@ -183,34 +183,39 @@ func Issues(ctx *context.Context) {
viewType string
viewType string
sortType = ctx . Query ( "sort" )
sortType = ctx . Query ( "sort" )
filterMode = models . FilterModeAll
filterMode = models . FilterModeAll
assigneeID int64
posterID int64
)
)
if ctxUser . IsOrganization ( ) {
if ctxUser . IsOrganization ( ) {
viewType = "all"
viewType = "all"
} else {
} else {
viewType = ctx . Query ( "type" )
viewType = ctx . Query ( "type" )
types := [ ] string { "assigned" , "created_by" }
types := [ ] string { "all" , "a ssigned" , "created_by" }
if ! com . IsSliceContainsStr ( types , viewType ) {
if ! com . IsSliceContainsStr ( types , viewType ) {
viewType = "all"
viewType = "all"
}
}
switch viewType {
switch viewType {
case "all" :
filterMode = models . FilterModeAll
case "assigned" :
case "assigned" :
filterMode = models . FilterModeAssign
filterMode = models . FilterModeAssign
assigneeID = ctxUser . ID
case "created_by" :
case "created_by" :
filterMode = models . FilterModeCreate
filterMode = models . FilterModeCreate
posterID = ctxUser . ID
}
}
}
}
page := ctx . QueryInt ( "page" )
if page <= 1 {
page = 1
}
repoID := ctx . QueryInt64 ( "repo" )
repoID := ctx . QueryInt64 ( "repo" )
isShowClosed := ctx . Query ( "state" ) == "closed"
isShowClosed := ctx . Query ( "state" ) == "closed"
// Get repositories.
// Get repositories.
var err error
var err error
var repos [ ] * models . Repository
var repos [ ] * models . Repository
userRepoIDs := make ( [ ] int64 , 0 , len ( repos ) )
if ctxUser . IsOrganization ( ) {
if ctxUser . IsOrganization ( ) {
env , err := ctxUser . AccessibleReposEnv ( ctx . User . ID )
env , err := ctxUser . AccessibleReposEnv ( ctx . User . ID )
if err != nil {
if err != nil {
@ -230,9 +235,6 @@ func Issues(ctx *context.Context) {
repos = ctxUser . Repos
repos = ctxUser . Repos
}
}
allCount := 0
repoIDs := make ( [ ] int64 , 0 , len ( repos ) )
showRepos := make ( [ ] * models . Repository , 0 , len ( repos ) )
for _ , repo := range repos {
for _ , repo := range repos {
if ( isPullList && repo . NumPulls == 0 ) ||
if ( isPullList && repo . NumPulls == 0 ) ||
( ! isPullList &&
( ! isPullList &&
@ -240,85 +242,129 @@ func Issues(ctx *context.Context) {
continue
continue
}
}
repoIDs = append ( repoIDs , repo . ID )
userRepoIDs = append ( userRepoIDs , repo . ID )
}
if isPullList {
var issues [ ] * models . Issue
allCount += repo . NumOpenPulls
switch filterMode {
repo . NumOpenIssues = repo . NumOpenPulls
case models . FilterModeAll :
repo . NumClosedIssues = repo . NumClosedPulls
// Get all issues from repositories from this user.
} else {
issues , err = models . Issues ( & models . IssuesOptions {
allCount += repo . NumOpenIssues
RepoIDs : userRepoIDs ,
RepoID : repoID ,
Page : page ,
IsClosed : util . OptionalBoolOf ( isShowClosed ) ,
IsPull : util . OptionalBoolOf ( isPullList ) ,
SortType : sortType ,
} )
case models . FilterModeAssign :
// Get all issues assigned to this user.
issues , err = models . Issues ( & models . IssuesOptions {
RepoID : repoID ,
AssigneeID : ctxUser . ID ,
Page : page ,
IsClosed : util . OptionalBoolOf ( isShowClosed ) ,
IsPull : util . OptionalBoolOf ( isPullList ) ,
SortType : sortType ,
} )
case models . FilterModeCreate :
// Get all issues created by this user.
issues , err = models . Issues ( & models . IssuesOptions {
RepoID : repoID ,
PosterID : ctxUser . ID ,
Page : page ,
IsClosed : util . OptionalBoolOf ( isShowClosed ) ,
IsPull : util . OptionalBoolOf ( isPullList ) ,
SortType : sortType ,
} )
case models . FilterModeMention :
// Get all issues created by this user.
issues , err = models . Issues ( & models . IssuesOptions {
RepoID : repoID ,
MentionedID : ctxUser . ID ,
Page : page ,
IsClosed : util . OptionalBoolOf ( isShowClosed ) ,
IsPull : util . OptionalBoolOf ( isPullList ) ,
SortType : sortType ,
} )
}
if err != nil {
ctx . Handle ( 500 , "Issues" , err )
return
}
showRepos := make ( [ ] * models . Repository , 0 , len ( issues ) )
showReposSet := make ( map [ int64 ] bool )
if repoID > 0 {
repo , err := models . GetRepositoryByID ( repoID )
if err != nil {
ctx . Handle ( 500 , "GetRepositoryByID" , fmt . Errorf ( "[#%d]%v" , repoID , err ) )
return
}
}
if filterMode != models . FilterModeAll {
if err = repo . GetOwner ( ) ; err != nil {
// Calculate repository issue count with filter mode.
ctx . Handle ( 500 , "GetOwner" , fmt . Errorf ( "[#%d]%v" , repoID , err ) )
numOpen , numClosed := repo . IssueStats ( ctxUser . ID , filterMode , isPullList )
return
repo . NumOpenIssues , repo . NumClosedIssues = int ( numOpen ) , int ( numClosed )
}
}
if repo . ID == repoID ||
// Check if user has access to given repository.
( isShowClosed && repo . NumClosedIssues > 0 ) ||
if ! repo . IsOwnedBy ( ctxUser . ID ) && ! repo . HasAccess ( ctxUser ) {
( ! isShowClosed && repo . NumOpenIssues > 0 ) {
ctx . Handle ( 404 , "Issues" , fmt . Errorf ( "#%d" , repoID ) )
showRepos = append ( showRepos , repo )
return
}
}
showReposSet [ repoID ] = true
showRepos = append ( showRepos , repo )
}
}
ctx . Data [ "Repos" ] = showRepos
if len ( repoIDs ) == 0 {
repoIDs = [ ] int64 { - 1 }
}
issueStats := models . GetUserIssueStats ( repoID , ctxUser . ID , repoIDs , filterMode , isPullList )
for _ , issue := range issues {
issueStats . AllCount = int64 ( allCount )
// Get Repository data.
issue . Repo , err = models . GetRepositoryByID ( issue . RepoID )
if err != nil {
ctx . Handle ( 500 , "GetRepositoryByID" , fmt . Errorf ( "[#%d]%v" , issue . RepoID , err ) )
return
}
// Get Owner data.
if err = issue . Repo . GetOwner ( ) ; err != nil {
ctx . Handle ( 500 , "GetOwner" , fmt . Errorf ( "[#%d]%v" , issue . RepoID , err ) )
return
}
page := ctx . QueryInt ( "page" )
// Append repo to list of shown repos
if page <= 1 {
if filterMode == models . FilterModeAll {
page = 1
// Use a map to make sure we don't add the same Repository twice.
_ , ok := showReposSet [ issue . RepoID ]
if ! ok {
showReposSet [ issue . RepoID ] = true
// Append to list of shown Repositories.
showRepos = append ( showRepos , issue . Repo )
}
}
}
}
issueStats := models . GetUserIssueStats ( repoID , ctxUser . ID , userRepoIDs , filterMode , isPullList )
var total int
var total int
if ! isShowClosed {
if ! isShowClosed {
total = int ( issueStats . OpenCount )
total = int ( issueStats . OpenCount )
} else {
} else {
total = int ( issueStats . ClosedCount )
total = int ( issueStats . ClosedCount )
}
}
ctx . Data [ "Page" ] = paginater . New ( total , setting . UI . IssuePagingNum , page , 5 )
// Get issues.
issues , err := models . Issues ( & models . IssuesOptions {
AssigneeID : assigneeID ,
RepoID : repoID ,
PosterID : posterID ,
RepoIDs : repoIDs ,
Page : page ,
IsClosed : util . OptionalBoolOf ( isShowClosed ) ,
IsPull : util . OptionalBoolOf ( isPullList ) ,
SortType : sortType ,
} )
if err != nil {
ctx . Handle ( 500 , "Issues" , err )
return
}
// Get posters and repository.
for i := range issues {
issues [ i ] . Repo , err = models . GetRepositoryByID ( issues [ i ] . RepoID )
if err != nil {
ctx . Handle ( 500 , "GetRepositoryByID" , fmt . Errorf ( "[#%d]%v" , issues [ i ] . ID , err ) )
return
}
if err = issues [ i ] . Repo . GetOwner ( ) ; err != nil {
ctx . Handle ( 500 , "GetOwner" , fmt . Errorf ( "[#%d]%v" , issues [ i ] . ID , err ) )
return
}
}
ctx . Data [ "Issues" ] = issues
ctx . Data [ "Issues" ] = issues
ctx . Data [ "Repos" ] = showRepos
ctx . Data [ "Page" ] = paginater . New ( total , setting . UI . IssuePagingNum , page , 5 )
ctx . Data [ "IssueStats" ] = issueStats
ctx . Data [ "IssueStats" ] = issueStats
ctx . Data [ "ViewType" ] = viewType
ctx . Data [ "ViewType" ] = viewType
ctx . Data [ "SortType" ] = sortType
ctx . Data [ "SortType" ] = sortType
ctx . Data [ "RepoID" ] = repoID
ctx . Data [ "RepoID" ] = repoID
ctx . Data [ "IsShowClosed" ] = isShowClosed
ctx . Data [ "IsShowClosed" ] = isShowClosed
if isShowClosed {
if isShowClosed {
ctx . Data [ "State" ] = "closed"
ctx . Data [ "State" ] = "closed"
} else {
} else {