Skip to content

Commit 76eaa99

Browse files
committed
fix
1 parent 5ab2729 commit 76eaa99

File tree

6 files changed

+80
-83
lines changed

6 files changed

+80
-83
lines changed

modules/label/label.go

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ import (
77
"fmt"
88
"regexp"
99
"strings"
10-
)
10+
"sync"
1111

12-
// colorPattern is a regexp which can validate label color
13-
var colorPattern = regexp.MustCompile("^#?(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{3})$")
12+
"code.gitea.io/gitea/modules/util"
13+
)
1414

1515
// Label represents label information loaded from template
1616
type Label struct {
@@ -21,18 +21,9 @@ type Label struct {
2121
ExclusiveOrder int `yaml:"exclusive_order,omitempty"`
2222
}
2323

24-
type ErrInvalidLabelColor struct {
25-
Color string
26-
}
27-
28-
func (e *ErrInvalidLabelColor) Error() string {
29-
return "invalid label color: " + e.Color
30-
}
31-
32-
func IsErrInvalidLabelColor(err error) bool {
33-
_, ok := err.(*ErrInvalidLabelColor)
34-
return ok
35-
}
24+
var colorPattern = sync.OnceValue(func() *regexp.Regexp {
25+
return regexp.MustCompile(`^#([\da-fA-F]{3}|[\da-fA-F]{6})$`)
26+
})
3627

3728
// NormalizeColor normalizes a color string to a 6-character hex code
3829
func NormalizeColor(color string) (string, error) {
@@ -44,10 +35,8 @@ func NormalizeColor(color string) (string, error) {
4435
color = "#" + color
4536
}
4637

47-
if !colorPattern.MatchString(color) {
48-
return "", &ErrInvalidLabelColor{
49-
Color: color,
50-
}
38+
if !colorPattern().MatchString(color) {
39+
return "", util.NewInvalidArgumentErrorf("invalid color: %s", color)
5140
}
5241

5342
// convert 3-character shorthand into 6-character version

routers/web/org/org_labels.go

Lines changed: 21 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
package org
55

66
import (
7-
"net/http"
7+
"errors"
88

99
"code.gitea.io/gitea/models/db"
1010
issues_model "code.gitea.io/gitea/models/issues"
1111
"code.gitea.io/gitea/modules/label"
1212
repo_module "code.gitea.io/gitea/modules/repository"
13+
"code.gitea.io/gitea/modules/util"
1314
"code.gitea.io/gitea/modules/web"
15+
shared_label "code.gitea.io/gitea/routers/web/shared/label"
1416
"code.gitea.io/gitea/services/context"
1517
"code.gitea.io/gitea/services/forms"
1618
)
@@ -32,14 +34,8 @@ func RetrieveLabels(ctx *context.Context) {
3234

3335
// NewLabel create new label for organization
3436
func NewLabel(ctx *context.Context) {
35-
form := web.GetForm(ctx).(*forms.CreateLabelForm)
36-
ctx.Data["Title"] = ctx.Tr("repo.labels")
37-
ctx.Data["PageIsLabels"] = true
38-
ctx.Data["PageIsOrgSettings"] = true
39-
40-
if ctx.HasError() {
41-
ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
42-
ctx.Redirect(ctx.Org.OrgLink + "/settings/labels")
37+
form := shared_label.GetLabelEditForm(ctx)
38+
if ctx.Written() {
4339
return
4440
}
4541

@@ -52,27 +48,25 @@ func NewLabel(ctx *context.Context) {
5248
ExclusiveOrder: form.ExclusiveOrder,
5349
}
5450
if err := issues_model.NewLabel(ctx, l); err != nil {
55-
if label.IsErrInvalidLabelColor(err) {
56-
ctx.Flash.Error("NewLabel: " + err.Error())
57-
} else {
58-
ctx.ServerError("NewLabel", err)
59-
return
60-
}
51+
ctx.ServerError("NewLabel", err)
52+
return
6153
}
62-
ctx.Redirect(ctx.Org.OrgLink + "/settings/labels")
54+
ctx.JSONRedirect(ctx.Org.OrgLink + "/settings/labels")
6355
}
6456

6557
// UpdateLabel update a label's name and color
6658
func UpdateLabel(ctx *context.Context) {
67-
form := web.GetForm(ctx).(*forms.CreateLabelForm)
59+
form := shared_label.GetLabelEditForm(ctx)
60+
if ctx.Written() {
61+
return
62+
}
63+
6864
l, err := issues_model.GetLabelInOrgByID(ctx, ctx.Org.Organization.ID, form.ID)
69-
if err != nil {
70-
switch {
71-
case issues_model.IsErrOrgLabelNotExist(err):
72-
ctx.HTTPError(http.StatusNotFound)
73-
default:
74-
ctx.ServerError("UpdateLabel", err)
75-
}
65+
if errors.Is(err, util.ErrNotExist) {
66+
ctx.JSONErrorNotFound()
67+
return
68+
} else if err != nil {
69+
ctx.ServerError("GetLabelInOrgByID", err)
7670
return
7771
}
7872

@@ -83,14 +77,10 @@ func UpdateLabel(ctx *context.Context) {
8377
l.Color = form.Color
8478
l.SetArchived(form.IsArchived)
8579
if err := issues_model.UpdateLabel(ctx, l); err != nil {
86-
if label.IsErrInvalidLabelColor(err) {
87-
ctx.Flash.Error("UpdateLabel: " + err.Error())
88-
} else {
89-
ctx.ServerError("UpdateLabel", err)
90-
return
91-
}
80+
ctx.ServerError("UpdateLabel", err)
81+
return
9282
}
93-
ctx.Redirect(ctx.Org.OrgLink + "/settings/labels")
83+
ctx.JSONRedirect(ctx.Org.OrgLink + "/settings/labels")
9484
}
9585

9686
// DeleteLabel delete a label

routers/web/repo/issue_label.go

Lines changed: 22 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package repo
55

66
import (
7+
"errors"
78
"net/http"
89

910
"code.gitea.io/gitea/models/db"
@@ -13,7 +14,9 @@ import (
1314
"code.gitea.io/gitea/modules/log"
1415
repo_module "code.gitea.io/gitea/modules/repository"
1516
"code.gitea.io/gitea/modules/templates"
17+
"code.gitea.io/gitea/modules/util"
1618
"code.gitea.io/gitea/modules/web"
19+
shared_label "code.gitea.io/gitea/routers/web/shared/label"
1720
"code.gitea.io/gitea/services/context"
1821
"code.gitea.io/gitea/services/forms"
1922
issue_service "code.gitea.io/gitea/services/issue"
@@ -100,13 +103,8 @@ func RetrieveLabelsForList(ctx *context.Context) {
100103

101104
// NewLabel create new label for repository
102105
func NewLabel(ctx *context.Context) {
103-
form := web.GetForm(ctx).(*forms.CreateLabelForm)
104-
ctx.Data["Title"] = ctx.Tr("repo.labels")
105-
ctx.Data["PageIsLabels"] = true
106-
107-
if ctx.HasError() {
108-
ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
109-
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
106+
form := shared_label.GetLabelEditForm(ctx)
107+
if ctx.Written() {
110108
return
111109
}
112110

@@ -119,45 +117,39 @@ func NewLabel(ctx *context.Context) {
119117
Color: form.Color,
120118
}
121119
if err := issues_model.NewLabel(ctx, l); err != nil {
122-
if label.IsErrInvalidLabelColor(err) {
123-
ctx.Flash.Error("NewLabel: " + err.Error())
124-
} else {
125-
ctx.ServerError("NewLabel", err)
126-
return
127-
}
120+
ctx.ServerError("NewLabel", err)
121+
return
128122
}
129-
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
123+
ctx.JSONRedirect(ctx.Repo.RepoLink + "/labels")
130124
}
131125

132126
// UpdateLabel update a label's name and color
133127
func UpdateLabel(ctx *context.Context) {
134-
form := web.GetForm(ctx).(*forms.CreateLabelForm)
128+
form := shared_label.GetLabelEditForm(ctx)
129+
if ctx.Written() {
130+
return
131+
}
132+
135133
l, err := issues_model.GetLabelInRepoByID(ctx, ctx.Repo.Repository.ID, form.ID)
136-
if err != nil {
137-
switch {
138-
case issues_model.IsErrRepoLabelNotExist(err):
139-
ctx.HTTPError(http.StatusNotFound)
140-
default:
141-
ctx.ServerError("UpdateLabel", err)
142-
}
134+
if errors.Is(err, util.ErrNotExist) {
135+
ctx.JSONErrorNotFound()
136+
return
137+
} else if err != nil {
138+
ctx.ServerError("GetLabelInRepoByID", err)
143139
return
144140
}
141+
145142
l.Name = form.Title
146143
l.Exclusive = form.Exclusive
147144
l.ExclusiveOrder = form.ExclusiveOrder
148145
l.Description = form.Description
149146
l.Color = form.Color
150-
151147
l.SetArchived(form.IsArchived)
152148
if err := issues_model.UpdateLabel(ctx, l); err != nil {
153-
if label.IsErrInvalidLabelColor(err) {
154-
ctx.Flash.Error("UpdateLabel: " + err.Error())
155-
} else {
156-
ctx.ServerError("UpdateLabel", err)
157-
return
158-
}
149+
ctx.ServerError("UpdateLabel", err)
150+
return
159151
}
160-
ctx.Redirect(ctx.Repo.RepoLink + "/labels")
152+
ctx.JSONRedirect(ctx.Repo.RepoLink + "/labels")
161153
}
162154

163155
// DeleteLabel delete a label

routers/web/shared/label/label.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
// Copyright 2025 The Gitea Authors. All rights reserved.
2+
// SPDX-License-Identifier: MIT
3+
4+
package label
5+
6+
import (
7+
"code.gitea.io/gitea/modules/label"
8+
"code.gitea.io/gitea/modules/web"
9+
"code.gitea.io/gitea/services/context"
10+
"code.gitea.io/gitea/services/forms"
11+
)
12+
13+
func GetLabelEditForm(ctx *context.Context) *forms.CreateLabelForm {
14+
form := web.GetForm(ctx).(*forms.CreateLabelForm)
15+
if ctx.HasError() {
16+
ctx.JSONError(ctx.Data["ErrorMsg"].(string))
17+
return nil
18+
}
19+
var err error
20+
form.Color, err = label.NormalizeColor(form.Color)
21+
if err != nil {
22+
ctx.JSONError(".....") // TODO: translate
23+
return nil
24+
}
25+
return form
26+
}

templates/repo/issue/labels/label_edit_modal.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
>
66
<div class="header"></div>
77
<div class="content">
8-
<form class="ui form ignore-dirty" method="post">
8+
<form class="ui form ignore-dirty form-fetch-action" method="post">
99
{{.CsrfTokenHtml}}
1010
<input name="id" type="hidden">
1111
<div class="required field">
@@ -50,7 +50,7 @@
5050
<div class="field">
5151
<label for="color">{{ctx.Locale.Tr "repo.issues.label_color"}}</label>
5252
<div class="column js-color-picker-input">
53-
<input name="color" value="#70c24a" placeholder="#c320f6" required pattern="^#?(?:[A-Fa-f0-9]{3}|[A-Fa-f0-9]{6})$" maxlength="7">
53+
<input name="color" value="#70c24a" placeholder="#c320f6" required pattern="^#?([\dA-Fa-f]{3}|[\dA-Fa-f]{6})$" maxlength="7">
5454
{{template "repo/issue/label_precolors"}}
5555
</div>
5656
</div>

web_src/js/features/comp/LabelEdit.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ export function initCompLabelEdit(pageSelector: string) {
7070
form.reportValidity();
7171
return false;
7272
}
73-
form.submit();
73+
form.dispatchEvent(new Event('submit', {bubbles: true}));
7474
},
7575
}).modal('show');
7676
};

0 commit comments

Comments
 (0)