diff --git a/src/main/scala/app/DashboardController.scala b/src/main/scala/app/DashboardController.scala index 9798298..ef2c906 100644 --- a/src/main/scala/app/DashboardController.scala +++ b/src/main/scala/app/DashboardController.scala @@ -1,8 +1,9 @@ package app import service._ -import util.{UsersAuthenticator, Keys} +import util.{StringUtil, UsersAuthenticator, Keys} import util.Implicits._ +import service.IssuesService.IssueSearchCondition class DashboardController extends DashboardControllerBase with IssuesService with PullRequestService with RepositoryService with AccountService @@ -12,8 +13,21 @@ self: IssuesService with PullRequestService with RepositoryService with AccountService with UsersAuthenticator => - get("/dashboard/issues/repos")(usersOnly { - searchIssues("created_by") + 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") + } }) get("/dashboard/issues/assigned")(usersOnly { @@ -29,7 +43,20 @@ }) get("/dashboard/pulls")(usersOnly { - searchPullRequests("created_by") + 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") + } }) get("/dashboard/pulls/created_by")(usersOnly { @@ -44,15 +71,21 @@ 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) = { import IssuesService._ - // condition - val condition = session.putAndGet(Keys.Session.DashboardIssues, - if(request.hasQueryString) IssueSearchCondition(request) - else session.getAs[IssueSearchCondition](Keys.Session.DashboardIssues).getOrElse(IssueSearchCondition()) - ) - + val condition = getOrCreateCondition(Keys.Session.DashboardIssues) val userName = context.loginAccount.get.userName val userRepos = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name) val filterUser = Map(filter -> userName) @@ -63,7 +96,11 @@ page, countIssue(condition.copy(state = "open" ), 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, getGroupNames(userName)) } @@ -72,12 +109,7 @@ import IssuesService._ import PullRequestService._ - // condition - val condition = session.putAndGet(Keys.Session.DashboardPulls, { - if(request.hasQueryString) IssueSearchCondition(request) - else session.getAs[IssueSearchCondition](Keys.Session.DashboardPulls).getOrElse(IssueSearchCondition()) - }) - + val condition = getOrCreateCondition(Keys.Session.DashboardPulls) val userName = context.loginAccount.get.userName val allRepos = getAllRepositories(userName) val filterUser = Map(filter -> userName) @@ -88,7 +120,11 @@ page, countIssue(condition.copy(state = "open" ), 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, getGroupNames(userName)) } diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 892c15a..5442371 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -401,8 +401,7 @@ } else { 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( diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index 08a5ea2..e86c243 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -326,6 +326,7 @@ milestoneId: Option[Option[Int]] = None, author: Option[String] = None, assigned: Option[String] = None, + mentioned: Option[String] = None, state: String = "open", sort: String = "created", direction: String = "desc", @@ -339,12 +340,14 @@ def nonEmpty: Boolean = !isEmpty - def toFilterString: String = - (List( + def toFilterString: String = ( + List( Some(s"is:${state}"), author.map(author => s"author:${author}"), - assigned.map(assignee => s"assignee:${assignee}") - ).flatten ++ labels.map(label => s"label:${label}") ++ + assigned.map(assignee => s"assignee:${assignee}"), + mentioned.map(mentioned => s"mentions:${mentioned}") + ).flatten ++ + labels.map(label => s"label:${label}") ++ List( milestoneId.map { _ match { case Some(x) => s"milestone:${milestoneId}" @@ -357,8 +360,11 @@ case ("comments", "asc" ) => Some("sort:comments-asc") case ("updated" , "desc") => Some("sort:updated-desc") 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 = "?" + List( @@ -410,15 +416,16 @@ conditions.get("milestone").flatMap(_.headOption) match { case None => 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("assignee").flatMap(_.headOption), + None, conditions.get("is").getOrElse(Seq.empty).filter(x => x == "open" || x == "closed").headOption.getOrElse("open"), sort, direction, - None, // TODO?? - Set.empty // TODO?? + conditions.get("visibility").flatMap(_.headOption), + conditions.get("group").map(_.toSet).getOrElse(Set.empty) ) } @@ -434,6 +441,7 @@ }, param(request, "author"), param(request, "assigned"), + None, param(request, "state", Seq("open", "closed")).getOrElse("open"), param(request, "sort", Seq("created", "comments", "updated")).getOrElse("created"), param(request, "direction", Seq("asc", "desc")).getOrElse("desc"), diff --git a/src/main/twirl/dashboard/issues.scala.html b/src/main/twirl/dashboard/issues.scala.html index 16e3564..898ac6b 100644 --- a/src/main/twirl/dashboard/issues.scala.html +++ b/src/main/twirl/dashboard/issues.scala.html @@ -10,6 +10,7 @@ @html.main("Issues"){ @dashboard.html.tab("issues")
+ @issuesnavi(filter, "issues", condition) @issueslist(issues, page, openCount, closedCount, condition, filter, groups)
} diff --git a/src/main/twirl/dashboard/issueslist.scala.html b/src/main/twirl/dashboard/issueslist.scala.html index 79c5517..16840b7 100644 --- a/src/main/twirl/dashboard/issueslist.scala.html +++ b/src/main/twirl/dashboard/issueslist.scala.html @@ -8,11 +8,13 @@ @import context._ @import view.helpers._ @import service.IssuesService.IssueInfo +@* +*@
diff --git a/src/main/twirl/dashboard/issuesnavi.scala.html b/src/main/twirl/dashboard/issuesnavi.scala.html new file mode 100644 index 0000000..7a8bf35 --- /dev/null +++ b/src/main/twirl/dashboard/issuesnavi.scala.html @@ -0,0 +1,22 @@ +@(filter: String, + active: String, + condition: service.IssuesService.IssueSearchCondition)(implicit context: app.Context) +@import context._ +@import view.helpers._ + diff --git a/src/main/twirl/dashboard/pulls.scala.html b/src/main/twirl/dashboard/pulls.scala.html index 1052f8e..0e2eff6 100644 --- a/src/main/twirl/dashboard/pulls.scala.html +++ b/src/main/twirl/dashboard/pulls.scala.html @@ -10,6 +10,7 @@ @html.main("Pull Requests"){ @dashboard.html.tab("pulls")
+ @issuesnavi(filter, "pulls", condition) @pullslist(issues, page, openCount, closedCount, condition, filter, groups)
} diff --git a/src/main/twirl/dashboard/pullslist.scala.html b/src/main/twirl/dashboard/pullslist.scala.html index fbddac5..1208816 100644 --- a/src/main/twirl/dashboard/pullslist.scala.html +++ b/src/main/twirl/dashboard/pullslist.scala.html @@ -8,11 +8,31 @@ @import context._ @import view.helpers._ @import service.IssuesService.IssueInfo +@* +*@
diff --git a/src/main/twirl/dashboard/tab.scala.html b/src/main/twirl/dashboard/tab.scala.html index aca044f..3cb3bf0 100644 --- a/src/main/twirl/dashboard/tab.scala.html +++ b/src/main/twirl/dashboard/tab.scala.html @@ -12,7 +12,7 @@ Pull Requests - + Issues diff --git a/src/main/twirl/issues/create.scala.html b/src/main/twirl/issues/create.scala.html index 7080667..4062651 100644 --- a/src/main/twirl/issues/create.scala.html +++ b/src/main/twirl/issues/create.scala.html @@ -7,7 +7,7 @@ @import view.helpers._ @html.main(s"New Issue - ${repository.owner}/${repository.name}", Some(repository)){ @html.menu("issues", repository){ - @tab("issues", false, repository) + @navigation("issues", false, repository)


diff --git a/src/main/twirl/issues/labels/list.scala.html b/src/main/twirl/issues/labels/list.scala.html index 3493ddd..471dcf5 100644 --- a/src/main/twirl/issues/labels/list.scala.html +++ b/src/main/twirl/issues/labels/list.scala.html @@ -6,7 +6,7 @@ @import view.helpers._ @html.main(s"Labels - ${repository.owner}/${repository.name}"){ @html.menu("issues", repository){ - @issues.html.tab("labels", hasWritePermission, repository) + @issues.html.navigation("labels", hasWritePermission, repository)
diff --git a/src/main/twirl/issues/list.scala.html b/src/main/twirl/issues/list.scala.html index 45b3e18..b1e36b3 100644 --- a/src/main/twirl/issues/list.scala.html +++ b/src/main/twirl/issues/list.scala.html @@ -13,7 +13,7 @@ @import view.helpers._ @html.main((if(target == "issues") "Issues" else "Pull requests") + s" - ${repository.owner}/${repository.name}", Some(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) @if(hasWritePermission){ diff --git a/src/main/twirl/issues/milestones/edit.scala.html b/src/main/twirl/issues/milestones/edit.scala.html index a2c328e..f876cf4 100644 --- a/src/main/twirl/issues/milestones/edit.scala.html +++ b/src/main/twirl/issues/milestones/edit.scala.html @@ -7,7 +7,7 @@

New milestone

Create a new milestone to help organize your issues and pull requests.
} else { - @issues.html.tab("milestones", false, repository) + @issues.html.navigation("milestones", false, repository)

}
diff --git a/src/main/twirl/issues/milestones/list.scala.html b/src/main/twirl/issues/milestones/list.scala.html index b0c498b..7254a5c 100644 --- a/src/main/twirl/issues/milestones/list.scala.html +++ b/src/main/twirl/issues/milestones/list.scala.html @@ -6,7 +6,7 @@ @import view.helpers._ @html.main(s"Milestones - ${repository.owner}/${repository.name}"){ @html.menu("issues", repository){ - @issues.html.tab("milestones", hasWritePermission, repository) + @issues.html.navigation("milestones", hasWritePermission, repository)
diff --git a/src/main/twirl/issues/navigation.scala.html b/src/main/twirl/issues/navigation.scala.html new file mode 100644 index 0000000..9c1ee8c --- /dev/null +++ b/src/main/twirl/issues/navigation.scala.html @@ -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._ + diff --git a/src/main/twirl/issues/tab.scala.html b/src/main/twirl/issues/tab.scala.html deleted file mode 100644 index 0c7b761..0000000 --- a/src/main/twirl/issues/tab.scala.html +++ /dev/null @@ -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._ -