@@ -870,51 +870,112 @@ func RetrieveRepoReviewers(ctx *context.Context, repo *repo_model.Repository, is
870870 ctx .Data ["IssueSidebarReviewersData" ] = data
871871}
872872
873- // RetrieveRepoMetas find all the meta information of a repository
874- func RetrieveRepoMetas (ctx * context.Context , repo * repo_model.Repository , isPull bool ) []* issues_model.Label {
875- if ! ctx .Repo .CanWriteIssuesOrPulls (isPull ) {
876- return nil
873+ type issueSidebarLabelsData struct {
874+ Repository * repo_model.Repository
875+ RepoLink string
876+ IssueID int64
877+ IsPullRequest bool
878+ AllLabels []* issues_model.Label
879+ RepoLabels []* issues_model.Label
880+ OrgLabels []* issues_model.Label
881+ SelectedLabelIDs string
882+ }
883+
884+ func makeSelectedStringIDs [KeyType , ItemType comparable ](
885+ allLabels []* issues_model.Label , candidateKey func (candidate * issues_model.Label ) KeyType ,
886+ selectedItems []ItemType , selectedKey func (selected ItemType ) KeyType ,
887+ ) string {
888+ selectedIDSet := make (container.Set [string ])
889+ allLabelMap := map [KeyType ]* issues_model.Label {}
890+ for _ , label := range allLabels {
891+ allLabelMap [candidateKey (label )] = label
892+ }
893+ for _ , item := range selectedItems {
894+ if label , ok := allLabelMap [selectedKey (item )]; ok {
895+ label .IsChecked = true
896+ selectedIDSet .Add (strconv .FormatInt (label .ID , 10 ))
897+ }
898+ }
899+ ids := selectedIDSet .Values ()
900+ sort .Strings (ids )
901+ return strings .Join (ids , "," )
902+ }
903+
904+ func (d * issueSidebarLabelsData ) SetSelectedLabels (labels []* issues_model.Label ) {
905+ d .SelectedLabelIDs = makeSelectedStringIDs (
906+ d .AllLabels , func (label * issues_model.Label ) int64 { return label .ID },
907+ labels , func (label * issues_model.Label ) int64 { return label .ID },
908+ )
909+ }
910+
911+ func (d * issueSidebarLabelsData ) SetSelectedLabelNames (labelNames []string ) {
912+ d .SelectedLabelIDs = makeSelectedStringIDs (
913+ d .AllLabels , func (label * issues_model.Label ) string { return strings .ToLower (label .Name ) },
914+ labelNames , strings .ToLower ,
915+ )
916+ }
917+
918+ func (d * issueSidebarLabelsData ) SetSelectedLabelIDs (labelIDs []int64 ) {
919+ d .SelectedLabelIDs = makeSelectedStringIDs (
920+ d .AllLabels , func (label * issues_model.Label ) int64 { return label .ID },
921+ labelIDs , func (labelID int64 ) int64 { return labelID },
922+ )
923+ }
924+
925+ func retrieveRepoLabels (ctx * context.Context , repo * repo_model.Repository , issueID int64 , isPull bool ) * issueSidebarLabelsData {
926+ labelsData := & issueSidebarLabelsData {
927+ Repository : repo ,
928+ RepoLink : ctx .Repo .RepoLink ,
929+ IssueID : issueID ,
930+ IsPullRequest : isPull ,
877931 }
932+ ctx .Data ["IssueSidebarLabelsData" ] = labelsData
878933
879934 labels , err := issues_model .GetLabelsByRepoID (ctx , repo .ID , "" , db.ListOptions {})
880935 if err != nil {
881936 ctx .ServerError ("GetLabelsByRepoID" , err )
882937 return nil
883938 }
884- ctx .Data ["Labels" ] = labels
939+ labelsData .RepoLabels = labels
940+
885941 if repo .Owner .IsOrganization () {
886942 orgLabels , err := issues_model .GetLabelsByOrgID (ctx , repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {})
887943 if err != nil {
888944 return nil
889945 }
946+ labelsData .OrgLabels = orgLabels
947+ }
948+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .RepoLabels ... )
949+ labelsData .AllLabels = append (labelsData .AllLabels , labelsData .OrgLabels ... )
950+ return labelsData
951+ }
890952
891- ctx .Data ["OrgLabels" ] = orgLabels
892- labels = append (labels , orgLabels ... )
953+ // retrieveRepoMetasForIssueWriter finds some the meta information of a repository for an issue/pr writer
954+ func retrieveRepoMetasForIssueWriter (ctx * context.Context , repo * repo_model.Repository , isPull bool ) {
955+ if ! ctx .Repo .CanWriteIssuesOrPulls (isPull ) {
956+ return
893957 }
894958
895959 RetrieveRepoMilestonesAndAssignees (ctx , repo )
896960 if ctx .Written () {
897- return nil
961+ return
898962 }
899963
900964 retrieveProjects (ctx , repo )
901965 if ctx .Written () {
902- return nil
966+ return
903967 }
904968
905969 PrepareBranchList (ctx )
906970 if ctx .Written () {
907- return nil
971+ return
908972 }
909-
910973 // Contains true if the user can create issue dependencies
911974 ctx .Data ["CanCreateIssueDependencies" ] = ctx .Repo .CanCreateIssueDependencies (ctx , ctx .Doer , isPull )
912-
913- return labels
914975}
915976
916977// Tries to load and set an issue template. The first return value indicates if a template was loaded.
917- func setTemplateIfExists (ctx * context.Context , ctxDataKey string , possibleFiles []string ) (bool , map [string ]error ) {
978+ func setTemplateIfExists (ctx * context.Context , ctxDataKey string , possibleFiles []string , labelsData * issueSidebarLabelsData ) (bool , map [string ]error ) {
918979 commit , err := ctx .Repo .GitRepo .GetBranchCommit (ctx .Repo .Repository .DefaultBranch )
919980 if err != nil {
920981 return false , nil
@@ -951,26 +1012,9 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
9511012 ctx .Data ["Fields" ] = template .Fields
9521013 ctx .Data ["TemplateFile" ] = template .FileName
9531014 }
954- labelIDs := make ([]string , 0 , len (template .Labels ))
955- if repoLabels , err := issues_model .GetLabelsByRepoID (ctx , ctx .Repo .Repository .ID , "" , db.ListOptions {}); err == nil {
956- ctx .Data ["Labels" ] = repoLabels
957- if ctx .Repo .Owner .IsOrganization () {
958- if orgLabels , err := issues_model .GetLabelsByOrgID (ctx , ctx .Repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {}); err == nil {
959- ctx .Data ["OrgLabels" ] = orgLabels
960- repoLabels = append (repoLabels , orgLabels ... )
961- }
962- }
9631015
964- for _ , metaLabel := range template .Labels {
965- for _ , repoLabel := range repoLabels {
966- if strings .EqualFold (repoLabel .Name , metaLabel ) {
967- repoLabel .IsChecked = true
968- labelIDs = append (labelIDs , strconv .FormatInt (repoLabel .ID , 10 ))
969- break
970- }
971- }
972- }
973- }
1016+ labelsData .SetSelectedLabelNames (template .Labels )
1017+
9741018 selectedAssigneeIDs := make ([]int64 , 0 , len (template .Assignees ))
9751019 selectedAssigneeIDStrings := make ([]string , 0 , len (template .Assignees ))
9761020 if userIDs , err := user_model .GetUserIDsByNames (ctx , template .Assignees , false ); err == nil {
@@ -983,8 +1027,7 @@ func setTemplateIfExists(ctx *context.Context, ctxDataKey string, possibleFiles
9831027 if template .Ref != "" && ! strings .HasPrefix (template .Ref , "refs/" ) { // Assume that the ref intended is always a branch - for tags users should use refs/tags/<ref>
9841028 template .Ref = git .BranchPrefix + template .Ref
9851029 }
986- ctx .Data ["HasSelectedLabel" ] = len (labelIDs ) > 0
987- ctx .Data ["label_ids" ] = strings .Join (labelIDs , "," )
1030+
9881031 ctx .Data ["HasSelectedAssignee" ] = len (selectedAssigneeIDs ) > 0
9891032 ctx .Data ["assignee_ids" ] = strings .Join (selectedAssigneeIDStrings , "," )
9901033 ctx .Data ["SelectedAssigneeIDs" ] = selectedAssigneeIDs
@@ -1042,8 +1085,14 @@ func NewIssue(ctx *context.Context) {
10421085 }
10431086 }
10441087
1045- RetrieveRepoMetas (ctx , ctx .Repo .Repository , false )
1046-
1088+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , false )
1089+ if ctx .Written () {
1090+ return
1091+ }
1092+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , false )
1093+ if ctx .Written () {
1094+ return
1095+ }
10471096 tags , err := repo_model .GetTagNamesByRepoID (ctx , ctx .Repo .Repository .ID )
10481097 if err != nil {
10491098 ctx .ServerError ("GetTagNamesByRepoID" , err )
@@ -1052,7 +1101,7 @@ func NewIssue(ctx *context.Context) {
10521101 ctx .Data ["Tags" ] = tags
10531102
10541103 ret := issue_service .ParseTemplatesFromDefaultBranch (ctx .Repo .Repository , ctx .Repo .GitRepo )
1055- templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates )
1104+ templateLoaded , errs := setTemplateIfExists (ctx , issueTemplateKey , IssueTemplateCandidates , labelsData )
10561105 for k , v := range errs {
10571106 ret .TemplateErrors [k ] = v
10581107 }
@@ -1161,34 +1210,25 @@ func ValidateRepoMetas(ctx *context.Context, form forms.CreateIssueForm, isPull
11611210 err error
11621211 )
11631212
1164- labels := RetrieveRepoMetas (ctx , ctx .Repo .Repository , isPull )
1213+ retrieveRepoMetasForIssueWriter (ctx , ctx .Repo .Repository , isPull )
1214+ if ctx .Written () {
1215+ return ret
1216+ }
1217+ labelsData := retrieveRepoLabels (ctx , ctx .Repo .Repository , 0 , isPull )
11651218 if ctx .Written () {
11661219 return ret
11671220 }
11681221
11691222 var labelIDs []int64
1170- hasSelected := false
11711223 // Check labels.
11721224 if len (form .LabelIDs ) > 0 {
11731225 labelIDs , err = base .StringsToInt64s (strings .Split (form .LabelIDs , "," ))
11741226 if err != nil {
11751227 return ret
11761228 }
1177- labelIDMark := make (container.Set [int64 ])
1178- labelIDMark .AddMultiple (labelIDs ... )
1179-
1180- for i := range labels {
1181- if labelIDMark .Contains (labels [i ].ID ) {
1182- labels [i ].IsChecked = true
1183- hasSelected = true
1184- }
1185- }
1229+ labelsData .SetSelectedLabelIDs (labelIDs )
11861230 }
11871231
1188- ctx .Data ["Labels" ] = labels
1189- ctx .Data ["HasSelectedLabel" ] = hasSelected
1190- ctx .Data ["label_ids" ] = form .LabelIDs
1191-
11921232 // Check milestone.
11931233 milestoneID := form .MilestoneID
11941234 if milestoneID > 0 {
@@ -1579,38 +1619,15 @@ func ViewIssue(ctx *context.Context) {
15791619 }
15801620 }
15811621
1582- // Metas.
1583- // Check labels.
1584- labelIDMark := make (container.Set [int64 ])
1585- for _ , label := range issue .Labels {
1586- labelIDMark .Add (label .ID )
1587- }
1588- labels , err := issues_model .GetLabelsByRepoID (ctx , repo .ID , "" , db.ListOptions {})
1589- if err != nil {
1590- ctx .ServerError ("GetLabelsByRepoID" , err )
1622+ retrieveRepoMetasForIssueWriter (ctx , repo , issue .IsPull )
1623+ if ctx .Written () {
15911624 return
15921625 }
1593- ctx .Data ["Labels" ] = labels
1594-
1595- if repo .Owner .IsOrganization () {
1596- orgLabels , err := issues_model .GetLabelsByOrgID (ctx , repo .Owner .ID , ctx .FormString ("sort" ), db.ListOptions {})
1597- if err != nil {
1598- ctx .ServerError ("GetLabelsByOrgID" , err )
1599- return
1600- }
1601- ctx .Data ["OrgLabels" ] = orgLabels
1602-
1603- labels = append (labels , orgLabels ... )
1604- }
1605-
1606- hasSelected := false
1607- for i := range labels {
1608- if labelIDMark .Contains (labels [i ].ID ) {
1609- labels [i ].IsChecked = true
1610- hasSelected = true
1611- }
1626+ labelsData := retrieveRepoLabels (ctx , repo , issue .ID , issue .IsPull )
1627+ if ctx .Written () {
1628+ return
16121629 }
1613- ctx . Data [ "HasSelectedLabel" ] = hasSelected
1630+ labelsData . SetSelectedLabels ( issue . Labels )
16141631
16151632 // Check milestone and assignee.
16161633 if ctx .Repo .CanWriteIssuesOrPulls (issue .IsPull ) {
0 commit comments