diff --git a/modules/templates/util_render.go b/modules/templates/util_render.go
index 659422aee..b15de6521 100644
--- a/modules/templates/util_render.go
+++ b/modules/templates/util_render.go
@@ -121,29 +121,25 @@ func RenderIssueTitle(ctx context.Context, text string, metas map[string]string)
// RenderLabel renders a label
// locale is needed due to an import cycle with our context providing the `Tr` function
func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_model.Label) template.HTML {
- var (
- archivedCSSClass string
- textColor = util.ContrastColor(label.Color)
- labelScope = label.ExclusiveScope()
- )
-
- description := emoji.ReplaceAliases(template.HTMLEscapeString(label.Description))
+ var extraCSSClasses string
+ textColor := util.ContrastColor(label.Color)
+ labelScope := label.ExclusiveScope()
+ descriptionText := emoji.ReplaceAliases(label.Description)
if label.IsArchived() {
- archivedCSSClass = "archived-label"
- description = fmt.Sprintf("(%s) %s", locale.TrString("archived"), description)
+ extraCSSClasses = "archived-label"
+ descriptionText = fmt.Sprintf("(%s) %s", locale.TrString("archived"), descriptionText)
}
if labelScope == "" {
// Regular label
- s := fmt.Sprintf("
%s
",
- archivedCSSClass, textColor, label.Color, description, RenderEmoji(ctx, label.Name))
- return template.HTML(s)
+ return HTMLFormat(`%s
`,
+ extraCSSClasses, textColor, label.Color, descriptionText, RenderEmoji(ctx, label.Name))
}
// Scoped label
- scopeText := RenderEmoji(ctx, labelScope)
- itemText := RenderEmoji(ctx, label.Name[len(labelScope)+1:])
+ scopeHTML := RenderEmoji(ctx, labelScope)
+ itemHTML := RenderEmoji(ctx, label.Name[len(labelScope)+1:])
// Make scope and item background colors slightly darker and lighter respectively.
// More contrast needed with higher luminance, empirically tweaked.
@@ -171,14 +167,13 @@ func RenderLabel(ctx context.Context, locale translation.Locale, label *issues_m
itemColor := "#" + hex.EncodeToString(itemBytes)
scopeColor := "#" + hex.EncodeToString(scopeBytes)
- s := fmt.Sprintf(""+
- "%s
"+
- "%s
"+
- "",
- archivedCSSClass, description,
- textColor, scopeColor, scopeText,
- textColor, itemColor, itemText)
- return template.HTML(s)
+ return HTMLFormat(``+
+ `%s
`+
+ `%s
`+
+ ``,
+ extraCSSClasses, descriptionText,
+ textColor, scopeColor, scopeHTML,
+ textColor, itemColor, itemHTML)
}
// RenderEmoji renders html text with emoji post processors
diff --git a/routers/web/repo/issue.go b/routers/web/repo/issue.go
index de6ef9e93..0c8363a16 100644
--- a/routers/web/repo/issue.go
+++ b/routers/web/repo/issue.go
@@ -2177,7 +2177,10 @@ func GetIssueInfo(ctx *context.Context) {
}
}
- ctx.JSON(http.StatusOK, convert.ToIssue(ctx, ctx.Doer, issue))
+ ctx.JSON(http.StatusOK, map[string]any{
+ "convertedIssue": convert.ToIssue(ctx, ctx.Doer, issue),
+ "renderedLabels": templates.RenderLabels(ctx, ctx.Locale, issue.Labels, ctx.Repo.RepoLink, issue),
+ })
}
// UpdateIssueTitle change issue's title
diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go
index 44d362d9c..b7952b087 100644
--- a/tests/integration/issue_test.go
+++ b/tests/integration/issue_test.go
@@ -6,6 +6,7 @@ package integration
import (
"context"
"fmt"
+ "html/template"
"net/http"
"net/url"
"path"
@@ -573,10 +574,14 @@ func TestGetIssueInfo(t *testing.T) {
urlStr := fmt.Sprintf("/%s/%s/issues/%d/info", owner.Name, repo.Name, issue.Index)
req := NewRequest(t, "GET", urlStr)
resp := session.MakeRequest(t, req, http.StatusOK)
- var apiIssue api.Issue
- DecodeJSON(t, resp, &apiIssue)
+ var respStruct struct {
+ ConvertedIssue api.Issue
+ RenderedLabels template.HTML
+ }
+ DecodeJSON(t, resp, &respStruct)
- assert.EqualValues(t, issue.ID, apiIssue.ID)
+ assert.EqualValues(t, issue.ID, respStruct.ConvertedIssue.ID)
+ assert.Contains(t, string(respStruct.RenderedLabels), `"labels-list"`)
}
func TestUpdateIssueDeadline(t *testing.T) {
diff --git a/web_src/js/components/ContextPopup.vue b/web_src/js/components/ContextPopup.vue
index 65a608952..e4e8bce18 100644
--- a/web_src/js/components/ContextPopup.vue
+++ b/web_src/js/components/ContextPopup.vue
@@ -1,6 +1,5 @@