mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-09 06:55:54 +01:00
Applying new Issues UI to dashboard
This commit is contained in:
@@ -12,7 +12,7 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
self: IssuesService with PullRequestService with RepositoryService with UsersAuthenticator =>
|
self: IssuesService with PullRequestService with RepositoryService with UsersAuthenticator =>
|
||||||
|
|
||||||
get("/dashboard/issues/repos")(usersOnly {
|
get("/dashboard/issues/repos")(usersOnly {
|
||||||
searchIssues("all")
|
searchIssues("created_by")
|
||||||
})
|
})
|
||||||
|
|
||||||
get("/dashboard/issues/assigned")(usersOnly {
|
get("/dashboard/issues/assigned")(usersOnly {
|
||||||
@@ -54,19 +54,12 @@ trait DashboardControllerBase extends ControllerBase {
|
|||||||
val page = IssueSearchCondition.page(request)
|
val page = IssueSearchCondition.page(request)
|
||||||
|
|
||||||
dashboard.html.issues(
|
dashboard.html.issues(
|
||||||
dashboard.html.issueslist(
|
|
||||||
searchIssue(condition, filterUser, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*),
|
searchIssue(condition, filterUser, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*),
|
||||||
page,
|
page,
|
||||||
countIssue(condition.copy(state = "open" ), filterUser, false, userRepos: _*),
|
countIssue(condition.copy(state = "open" ), filterUser, false, userRepos: _*),
|
||||||
countIssue(condition.copy(state = "closed"), filterUser, false, userRepos: _*),
|
countIssue(condition.copy(state = "closed"), filterUser, false, userRepos: _*),
|
||||||
condition),
|
|
||||||
countIssue(condition.copy(assigned = None, author = None), filterUser, false, userRepos: _*),
|
|
||||||
countIssue(condition.copy(assigned = Some(userName), author = None), filterUser, false, userRepos: _*),
|
|
||||||
countIssue(condition.copy(assigned = None, author = Some(userName)), filterUser, false, userRepos: _*),
|
|
||||||
countIssueGroupByRepository(condition, filterUser, false, userRepos: _*),
|
|
||||||
condition,
|
condition,
|
||||||
filter)
|
filter)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private def searchPullRequests(filter: String, repository: Option[String]) = {
|
private def searchPullRequests(filter: String, repository: Option[String]) = {
|
||||||
|
|||||||
@@ -1,50 +1,14 @@
|
|||||||
@(listparts: play.twirl.api.Html,
|
@(issues: List[service.IssuesService.IssueInfo],
|
||||||
allCount: Int,
|
page: Int,
|
||||||
assignedCount: Int,
|
openCount: Int,
|
||||||
createdByCount: Int,
|
closedCount: Int,
|
||||||
repositories: List[(String, String, Int)],
|
|
||||||
condition: service.IssuesService.IssueSearchCondition,
|
condition: service.IssuesService.IssueSearchCondition,
|
||||||
filter: String)(implicit context: app.Context)
|
filter: String)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main("Your Issues"){
|
@html.main("Issues"){
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@dashboard.html.tab("issues")
|
@dashboard.html.tab("issues")
|
||||||
<div class="row-fluid">
|
@issueslist(issues, page, openCount, closedCount, condition, filter)
|
||||||
<div class="span3">
|
|
||||||
<ul class="nav nav-pills nav-stacked">
|
|
||||||
<li@if(filter == "all"){ class="active"}>
|
|
||||||
<a href="@path/dashboard/issues/repos@condition.toURL">
|
|
||||||
<span class="count-right">@allCount</span>
|
|
||||||
In your repositories
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li@if(filter == "assigned"){ class="active"}>
|
|
||||||
<a href="@path/dashboard/issues/assigned@condition.toURL">
|
|
||||||
<span class="count-right">@assignedCount</span>
|
|
||||||
Assigned to you
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li@if(filter == "created_by"){ class="active"}>
|
|
||||||
<a href="@path/dashboard/issues/created_by@condition.toURL">
|
|
||||||
<span class="count-right">@createdByCount</span>
|
|
||||||
Created by you
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<hr/>
|
|
||||||
<ul class="nav nav-pills nav-stacked small">
|
|
||||||
@repositories.map { case (owner, name, count) =>
|
|
||||||
<li@if(condition.repo == Some(owner + "/" + name)){ class="active"}>
|
|
||||||
<a href="@condition.copy(repo = Some(owner + "/" + name)).toURL">
|
|
||||||
<span class="count-right">@count</span>
|
|
||||||
@owner/@name
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
@listparts
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,44 +3,38 @@
|
|||||||
openCount: Int,
|
openCount: Int,
|
||||||
closedCount: Int,
|
closedCount: Int,
|
||||||
condition: service.IssuesService.IssueSearchCondition,
|
condition: service.IssuesService.IssueSearchCondition,
|
||||||
collaborators: List[String] = Nil,
|
filter: String)(implicit context: app.Context)
|
||||||
milestones: List[model.Milestone] = Nil,
|
|
||||||
labels: List[model.Label] = Nil,
|
|
||||||
repository: Option[service.RepositoryService.RepositoryInfo] = None,
|
|
||||||
hasWritePermission: Boolean = false)(implicit context: app.Context)
|
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@import service.IssuesService.IssueInfo
|
@import service.IssuesService.IssueInfo
|
||||||
<div class="span9">
|
<ul class="nav nav-pills-group pull-left fill-width">
|
||||||
@if(condition.labels.nonEmpty || condition.milestoneId.isDefined){
|
<li class="@if(filter == "created_by"){active} first"><a href="@path/dashboard/issues/created_by@condition.toURL">Created</a></li>
|
||||||
<a href="@condition.copy(labels = Set.empty, milestoneId = None).toURL" id="clear-filter">
|
<li class="@if(filter == "assigned"){active} last"><a href="@path/dashboard/issues/assigned@condition.toURL">Assigned</a></li>
|
||||||
<i class="icon-remove-circle"></i> Clear milestone and label filters
|
@*
|
||||||
|
<li class="last"><a href="#">Mentioned</a></li>
|
||||||
|
*@
|
||||||
|
</ul>
|
||||||
|
<table class="table table-bordered table-hover table-issues">
|
||||||
|
<tr>
|
||||||
|
<th style="background-color: #eee;">
|
||||||
|
<span class="small">
|
||||||
|
<a class="button-link@if(condition.state == "open"){ selected}" href="@condition.copy(state = "open").toURL">
|
||||||
|
<img src="@assets/common/images/status-open@(if(condition.state == "open"){"-active"}).png"/>
|
||||||
|
@openCount Open
|
||||||
|
</a>
|
||||||
|
<a class="button-link@if(condition.state == "closed"){ selected}" href="@condition.copy(state = "closed").toURL">
|
||||||
|
<img src="@assets/common/images/status-closed@(if(condition.state == "closed"){"-active"}).png"/>
|
||||||
|
@closedCount Closed
|
||||||
</a>
|
</a>
|
||||||
|
</span>
|
||||||
|
<div class="pull-right" id="table-issues-control">
|
||||||
|
@helper.html.dropdown("Visibility", flat = true){
|
||||||
|
<li>TODO</li>
|
||||||
}
|
}
|
||||||
@if(condition.repo.isDefined){
|
@helper.html.dropdown("Organization", flat = true){
|
||||||
<a href="@condition.copy(repo = None).toURL" id="clear-filter">
|
<li>TODO</li>
|
||||||
<i class="icon-remove-circle"></i> Clear filter on @condition.repo
|
|
||||||
</a>
|
|
||||||
}
|
}
|
||||||
<div class="pull-right">
|
@helper.html.dropdown("Sort", flat = true){
|
||||||
@helper.html.paginator(page, (if(condition.state == "open") openCount else closedCount), service.IssuesService.IssueLimit, 7, condition.toURL)
|
|
||||||
</div>
|
|
||||||
<div class="btn-group">
|
|
||||||
<a class="btn btn-small@if(condition.state == "open"){ active}" href="@condition.copy(state = "open").toURL">@openCount Open</a>
|
|
||||||
<a class="btn btn-small@if(condition.state == "closed"){ active}" href="@condition.copy(state = "closed").toURL">@closedCount Closed</a>
|
|
||||||
</div>
|
|
||||||
@helper.html.dropdown(
|
|
||||||
value = (condition.sort, condition.direction) match {
|
|
||||||
case ("created" , "desc") => "Newest"
|
|
||||||
case ("created" , "asc" ) => "Oldest"
|
|
||||||
case ("comments", "desc") => "Most commented"
|
|
||||||
case ("comments", "asc" ) => "Least commented"
|
|
||||||
case ("updated" , "desc") => "Recently updated"
|
|
||||||
case ("updated" , "asc" ) => "Least recently updated"
|
|
||||||
},
|
|
||||||
prefix = "Sort",
|
|
||||||
mini = false
|
|
||||||
){
|
|
||||||
<li>
|
<li>
|
||||||
<a href="@condition.copy(sort="created", direction="desc").toURL">
|
<a href="@condition.copy(sort="created", direction="desc").toURL">
|
||||||
@helper.html.checkicon(condition.sort == "created" && condition.direction == "desc") Newest
|
@helper.html.checkicon(condition.sort == "created" && condition.direction == "desc") Newest
|
||||||
@@ -72,84 +66,18 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
}
|
}
|
||||||
<table class="table table-bordered table-hover table-issues">
|
|
||||||
@if(issues.isEmpty){
|
|
||||||
<tr>
|
|
||||||
<td style="padding: 20px; background-color: #eee; text-align: center;">
|
|
||||||
No issues to show.
|
|
||||||
@if(condition.labels.nonEmpty || condition.milestoneId.isDefined){
|
|
||||||
<a href="@condition.copy(labels = Set.empty, milestoneId = None).toURL">Clear active filters.</a>
|
|
||||||
} else {
|
|
||||||
@if(repository.isDefined){
|
|
||||||
<a href="@url(repository.get)/issues/new">Create a new issue.</a>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
} else {
|
|
||||||
@if(hasWritePermission){
|
|
||||||
<tr>
|
|
||||||
<td style="background-color: #eee;">
|
|
||||||
<div class="btn-group">
|
|
||||||
<button class="btn btn-mini strong" id="state">@{if(condition.state == "open") "Close" else "Reopen"}</button>
|
|
||||||
</div>
|
</div>
|
||||||
@helper.html.dropdown("Label") {
|
</th>
|
||||||
@labels.map { label =>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:void(0);" class="toggle-label" data-id="@label.labelId">
|
|
||||||
<i class="icon-white"></i>
|
|
||||||
<span class="label" style="background-color: #@label.color;"> </span>
|
|
||||||
@label.labelName
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@helper.html.dropdown("Assignee") {
|
|
||||||
<li><a href="javascript:void(0);" class="toggle-assign" data-name=""><i class="icon-remove-circle"></i> Clear assignee</a></li>
|
|
||||||
@collaborators.map { collaborator =>
|
|
||||||
<li><a href="javascript:void(0);" class="toggle-assign" data-name="@collaborator"><i class="icon-white"></i>@avatar(collaborator, 20) @collaborator</a></li>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@helper.html.dropdown("Milestone") {
|
|
||||||
<li><a href="javascript:void(0);" class="toggle-milestone" data-id=""><i class="icon-remove-circle"></i> Clear this milestone</a></li>
|
|
||||||
@milestones.map { milestone =>
|
|
||||||
<li>
|
|
||||||
<a href="javascript:void(0);" class="toggle-milestone" data-id="@milestone.milestoneId">
|
|
||||||
<i class="icon-white"></i> @milestone.title
|
|
||||||
<div class="small" style="padding-left: 20px;">
|
|
||||||
@milestone.dueDate.map { dueDate =>
|
|
||||||
@if(isPast(dueDate)){
|
|
||||||
<img src="@assets/common/images/alert.png"/><span class="milestone-alert">Due by @date(dueDate)</span>
|
|
||||||
} else {
|
|
||||||
<span class="muted">Due by @date(dueDate)</span>
|
|
||||||
}
|
|
||||||
}.getOrElse {
|
|
||||||
<span class="muted">No due date</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
}
|
|
||||||
}
|
|
||||||
@issues.map { case IssueInfo(issue, labels, milestone, commentCount) =>
|
@issues.map { case IssueInfo(issue, labels, milestone, commentCount) =>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td style="padding-top: 15px; padding-bottom: 15px;">
|
||||||
@if(hasWritePermission){
|
|
||||||
<label class="checkbox" style="cursor: default;">
|
|
||||||
<input type="checkbox" value="@issue.issueId"/>
|
|
||||||
}
|
|
||||||
@if(issue.isPullRequest){
|
@if(issue.isPullRequest){
|
||||||
<img src="@assets/common/images/pullreq-@(if(issue.closed) "closed" else "open").png"/>
|
<img src="@assets/common/images/pullreq-@(if(issue.closed) "closed" else "open").png"/>
|
||||||
} else {
|
} else {
|
||||||
<img src="@assets/common/images/issue-@(if(issue.closed) "closed" else "open").png"/>
|
<img src="@assets/common/images/issue-@(if(issue.closed) "closed" else "open").png"/>
|
||||||
}
|
}
|
||||||
@if(repository.isEmpty){
|
|
||||||
<a href="@path/@issue.userName/@issue.repositoryName">@issue.repositoryName</a> ・
|
<a href="@path/@issue.userName/@issue.repositoryName">@issue.repositoryName</a> ・
|
||||||
}
|
|
||||||
@if(issue.isPullRequest){
|
@if(issue.isPullRequest){
|
||||||
<a href="@path/@issue.userName/@issue.repositoryName/pull/@issue.issueId" class="issue-title">@issue.title</a>
|
<a href="@path/@issue.userName/@issue.repositoryName/pull/@issue.issueId" class="issue-title">@issue.title</a>
|
||||||
} else {
|
} else {
|
||||||
@@ -162,17 +90,22 @@
|
|||||||
@issue.assignedUserName.map { userName =>
|
@issue.assignedUserName.map { userName =>
|
||||||
@avatar(userName, 20, tooltip = true)
|
@avatar(userName, 20, tooltip = true)
|
||||||
}
|
}
|
||||||
#@issue.issueId
|
|
||||||
</span>
|
|
||||||
<div class="small muted" style="margin-left: 20px;">
|
|
||||||
Opened by @user(issue.openedUserName, styleClass="username") @datetime(issue.registeredDate)
|
|
||||||
@if(commentCount > 0){
|
@if(commentCount > 0){
|
||||||
<i class="icon-comment"></i><a href="@path/@issue.userName/@issue.repositoryName/issues/@issue.issueId" class="issue-comment-count">@commentCount @plural(commentCount, "comment")</a>
|
<a href="@path/@issue.userName/@issue.repositoryName/issues/@issue.issueId" class="issue-comment-count">
|
||||||
|
<img src="@assets/common/images/comment-active.png"> @commentCount
|
||||||
|
</a>
|
||||||
|
} else {
|
||||||
|
<a href="@path/@issue.userName/@issue.repositoryName/issues/@issue.issueId" class="issue-comment-count" style="color: silver;">
|
||||||
|
<img src="@assets/common/images/comment.png"> @commentCount
|
||||||
|
</a>
|
||||||
|
}
|
||||||
|
</span>
|
||||||
|
<div class="small muted" style="margin-left: 20px; margin-top: 5px;">
|
||||||
|
#@issue.issueId opened by @user(issue.openedUserName, styleClass="username") @datetime(issue.registeredDate)
|
||||||
|
@milestone.map { milestone =>
|
||||||
|
<span style="margin: 20px;"><a href="@condition.copy(milestoneId = Some(Some(1))).toURL" class="username"><img src="@assets/common/images/milestone.png"> @milestone</a></span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@if(hasWritePermission){
|
|
||||||
</label>
|
|
||||||
}
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
}
|
}
|
||||||
@@ -180,5 +113,3 @@
|
|||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
@helper.html.paginator(page, (if(condition.state == "open") openCount else closedCount), service.IssuesService.IssueLimit, 10, condition.toURL)
|
@helper.html.paginator(page, (if(condition.state == "open") openCount else closedCount), service.IssuesService.IssueLimit, 10, condition.toURL)
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user