mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Show total TrackedTime on issue/pull/milestone lists (#26672)
TODOs: - [x] write test for `GetIssueTotalTrackedTime` - [x] frontport kitharas template changes and make them mobile-friendly ---   --- *Sponsored by Kithara Software GmbH*
This commit is contained in:
		@@ -198,46 +198,43 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var issueStats *issues_model.IssueStats
 | 
			
		||||
	{
 | 
			
		||||
		statsOpts := &issues_model.IssuesOptions{
 | 
			
		||||
			RepoIDs:           []int64{repo.ID},
 | 
			
		||||
			LabelIDs:          labelIDs,
 | 
			
		||||
			MilestoneIDs:      mileIDs,
 | 
			
		||||
			ProjectID:         projectID,
 | 
			
		||||
			AssigneeID:        assigneeID,
 | 
			
		||||
			MentionedID:       mentionedID,
 | 
			
		||||
			PosterID:          posterID,
 | 
			
		||||
			ReviewRequestedID: reviewRequestedID,
 | 
			
		||||
			ReviewedID:        reviewedID,
 | 
			
		||||
			IsPull:            isPullOption,
 | 
			
		||||
			IssueIDs:          nil,
 | 
			
		||||
		}
 | 
			
		||||
		if keyword != "" {
 | 
			
		||||
			allIssueIDs, err := issueIDsFromSearch(ctx, keyword, statsOpts)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				if issue_indexer.IsAvailable(ctx) {
 | 
			
		||||
					ctx.ServerError("issueIDsFromSearch", err)
 | 
			
		||||
					return
 | 
			
		||||
				}
 | 
			
		||||
				ctx.Data["IssueIndexerUnavailable"] = true
 | 
			
		||||
	statsOpts := &issues_model.IssuesOptions{
 | 
			
		||||
		RepoIDs:           []int64{repo.ID},
 | 
			
		||||
		LabelIDs:          labelIDs,
 | 
			
		||||
		MilestoneIDs:      mileIDs,
 | 
			
		||||
		ProjectID:         projectID,
 | 
			
		||||
		AssigneeID:        assigneeID,
 | 
			
		||||
		MentionedID:       mentionedID,
 | 
			
		||||
		PosterID:          posterID,
 | 
			
		||||
		ReviewRequestedID: reviewRequestedID,
 | 
			
		||||
		ReviewedID:        reviewedID,
 | 
			
		||||
		IsPull:            isPullOption,
 | 
			
		||||
		IssueIDs:          nil,
 | 
			
		||||
	}
 | 
			
		||||
	if keyword != "" {
 | 
			
		||||
		allIssueIDs, err := issueIDsFromSearch(ctx, keyword, statsOpts)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			if issue_indexer.IsAvailable(ctx) {
 | 
			
		||||
				ctx.ServerError("issueIDsFromSearch", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
			statsOpts.IssueIDs = allIssueIDs
 | 
			
		||||
			ctx.Data["IssueIndexerUnavailable"] = true
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if keyword != "" && len(statsOpts.IssueIDs) == 0 {
 | 
			
		||||
			// So it did search with the keyword, but no issue found.
 | 
			
		||||
			// Just set issueStats to empty.
 | 
			
		||||
			issueStats = &issues_model.IssueStats{}
 | 
			
		||||
		} else {
 | 
			
		||||
			// So it did search with the keyword, and found some issues. It needs to get issueStats of these issues.
 | 
			
		||||
			// Or the keyword is empty, so it doesn't need issueIDs as filter, just get issueStats with statsOpts.
 | 
			
		||||
			issueStats, err = issues_model.GetIssueStats(ctx, statsOpts)
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				ctx.ServerError("GetIssueStats", err)
 | 
			
		||||
				return
 | 
			
		||||
			}
 | 
			
		||||
		statsOpts.IssueIDs = allIssueIDs
 | 
			
		||||
	}
 | 
			
		||||
	if keyword != "" && len(statsOpts.IssueIDs) == 0 {
 | 
			
		||||
		// So it did search with the keyword, but no issue found.
 | 
			
		||||
		// Just set issueStats to empty.
 | 
			
		||||
		issueStats = &issues_model.IssueStats{}
 | 
			
		||||
	} else {
 | 
			
		||||
		// So it did search with the keyword, and found some issues. It needs to get issueStats of these issues.
 | 
			
		||||
		// Or the keyword is empty, so it doesn't need issueIDs as filter, just get issueStats with statsOpts.
 | 
			
		||||
		issueStats, err = issues_model.GetIssueStats(ctx, statsOpts)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("GetIssueStats", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	isShowClosed := ctx.FormString("state") == "closed"
 | 
			
		||||
@@ -246,6 +243,15 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
 | 
			
		||||
		isShowClosed = true
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if repo.IsTimetrackerEnabled(ctx) {
 | 
			
		||||
		totalTrackedTime, err := issues_model.GetIssueTotalTrackedTime(ctx, statsOpts, isShowClosed)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			ctx.ServerError("GetIssueTotalTrackedTime", err)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		ctx.Data["TotalTrackedTime"] = totalTrackedTime
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	archived := ctx.FormBool("archived")
 | 
			
		||||
 | 
			
		||||
	page := ctx.FormInt("page")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user