Skip to content

Commit eb674fc

Browse files
committed
make multi selectable
1 parent 3220b65 commit eb674fc

File tree

2 files changed

+79
-49
lines changed

2 files changed

+79
-49
lines changed

routers/user/home.go

+51-36
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ func Milestones(ctx *context.Context) {
169169
page = 1
170170
}
171171

172-
repoID := ctx.QueryInt64("repo")
172+
reposQuery := ctx.Query("repos")
173173
isShowClosed := ctx.Query("state") == "closed"
174174

175175
// Get repositories.
@@ -199,17 +199,34 @@ func Milestones(ctx *context.Context) {
199199
}
200200

201201
var repoIDs []int64
202-
if repoID > 0 {
203-
repoIDs = []int64{repoID}
204-
if !com.IsSliceContainsInt64(userRepoIDs, repoID) {
202+
if issueReposQueryPattern.MatchString(reposQuery) {
203+
// remove "[" and "]" from string
204+
reposQuery = reposQuery[1 : len(reposQuery)-1]
205+
//for each ID (delimiter ",") add to int to repoIDs
206+
reposSet := false
207+
for _, rID := range strings.Split(reposQuery, ",") {
208+
// Ensure nonempty string entries
209+
if rID != "" && rID != "0" {
210+
reposSet = true
211+
rIDint64, err := strconv.ParseInt(rID, 10, 64)
212+
if err == nil && com.IsSliceContainsInt64(userRepoIDs, rIDint64) {
213+
repoIDs = append(repoIDs, rIDint64)
214+
}
215+
}
216+
}
217+
if reposSet && len(repoIDs) == 0 {
205218
// force an empty result
206219
repoIDs = []int64{-1}
207220
}
208221
} else {
222+
log.Error("issueReposQueryPattern not match with query")
223+
}
224+
225+
if len(repoIDs) == 0 {
209226
repoIDs = userRepoIDs
210227
}
211228

212-
counts, err := models.CountMilestonesByRepoIDs(repoIDs, isShowClosed)
229+
counts, err := models.CountMilestonesByRepoIDs(userRepoIDs, isShowClosed)
213230
if err != nil {
214231
ctx.ServerError("CountMilestonesByRepoIDs", err)
215232
return
@@ -222,36 +239,29 @@ func Milestones(ctx *context.Context) {
222239
}
223240

224241
showReposMap := make(map[int64]*models.Repository, len(counts))
225-
for repoID := range counts {
226-
repo, err := models.GetRepositoryByID(repoID)
227-
if err != nil {
228-
ctx.ServerError("GetRepositoryByID", err)
229-
return
242+
for rID := range counts {
243+
if rID == -1 {
244+
break
230245
}
231-
showReposMap[repoID] = repo
232-
}
233-
234-
if repoID > 0 {
235-
if _, ok := showReposMap[repoID]; !ok {
236-
repo, err := models.GetRepositoryByID(repoID)
246+
repo, err := models.GetRepositoryByID(rID)
247+
if err != nil {
237248
if models.IsErrRepoNotExist(err) {
238249
ctx.NotFound("GetRepositoryByID", err)
239250
return
240251
} else if err != nil {
241-
ctx.ServerError("GetRepositoryByID", fmt.Errorf("[%d]%v", repoID, err))
252+
ctx.ServerError("GetRepositoryByID", fmt.Errorf("[%d]%v", rID, err))
242253
return
243254
}
244-
showReposMap[repoID] = repo
245255
}
246-
247-
repo := showReposMap[repoID]
256+
showReposMap[rID] = repo
248257

249258
// Check if user has access to given repository.
250259
perm, err := models.GetUserRepoPermission(repo, ctxUser)
251260
if err != nil {
252-
ctx.ServerError("GetUserRepoPermission", fmt.Errorf("[%d]%v", repoID, err))
261+
ctx.ServerError("GetUserRepoPermission", fmt.Errorf("[%d]%v", rID, err))
253262
return
254263
}
264+
255265
if !perm.CanRead(models.UnitTypeIssues) {
256266
if log.IsTrace() {
257267
log.Trace("Permission Denied: User %-v cannot read %-v of repo %-v\n"+
@@ -285,36 +295,41 @@ func Milestones(ctx *context.Context) {
285295
}
286296
}
287297

288-
milestoneStats, err := models.GetMilestonesStats(userRepoIDs)
298+
milestoneStats, err := models.GetMilestonesStats(repoIDs)
289299
if err != nil {
290300
ctx.ServerError("GetMilestoneStats", err)
291301
return
292302
}
293303

294-
var total int
295-
if !isShowClosed {
296-
total = int(milestoneStats.OpenCount)
304+
totalMilestoneStats, err := models.GetMilestonesStats(userRepoIDs)
305+
if err != nil {
306+
ctx.ServerError("GetMilestoneStats", err)
307+
return
308+
}
309+
310+
var pagerCount int
311+
if isShowClosed {
312+
ctx.Data["State"] = "closed"
313+
ctx.Data["Total"] = totalMilestoneStats.ClosedCount
314+
pagerCount = int(milestoneStats.ClosedCount)
297315
} else {
298-
total = int(milestoneStats.ClosedCount)
316+
ctx.Data["State"] = "open"
317+
ctx.Data["Total"] = totalMilestoneStats.OpenCount
318+
pagerCount = int(milestoneStats.OpenCount)
299319
}
300320

301321
ctx.Data["Milestones"] = milestones
302322
ctx.Data["Repos"] = showRepos
303323
ctx.Data["Counts"] = counts
304324
ctx.Data["MilestoneStats"] = milestoneStats
305-
ctx.Data["Total"] = total
306325
ctx.Data["SortType"] = sortType
307-
ctx.Data["RepoID"] = repoID
308-
ctx.Data["IsShowClosed"] = isShowClosed
309-
310-
if isShowClosed {
311-
ctx.Data["State"] = "closed"
312-
} else {
313-
ctx.Data["State"] = "open"
326+
if len(repoIDs) != len(userRepoIDs) {
327+
ctx.Data["RepoIDs"] = repoIDs
314328
}
329+
ctx.Data["IsShowClosed"] = isShowClosed
315330

316-
pager := context.NewPagination(total, setting.UI.IssuePagingNum, page, 5)
317-
pager.AddParam(ctx, "repo", "RepoID")
331+
pager := context.NewPagination(pagerCount, setting.UI.IssuePagingNum, page, 5)
332+
pager.AddParam(ctx, "repos", "RepoIDs")
318333
pager.AddParam(ctx, "sort", "SortType")
319334
pager.AddParam(ctx, "state", "State")
320335
ctx.Data["Page"] = pager

templates/user/dashboard/milestones.tmpl

+28-13
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,35 @@
1111
</a>
1212
<div class="ui divider"></div>
1313
{{range .Repos}}
14-
<a class="{{if eq $.RepoID .ID}}ui basic blue button{{end}} repo name item" href="{{$.Link}}?sort={{$.SortType}}{{if not (eq $.RepoID .ID)}}&repo={{.ID}}{{end}}&state={{$.State}}" title="{{.FullName}}">
15-
<span class="text truncate">{{.FullName}}</span>
16-
<div class="floating ui {{if $.IsShowClosed}}red{{else}}green{{end}} label">{{index $.Counts .ID}}</div>
17-
</a>
14+
{{with $Repo := .}}
15+
<a class="{{range $.RepoIDs}}{{if eq . $Repo.ID}}ui basic blue button{{end}}{{end}} repo name item" href="{{$.Link}}?repos=[
16+
{{with $include := true}}
17+
{{range $.RepoIDs}}
18+
{{if eq . $Repo.ID}}
19+
{{$include = false}}
20+
{{else}}
21+
{{.}}%2C
22+
{{end}}
23+
{{end}}
24+
{{if eq $include true}}
25+
{{$Repo.ID}}%2C
26+
{{end}}
27+
{{end}}
28+
]&sort={{$.SortType}}&state={{$.State}}" title="{{.FullName}}">
29+
<span class="text truncate">{{$Repo.FullName}}</span>
30+
<div class="floating ui {{if $.IsShowClosed}}red{{else}}green{{end}} label">{{index $.Counts $Repo.ID}}</div>
31+
</a>
32+
{{end}}
1833
{{end}}
1934
</div>
2035
</div>
2136
<div class="twelve wide column content">
2237
<div class="ui tiny basic status buttons">
23-
<a class="ui {{if not .IsShowClosed}}green active{{end}} basic button" href="{{.Link}}?repo={{.RepoID}}&sort={{$.SortType}}&state=open">
38+
<a class="ui {{if not .IsShowClosed}}green active{{end}} basic button" href="{{.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state=open">
2439
<i class="octicon octicon-issue-opened"></i>
2540
{{.i18n.Tr "repo.milestones.open_tab" .MilestoneStats.OpenCount}}
2641
</a>
27-
<a class="ui {{if .IsShowClosed}}red active{{end}} basic button" href="{{.Link}}?repo={{.RepoID}}&sort={{$.SortType}}&state=closed">
42+
<a class="ui {{if .IsShowClosed}}red active{{end}} basic button" href="{{.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state=closed">
2843
<i class="octicon octicon-issue-closed"></i>
2944
{{.i18n.Tr "repo.milestones.close_tab" .MilestoneStats.ClosedCount}}
3045
</a>
@@ -37,20 +52,20 @@
3752
<i class="dropdown icon"></i>
3853
</span>
3954
<div class="menu">
40-
<a class="{{if or (eq .SortType "closestduedate") (not .SortType)}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=closestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.closest_due_date"}}</a>
41-
<a class="{{if eq .SortType "furthestduedate"}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=furthestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.furthest_due_date"}}</a>
42-
<a class="{{if eq .SortType "leastcomplete"}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=leastcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_complete"}}</a>
43-
<a class="{{if eq .SortType "mostcomplete"}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=mostcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_complete"}}</a>
44-
<a class="{{if eq .SortType "mostissues"}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=mostissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_issues"}}</a>
45-
<a class="{{if eq .SortType "leastissues"}}active{{end}} item" href="{{$.Link}}?repo={{.RepoID}}&sort=leastissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_issues"}}</a>
55+
<a class="{{if or (eq .SortType "closestduedate") (not .SortType)}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=closestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.closest_due_date"}}</a>
56+
<a class="{{if eq .SortType "furthestduedate"}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=furthestduedate&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.furthest_due_date"}}</a>
57+
<a class="{{if eq .SortType "leastcomplete"}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=leastcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_complete"}}</a>
58+
<a class="{{if eq .SortType "mostcomplete"}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=mostcomplete&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_complete"}}</a>
59+
<a class="{{if eq .SortType "mostissues"}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=mostissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.most_issues"}}</a>
60+
<a class="{{if eq .SortType "leastissues"}}active{{end}} item" href="{{$.Link}}?repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort=leastissues&state={{$.State}}">{{.i18n.Tr "repo.milestones.filter_sort.least_issues"}}</a>
4661
</div>
4762
</div>
4863
</div>
4964

5065
<div class="milestone list">
5166
{{range .Milestones}}
5267
<li class="item">
53-
<div class="ui label">{{if not $.RepoID}}{{.Repo.FullName}}{{end}}</div>
68+
<div class="ui label">{{if not $.RepoIDs}}{{.Repo.FullName}}{{end}}</div>
5469
<i class="octicon octicon-milestone"></i> <a href="{{.Repo.Link }}/milestone/{{.ID}}">{{.Name}}</a>
5570
<div class="ui right green progress" data-percent="{{.Completeness}}">
5671
<div class="bar" {{if not .Completeness}}style="background-color: transparent"{{end}}>

0 commit comments

Comments
 (0)