diff --git a/src/main/scala/app/DashboardController.scala b/src/main/scala/app/DashboardController.scala index ef2c906..7c44529 100644 --- a/src/main/scala/app/DashboardController.scala +++ b/src/main/scala/app/DashboardController.scala @@ -71,8 +71,8 @@ searchPullRequests("mentioned") }) - private def getOrCreateCondition(key: String) = { - session.putAndGet(key, if(request.hasQueryString){ + private def getOrCreateCondition(key: String, filter: String, userName: String) = { + val condition = session.putAndGet(key, if(request.hasQueryString){ val q = request.getParameter("q") if(q == null){ IssueSearchCondition(request) @@ -80,22 +80,27 @@ IssueSearchCondition(q, Map[String, Int]()) } } else session.getAs[IssueSearchCondition](key).getOrElse(IssueSearchCondition())) + + filter match { + case "assigned" => condition.copy(assigned = Some(userName), author = None , mentioned = None) + case "mentioned" => condition.copy(assigned = None , author = None , mentioned = Some(userName)) + case _ => condition.copy(assigned = None , author = Some(userName), mentioned = None) + } } private def searchIssues(filter: String) = { import IssuesService._ - 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) - val page = IssueSearchCondition.page(request) + val userName = context.loginAccount.get.userName + val condition = getOrCreateCondition(Keys.Session.DashboardIssues, filter, userName) + val userRepos = getUserRepositories(userName, context.baseUrl, true).map(repo => repo.owner -> repo.name) + val page = IssueSearchCondition.page(request) dashboard.html.issues( - searchIssue(condition, filterUser, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*), + searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, userRepos: _*), page, - countIssue(condition.copy(state = "open" ), filterUser, false, userRepos: _*), - countIssue(condition.copy(state = "closed"), filterUser, false, userRepos: _*), + countIssue(condition.copy(state = "open" ), false, userRepos: _*), + countIssue(condition.copy(state = "closed"), false, userRepos: _*), filter match { case "assigned" => condition.copy(assigned = Some(userName)) case "mentioned" => condition.copy(mentioned = Some(userName)) @@ -109,17 +114,16 @@ import IssuesService._ import PullRequestService._ - val condition = getOrCreateCondition(Keys.Session.DashboardPulls) - val userName = context.loginAccount.get.userName - val allRepos = getAllRepositories(userName) - val filterUser = Map(filter -> userName) - val page = IssueSearchCondition.page(request) + val userName = context.loginAccount.get.userName + val condition = getOrCreateCondition(Keys.Session.DashboardPulls, filter, userName) + val allRepos = getAllRepositories(userName) + val page = IssueSearchCondition.page(request) dashboard.html.pulls( - searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, allRepos: _*), + searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, allRepos: _*), page, - countIssue(condition.copy(state = "open" ), filterUser, true, allRepos: _*), - countIssue(condition.copy(state = "closed"), filterUser, true, allRepos: _*), + countIssue(condition.copy(state = "open" ), true, allRepos: _*), + countIssue(condition.copy(state = "closed"), true, allRepos: _*), filter match { case "assigned" => condition.copy(assigned = Some(userName)) case "mentioned" => condition.copy(mentioned = Some(userName)) diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index 5442371..9f6efcf 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -406,13 +406,13 @@ issues.html.list( "issues", - searchIssue(condition, Map.empty, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), + searchIssue(condition, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), page, (getCollaborators(owner, repoName) :+ owner).sorted, getMilestones(owner, repoName), getLabels(owner, repoName), - countIssue(condition.copy(state = "open" ), Map.empty, false, owner -> repoName), - countIssue(condition.copy(state = "closed"), Map.empty, false, owner -> repoName), + countIssue(condition.copy(state = "open" ), false, owner -> repoName), + countIssue(condition.copy(state = "closed"), false, owner -> repoName), condition, repository, hasWritePermission(owner, repoName, context.loginAccount)) diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index a56fa55..ff87241 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -468,13 +468,13 @@ issues.html.list( "pulls", - searchIssue(condition, Map.empty, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), + searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), page, (getCollaborators(owner, repoName) :+ owner).sorted, getMilestones(owner, repoName), getLabels(owner, repoName), - countIssue(condition.copy(state = "open" ), Map.empty, true, owner -> repoName), - countIssue(condition.copy(state = "closed"), Map.empty, true, owner -> repoName), + countIssue(condition.copy(state = "open" ), true, owner -> repoName), + countIssue(condition.copy(state = "closed"), true, owner -> repoName), condition, repository, hasWritePermission(owner, repoName, context.loginAccount)) diff --git a/src/main/scala/service/IssuesService.scala b/src/main/scala/service/IssuesService.scala index e86c243..e8d9749 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -47,9 +47,9 @@ * @param repos Tuple of the repository owner and the repository name * @return the count of the search result */ - def countIssue(condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean, + def countIssue(condition: IssueSearchCondition, onlyPullRequest: Boolean, repos: (String, String)*)(implicit s: Session): Int = - Query(searchIssueQuery(repos, condition, filterUser, onlyPullRequest).length).first + Query(searchIssueQuery(repos, condition, onlyPullRequest).length).first /** * Returns the Map which contains issue count for each labels. @@ -62,7 +62,7 @@ def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition, filterUser: Map[String, String])(implicit s: Session): Map[String, Int] = { - searchIssueQuery(Seq(owner -> repository), condition.copy(labels = Set.empty), filterUser, false) + searchIssueQuery(Seq(owner -> repository), condition.copy(labels = Set.empty), false) .innerJoin(IssueLabels).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) } @@ -82,19 +82,17 @@ * Returns the search result against issues. * * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned", "created_by", "not_created_by" or "mentioned", value is the user name) * @param pullRequest if true then returns only pull requests, false then returns only issues. * @param offset the offset for pagination * @param limit the limit for pagination * @param repos Tuple of the repository owner and the repository name * @return the search result (list of tuples which contain issue, labels and comment count) */ - def searchIssue(condition: IssueSearchCondition, filterUser: Map[String, String], pullRequest: Boolean, - offset: Int, limit: Int, repos: (String, String)*) + def searchIssue(condition: IssueSearchCondition, pullRequest: Boolean, offset: Int, limit: Int, repos: (String, String)*) (implicit s: Session): List[IssueInfo] = { // get issues and comment count and labels - searchIssueQuery(repos, condition, filterUser, pullRequest) + searchIssueQuery(repos, condition, pullRequest) .innerJoin(IssueOutline).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) } .sortBy { case (t1, t2) => (condition.sort match { @@ -135,15 +133,11 @@ /** * Assembles query for conditional issue searching. */ - private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, - filterUser: Map[String, String], pullRequest: Boolean)(implicit s: Session) = + private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, pullRequest: Boolean)(implicit s: Session) = Issues filter { t1 => (t1.closed === (condition.state == "closed").bind) && (t1.milestoneId === condition.milestoneId.get.get.bind, condition.milestoneId.flatten.isDefined) && (t1.milestoneId.? isEmpty, condition.milestoneId == Some(None)) && - (t1.assignedUserName === filterUser("assigned").bind, filterUser.get("assigned").isDefined) && - (t1.openedUserName === filterUser("created_by").bind, filterUser.get("created_by").isDefined) && - (t1.openedUserName =!= filterUser("not_created_by").bind, filterUser.get("not_created_by").isDefined) && (t1.assignedUserName === condition.assigned.get.bind, condition.assigned.isDefined) && (t1.openedUserName === condition.author.get.bind, condition.author.isDefined) && (t1.pullRequest === pullRequest.bind) && @@ -164,10 +158,10 @@ // Organization (group) filter (t1.userName inSetBind condition.groups, condition.groups.nonEmpty) && // Mentioned filter - ((t1.openedUserName === filterUser("mentioned").bind) || t1.assignedUserName === filterUser("mentioned").bind || + ((t1.openedUserName === condition.mentioned.get.bind) || t1.assignedUserName === condition.mentioned.get.bind || (IssueComments filter { t2 => - (t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) && (t2.commentedUserName === filterUser("mentioned").bind) - } exists), filterUser.get("mentioned").isDefined) + (t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) && (t2.commentedUserName === condition.mentioned.get.bind) + } exists), condition.mentioned.isDefined) } def createIssue(owner: String, repository: String, loginUser: String, title: String, content: Option[String], @@ -373,8 +367,9 @@ case Some(x) => "milestone=" + x case None => "milestone=none" }}, - author .map(x => "author=" + urlEncode(x)), - assigned.map(x => "assigned=" + urlEncode(x)), + author .map(x => "author=" + urlEncode(x)), + assigned .map(x => "assigned=" + urlEncode(x)), + mentioned.map(x => "mentioned=" + urlEncode(x)), Some("state=" + urlEncode(state)), Some("sort=" + urlEncode(sort)), Some("direction=" + urlEncode(direction)), @@ -420,7 +415,7 @@ }, conditions.get("author").flatMap(_.headOption), conditions.get("assignee").flatMap(_.headOption), - None, + conditions.get("mentions").flatMap(_.headOption), conditions.get("is").getOrElse(Seq.empty).filter(x => x == "open" || x == "closed").headOption.getOrElse("open"), sort, direction, @@ -441,7 +436,7 @@ }, param(request, "author"), param(request, "assigned"), - None, + param(request, "mentioned"), 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/scala/servlet/GitRepositoryServlet.scala b/src/main/scala/servlet/GitRepositoryServlet.scala index 012c6ea..df55d46 100644 --- a/src/main/scala/servlet/GitRepositoryServlet.scala +++ b/src/main/scala/servlet/GitRepositoryServlet.scala @@ -134,8 +134,8 @@ // Retrieve all issue count in the repository val issueCount = - countIssue(IssueSearchCondition(state = "open"), Map.empty, false, owner -> repository) + - countIssue(IssueSearchCondition(state = "closed"), Map.empty, false, owner -> repository) + countIssue(IssueSearchCondition(state = "open"), false, owner -> repository) + + countIssue(IssueSearchCondition(state = "closed"), false, owner -> repository) // Extract new commit and apply issue comment val defaultBranch = getRepository(owner, repository, baseUrl).get.repository.defaultBranch diff --git a/src/main/twirl/dashboard/issuesnavi.scala.html b/src/main/twirl/dashboard/issuesnavi.scala.html index 7a8bf35..ec15e74 100644 --- a/src/main/twirl/dashboard/issuesnavi.scala.html +++ b/src/main/twirl/dashboard/issuesnavi.scala.html @@ -15,7 +15,7 @@