Skip to content

Commit a345a03

Browse files
Bwkolunny
authored andcommitted
Added sorting to the labels & milestones page (#199)
1 parent f27d87d commit a345a03

File tree

7 files changed

+82
-13
lines changed

7 files changed

+82
-13
lines changed

models/issue.go

+17-1
Original file line numberDiff line numberDiff line change
@@ -1503,12 +1503,28 @@ func GetMilestonesByRepoID(repoID int64) ([]*Milestone, error) {
15031503
}
15041504

15051505
// GetMilestones returns a list of milestones of given repository and status.
1506-
func GetMilestones(repoID int64, page int, isClosed bool) ([]*Milestone, error) {
1506+
func GetMilestones(repoID int64, page int, isClosed bool, sortType string) ([]*Milestone, error) {
15071507
miles := make([]*Milestone, 0, setting.UI.IssuePagingNum)
15081508
sess := x.Where("repo_id = ? AND is_closed = ?", repoID, isClosed)
15091509
if page > 0 {
15101510
sess = sess.Limit(setting.UI.IssuePagingNum, (page-1)*setting.UI.IssuePagingNum)
15111511
}
1512+
1513+
switch sortType {
1514+
case "furthestduedate":
1515+
sess.Desc("deadline_unix")
1516+
case "leastcomplete":
1517+
sess.Asc("completeness")
1518+
case "mostcomplete":
1519+
sess.Desc("completeness")
1520+
case "leastissues":
1521+
sess.Asc("num_issues")
1522+
case "mostissues":
1523+
sess.Desc("num_issues")
1524+
default:
1525+
sess.Asc("deadline_unix")
1526+
}
1527+
15121528
return miles, sess.Find(&miles)
15131529
}
15141530

models/issue_label.go

+15-5
Original file line numberDiff line numberDiff line change
@@ -171,12 +171,22 @@ func GetLabelsInRepoByIDs(repoID int64, labelIDs []int64) ([]*Label, error) {
171171
}
172172

173173
// GetLabelsByRepoID returns all labels that belong to given repository by ID.
174-
func GetLabelsByRepoID(repoID int64) ([]*Label, error) {
174+
func GetLabelsByRepoID(repoID int64, sortType string) ([]*Label, error) {
175175
labels := make([]*Label, 0, 10)
176-
return labels, x.
177-
Where("repo_id = ?", repoID).
178-
Asc("name").
179-
Find(&labels)
176+
sess := x.Where("repo_id = ?", repoID)
177+
178+
switch sortType {
179+
case "reversealphabetically":
180+
sess.Desc("name")
181+
case "leastissues":
182+
sess.Asc("num_issues")
183+
case "mostissues":
184+
sess.Desc("num_issues")
185+
default:
186+
sess.Asc("name")
187+
}
188+
189+
return labels, sess.Find(&labels)
180190
}
181191

182192
func getLabelsByIssueID(e Engine, issueID int64) ([]*Label, error) {

options/locale/locale_en-US.ini

+8
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,8 @@ issues.label_modify = Label Modification
557557
issues.label_deletion = Label Deletion
558558
issues.label_deletion_desc = Deleting this label will remove its information in all related issues. Do you want to continue?
559559
issues.label_deletion_success = Label has been deleted successfully!
560+
issues.label.filter_sort.alphabetically = Alphabetically
561+
issues.label.filter_sort.reverse_alphabetically = Reverse alphabetically
560562
issues.num_participants = %d Participants
561563
issues.attachment.open_tab = `Click to see "%s" in a new tab`
562564
issues.attachment.download = `Click to download "%s"`
@@ -610,6 +612,12 @@ milestones.edit_success = Changes of milestone '%s' has been saved successfully!
610612
milestones.deletion = Milestone Deletion
611613
milestones.deletion_desc = Deleting this milestone will remove its information in all related issues. Do you want to continue?
612614
milestones.deletion_success = Milestone has been deleted successfully!
615+
milestones.filter_sort.closest_due_date = Closest due date
616+
milestones.filter_sort.furthest_due_date = Furthest due date
617+
milestones.filter_sort.least_complete = Least complete
618+
milestones.filter_sort.most_complete = Most complete
619+
milestones.filter_sort.most_issues = Most issues
620+
milestones.filter_sort.least_issues = Least issues
613621

614622
wiki = Wiki
615623
wiki.welcome = Welcome to Wiki!

routers/api/v1/repo/label.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515

1616
// ListLabels list all the labels of a repository
1717
func ListLabels(ctx *context.APIContext) {
18-
labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID)
18+
labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID, ctx.Query("sort"))
1919
if err != nil {
2020
ctx.Error(500, "GetLabelsByRepoID", err)
2121
return

routers/repo/issue.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func MustAllowPulls(ctx *context.Context) {
8282

8383
// RetrieveLabels find all the labels of a repository
8484
func RetrieveLabels(ctx *context.Context) {
85-
labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID)
85+
labels, err := models.GetLabelsByRepoID(ctx.Repo.Repository.ID, ctx.Query("sort"))
8686
if err != nil {
8787
ctx.Handle(500, "RetrieveLabels.GetLabels", err)
8888
return
@@ -92,6 +92,7 @@ func RetrieveLabels(ctx *context.Context) {
9292
}
9393
ctx.Data["Labels"] = labels
9494
ctx.Data["NumLabels"] = len(labels)
95+
ctx.Data["SortType"] = ctx.Query("sort")
9596
}
9697

9798
// Issues render issues page
@@ -274,12 +275,12 @@ func renderAttachmentSettings(ctx *context.Context) {
274275
// RetrieveRepoMilestonesAndAssignees find all the milestones and assignees of a repository
275276
func RetrieveRepoMilestonesAndAssignees(ctx *context.Context, repo *models.Repository) {
276277
var err error
277-
ctx.Data["OpenMilestones"], err = models.GetMilestones(repo.ID, -1, false)
278+
ctx.Data["OpenMilestones"], err = models.GetMilestones(repo.ID, -1, false, "")
278279
if err != nil {
279280
ctx.Handle(500, "GetMilestones", err)
280281
return
281282
}
282-
ctx.Data["ClosedMilestones"], err = models.GetMilestones(repo.ID, -1, true)
283+
ctx.Data["ClosedMilestones"], err = models.GetMilestones(repo.ID, -1, true, "")
283284
if err != nil {
284285
ctx.Handle(500, "GetMilestones", err)
285286
return
@@ -298,7 +299,7 @@ func RetrieveRepoMetas(ctx *context.Context, repo *models.Repository) []*models.
298299
return nil
299300
}
300301

301-
labels, err := models.GetLabelsByRepoID(repo.ID)
302+
labels, err := models.GetLabelsByRepoID(repo.ID, "")
302303
if err != nil {
303304
ctx.Handle(500, "GetLabelsByRepoID", err)
304305
return nil
@@ -583,7 +584,7 @@ func ViewIssue(ctx *context.Context) {
583584
for i := range issue.Labels {
584585
labelIDMark[issue.Labels[i].ID] = true
585586
}
586-
labels, err := models.GetLabelsByRepoID(repo.ID)
587+
labels, err := models.GetLabelsByRepoID(repo.ID, "")
587588
if err != nil {
588589
ctx.Handle(500, "GetLabelsByRepoID", err)
589590
return
@@ -1079,6 +1080,7 @@ func Milestones(ctx *context.Context) {
10791080
ctx.Data["OpenCount"] = openCount
10801081
ctx.Data["ClosedCount"] = closedCount
10811082

1083+
sortType := ctx.Query("sort")
10821084
page := ctx.QueryInt("page")
10831085
if page <= 1 {
10841086
page = 1
@@ -1092,7 +1094,7 @@ func Milestones(ctx *context.Context) {
10921094
}
10931095
ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)
10941096

1095-
miles, err := models.GetMilestones(ctx.Repo.Repository.ID, page, isShowClosed)
1097+
miles, err := models.GetMilestones(ctx.Repo.Repository.ID, page, isShowClosed, sortType)
10961098
if err != nil {
10971099
ctx.Handle(500, "GetMilestones", err)
10981100
return
@@ -1108,6 +1110,7 @@ func Milestones(ctx *context.Context) {
11081110
ctx.Data["State"] = "open"
11091111
}
11101112

1113+
ctx.Data["SortType"] = sortType
11111114
ctx.Data["IsShowClosed"] = isShowClosed
11121115
ctx.HTML(200, tplMilestone)
11131116
}

templates/repo/issue/labels.tmpl

+15
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,21 @@
3434
</div>
3535
<div class="ui divider"></div>
3636

37+
<div class="ui right floated secondary filter menu">
38+
<!-- Sort -->
39+
<div class="ui dropdown type jump item">
40+
<span class="text">
41+
{{.i18n.Tr "repo.issues.filter_sort"}}
42+
<i class="dropdown icon"></i>
43+
</span>
44+
<div class="menu">
45+
<a class="{{if or (eq .SortType "alphabetically") (not .SortType)}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&state={{$.State}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a>
46+
<a class="{{if eq .SortType "reversealphabetically"}}active{{end}} item" href="{{$.Link}}?sort=reversealphabetically&state={{$.State}}">{{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a>
47+
<a class="{{if eq .SortType "leastissues"}}active{{end}} item" href="{{$.Link}}?sort=leastissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_issues"}}</a>
48+
<a class="{{if eq .SortType "mostissues"}}active{{end}} item" href="{{$.Link}}?sort=mostissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_issues"}}</a>
49+
</div>
50+
</div>
51+
</div>
3752
{{template "base/alert" .}}
3853
<div class="ui black label">{{.i18n.Tr "repo.issues.label_count" .NumLabels}}</div>
3954
<div class="label list">

templates/repo/issue/milestones.tmpl

+17
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,23 @@
2323
</a>
2424
</div>
2525

26+
<div class="ui right floated secondary filter menu">
27+
<!-- Sort -->
28+
<div class="ui dropdown type jump item">
29+
<span class="text">
30+
{{.i18n.Tr "repo.issues.filter_sort"}}
31+
<i class="dropdown icon"></i>
32+
</span>
33+
<div class="menu">
34+
<a class="{{if or (eq .SortType "closestduedate") (not .SortType)}}active{{end}} item" href="{{$.Link}}?sort=closestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.closest_due_date"}}</a>
35+
<a class="{{if eq .SortType "furthestduedate"}}active{{end}} item" href="{{$.Link}}?sort=furthestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.furthest_due_date"}}</a>
36+
<a class="{{if eq .SortType "leastcomplete"}}active{{end}} item" href="{{$.Link}}?sort=leastcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_complete"}}</a>
37+
<a class="{{if eq .SortType "mostcomplete"}}active{{end}} item" href="{{$.Link}}?sort=mostcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_complete"}}</a>
38+
<a class="{{if eq .SortType "mostissues"}}active{{end}} item" href="{{$.Link}}?sort=mostissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_issues"}}</a>
39+
<a class="{{if eq .SortType "leastissues"}}active{{end}} item" href="{{$.Link}}?sort=leastissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_issues"}}</a>
40+
</div>
41+
</div>
42+
</div>
2643
<div class="milestone list">
2744
{{range .Milestones}}
2845
<li class="item">

0 commit comments

Comments
 (0)