mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-08 22:45:51 +01:00
Add user filter to issue search condition.
This commit is contained in:
@@ -29,22 +29,24 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
get("/:owner/:repository/issues"){
|
get("/:owner/:repository/issues"){
|
||||||
val owner = params("owner")
|
val owner = params("owner")
|
||||||
val repository = params("repository")
|
val repository = params("repository")
|
||||||
val sessionKey = "%s/%s/issues".format(owner, repository)
|
|
||||||
|
|
||||||
// retreive search condition
|
searchIssues(owner, repository, "all", None)
|
||||||
val condition = if(request.getQueryString == null){
|
}
|
||||||
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
|
|
||||||
} else IssueSearchCondition(request)
|
|
||||||
|
|
||||||
session.put(sessionKey, condition)
|
get("/:owner/:repository/issues/assigned/:userName"){
|
||||||
|
val owner = params("owner")
|
||||||
|
val repository = params("repository")
|
||||||
|
val userName = params("userName")
|
||||||
|
|
||||||
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
|
searchIssues(owner, repository, "assigned", Some(userName))
|
||||||
issues.html.issues(searchIssue(owner, repository, condition.state == "closed"),
|
}
|
||||||
getLabels(owner, repository),
|
|
||||||
getMilestones(owner, repository).filter(_.closedDate.isEmpty),
|
|
||||||
condition, repositoryInfo, isWritable(owner, repository, context.loginAccount))
|
|
||||||
|
|
||||||
} getOrElse NotFound
|
get("/:owner/:repository/issues/created_by/:userName"){
|
||||||
|
val owner = params("owner")
|
||||||
|
val repository = params("repository")
|
||||||
|
val userName = params("userName")
|
||||||
|
|
||||||
|
searchIssues(owner, repository, "created_by", Some(userName))
|
||||||
}
|
}
|
||||||
|
|
||||||
get("/:owner/:repository/issues/:id"){
|
get("/:owner/:repository/issues/:id"){
|
||||||
@@ -83,4 +85,23 @@ trait IssuesControllerBase extends ControllerBase {
|
|||||||
saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
|
saveComment(owner, repository, context.loginAccount.get.userName, form.issueId, form.content)))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
private def searchIssues(owner: String, repository: String, filter: String, userName: Option[String]) = {
|
||||||
|
val sessionKey = "%s/%s/issues".format(owner, repository)
|
||||||
|
|
||||||
|
// retrieve search condition
|
||||||
|
val condition = if(request.getQueryString == null){
|
||||||
|
session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition]
|
||||||
|
} else IssueSearchCondition(request)
|
||||||
|
|
||||||
|
session.put(sessionKey, condition)
|
||||||
|
|
||||||
|
getRepository(owner, repository, baseUrl).map { repositoryInfo =>
|
||||||
|
issues.html.issues(searchIssue(owner, repository, condition.state == "closed"),
|
||||||
|
getLabels(owner, repository),
|
||||||
|
getMilestones(owner, repository).filter(_.closedDate.isEmpty),
|
||||||
|
condition, filter, repositoryInfo, isWritable(owner, repository, context.loginAccount))
|
||||||
|
|
||||||
|
} getOrElse NotFound
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,16 +84,14 @@ object IssuesService {
|
|||||||
|
|
||||||
import IssueSearchCondition._
|
import IssueSearchCondition._
|
||||||
|
|
||||||
def toURL(repository: service.RepositoryService.RepositoryInfo)(implicit context: app.Context): String = {
|
def toURL: String =
|
||||||
val params = List(
|
"?" + List(
|
||||||
if(labels.isEmpty) None else Some("labels=" + urlEncode(labels.mkString(" "))),
|
if(labels.isEmpty) None else Some("labels=" + urlEncode(labels.mkString(" "))),
|
||||||
milestoneId.map("milestone=" + _),
|
milestoneId.map("milestone=" + _),
|
||||||
Some("state=" + urlEncode(state)),
|
Some("state=" + urlEncode(state)),
|
||||||
Some("sort=" + urlEncode(sort)),
|
Some("sort=" + urlEncode(sort)),
|
||||||
Some("direction=" + urlEncode(direction))
|
Some("direction=" + urlEncode(direction))).flatten.mkString("&")
|
||||||
)
|
|
||||||
"%s/%s/%s/issues?%s".format(context.path, repository.owner, repository.name, params.flatten.mkString("&"))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
object IssueSearchCondition {
|
object IssueSearchCondition {
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone], condition: service.IssuesService.IssueSearchCondition, repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
|
@(issues: List[model.Issue], labels: List[model.Label], milestones: List[model.Milestone], condition: service.IssuesService.IssueSearchCondition, filter: String, repository: service.RepositoryService.RepositoryInfo, isWritable: Boolean)(implicit context: app.Context)
|
||||||
@import context._
|
@import context._
|
||||||
@import view.helpers._
|
@import view.helpers._
|
||||||
@html.main("Issues - " + repository.owner + "/" + repository.name){
|
@html.main("Issues - " + repository.owner + "/" + repository.name){
|
||||||
@@ -7,21 +7,21 @@
|
|||||||
<div class="row-fluid">
|
<div class="row-fluid">
|
||||||
<div class="span3">
|
<div class="span3">
|
||||||
<ul class="nav nav-pills nav-stacked">
|
<ul class="nav nav-pills nav-stacked">
|
||||||
<li class="active">
|
<li@if(filter == "all"){ class="active"}>
|
||||||
<a href="#">
|
<a href="@path/@repository.owner/@repository.name/issues@condition.toURL">
|
||||||
<span class="count-right">0</span>
|
<span class="count-right">0</span>
|
||||||
Everyone's Issues
|
Everyone's Issues
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@if(loginAccount.isDefined){
|
@if(loginAccount.isDefined){
|
||||||
<li>
|
<li@if(filter == "assigned"){ class="active"}>
|
||||||
<a href="#">
|
<a href="@path/@repository.owner/@repository.name/issues/assigned/@loginAccount.map(_.userName)@condition.toURL">
|
||||||
<span class="count-right">0</span>
|
<span class="count-right">0</span>
|
||||||
Assigned to you
|
Assigned to you
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li@if(filter == "created_by"){ class="active"}>
|
||||||
<a href="#">
|
<a href="@path/@repository.owner/@repository.name/issues/created_by/@loginAccount.map(_.userName)@condition.toURL">
|
||||||
<span class="count-right">0</span>
|
<span class="count-right">0</span>
|
||||||
Created by you
|
Created by you
|
||||||
</a>
|
</a>
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
@milestones.map { milestone =>
|
@milestones.map { milestone =>
|
||||||
<li><a href="@condition.copy(milestoneId = Some(milestone.milestoneId)).toURL(repository)">@milestone.title</a></li>
|
<li><a href="@condition.copy(milestoneId = Some(milestone.milestoneId)).toURL">@milestone.title</a></li>
|
||||||
}
|
}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<ul class="label-list nav nav-pills nav-stacked">
|
<ul class="label-list nav nav-pills nav-stacked">
|
||||||
@labels.map { label =>
|
@labels.map { label =>
|
||||||
<li>
|
<li>
|
||||||
<a href="@condition.copy(labels = (if(condition.labels.contains(label.labelName)) condition.labels - label.labelName else condition.labels + label.labelName)).toURL(repository)"
|
<a href="@condition.copy(labels = (if(condition.labels.contains(label.labelName)) condition.labels - label.labelName else condition.labels + label.labelName)).toURL"
|
||||||
@if(condition.labels.contains(label.labelName)){style="background-color: #@label.color; color: #@label.fontColor;"}>
|
@if(condition.labels.contains(label.labelName)){style="background-color: #@label.color; color: #@label.fontColor;"}>
|
||||||
<span class="count-right">0</span>
|
<span class="count-right">0</span>
|
||||||
<span style="background-color: #@label.color;" class="label-color"> </span>
|
<span style="background-color: #@label.color;" class="label-color"> </span>
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="span9">
|
<div class="span9">
|
||||||
@if(condition.labels.nonEmpty || condition.milestoneId.isDefined){
|
@if(condition.labels.nonEmpty || condition.milestoneId.isDefined){
|
||||||
<a href="@(new service.IssuesService.IssueSearchCondition().toURL(repository))" id="clear-filter">
|
<a href="@condition.copy(labels = Set.empty, milestoneId = None).toURL" id="clear-filter">
|
||||||
<i class="icon-remove-circle"></i> Clear milestone and label filters
|
<i class="icon-remove-circle"></i> Clear milestone and label filters
|
||||||
</a>
|
</a>
|
||||||
}
|
}
|
||||||
@@ -89,8 +89,8 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<a class="btn@if(condition.state == "open"){ active}" href="@condition.copy(state = "open").toURL(repository)">1 Open</a>
|
<a class="btn@if(condition.state == "open"){ active}" href="@condition.copy(state = "open").toURL">1 Open</a>
|
||||||
<a class="btn@if(condition.state == "closed"){ active}" href="@condition.copy(state = "closed").toURL(repository)">1 Closed</a>
|
<a class="btn@if(condition.state == "closed"){ active}" href="@condition.copy(state = "closed").toURL">1 Closed</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button class="btn dropdown-toggle" data-toggle="dropdown">
|
<button class="btn dropdown-toggle" data-toggle="dropdown">
|
||||||
@@ -106,12 +106,12 @@
|
|||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a href="@condition.copy(sort="created", direction="desc").toURL(repository)">Newest</a></li>
|
<li><a href="@condition.copy(sort="created", direction="desc").toURL">Newest</a></li>
|
||||||
<li><a href="@condition.copy(sort="created", direction="asc" ).toURL(repository)">Oldest</a></li>
|
<li><a href="@condition.copy(sort="created", direction="asc" ).toURL">Oldest</a></li>
|
||||||
<li><a href="@condition.copy(sort="comments", direction="desc").toURL(repository)">Most commented</a></li>
|
<li><a href="@condition.copy(sort="comments", direction="desc").toURL">Most commented</a></li>
|
||||||
<li><a href="@condition.copy(sort="comments", direction="asc" ).toURL(repository)">Least commented</a></li>
|
<li><a href="@condition.copy(sort="comments", direction="asc" ).toURL">Least commented</a></li>
|
||||||
<li><a href="@condition.copy(sort="updated", direction="desc").toURL(repository)">Recently updated</a></li>
|
<li><a href="@condition.copy(sort="updated", direction="desc").toURL">Recently updated</a></li>
|
||||||
<li><a href="@condition.copy(sort="updated", direction="asc" ).toURL(repository)">Least recently updated</a></li>
|
<li><a href="@condition.copy(sort="updated", direction="asc" ).toURL">Least recently updated</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-bordered table-hover">
|
<table class="table table-bordered table-hover">
|
||||||
|
|||||||
Reference in New Issue
Block a user