mirror of https://github.com/go-gitea/gitea
parent
348d1d0f32
commit
b7fb20e73e
@ -0,0 +1,93 @@ |
||||
// Copyright 2024 The Gitea Authors. All rights reserved.
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
package repo |
||||
|
||||
import ( |
||||
"net/http" |
||||
|
||||
"code.gitea.io/gitea/models/db" |
||||
issues_model "code.gitea.io/gitea/models/issues" |
||||
"code.gitea.io/gitea/models/unit" |
||||
issue_indexer "code.gitea.io/gitea/modules/indexer/issues" |
||||
"code.gitea.io/gitea/modules/optional" |
||||
"code.gitea.io/gitea/services/context" |
||||
) |
||||
|
||||
type issueSuggestion struct { |
||||
ID int64 `json:"id"` |
||||
Title string `json:"title"` |
||||
State string `json:"state"` |
||||
PullRequest *struct { |
||||
Merged bool `json:"merged"` |
||||
Draft bool `json:"draft"` |
||||
} `json:"pull_request,omitempty"` |
||||
} |
||||
|
||||
// IssueSuggestions returns a list of issue suggestions
|
||||
func IssueSuggestions(ctx *context.Context) { |
||||
keyword := ctx.Req.FormValue("q") |
||||
|
||||
canReadIssues := ctx.Repo.CanRead(unit.TypeIssues) |
||||
canReadPulls := ctx.Repo.CanRead(unit.TypePullRequests) |
||||
|
||||
var isPull optional.Option[bool] |
||||
if canReadPulls && !canReadIssues { |
||||
isPull = optional.Some(true) |
||||
} else if canReadIssues && !canReadPulls { |
||||
isPull = optional.Some(false) |
||||
} |
||||
|
||||
searchOpt := &issue_indexer.SearchOptions{ |
||||
Paginator: &db.ListOptions{ |
||||
Page: 0, |
||||
PageSize: 5, |
||||
}, |
||||
Keyword: keyword, |
||||
RepoIDs: []int64{ctx.Repo.Repository.ID}, |
||||
IsPull: isPull, |
||||
IsClosed: nil, |
||||
SortBy: issue_indexer.SortByUpdatedDesc, |
||||
} |
||||
|
||||
ids, _, err := issue_indexer.SearchIssues(ctx, searchOpt) |
||||
if err != nil { |
||||
ctx.ServerError("SearchIssues", err) |
||||
return |
||||
} |
||||
issues, err := issues_model.GetIssuesByIDs(ctx, ids, true) |
||||
if err != nil { |
||||
ctx.ServerError("FindIssuesByIDs", err) |
||||
return |
||||
} |
||||
|
||||
suggestions := make([]*issueSuggestion, 0, len(issues)) |
||||
|
||||
for _, issue := range issues { |
||||
suggestion := &issueSuggestion{ |
||||
ID: issue.ID, |
||||
Title: issue.Title, |
||||
State: string(issue.State()), |
||||
} |
||||
|
||||
if issue.IsPull { |
||||
if err := issue.LoadPullRequest(ctx); err != nil { |
||||
ctx.ServerError("LoadPullRequest", err) |
||||
return |
||||
} |
||||
if issue.PullRequest != nil { |
||||
suggestion.PullRequest = &struct { |
||||
Merged bool `json:"merged"` |
||||
Draft bool `json:"draft"` |
||||
}{ |
||||
Merged: issue.PullRequest.HasMerged, |
||||
Draft: issue.PullRequest.IsWorkInProgress(ctx), |
||||
} |
||||
} |
||||
} |
||||
|
||||
suggestions = append(suggestions, suggestion) |
||||
} |
||||
|
||||
ctx.JSON(http.StatusOK, suggestions) |
||||
} |
@ -0,0 +1,32 @@ |
||||
import type {Issue} from '../types.ts'; |
||||
|
||||
export function getIssueIcon(issue: Issue) { |
||||
if (issue.pull_request) { |
||||
if (issue.state === 'open') { |
||||
if (issue.pull_request.draft === true) { |
||||
return 'octicon-git-pull-request-draft'; // WIP PR
|
||||
} |
||||
return 'octicon-git-pull-request'; // Open PR
|
||||
} else if (issue.pull_request.merged === true) { |
||||
return 'octicon-git-merge'; // Merged PR
|
||||
} |
||||
return 'octicon-git-pull-request'; // Closed PR
|
||||
} else if (issue.state === 'open') { |
||||
return 'octicon-issue-opened'; // Open Issue
|
||||
} |
||||
return 'octicon-issue-closed'; // Closed Issue
|
||||
} |
||||
|
||||
export function getIssueColor(issue: Issue) { |
||||
if (issue.pull_request) { |
||||
if (issue.pull_request.draft === true) { |
||||
return 'grey'; // WIP PR
|
||||
} else if (issue.pull_request.merged === true) { |
||||
return 'purple'; // Merged PR
|
||||
} |
||||
} |
||||
if (issue.state === 'open') { |
||||
return 'green'; // Open Issue
|
||||
} |
||||
return 'red'; // Closed Issue
|
||||
} |
Loading…
Reference in new issue