mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 02:25:59 +01:00 
			
		
		
		
	(refs #508)Add search filter box to the dashboard
This commit is contained in:
		| @@ -1,8 +1,9 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import service._ | import service._ | ||||||
| import util.{UsersAuthenticator, Keys} | import util.{StringUtil, UsersAuthenticator, Keys} | ||||||
| import util.Implicits._ | import util.Implicits._ | ||||||
|  | import service.IssuesService.IssueSearchCondition | ||||||
|  |  | ||||||
| class DashboardController extends DashboardControllerBase | class DashboardController extends DashboardControllerBase | ||||||
|   with IssuesService with PullRequestService with RepositoryService with AccountService |   with IssuesService with PullRequestService with RepositoryService with AccountService | ||||||
| @@ -12,8 +13,21 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|   self: IssuesService with PullRequestService with RepositoryService with AccountService |   self: IssuesService with PullRequestService with RepositoryService with AccountService | ||||||
|     with UsersAuthenticator => |     with UsersAuthenticator => | ||||||
|  |  | ||||||
|   get("/dashboard/issues/repos")(usersOnly { |   get("/dashboard/issues")(usersOnly { | ||||||
|  |     val q = request.getParameter("q") | ||||||
|  |     val account = context.loginAccount.get | ||||||
|  |     Option(q).map { q => | ||||||
|  |       val condition = IssueSearchCondition(q, Map[String, Int]()) | ||||||
|  |       q match { | ||||||
|  |         case q if(q.contains("is:pr")) => redirect(s"/dashboard/pulls?q=${StringUtil.urlEncode(q)}") | ||||||
|  |         case q if(q.contains(s"author:${account.userName}")) => redirect(s"/dashboard/issues/created_by${condition.toURL}") | ||||||
|  |         case q if(q.contains(s"assignee:${account.userName}")) => redirect(s"/dashboard/issues/assigned${condition.toURL}") | ||||||
|  |         case q if(q.contains(s"mentions:${account.userName}")) => redirect(s"/dashboard/issues/mentioned${condition.toURL}") | ||||||
|  |         case _ => searchIssues("created_by") | ||||||
|  |       } | ||||||
|  |     } getOrElse { | ||||||
|       searchIssues("created_by") |       searchIssues("created_by") | ||||||
|  |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/dashboard/issues/assigned")(usersOnly { |   get("/dashboard/issues/assigned")(usersOnly { | ||||||
| @@ -29,7 +43,20 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/dashboard/pulls")(usersOnly { |   get("/dashboard/pulls")(usersOnly { | ||||||
|  |     val q = request.getParameter("q") | ||||||
|  |     val account = context.loginAccount.get | ||||||
|  |     Option(q).map { q => | ||||||
|  |       val condition = IssueSearchCondition(q, Map[String, Int]()) | ||||||
|  |       q match { | ||||||
|  |         case q if(q.contains("is:issue")) => redirect(s"/dashboard/issues?q=${StringUtil.urlEncode(q)}") | ||||||
|  |         case q if(q.contains(s"author:${account.userName}")) => redirect(s"/dashboard/pulls/created_by${condition.toURL}") | ||||||
|  |         case q if(q.contains(s"assignee:${account.userName}")) => redirect(s"/dashboard/pulls/assigned${condition.toURL}") | ||||||
|  |         case q if(q.contains(s"mentions:${account.userName}")) => redirect(s"/dashboard/pulls/mentioned${condition.toURL}") | ||||||
|  |         case _ => searchPullRequests("created_by") | ||||||
|  |       } | ||||||
|  |     } getOrElse { | ||||||
|       searchPullRequests("created_by") |       searchPullRequests("created_by") | ||||||
|  |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/dashboard/pulls/created_by")(usersOnly { |   get("/dashboard/pulls/created_by")(usersOnly { | ||||||
| @@ -44,15 +71,21 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|     searchPullRequests("mentioned") |     searchPullRequests("mentioned") | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|  |   private def getOrCreateCondition(key: String) = { | ||||||
|  |     session.putAndGet(key, if(request.hasQueryString){ | ||||||
|  |       val q = request.getParameter("q") | ||||||
|  |       if(q == null){ | ||||||
|  |         IssueSearchCondition(request) | ||||||
|  |       } else { | ||||||
|  |         IssueSearchCondition(q, Map[String, Int]()) | ||||||
|  |       } | ||||||
|  |     } else session.getAs[IssueSearchCondition](key).getOrElse(IssueSearchCondition())) | ||||||
|  |   } | ||||||
|  |  | ||||||
|   private def searchIssues(filter: String) = { |   private def searchIssues(filter: String) = { | ||||||
|     import IssuesService._ |     import IssuesService._ | ||||||
|  |  | ||||||
|     // condition |     val condition  = getOrCreateCondition(Keys.Session.DashboardIssues) | ||||||
|     val condition = session.putAndGet(Keys.Session.DashboardIssues, |  | ||||||
|       if(request.hasQueryString) IssueSearchCondition(request) |  | ||||||
|       else session.getAs[IssueSearchCondition](Keys.Session.DashboardIssues).getOrElse(IssueSearchCondition()) |  | ||||||
|     ) |  | ||||||
|  |  | ||||||
|     val userName   = context.loginAccount.get.userName |     val userName   = context.loginAccount.get.userName | ||||||
|     val userRepos  = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name) |     val userRepos  = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name) | ||||||
|     val filterUser = Map(filter -> userName) |     val filterUser = Map(filter -> userName) | ||||||
| @@ -63,7 +96,11 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|       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, |       filter match { | ||||||
|  |         case "assigned"  => condition.copy(assigned  = Some(userName)) | ||||||
|  |         case "mentioned" => condition.copy(mentioned = Some(userName)) | ||||||
|  |         case _           => condition.copy(author    = Some(userName)) | ||||||
|  |       }, | ||||||
|       filter, |       filter, | ||||||
|       getGroupNames(userName)) |       getGroupNames(userName)) | ||||||
|   } |   } | ||||||
| @@ -72,12 +109,7 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|     import IssuesService._ |     import IssuesService._ | ||||||
|     import PullRequestService._ |     import PullRequestService._ | ||||||
|  |  | ||||||
|     // condition |     val condition  = getOrCreateCondition(Keys.Session.DashboardPulls) | ||||||
|     val condition = session.putAndGet(Keys.Session.DashboardPulls, { |  | ||||||
|       if(request.hasQueryString) IssueSearchCondition(request) |  | ||||||
|       else session.getAs[IssueSearchCondition](Keys.Session.DashboardPulls).getOrElse(IssueSearchCondition()) |  | ||||||
|     }) |  | ||||||
|  |  | ||||||
|     val userName   = context.loginAccount.get.userName |     val userName   = context.loginAccount.get.userName | ||||||
|     val allRepos   = getAllRepositories(userName) |     val allRepos   = getAllRepositories(userName) | ||||||
|     val filterUser = Map(filter -> userName) |     val filterUser = Map(filter -> userName) | ||||||
| @@ -88,7 +120,11 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|       page, |       page, | ||||||
|       countIssue(condition.copy(state = "open"  ), filterUser, true, allRepos: _*), |       countIssue(condition.copy(state = "open"  ), filterUser, true, allRepos: _*), | ||||||
|       countIssue(condition.copy(state = "closed"), filterUser, true, allRepos: _*), |       countIssue(condition.copy(state = "closed"), filterUser, true, allRepos: _*), | ||||||
|       condition, |       filter match { | ||||||
|  |         case "assigned"  => condition.copy(assigned  = Some(userName)) | ||||||
|  |         case "mentioned" => condition.copy(mentioned = Some(userName)) | ||||||
|  |         case _           => condition.copy(author    = Some(userName)) | ||||||
|  |       }, | ||||||
|       filter, |       filter, | ||||||
|       getGroupNames(userName)) |       getGroupNames(userName)) | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -401,8 +401,7 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|           } else { |           } else { | ||||||
|             IssueSearchCondition(q, getMilestones(owner, repoName).map(x => (x.title, x.milestoneId)).toMap) |             IssueSearchCondition(q, getMilestones(owner, repoName).map(x => (x.title, x.milestoneId)).toMap) | ||||||
|           } |           } | ||||||
|         } |         } else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) | ||||||
|         else session.getAs[IssueSearchCondition](sessionKey).getOrElse(IssueSearchCondition()) |  | ||||||
|       ) |       ) | ||||||
|  |  | ||||||
|       issues.html.list( |       issues.html.list( | ||||||
|   | |||||||
| @@ -326,6 +326,7 @@ object IssuesService { | |||||||
|       milestoneId: Option[Option[Int]] = None, |       milestoneId: Option[Option[Int]] = None, | ||||||
|       author: Option[String] = None, |       author: Option[String] = None, | ||||||
|       assigned: Option[String] = None, |       assigned: Option[String] = None, | ||||||
|  |       mentioned: Option[String] = None, | ||||||
|       state: String = "open", |       state: String = "open", | ||||||
|       sort: String = "created", |       sort: String = "created", | ||||||
|       direction: String = "desc", |       direction: String = "desc", | ||||||
| @@ -339,12 +340,14 @@ object IssuesService { | |||||||
|  |  | ||||||
|     def nonEmpty: Boolean = !isEmpty |     def nonEmpty: Boolean = !isEmpty | ||||||
|  |  | ||||||
|     def toFilterString: String = |     def toFilterString: String = ( | ||||||
|       (List( |       List( | ||||||
|         Some(s"is:${state}"), |         Some(s"is:${state}"), | ||||||
|         author.map(author => s"author:${author}"), |         author.map(author => s"author:${author}"), | ||||||
|         assigned.map(assignee => s"assignee:${assignee}") |         assigned.map(assignee => s"assignee:${assignee}"), | ||||||
|       ).flatten ++ labels.map(label => s"label:${label}") ++ |         mentioned.map(mentioned => s"mentions:${mentioned}") | ||||||
|  |       ).flatten ++ | ||||||
|  |       labels.map(label => s"label:${label}") ++ | ||||||
|       List( |       List( | ||||||
|         milestoneId.map { _ match { |         milestoneId.map { _ match { | ||||||
|           case Some(x) => s"milestone:${milestoneId}" |           case Some(x) => s"milestone:${milestoneId}" | ||||||
| @@ -357,8 +360,11 @@ object IssuesService { | |||||||
|           case ("comments", "asc" ) => Some("sort:comments-asc") |           case ("comments", "asc" ) => Some("sort:comments-asc") | ||||||
|           case ("updated" , "desc") => Some("sort:updated-desc") |           case ("updated" , "desc") => Some("sort:updated-desc") | ||||||
|           case ("updated" , "asc" ) => Some("sort:updated-asc") |           case ("updated" , "asc" ) => Some("sort:updated-asc") | ||||||
|         } |         }, | ||||||
|       ).flatten).mkString(" ") |         visibility.map(visibility => s"visibility:${visibility}") | ||||||
|  |       ).flatten ++ | ||||||
|  |       groups.map(group => s"group:${group}") | ||||||
|  |     ).mkString(" ") | ||||||
|  |  | ||||||
|     def toURL: String = |     def toURL: String = | ||||||
|       "?" + List( |       "?" + List( | ||||||
| @@ -410,15 +416,16 @@ object IssuesService { | |||||||
|         conditions.get("milestone").flatMap(_.headOption) match { |         conditions.get("milestone").flatMap(_.headOption) match { | ||||||
|           case None         => None |           case None         => None | ||||||
|           case Some("none") => Some(None) |           case Some("none") => Some(None) | ||||||
|           case Some(x)      => Some(milestones.get(x)) |           case Some(x)      => milestones.get(x).map(x => Some(x)) | ||||||
|         }, |         }, | ||||||
|         conditions.get("author").flatMap(_.headOption), |         conditions.get("author").flatMap(_.headOption), | ||||||
|         conditions.get("assignee").flatMap(_.headOption), |         conditions.get("assignee").flatMap(_.headOption), | ||||||
|  |         None, | ||||||
|         conditions.get("is").getOrElse(Seq.empty).filter(x => x == "open" || x == "closed").headOption.getOrElse("open"), |         conditions.get("is").getOrElse(Seq.empty).filter(x => x == "open" || x == "closed").headOption.getOrElse("open"), | ||||||
|         sort, |         sort, | ||||||
|         direction, |         direction, | ||||||
|         None, // TODO?? |         conditions.get("visibility").flatMap(_.headOption), | ||||||
|         Set.empty // TODO?? |         conditions.get("group").map(_.toSet).getOrElse(Set.empty) | ||||||
|       ) |       ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -434,6 +441,7 @@ object IssuesService { | |||||||
|         }, |         }, | ||||||
|         param(request, "author"), |         param(request, "author"), | ||||||
|         param(request, "assigned"), |         param(request, "assigned"), | ||||||
|  |         None, | ||||||
|         param(request, "state",     Seq("open", "closed")).getOrElse("open"), |         param(request, "state",     Seq("open", "closed")).getOrElse("open"), | ||||||
|         param(request, "sort",      Seq("created", "comments", "updated")).getOrElse("created"), |         param(request, "sort",      Seq("created", "comments", "updated")).getOrElse("created"), | ||||||
|         param(request, "direction", Seq("asc", "desc")).getOrElse("desc"), |         param(request, "direction", Seq("asc", "desc")).getOrElse("desc"), | ||||||
|   | |||||||
| @@ -10,6 +10,7 @@ | |||||||
| @html.main("Issues"){ | @html.main("Issues"){ | ||||||
|   @dashboard.html.tab("issues") |   @dashboard.html.tab("issues") | ||||||
|   <div class="container"> |   <div class="container"> | ||||||
|  |     @issuesnavi(filter, "issues", condition) | ||||||
|     @issueslist(issues, page, openCount, closedCount, condition, filter, groups) |     @issueslist(issues, page, openCount, closedCount, condition, filter, groups) | ||||||
|   </div> |   </div> | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,11 +8,13 @@ | |||||||
| @import context._ | @import context._ | ||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @import service.IssuesService.IssueInfo | @import service.IssuesService.IssueInfo | ||||||
|  | @* | ||||||
| <ul class="nav nav-pills-group pull-left fill-width"> | <ul class="nav nav-pills-group pull-left fill-width"> | ||||||
|   <li class="@if(filter == "created_by"){active} first"><a href="@path/dashboard/issues/created_by@condition.toURL">Created</a></li> |   <li class="@if(filter == "created_by"){active} first"><a href="@path/dashboard/issues/created_by@condition.toURL">Created</a></li> | ||||||
|   <li class="@if(filter == "assigned"){active}"><a href="@path/dashboard/issues/assigned@condition.toURL">Assigned</a></li> |   <li class="@if(filter == "assigned"){active}"><a href="@path/dashboard/issues/assigned@condition.toURL">Assigned</a></li> | ||||||
|   <li class="@if(filter == "mentioned"){active} last"><a href="@path/dashboard/issues/mentioned@condition.toURL">Mentioned</a></li> |   <li class="@if(filter == "mentioned"){active} last"><a href="@path/dashboard/issues/mentioned@condition.toURL">Mentioned</a></li> | ||||||
| </ul> | </ul> | ||||||
|  | *@ | ||||||
| <table class="table table-bordered table-hover table-issues"> | <table class="table table-bordered table-hover table-issues"> | ||||||
|   <tr> |   <tr> | ||||||
|     <th style="background-color: #eee;"> |     <th style="background-color: #eee;"> | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								src/main/twirl/dashboard/issuesnavi.scala.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								src/main/twirl/dashboard/issuesnavi.scala.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | @(filter: String, | ||||||
|  |   active: String, | ||||||
|  |   condition: service.IssuesService.IssueSearchCondition)(implicit context: app.Context) | ||||||
|  | @import context._ | ||||||
|  | @import view.helpers._ | ||||||
|  | <ul class="nav nav-pills-group pull-left fill-width"> | ||||||
|  |   <li class="@if(filter == "created_by"){active} first"> | ||||||
|  |     <a href="@path/dashboard/@active/created_by@condition.copy(author = None, assigned = None).toURL">Created</a> | ||||||
|  |   </li> | ||||||
|  |   <li class="@if(filter == "assigned"){active}"> | ||||||
|  |     <a href="@path/dashboard/@active/assigned@condition.copy(author = None, assigned = None).toURL">Assigned</a> | ||||||
|  |   </li> | ||||||
|  |   <li class="@if(filter == "mentioned"){active} last"> | ||||||
|  |     <a href="@path/dashboard/@active/mentioned@condition.copy(author = None, assigned = None).toURL">Mentioned</a> | ||||||
|  |   </li> | ||||||
|  |   <li class="pull-right"> | ||||||
|  |     <form method="GET" id="search-filter-form" action="@path/dashboard/@active" style="margin-bottom: 0px;"> | ||||||
|  |       <input type="text" id="search-filter-box" class="input-xlarge" name="q" style="height: 24px;" | ||||||
|  |              value="is:@{if(active == "issues") "issue" else "pr"} @condition.toFilterString"/> | ||||||
|  |     </form> | ||||||
|  |   </li> | ||||||
|  | </ul> | ||||||
| @@ -10,6 +10,7 @@ | |||||||
| @html.main("Pull Requests"){ | @html.main("Pull Requests"){ | ||||||
|   @dashboard.html.tab("pulls") |   @dashboard.html.tab("pulls") | ||||||
|   <div class="container"> |   <div class="container"> | ||||||
|  |     @issuesnavi(filter, "pulls", condition) | ||||||
|     @pullslist(issues, page, openCount, closedCount, condition, filter, groups) |     @pullslist(issues, page, openCount, closedCount, condition, filter, groups) | ||||||
|   </div> |   </div> | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,11 +8,31 @@ | |||||||
| @import context._ | @import context._ | ||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @import service.IssuesService.IssueInfo | @import service.IssuesService.IssueInfo | ||||||
|  | @* | ||||||
| <ul class="nav nav-pills-group pull-left fill-width"> | <ul class="nav nav-pills-group pull-left fill-width"> | ||||||
|   <li class="@if(filter == "created_by"){active} first"><a href="@path/dashboard/pulls/created_by@condition.toURL">Created</a></li> |   <li class="@if(filter == "created_by"){active} first"><a href="@path/dashboard/pulls/created_by@condition.toURL">Created</a></li> | ||||||
|   <li class="@if(filter == "assigned"){active}"><a href="@path/dashboard/pulls/assigned@condition.toURL">Assigned</a></li> |   <li class="@if(filter == "assigned"){active}"><a href="@path/dashboard/pulls/assigned@condition.toURL">Assigned</a></li> | ||||||
|   <li class="@if(filter == "mentioned"){active} last"><a href="@path/dashboard/pulls/mentioned@condition.toURL">Mentioned</a></li> |   <li class="@if(filter == "mentioned"){active} last"><a href="@path/dashboard/pulls/mentioned@condition.toURL">Mentioned</a></li> | ||||||
|  |   <li class="pull-right"> | ||||||
|  |     <div class="input-prepend" style="margin-bottom: 0px;"> | ||||||
|  |       <div class="btn-group"> | ||||||
|  |         <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" style="height: 34px;"> | ||||||
|  |           Filter | ||||||
|  |           <span class="caret"></span> | ||||||
|  |         </button> | ||||||
|  |         <ul class="dropdown-menu"> | ||||||
|  |           <li><a href="?q=is:open">Open issues and pull requests</a></li> | ||||||
|  |           <li><a href="?q=is:open+is:issue+author:@urlEncode(loginAccount.get.userName)">Your issues</a></li> | ||||||
|  |           <li><a href="?q=is:open+is:pr+author:@urlEncode(loginAccount.get.userName)">Your pull requests</a></li> | ||||||
|  |           <li><a href="?q=is:open+assignee:@urlEncode(loginAccount.get.userName)">Everything assigned to you</a></li> | ||||||
|  |           <li><a href="?q=is:open+mentions:@urlEncode(loginAccount.get.userName)">Everything mentioning you</a></li> | ||||||
|  |         </ul> | ||||||
|  |       </div> | ||||||
|  |       <input type="text" id="search-filter-box" class="input-xlarge" name="q" style="height: 24px;" value="is:@{if(active == "issues") "issue" else "pr"} @condition.toFilterString"/> | ||||||
|  |     </div> | ||||||
|  |   </li> | ||||||
| </ul> | </ul> | ||||||
|  | *@ | ||||||
| <table class="table table-bordered table-hover table-issues"> | <table class="table table-bordered table-hover table-issues"> | ||||||
|   <tr> |   <tr> | ||||||
|     <th style="background-color: #eee;"> |     <th style="background-color: #eee;"> | ||||||
|   | |||||||
| @@ -12,7 +12,7 @@ | |||||||
|         <img src="@assets/common/images/menu-pulls.png"> |         <img src="@assets/common/images/menu-pulls.png"> | ||||||
|         Pull Requests |         Pull Requests | ||||||
|       </a> |       </a> | ||||||
|       <a href="@path/dashboard/issues/repos" @if(active == "issues"){ class="active"}> |       <a href="@path/dashboard/issues" @if(active == "issues"){ class="active"}> | ||||||
|         <img src="@assets/common/images/menu-issues.png"> |         <img src="@assets/common/images/menu-issues.png"> | ||||||
|         Issues |         Issues | ||||||
|       </a> |       </a> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @html.main(s"New Issue - ${repository.owner}/${repository.name}", Some(repository)){ | @html.main(s"New Issue - ${repository.owner}/${repository.name}", Some(repository)){ | ||||||
|   @html.menu("issues", repository){ |   @html.menu("issues", repository){ | ||||||
|     @tab("issues", false, repository) |     @navigation("issues", false, repository) | ||||||
|     <br/><br/><hr style="margin-bottom: 10px;"> |     <br/><br/><hr style="margin-bottom: 10px;"> | ||||||
|     <form action="@url(repository)/issues/new" method="POST" validate="true"> |     <form action="@url(repository)/issues/new" method="POST" validate="true"> | ||||||
|     <div class="row-fluid"> |     <div class="row-fluid"> | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @html.main(s"Labels - ${repository.owner}/${repository.name}"){ | @html.main(s"Labels - ${repository.owner}/${repository.name}"){ | ||||||
|   @html.menu("issues", repository){ |   @html.menu("issues", repository){ | ||||||
|     @issues.html.tab("labels", hasWritePermission, repository) |     @issues.html.navigation("labels", hasWritePermission, repository) | ||||||
|     <br> |     <br> | ||||||
|     <table class="table table-bordered table-hover table-issues" id="new-label-table" style="display: none;"> |     <table class="table table-bordered table-hover table-issues" id="new-label-table" style="display: none;"> | ||||||
|       <tr><td></td></tr> |       <tr><td></td></tr> | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @html.main((if(target == "issues") "Issues" else "Pull requests") + s" - ${repository.owner}/${repository.name}", Some(repository)){ | @html.main((if(target == "issues") "Issues" else "Pull requests") + s" - ${repository.owner}/${repository.name}", Some(repository)){ | ||||||
|   @html.menu(target, repository){ |   @html.menu(target, repository){ | ||||||
|     @tab(target, true, repository, Some(condition)) |     @navigation(target, true, repository, Some(condition)) | ||||||
|     @listparts(target, issues, page, openCount, closedCount, condition, collaborators, milestones, labels, Some(repository), hasWritePermission) |     @listparts(target, issues, page, openCount, closedCount, condition, collaborators, milestones, labels, Some(repository), hasWritePermission) | ||||||
|     @if(hasWritePermission){ |     @if(hasWritePermission){ | ||||||
|       <form id="batcheditForm" method="POST"> |       <form id="batcheditForm" method="POST"> | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ | |||||||
|       <h4>New milestone</h4> |       <h4>New milestone</h4> | ||||||
|       <div class="muted">Create a new milestone to help organize your issues and pull requests.</div> |       <div class="muted">Create a new milestone to help organize your issues and pull requests.</div> | ||||||
|     } else { |     } else { | ||||||
|       @issues.html.tab("milestones", false, repository) |       @issues.html.navigation("milestones", false, repository) | ||||||
|       <br><br> |       <br><br> | ||||||
|     } |     } | ||||||
|     <hr style="margin-top: 12px; margin-bottom: 18px;" class="fill-width"/> |     <hr style="margin-top: 12px; margin-bottom: 18px;" class="fill-width"/> | ||||||
|   | |||||||
| @@ -6,7 +6,7 @@ | |||||||
| @import view.helpers._ | @import view.helpers._ | ||||||
| @html.main(s"Milestones - ${repository.owner}/${repository.name}"){ | @html.main(s"Milestones - ${repository.owner}/${repository.name}"){ | ||||||
|   @html.menu("issues", repository){ |   @html.menu("issues", repository){ | ||||||
|     @issues.html.tab("milestones", hasWritePermission, repository) |     @issues.html.navigation("milestones", hasWritePermission, repository) | ||||||
|     <br> |     <br> | ||||||
|     <table class="table table-bordered table-hover table-issues"> |     <table class="table table-bordered table-hover table-issues"> | ||||||
|       <tr> |       <tr> | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								src/main/twirl/issues/navigation.scala.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/main/twirl/issues/navigation.scala.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | @(active: String, | ||||||
|  |   newButton: Boolean, | ||||||
|  |   repository: service.RepositoryService.RepositoryInfo, | ||||||
|  |   condition: Option[service.IssuesService.IssueSearchCondition] = None)(implicit context: app.Context) | ||||||
|  | @import context._ | ||||||
|  | @import view.helpers._ | ||||||
|  | <ul class="nav nav-pills-group  pull-left fill-width"> | ||||||
|  |   <li class="@if(active == "issues"    ){active} first"><a href="@url(repository)/issues">Issues</a></li> | ||||||
|  |   <li class="@if(active == "pulls"     ){active}"><a href="@url(repository)/pulls">Pull requests</a></li> | ||||||
|  |   <li class="@if(active == "labels"    ){active}"><a href="@url(repository)/issues/labels">Labels</a></li> | ||||||
|  |   <li class="@if(active == "milestones"){active} last"><a href="@url(repository)/issues/milestones">Milestones</a></li> | ||||||
|  |   <li class="pull-right"> | ||||||
|  |     <form method="GET" id="search-filter-form" style="margin-bottom: 0px;"> | ||||||
|  |       @condition.map { condition => | ||||||
|  |         @if(loginAccount.isDefined){ | ||||||
|  |           <div class="input-prepend" style="margin-bottom: 0px;"> | ||||||
|  |             <div class="btn-group"> | ||||||
|  |               <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" style="height: 34px;"> | ||||||
|  |                 Filter | ||||||
|  |                 <span class="caret"></span> | ||||||
|  |               </button> | ||||||
|  |               <ul class="dropdown-menu"> | ||||||
|  |                 <li><a href="?q=is:open">Open issues and pull requests</a></li> | ||||||
|  |                 <li><a href="?q=is:open+is:issue+author:@urlEncode(loginAccount.get.userName)">Your issues</a></li> | ||||||
|  |                 <li><a href="?q=is:open+is:pr+author:@urlEncode(loginAccount.get.userName)">Your pull requests</a></li> | ||||||
|  |                 <li><a href="?q=is:open+assignee:@urlEncode(loginAccount.get.userName)">Everything assigned to you</a></li> | ||||||
|  |                 @* | ||||||
|  |                 <li><a href="?q=is:open+mentions:@urlEncode(loginAccount.get.userName)">Everything mentioning you</a></li> | ||||||
|  |                 *@ | ||||||
|  |               </ul> | ||||||
|  |             </div> | ||||||
|  |             <input type="text" id="search-filter-box" class="input-xlarge" name="q" style="height: 24px;" value="is:@{if(active == "issues") "issue" else "pr"} @condition.toFilterString"/> | ||||||
|  |           </div> | ||||||
|  |         } else { | ||||||
|  |           <input type="text" id="search-filter-box" class="input-xlarge" name="q" style="height: 24px;" value="is:@{if(active == "issues") "issue" else "pr"} @condition.toFilterString"/> | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |       @if(loginAccount.isDefined){ | ||||||
|  |         <div class="btn-group"> | ||||||
|  |           @if(newButton){ | ||||||
|  |             @if(active == "issues"){ | ||||||
|  |               <a class="btn btn-success" href="@url(repository)/issues/new" style="height: 24px;">New issue</a> | ||||||
|  |             } | ||||||
|  |             @if(active == "pulls"){ | ||||||
|  |               <a class="btn btn-success" href="@url(repository)/compare" style="height: 24px;">New pull request</a> | ||||||
|  |             } | ||||||
|  |             @if(active == "labels"){ | ||||||
|  |               <a class="btn btn-success" href="javascript:void(0);" id="new-label-button" style="height: 24px;">New label</a> | ||||||
|  |             } | ||||||
|  |             @if(active == "milestones"){ | ||||||
|  |               <a class="btn btn-success" href="@url(repository)/issues/milestones/new" style="height: 24px;">New milestone</a> | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |         </div> | ||||||
|  |       } | ||||||
|  |     </form> | ||||||
|  |   </li> | ||||||
|  | </ul> | ||||||
| @@ -1,52 +0,0 @@ | |||||||
| @(active: String, |  | ||||||
|   newButton: Boolean, |  | ||||||
|   repository: service.RepositoryService.RepositoryInfo, |  | ||||||
|   condition: Option[service.IssuesService.IssueSearchCondition] = None)(implicit context: app.Context) |  | ||||||
| @import context._ |  | ||||||
| @import view.helpers._ |  | ||||||
| <ul class="nav nav-pills-group  pull-left fill-width"> |  | ||||||
|   <li class="@if(active == "issues"    ){active} first"><a href="@url(repository)/issues">Issues</a></li> |  | ||||||
|   <li class="@if(active == "pulls"     ){active}"><a href="@url(repository)/pulls">Pull requests</a></li> |  | ||||||
|   <li class="@if(active == "labels"    ){active}"><a href="@url(repository)/issues/labels">Labels</a></li> |  | ||||||
|   <li class="@if(active == "milestones"){active} last"><a href="@url(repository)/issues/milestones">Milestones</a></li> |  | ||||||
|   <li class="pull-right"> |  | ||||||
|     @condition.map { condition => |  | ||||||
|       <form method="GET" id="search-filter-form"> |  | ||||||
|         <div class="input-prepend" style="margin-bottom: 0px;"> |  | ||||||
|           <div class="btn-group"> |  | ||||||
|             <button type="button" class="btn dropdown-toggle" data-toggle="dropdown" style="height: 34px;"> |  | ||||||
|               Filter |  | ||||||
|               <span class="caret"></span> |  | ||||||
|             </button> |  | ||||||
|             <ul class="dropdown-menu"> |  | ||||||
|               <li><a href="#">Open issues and pull requests</a></li> |  | ||||||
|               <li><a href="#">Your issues</a></li> |  | ||||||
|               <li><a href="#">Your pull requests</a></li> |  | ||||||
|               <li><a href="#">Everything assigned to you</a></li> |  | ||||||
|               <li><a href="#">Everything mentioning you</a></li> |  | ||||||
|             </ul> |  | ||||||
|           </div> |  | ||||||
|           <input type="text" id="search-filter-box" class="input-xlarge" name="q" style="height: 24px;" value="is:@{if(active == "issues") "issue" else "pr"} @condition.toFilterString"/> |  | ||||||
|         </div> |  | ||||||
|       </form> |  | ||||||
|     } |  | ||||||
|     @if(loginAccount.isDefined){ |  | ||||||
|       <div class="btn-group"> |  | ||||||
|         @if(newButton){ |  | ||||||
|           @if(active == "issues"){ |  | ||||||
|             <a class="btn btn-success" href="@url(repository)/issues/new" style="height: 24px;">New issue</a> |  | ||||||
|           } |  | ||||||
|           @if(active == "pulls"){ |  | ||||||
|             <a class="btn btn-success" href="@url(repository)/compare" style="height: 24px;">New pull request</a> |  | ||||||
|           } |  | ||||||
|           @if(active == "labels"){ |  | ||||||
|             <a class="btn btn-success" href="javascript:void(0);" id="new-label-button" style="height: 24px;">New label</a> |  | ||||||
|           } |  | ||||||
|           @if(active == "milestones"){ |  | ||||||
|             <a class="btn btn-success" href="@url(repository)/issues/milestones/new" style="height: 24px;">New milestone</a> |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|       </div> |  | ||||||
|     } |  | ||||||
|   </li> |  | ||||||
| </ul> |  | ||||||
		Reference in New Issue
	
	Block a user