diff --git a/src/main/scala/app/DashboardController.scala b/src/main/scala/app/DashboardController.scala index 030f875..d73cb36 100644 --- a/src/main/scala/app/DashboardController.scala +++ b/src/main/scala/app/DashboardController.scala @@ -50,20 +50,20 @@ 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 filterUser = Map(filter -> userName) val page = IssueSearchCondition.page(request) dashboard.html.issues( dashboard.html.issueslist( - 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: _*), condition), - countIssue(condition, Map.empty, false, userRepos: _*), - countIssue(condition, Map("assigned" -> userName), false, userRepos: _*), - countIssue(condition, Map("created_by" -> userName), false, userRepos: _*), - countIssueGroupByRepository(condition, filterUser, false, userRepos: _*), + countIssue(condition.copy(assigned = None, author = None), false, userRepos: _*), + countIssue(condition.copy(assigned = Some(userName), author = None), false, userRepos: _*), + countIssue(condition.copy(assigned = None, author = Some(userName)), false, userRepos: _*), + countIssueGroupByRepository(condition, false, userRepos: _*), condition, filter) @@ -86,14 +86,14 @@ val page = IssueSearchCondition.page(request) val counts = countIssueGroupByRepository( - IssueSearchCondition().copy(state = condition.state), Map.empty, true, userRepos: _*) + IssueSearchCondition().copy(state = condition.state), true, userRepos: _*) dashboard.html.pulls( dashboard.html.pullslist( - 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: _*), condition, None, false), diff --git a/src/main/scala/app/IssuesController.scala b/src/main/scala/app/IssuesController.scala index b04b31b..5947851 100644 --- a/src/main/scala/app/IssuesController.scala +++ b/src/main/scala/app/IssuesController.scala @@ -48,16 +48,8 @@ "content" -> trim(optional(text())) )(IssueStateForm.apply) - get("/:owner/:repository/issues")(referrersOnly { - searchIssues("all", _) - }) - - get("/:owner/:repository/issues/assigned/:userName")(referrersOnly { - searchIssues("assigned", _) - }) - - get("/:owner/:repository/issues/created_by/:userName")(referrersOnly { - searchIssues("created_by", _) + get("/:owner/:repository/issues")(referrersOnly { repository => + searchIssues(repository) }) get("/:owner/:repository/issues/:id")(referrersOnly { repository => @@ -370,9 +362,8 @@ } } - private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = { + private def searchIssues(repository: RepositoryService.RepositoryInfo) = { defining(repository.owner, repository.name){ case (owner, repoName) => - val filterUser = Map(filter -> params.getOrElse("userName", "")) val page = IssueSearchCondition.page(request) val sessionKey = Keys.Session.Issues(owner, repoName) @@ -383,19 +374,18 @@ ) issues.html.list( - searchIssue(condition, filterUser, 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"), filterUser, false, owner -> repoName), - countIssue(condition.copy(state = "closed"), filterUser, false, owner -> repoName), - countIssue(condition, Map.empty, false, owner -> repoName), - context.loginAccount.map(x => countIssue(condition, Map("assigned" -> x.userName), false, owner -> repoName)), - context.loginAccount.map(x => countIssue(condition, Map("created_by" -> x.userName), false, owner -> repoName)), - countIssueGroupByLabels(owner, repoName, condition, filterUser), + countIssue(condition.copy(state = "open"), false, owner -> repoName), + countIssue(condition.copy(state = "closed"), false, owner -> repoName), + countIssue(condition.copy(assigned = None, author = None), false, owner -> repoName), + context.loginAccount.map(x => countIssue(condition.copy(assigned = Some(x.userName), author = None), false, owner -> repoName)), + context.loginAccount.map(x => countIssue(condition.copy(assigned = None, author = Some(x.userName)), false, owner -> repoName)), + countIssueGroupByLabels(owner, repoName, condition), condition, - filter, repository, hasWritePermission(owner, repoName, context.loginAccount)) } diff --git a/src/main/scala/app/PullRequestsController.scala b/src/main/scala/app/PullRequestsController.scala index 8fd4672..a5a4a5d 100644 --- a/src/main/scala/app/PullRequestsController.scala +++ b/src/main/scala/app/PullRequestsController.scala @@ -464,13 +464,13 @@ ) pulls.html.list( - searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), + searchIssue(condition, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), getPullRequestCountGroupByUser(condition.state == "closed", Some(owner), Some(repoName)), userName, page, - countIssue(condition.copy(state = "open" ), filterUser, true, owner -> repoName), - countIssue(condition.copy(state = "closed"), filterUser, true, owner -> repoName), - countIssue(condition, Map.empty, true, owner -> repoName), + countIssue(condition.copy(state = "open" ), true, owner -> repoName), + countIssue(condition.copy(state = "closed"), true, owner -> repoName), + countIssue(condition.copy(assigned = None, author = None), 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 c6d5fc4..7da74d2 100644 --- a/src/main/scala/service/IssuesService.scala +++ b/src/main/scala/service/IssuesService.scala @@ -43,14 +43,13 @@ * Returns the count of the search result against issues. * * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name) * @param onlyPullRequest if true then counts only pull request, false then counts both of issue and pull request. * @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, - repos: (String, String)*)(implicit s: Session): Int = - Query(searchIssueQuery(repos, condition, filterUser, onlyPullRequest).length).first + def countIssue(condition: IssueSearchCondition, onlyPullRequest: Boolean, repos: (String, String)*) + (implicit s: Session): Int = + Query(searchIssueQuery(repos, condition, onlyPullRequest).length).first /** * Returns the Map which contains issue count for each labels. @@ -58,13 +57,12 @@ * @param owner the repository owner * @param repository the repository name * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name) * @return the Map which contains issue count for each labels (key is label name, value is issue count) */ - def countIssueGroupByLabels(owner: String, repository: String, condition: IssueSearchCondition, - filterUser: Map[String, String])(implicit s: Session): Map[String, Int] = { + def countIssueGroupByLabels(owner: String, repository: String, + condition: IssueSearchCondition)(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) } @@ -84,15 +82,14 @@ * If the issue does not exist, its repository is not included in the result. * * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned" or "created_by", value is the user name) * @param onlyPullRequest if true then returns only pull request, false then returns both of issue and pull request. * @param repos Tuple of the repository owner and the repository name * @return list which contains issue count for each repository */ def countIssueGroupByRepository( - condition: IssueSearchCondition, filterUser: Map[String, String], onlyPullRequest: Boolean, + condition: IssueSearchCondition, onlyPullRequest: Boolean, repos: (String, String)*)(implicit s: Session): List[(String, String, Int)] = { - searchIssueQuery(repos, condition.copy(repo = None), filterUser, onlyPullRequest) + searchIssueQuery(repos, condition.copy(repo = None), onlyPullRequest) .groupBy { t => t.userName -> t.repositoryName } @@ -107,19 +104,18 @@ * Returns the search result against issues. * * @param condition the search condition - * @param filterUser the filter user name (key is "all", "assigned", "created_by" or "not_created_by", value is the user name) * @param onlyPullRequest if true then returns only pull request, false then returns both of issue and pull request. * @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], onlyPullRequest: Boolean, + def searchIssue(condition: IssueSearchCondition, onlyPullRequest: Boolean, offset: Int, limit: Int, repos: (String, String)*) (implicit s: Session): List[IssueInfo] = { // get issues and comment count and labels - searchIssueQuery(repos, condition, filterUser, onlyPullRequest) + searchIssueQuery(repos, condition, onlyPullRequest) .innerJoin(IssueOutline).on { (t1, t2) => t1.byIssue(t2.userName, t2.repositoryName, t2.issueId) } .sortBy { case (t1, t2) => (condition.sort match { @@ -161,7 +157,7 @@ * Assembles query for conditional issue searching. */ private def searchIssueQuery(repos: Seq[(String, String)], condition: IssueSearchCondition, - filterUser: Map[String, String], onlyPullRequest: Boolean)(implicit s: Session) = + onlyPullRequest: Boolean)(implicit s: Session) = Issues filter { t1 => condition.repo .map { _.split('/') match { case array => Seq(array(0) -> array(1)) } } @@ -171,9 +167,8 @@ (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 === true.bind, onlyPullRequest) && (IssueLabels filter { t2 => (t2.byIssue(t1.userName, t1.repositoryName, t1.issueId)) && @@ -339,6 +334,8 @@ case class IssueSearchCondition( labels: Set[String] = Set.empty, milestoneId: Option[Option[Int]] = None, + author: Option[String] = None, + assigned: Option[String] = None, repo: Option[String] = None, state: String = "open", sort: String = "created", @@ -351,6 +348,8 @@ case Some(x) => x.toString case None => "none" })}, + author .map(x => "author=" + urlEncode(x)), + assigned.map(x => "assigned=" + urlEncode(x)), repo.map("for=" + urlEncode(_)), Some("state=" + urlEncode(state)), Some("sort=" + urlEncode(sort)), @@ -372,6 +371,8 @@ case "none" => None case x => x.toIntOpt }, + param(request, "author"), + param(request, "assigned"), param(request, "for"), param(request, "state", Seq("open", "closed")).getOrElse("open"), param(request, "sort", Seq("created", "comments", "updated")).getOrElse("created"), 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/helper/dropdown.scala.html b/src/main/twirl/helper/dropdown.scala.html index 70d1dce..49ae716 100644 --- a/src/main/twirl/helper/dropdown.scala.html +++ b/src/main/twirl/helper/dropdown.scala.html @@ -1,6 +1,13 @@ -@(value: String = "", prefix: String = "", mini: Boolean = true, style: String = "", right: Boolean = false)(body: Html) +@(value : String = "", + prefix: String = "", + mini : Boolean = true, + style : String = "", + right : Boolean = false, + flat : Boolean = false)(body: Html)