You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

issue_label.go 4.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package repo
  5. import (
  6. "code.gitea.io/gitea/models"
  7. "code.gitea.io/gitea/modules/auth"
  8. "code.gitea.io/gitea/modules/base"
  9. "code.gitea.io/gitea/modules/context"
  10. "code.gitea.io/gitea/modules/log"
  11. )
  12. const (
  13. tplLabels base.TplName = "repo/issue/labels"
  14. )
  15. // Labels render issue's labels page
  16. func Labels(ctx *context.Context) {
  17. ctx.Data["Title"] = ctx.Tr("repo.labels")
  18. ctx.Data["PageIsIssueList"] = true
  19. ctx.Data["PageIsLabels"] = true
  20. ctx.Data["RequireMinicolors"] = true
  21. ctx.Data["RequireTribute"] = true
  22. ctx.Data["LabelTemplates"] = models.LabelTemplates
  23. ctx.HTML(200, tplLabels)
  24. }
  25. // InitializeLabels init labels for a repository
  26. func InitializeLabels(ctx *context.Context, form auth.InitializeLabelsForm) {
  27. if ctx.HasError() {
  28. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  29. return
  30. }
  31. if err := models.InitalizeLabels(ctx.Repo.Repository.ID, form.TemplateName); err != nil {
  32. if models.IsErrIssueLabelTemplateLoad(err) {
  33. originalErr := err.(models.ErrIssueLabelTemplateLoad).OriginalError
  34. ctx.Flash.Error(ctx.Tr("repo.issues.label_templates.fail_to_load_file", form.TemplateName, originalErr))
  35. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  36. return
  37. }
  38. ctx.ServerError("InitalizeLabels", err)
  39. return
  40. }
  41. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  42. }
  43. // RetrieveLabels find all the labels of a repository
  44. func RetrieveLabels(ctx *context.Context) {
  45. labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID, ctx.Query("sort"))
  46. if err != nil {
  47. ctx.ServerError("RetrieveLabels.GetLabels", err)
  48. return
  49. }
  50. for _, l := range labels {
  51. l.CalOpenIssues()
  52. }
  53. ctx.Data["Labels"] = labels
  54. ctx.Data["NumLabels"] = len(labels)
  55. ctx.Data["SortType"] = ctx.Query("sort")
  56. }
  57. // NewLabel create new label for repository
  58. func NewLabel(ctx *context.Context, form auth.CreateLabelForm) {
  59. ctx.Data["Title"] = ctx.Tr("repo.labels")
  60. ctx.Data["PageIsLabels"] = true
  61. if ctx.HasError() {
  62. ctx.Flash.Error(ctx.Data["ErrorMsg"].(string))
  63. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  64. return
  65. }
  66. l := &models.Label{
  67. RepoID: ctx.Repo.Repository.ID,
  68. Name: form.Title,
  69. Description: form.Description,
  70. Color: form.Color,
  71. }
  72. if err := models.NewLabel(l); err != nil {
  73. ctx.ServerError("NewLabel", err)
  74. return
  75. }
  76. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  77. }
  78. // UpdateLabel update a label's name and color
  79. func UpdateLabel(ctx *context.Context, form auth.CreateLabelForm) {
  80. l, err := models.GetLabelByID(form.ID)
  81. if err != nil {
  82. switch {
  83. case models.IsErrLabelNotExist(err):
  84. ctx.Error(404)
  85. default:
  86. ctx.ServerError("UpdateLabel", err)
  87. }
  88. return
  89. }
  90. l.Name = form.Title
  91. l.Description = form.Description
  92. l.Color = form.Color
  93. if err := models.UpdateLabel(l); err != nil {
  94. ctx.ServerError("UpdateLabel", err)
  95. return
  96. }
  97. ctx.Redirect(ctx.Repo.RepoLink + "/labels")
  98. }
  99. // DeleteLabel delete a label
  100. func DeleteLabel(ctx *context.Context) {
  101. if err := models.DeleteLabel(ctx.Repo.Repository.ID, ctx.QueryInt64("id")); err != nil {
  102. ctx.Flash.Error("DeleteLabel: " + err.Error())
  103. } else {
  104. ctx.Flash.Success(ctx.Tr("repo.issues.label_deletion_success"))
  105. }
  106. ctx.JSON(200, map[string]interface{}{
  107. "redirect": ctx.Repo.RepoLink + "/labels",
  108. })
  109. }
  110. // UpdateIssueLabel change issue's labels
  111. func UpdateIssueLabel(ctx *context.Context) {
  112. issues := getActionIssues(ctx)
  113. if ctx.Written() {
  114. return
  115. }
  116. switch action := ctx.Query("action"); action {
  117. case "clear":
  118. for _, issue := range issues {
  119. if err := issue.ClearLabels(ctx.User); err != nil {
  120. ctx.ServerError("ClearLabels", err)
  121. return
  122. }
  123. }
  124. case "attach", "detach", "toggle":
  125. label, err := models.GetLabelByID(ctx.QueryInt64("id"))
  126. if err != nil {
  127. if models.IsErrLabelNotExist(err) {
  128. ctx.Error(404, "GetLabelByID")
  129. } else {
  130. ctx.ServerError("GetLabelByID", err)
  131. }
  132. return
  133. }
  134. if action == "toggle" {
  135. // detach if any issues already have label, otherwise attach
  136. action = "attach"
  137. for _, issue := range issues {
  138. if issue.HasLabel(label.ID) {
  139. action = "detach"
  140. break
  141. }
  142. }
  143. }
  144. if action == "attach" {
  145. for _, issue := range issues {
  146. if err = issue.AddLabel(ctx.User, label); err != nil {
  147. ctx.ServerError("AddLabel", err)
  148. return
  149. }
  150. }
  151. } else {
  152. for _, issue := range issues {
  153. if err = issue.RemoveLabel(ctx.User, label); err != nil {
  154. ctx.ServerError("RemoveLabel", err)
  155. return
  156. }
  157. }
  158. }
  159. default:
  160. log.Warn("Unrecognized action: %s", action)
  161. ctx.Error(500)
  162. return
  163. }
  164. ctx.JSON(200, map[string]interface{}{
  165. "ok": true,
  166. })
  167. }