mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-26 16:22:15 +01:00
476a043a5f
Co-Author: @wxiaoguang
This PR is to fix
https://github.com/go-gitea/gitea/issues/23318#issuecomment-1506275446 .
The way to fix this in this PR is to use `delete_modal_actions.tmpl`
here both to fix this issue and keep ui consistency (as suggested by
[TODO
here](4299c3b7db/templates/projects/view.tmpl (L161)
))
And this PR also refactors `delete_modal_actions.tmpl` and its related
styles, and use the template for more modal actions:
1. Added template attributes:
* locale
* ModalButtonStyle: "yes" (default) or "confirm"
* ModalButtonCancelText
* ModalButtonOkText
2. Rename `delete_modal_actions.tmpl` template to
`modal_actions_confirm.tmpl` because it is not only used for action
modals deletion now.
3. Refactored css related to modals into `web_src/css/modules/modal.css`
and improved the styles.
4. Also use the template for PR deletion modal and remove issue
dependency modal.
5. Some modals should also use the template, but not sure how to open
them, so mark these modal actions by `{{/* TODO: Convert to
base/modal_actions_confirm */}}`
After (Also tested on arc green):
Hovering on the left buttons
<img width="711" alt="Screen Shot 2023-04-23 at 15 17 12"
src="https://user-images.githubusercontent.com/17645053/233825650-76307e65-9255-44bb-80e8-7062f58ead1b.png">
<img width="786" alt="Screen Shot 2023-04-23 at 15 17 21"
src="https://user-images.githubusercontent.com/17645053/233825652-4dc6f7d1-a180-49fb-a468-d60950eaee0d.png">
Test for functionalities:
https://user-images.githubusercontent.com/17645053/233826857-76376fda-022c-42d0-b0f3-339c17ca4e59.mov
---------
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
699 lines
30 KiB
Handlebars
699 lines
30 KiB
Handlebars
<div class="four wide column">
|
|
<div class="ui segment metas">
|
|
{{template "repo/issue/branch_selector_field" .}}
|
|
|
|
{{if .Issue.IsPull}}
|
|
|
|
<input id="reviewer_id" name="reviewer_id" type="hidden" value="{{.reviewer_id}}">
|
|
<div class="ui {{if or (not .Reviewers) (not .CanChooseReviewer) .Repository.IsArchived}}disabled{{end}} floating jump select-reviewers-modify dropdown">
|
|
<a class="text gt-df gt-ac muted">
|
|
<strong>{{.locale.Tr "repo.issues.review.reviewers"}}</strong>
|
|
{{if and .CanChooseReviewer (not .Repository.IsArchived)}}
|
|
{{svg "octicon-gear" 16 "gt-ml-2"}}
|
|
{{end}}
|
|
</a>
|
|
<div class="filter menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
|
|
<div class="header" style="text-transform: none;font-size:16px;">{{.locale.Tr "repo.issues.new.add_reviewer_title"}}</div>
|
|
{{if .Reviewers}}
|
|
<div class="ui icon search input">
|
|
<i class="icon gt-df gt-ac gt-jc">{{svg "octicon-search" 16}}</i>
|
|
<input type="text" placeholder="{{.locale.Tr "repo.issues.filter_reviewers"}}">
|
|
</div>
|
|
{{end}}
|
|
{{if .Reviewers}}
|
|
{{range .Reviewers}}
|
|
{{if .User}}
|
|
<a class="{{if not .CanChange}}ui{{end}} item {{if .Checked}}checked{{end}} {{if not .CanChange}}ban-change{{end}}" href="#" data-id="{{.ItemID}}" data-id-selector="#review_request_{{.ItemID}}" {{if not .CanChange}} data-tooltip-content="{{$.locale.Tr "repo.issues.remove_request_review_block"}}"{{end}}>
|
|
<span class="octicon-check {{if not .Checked}}invisible{{end}}">{{svg "octicon-check"}}</span>
|
|
<span class="text">
|
|
{{avatar $.Context .User 28 "gt-mr-3"}}{{template "repo/search_name" .User}}
|
|
</span>
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
{{if .TeamReviewers}}
|
|
<div class="ui divider"></div>
|
|
{{range .TeamReviewers}}
|
|
{{if .Team}}
|
|
<a class="{{if not .CanChange}}ui{{end}} item {{if .Checked}}checked{{end}} {{if not .CanChange}}ban-change{{end}}" href="#" data-id="{{.ItemID}}" data-id-selector="#review_request_team_{{.Team.ID}}" {{if not .CanChange}} data-tooltip-content="{{$.locale.Tr "repo.issues.remove_request_review_block"}}"{{end}}>
|
|
<span class="octicon-check {{if not .Checked}}invisible{{end}}">{{svg "octicon-check" 16}}</span>
|
|
<span class="text">
|
|
{{svg "octicon-people" 16 "gt-ml-4 gt-mr-2"}}{{$.Issue.Repo.OwnerName}}/{{.Team.Name}}
|
|
</span>
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui assignees list">
|
|
<span class="no-select item {{if or .OriginalReviews .PullReviewers}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_reviewers"}}</span>
|
|
<div class="selected">
|
|
{{range .PullReviewers}}
|
|
<div class="item gt-mb-2">
|
|
{{if .User}}
|
|
<a class="muted sidebar-item-link" href="{{.User.HomeLink}}">
|
|
{{avatar $.Context .User 28 "gt-mr-3"}}
|
|
{{.User.GetDisplayName}}
|
|
</a>
|
|
{{else if .Team}}
|
|
<span class="text">{{svg "octicon-people" 16 "teamavatar"}}{{$.Issue.Repo.OwnerName}}/{{.Team.Name}}</span>
|
|
{{end}}
|
|
<span class="ui right type-icon text {{if eq .Review.Type 1}}green
|
|
{{- else if eq .Review.Type 2}}grey
|
|
{{- else if eq .Review.Type 3}}red
|
|
{{- else if eq .Review.Type 4}}yellow
|
|
{{- else}}grey{{end}} right ">
|
|
|
|
{{if .CanChange}}
|
|
<a href="#" class="ui icon re-request-review {{if .Checked}}checked{{end}}" data-tooltip-content="{{if .Checked}} {{$.locale.Tr "repo.issues.remove_request_review"}} {{else}} {{$.locale.Tr "repo.issues.re_request_review"}} {{end}}" data-issue-id="{{$.Issue.ID}}" data-id="{{.ItemID}}" data-update-url="{{$.RepoLink}}/issues/request_review">
|
|
{{if .Checked}} {{svg "octicon-trash"}} {{else}} {{svg "octicon-sync"}} {{end}}
|
|
</a>
|
|
{{end}}
|
|
{{svg (printf "octicon-%s" .Review.Type.Icon)}}
|
|
</span>
|
|
</div>
|
|
{{end}}
|
|
{{range .OriginalReviews}}
|
|
<div class="item" style="margin-bottom: 10px;">
|
|
<a href="{{$.Repository.OriginalURL}}" data-tooltip-content="{{$.locale.Tr "repo.migrated_from_fake" ($.Repository.GetOriginalURLHostname|Escape) | Safe}}">
|
|
<span class="text black">
|
|
{{svg (MigrationIcon $.Repository.GetOriginalURLHostname)}}
|
|
{{.OriginalAuthor}}
|
|
</span>
|
|
</a>
|
|
<span class="ui right type-icon text {{if eq .Type 1}}green
|
|
{{- else if eq .Type 2}}grey
|
|
{{- else if eq .Type 3}}red
|
|
{{- else if eq .Type 4}}yellow
|
|
{{- else}}grey{{end}} right ">
|
|
{{svg (printf "octicon-%s" .Type.Icon)}}
|
|
</span>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{if and (or .HasIssuesOrPullsWritePermission .IsIssuePoster) (not .HasMerged) (not .Issue.IsClosed) (not .IsPullWorkInProgress)}}
|
|
<div class="toggle-wip" data-title="{{.Issue.Title}}" data-wip-prefix="{{(index .PullRequestWorkInProgressPrefixes 0| Escape)}}" data-update-url="{{.Issue.Link}}/title">
|
|
<a class="muted">
|
|
{{.locale.Tr "repo.pulls.still_in_progress"}} {{.locale.Tr "repo.pulls.add_prefix" (index .PullRequestWorkInProgressPrefixes 0| Escape) | Safe}}
|
|
</a>
|
|
</div>
|
|
{{end}}
|
|
<div class="ui divider"></div>
|
|
{{end}}
|
|
|
|
{{template "repo/issue/labels/labels_selector_field" .}}
|
|
{{template "repo/issue/labels/labels_sidebar" dict "root" $}}
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui {{if or (not .HasIssuesOrPullsWritePermission) .Repository.IsArchived}}disabled{{end}} floating jump select-milestone dropdown">
|
|
<a class="text gt-df gt-ac muted">
|
|
<strong>{{.locale.Tr "repo.issues.new.milestone"}}</strong>
|
|
{{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
|
|
{{svg "octicon-gear" 16 "gt-ml-2"}}
|
|
{{end}}
|
|
</a>
|
|
<div class="menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/milestone">
|
|
<div class="header" style="text-transform: none;font-size:16px;">{{.locale.Tr "repo.issues.new.add_milestone_title"}}</div>
|
|
{{if or .OpenMilestones .ClosedMilestones}}
|
|
<div class="ui icon search input">
|
|
<i class="icon gt-df gt-ac gt-jc">{{svg "octicon-search" 16}}</i>
|
|
<input type="text" placeholder="{{.locale.Tr "repo.issues.filter_milestones"}}">
|
|
</div>
|
|
{{end}}
|
|
<div class="no-select item">{{.locale.Tr "repo.issues.new.clear_milestone"}}</div>
|
|
{{if and (not .OpenMilestones) (not .ClosedMilestones)}}
|
|
<div class="header" style="text-transform: none;font-size:14px;">
|
|
{{.locale.Tr "repo.issues.new.no_items"}}
|
|
</div>
|
|
{{else}}
|
|
{{if .OpenMilestones}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
{{.locale.Tr "repo.issues.new.open_milestone"}}
|
|
</div>
|
|
{{range .OpenMilestones}}
|
|
<a class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}">
|
|
{{svg "octicon-milestone" 16 "gt-mr-2"}}
|
|
{{.Name}}
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
{{if .ClosedMilestones}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
{{.locale.Tr "repo.issues.new.closed_milestone"}}
|
|
</div>
|
|
{{range .ClosedMilestones}}
|
|
<a class="item" data-id="{{.ID}}" data-href="{{$.RepoLink}}/issues?milestone={{.ID}}">
|
|
{{svg "octicon-milestone" 16 "gt-mr-2"}}
|
|
{{.Name}}
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui select-milestone list">
|
|
<span class="no-select item {{if .Issue.Milestone}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_milestone"}}</span>
|
|
<div class="selected">
|
|
{{if .Issue.Milestone}}
|
|
<a class="item muted sidebar-item-link" href="{{.RepoLink}}/milestone/{{.Issue.Milestone.ID}}">
|
|
{{svg "octicon-milestone" 18 "gt-mr-3"}}
|
|
{{.Issue.Milestone.Name}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
{{if .IsProjectsEnabled}}
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui {{if or (not .HasIssuesOrPullsWritePermission) .Repository.IsArchived}}disabled{{end}} floating jump select-project dropdown">
|
|
<a class="text gt-df gt-ac muted">
|
|
<strong>{{.locale.Tr "repo.issues.new.projects"}}</strong>
|
|
{{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
|
|
{{svg "octicon-gear" 16 "gt-ml-2"}}
|
|
{{end}}
|
|
</a>
|
|
<div class="menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/projects">
|
|
<div class="header" style="text-transform: none;font-size:16px;">{{.locale.Tr "repo.issues.new.add_project_title"}}</div>
|
|
{{if or .OpenProjects .ClosedProjects}}
|
|
<div class="ui icon search input">
|
|
<i class="icon gt-df gt-ac gt-jc">{{svg "octicon-search" 16}}</i>
|
|
<input type="text" placeholder="{{.locale.Tr "repo.issues.filter_projects"}}">
|
|
</div>
|
|
{{end}}
|
|
<div class="no-select item">{{.locale.Tr "repo.issues.new.clear_projects"}}</div>
|
|
{{if .OpenProjects}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
{{.locale.Tr "repo.issues.new.open_projects"}}
|
|
</div>
|
|
{{range .OpenProjects}}
|
|
<a class="item muted sidebar-item-link" data-id="{{.ID}}" data-href="{{.Link}}">
|
|
{{svg .IconName 18 "gt-mr-3"}}{{.Title}}
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
{{if .ClosedProjects}}
|
|
<div class="divider"></div>
|
|
<div class="header">
|
|
{{.locale.Tr "repo.issues.new.closed_projects"}}
|
|
</div>
|
|
{{range .ClosedProjects}}
|
|
<a class="item muted sidebar-item-link" data-id="{{.ID}}" data-href="{{.Link}}">
|
|
{{svg .IconName 18 "gt-mr-3"}}{{.Title}}
|
|
</a>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui select-project list">
|
|
<span class="no-select item {{if .Issue.ProjectID}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_projects"}}</span>
|
|
<div class="selected">
|
|
{{if .Issue.ProjectID}}
|
|
<a class="item muted sidebar-item-link" href="{{.Issue.Project.Link}}">
|
|
{{svg .Issue.Project.IconName 18 "gt-mr-3"}}{{.Issue.Project.Title}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
<input id="assignee_id" name="assignee_id" type="hidden" value="{{.assignee_id}}">
|
|
<div class="ui {{if or (not .HasIssuesOrPullsWritePermission) .Repository.IsArchived}}disabled{{end}} floating jump select-assignees-modify dropdown">
|
|
<a class="text gt-df gt-ac muted">
|
|
<strong>{{.locale.Tr "repo.issues.new.assignees"}}</strong>
|
|
{{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
|
|
{{svg "octicon-gear" 16 "gt-ml-2"}}
|
|
{{end}}
|
|
</a>
|
|
<div class="filter menu" data-action="update" data-issue-id="{{$.Issue.ID}}" data-update-url="{{$.RepoLink}}/issues/assignee">
|
|
<div class="header" style="text-transform: none;font-size:16px;">{{.locale.Tr "repo.issues.new.add_assignees_title"}}</div>
|
|
<div class="ui icon search input">
|
|
<i class="icon gt-df gt-ac gt-jc">{{svg "octicon-search" 16}}</i>
|
|
<input type="text" placeholder="{{.locale.Tr "repo.issues.filter_assignees"}}">
|
|
</div>
|
|
<div class="no-select item">{{.locale.Tr "repo.issues.new.clear_assignees"}}</div>
|
|
{{range .Assignees}}
|
|
|
|
{{$AssigneeID := .ID}}
|
|
<a class="item{{range $.Issue.Assignees}}{{if eq .ID $AssigneeID}} checked{{end}}{{end}}" href="#" data-id="{{.ID}}" data-id-selector="#assignee_{{.ID}}">
|
|
{{$checked := false}}
|
|
{{range $.Issue.Assignees}}
|
|
{{if eq .ID $AssigneeID}}
|
|
{{$checked = true}}
|
|
{{end}}
|
|
{{end}}
|
|
<span class="octicon-check {{if not $checked}}invisible{{end}}">{{svg "octicon-check"}}</span>
|
|
<span class="text">
|
|
{{avatar $.Context . 20 "gt-mr-3"}}{{template "repo/search_name" .}}
|
|
</span>
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
<div class="ui assignees list">
|
|
<span class="no-select item {{if .Issue.Assignees}}gt-hidden{{end}}">{{.locale.Tr "repo.issues.new.no_assignees"}}</span>
|
|
<div class="selected">
|
|
{{range .Issue.Assignees}}
|
|
<div class="item">
|
|
<a class="muted sidebar-item-link" href="{{$.RepoLink}}/{{if $.Issue.IsPull}}pulls{{else}}issues{{end}}?assignee={{.ID}}">
|
|
{{avatar $.Context . 28 "gt-mr-3"}}
|
|
{{.GetDisplayName}}
|
|
</a>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="ui divider"></div>
|
|
|
|
{{if .Participants}}
|
|
<span class="text"><strong>{{.locale.Tr "repo.issues.num_participants" .NumParticipants}}</strong></span>
|
|
<div class="ui list gt-df gt-fw">
|
|
{{range .Participants}}
|
|
<a {{if gt .ID 0}}href="{{.HomeLink}}"{{end}} data-tooltip-content="{{.GetDisplayName}}">
|
|
{{avatar $.Context . 28 "gt-my-1 gt-mr-2"}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if and $.IssueWatch (not .Repository.IsArchived)}}
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui watching">
|
|
<span class="text"><strong>{{.locale.Tr "notification.notifications"}}</strong></span>
|
|
<div class="gt-mt-3">
|
|
<form method="POST" action="{{.Issue.Link}}/watch">
|
|
<input type="hidden" name="watch" value="{{if $.IssueWatch.IsWatching}}0{{else}}1{{end}}">
|
|
{{$.CsrfTokenHtml}}
|
|
<button class="fluid ui button gt-df gt-jc">
|
|
{{if $.IssueWatch.IsWatching}}
|
|
{{svg "octicon-mute" 16 "gt-mr-3"}}
|
|
{{.locale.Tr "repo.issues.unsubscribe"}}
|
|
{{else}}
|
|
{{svg "octicon-unmute" 16 "gt-mr-3"}}
|
|
{{.locale.Tr "repo.issues.subscribe"}}
|
|
{{end}}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if .Repository.IsTimetrackerEnabled $.Context}}
|
|
{{if and .CanUseTimetracker (not .Repository.IsArchived)}}
|
|
<div class="ui divider"></div>
|
|
<div class="ui timetrack">
|
|
<span class="text"><strong>{{.locale.Tr "repo.issues.tracker"}}</strong></span>
|
|
<div class="gt-mt-3">
|
|
<form method="POST" action="{{.Issue.Link}}/times/stopwatch/toggle" id="toggle_stopwatch_form">
|
|
{{$.CsrfTokenHtml}}
|
|
</form>
|
|
<form method="POST" action="{{.Issue.Link}}/times/stopwatch/cancel" id="cancel_stopwatch_form">
|
|
{{$.CsrfTokenHtml}}
|
|
</form>
|
|
{{if $.IsStopwatchRunning}}
|
|
<button class="ui fluid button issue-stop-time">{{.locale.Tr "repo.issues.stop_tracking"}}</button>
|
|
<button class="ui fluid negative button issue-cancel-time gt-mt-3">{{.locale.Tr "repo.issues.cancel_tracking"}}</button>
|
|
{{else}}
|
|
{{if .HasUserStopwatch}}
|
|
<div class="ui warning message">
|
|
{{.locale.Tr "repo.issues.tracking_already_started" (.OtherStopwatchURL|Escape) | Safe}}
|
|
</div>
|
|
{{end}}
|
|
<button class="ui fluid button issue-start-time" data-tooltip-content='{{.locale.Tr "repo.issues.start_tracking"}}'>{{.locale.Tr "repo.issues.start_tracking_short"}}</button>
|
|
<div class="ui mini modal issue-start-time-modal">
|
|
<div class="header">{{.locale.Tr "repo.issues.add_time"}}</div>
|
|
<div class="content">
|
|
<form method="POST" id="add_time_manual_form" action="{{.Issue.Link}}/times/add" class="ui action input fluid">
|
|
{{$.CsrfTokenHtml}}
|
|
<input placeholder='{{.locale.Tr "repo.issues.add_time_hours"}}' type="number" name="hours">
|
|
<input placeholder='{{.locale.Tr "repo.issues.add_time_minutes"}}' type="number" name="minutes" class="ui compact">
|
|
</form>
|
|
</div>
|
|
<div class="actions">
|
|
<button class="ui green approve button">{{.locale.Tr "repo.issues.add_time_short"}}</button>
|
|
<button class="ui red cancel button">{{.locale.Tr "repo.issues.add_time_cancel"}}</button>
|
|
</div>
|
|
</div>
|
|
<button class="ui fluid button green issue-add-time gt-mt-3" data-tooltip-content='{{.locale.Tr "repo.issues.add_time"}}'>{{.locale.Tr "repo.issues.add_time_short"}}</button>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if gt (len .WorkingUsers) 0}}
|
|
<div class="ui divider"></div>
|
|
<div class="ui comments">
|
|
<span class="text"><strong>{{.locale.Tr "repo.issues.time_spent_from_all_authors" ($.Issue.TotalTrackedTime | Sec2Time) | Safe}}</strong></span>
|
|
<div>
|
|
{{range $user, $trackedtime := .WorkingUsers}}
|
|
<div class="comment gt-mt-3">
|
|
<a class="avatar">
|
|
{{avatar $.Context $user}}
|
|
</a>
|
|
<div class="content">
|
|
{{template "shared/user/authorlink" $user}}
|
|
<div class="text">
|
|
{{$trackedtime}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
|
|
<div class="ui divider"></div>
|
|
<span class="text"><strong>{{.locale.Tr "repo.issues.due_date"}}</strong></span>
|
|
<div class="ui form" id="deadline-loader">
|
|
<div class="ui negative message gt-hidden" id="deadline-err-invalid-date">
|
|
{{svg "octicon-x" 16 "close icon"}}
|
|
{{.locale.Tr "repo.issues.due_date_invalid"}}
|
|
</div>
|
|
{{if ne .Issue.DeadlineUnix 0}}
|
|
<p>
|
|
<div class="gt-df gt-sb gt-ac">
|
|
<div class="due-date {{if .Issue.IsOverdue}}text red{{end}}" {{if .Issue.IsOverdue}}data-tooltip-content="{{.locale.Tr "repo.issues.due_date_overdue"}}"{{end}}>
|
|
{{svg "octicon-calendar" 16 "gt-mr-3"}}
|
|
{{template "shared/datetime/long" (dict "Datetime" .Issue.DeadlineUnix.FormatDate "Fallback" .Issue.DeadlineUnix.FormatDate)}}
|
|
</div>
|
|
<div>
|
|
{{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
|
|
<a class="issue-due-edit muted" data-tooltip-content="{{$.locale.Tr "repo.issues.due_date_form_edit"}}">{{svg "octicon-pencil" 16 "gt-mr-2"}}</a>
|
|
<a class="issue-due-remove muted" data-tooltip-content="{{$.locale.Tr "repo.issues.due_date_form_remove"}}">{{svg "octicon-trash"}}</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</p>
|
|
{{else}}
|
|
<p>{{.locale.Tr "repo.issues.due_date_not_set"}}</p>
|
|
{{end}}
|
|
|
|
{{if and .HasIssuesOrPullsWritePermission (not .Repository.IsArchived)}}
|
|
<div {{if ne .Issue.DeadlineUnix 0}} class="gt-hidden"{{end}} id="deadlineForm">
|
|
<form class="ui fluid action input issue-due-form" action="{{AppSubUrl}}/{{PathEscape .Repository.Owner.Name}}/{{PathEscape .Repository.Name}}/issues/{{.Issue.Index}}/deadline" method="post" id="update-issue-deadline-form">
|
|
{{$.CsrfTokenHtml}}
|
|
<input required placeholder="{{.locale.Tr "repo.issues.due_date_form"}}" {{if gt .Issue.DeadlineUnix 0}}value="{{.Issue.DeadlineUnix.Format "2006-01-02"}}"{{end}} type="date" name="deadlineDate" id="deadlineDate">
|
|
<button class="ui green icon button">
|
|
{{if ne .Issue.DeadlineUnix 0}}
|
|
{{svg "octicon-pencil"}}
|
|
{{else}}
|
|
{{svg "octicon-plus"}}
|
|
{{end}}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
|
|
{{if .Repository.IsDependenciesEnabled $.Context}}
|
|
<div class="ui divider"></div>
|
|
|
|
<div class="ui depending">
|
|
{{if (and (not .BlockedByDependencies) (not .BlockedByDependenciesNotPermitted) (not .BlockingDependencies) (not .BlockingDependenciesNotPermitted))}}
|
|
<span class="text"><strong>{{.locale.Tr "repo.issues.dependency.title"}}</strong></span>
|
|
<br>
|
|
<p>
|
|
{{if .Issue.IsPull}}
|
|
{{.locale.Tr "repo.issues.dependency.pr_no_dependencies"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.dependency.issue_no_dependencies"}}
|
|
{{end}}
|
|
</p>
|
|
{{end}}
|
|
|
|
{{if or .BlockingDependencies .BlockingDependenciesNotPermitted}}
|
|
<span class="text" data-tooltip-content="{{if .Issue.IsPull}}{{.locale.Tr "repo.issues.dependency.pr_close_blocks"}}{{else}}{{.locale.Tr "repo.issues.dependency.issue_close_blocks"}}{{end}}">
|
|
<strong>{{.locale.Tr "repo.issues.dependency.blocks_short"}}</strong>
|
|
</span>
|
|
<div class="ui relaxed divided list">
|
|
{{range .BlockingDependencies}}
|
|
<div class="item dependency{{if .Issue.IsClosed}} is-closed{{end}} gt-df gt-ac gt-sb">
|
|
<div class="item-left gt-df gt-jc gt-fc gt-f1">
|
|
<a class="title" href="{{.Issue.Link}}" data-tooltip-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}">
|
|
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
|
|
</a>
|
|
<div class="text small">
|
|
{{.Repository.OwnerName}}/{{.Repository.Name}}
|
|
</div>
|
|
</div>
|
|
<div class="item-right gt-df gt-ac">
|
|
{{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}}
|
|
<a class="delete-dependency-button ci muted" data-id="{{.Issue.ID}}" data-type="blocking" data-tooltip-content="{{$.locale.Tr "repo.issues.dependency.remove_info"}}">
|
|
{{svg "octicon-trash" 16}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if .BlockingDependenciesNotPermitted}}
|
|
<div class="item gt-df gt-ac gt-sb">
|
|
<span>{{$.locale.TrN (len .BlockingDependenciesNotPermitted) "repo.issues.dependency.no_permission_1" "repo.issues.dependency.no_permission_n" (len .BlockingDependenciesNotPermitted)}}</span>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if or .BlockedByDependencies .BlockedByDependenciesNotPermitted}}
|
|
<span class="text" data-tooltip-content="{{if .Issue.IsPull}}{{.locale.Tr "repo.issues.dependency.pr_closing_blockedby"}}{{else}}{{.locale.Tr "repo.issues.dependency.issue_closing_blockedby"}}{{end}}">
|
|
<strong>{{.locale.Tr "repo.issues.dependency.blocked_by_short"}}</strong>
|
|
</span>
|
|
<div class="ui relaxed divided list">
|
|
{{range .BlockedByDependencies}}
|
|
<div class="item dependency{{if .Issue.IsClosed}} is-closed{{end}} gt-df gt-ac gt-sb">
|
|
<div class="item-left gt-df gt-jc gt-fc gt-f1">
|
|
<a class="title" href="{{.Issue.Link}}" data-tooltip-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}">
|
|
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
|
|
</a>
|
|
<div class="text small">
|
|
{{.Repository.OwnerName}}/{{.Repository.Name}}
|
|
</div>
|
|
</div>
|
|
<div class="item-right gt-df gt-ac">
|
|
{{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}}
|
|
<a class="delete-dependency-button ci muted" data-id="{{.Issue.ID}}" data-type="blockedBy" data-tooltip-content="{{$.locale.Tr "repo.issues.dependency.remove_info"}}">
|
|
{{svg "octicon-trash" 16}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{if $.CanCreateIssueDependencies}}
|
|
{{range .BlockedByDependenciesNotPermitted}}
|
|
<div class="item dependency{{if .Issue.IsClosed}} is-closed{{end}} gt-df gt-ac gt-sb">
|
|
<div class="item-left gt-df gt-jc gt-fc gt-f1">
|
|
<div>
|
|
<span data-tooltip-content="{{$.locale.Tr "repo.issues.dependency.no_permission.can_remove"}}">{{svg "octicon-lock" 16}}</span>
|
|
<span class="title" data-tooltip-content="#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}">
|
|
#{{.Issue.Index}} {{.Issue.Title | RenderEmoji $.Context}}
|
|
</span>
|
|
</div>
|
|
<div class="text small">
|
|
{{.Repository.OwnerName}}/{{.Repository.Name}}
|
|
</div>
|
|
</div>
|
|
<div class="item-right gt-df gt-ac">
|
|
{{if and $.CanCreateIssueDependencies (not $.Repository.IsArchived)}}
|
|
<a class="delete-dependency-button ci muted" data-id="{{.Issue.ID}}" data-type="blocking" data-tooltip-content="{{$.locale.Tr "repo.issues.dependency.remove_info"}}">
|
|
{{svg "octicon-trash" 16}}
|
|
</a>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{else if .BlockedByDependenciesNotPermitted}}
|
|
<div class="item gt-df gt-ac gt-sb">
|
|
<span>{{$.locale.TrN (len .BlockedByDependenciesNotPermitted) "repo.issues.dependency.no_permission_1" "repo.issues.dependency.no_permission_n" (len .BlockedByDependenciesNotPermitted)}}</span>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}}
|
|
<div>
|
|
<form method="POST" action="{{.Issue.Link}}/dependency/add" id="addDependencyForm">
|
|
{{$.CsrfTokenHtml}}
|
|
<div class="ui fluid action input">
|
|
<div class="ui search selection dropdown" id="new-dependency-drop-list" data-issue-id="{{.Issue.ID}}">
|
|
<input name="newDependency" type="hidden">
|
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
|
<input type="text" class="search">
|
|
<div class="default text">{{.locale.Tr "repo.issues.dependency.add"}}</div>
|
|
</div>
|
|
<button class="ui green icon button">
|
|
{{svg "octicon-plus"}}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
{{end}}
|
|
</div>
|
|
|
|
{{if and .CanCreateIssueDependencies (not .Repository.IsArchived)}}
|
|
<input type="hidden" id="crossRepoSearch" value="{{.AllowCrossRepositoryDependencies}}">
|
|
|
|
<div class="ui gitea-confirm-modal modal remove-dependency">
|
|
<div class="header">
|
|
{{svg "octicon-trash"}}
|
|
{{.locale.Tr "repo.issues.dependency.remove_header"}}
|
|
</div>
|
|
<div class="content">
|
|
<form method="POST" action="{{.Issue.Link}}/dependency/delete" id="removeDependencyForm">
|
|
{{$.CsrfTokenHtml}}
|
|
<input type="hidden" value="" name="removeDependencyID" id="removeDependencyID">
|
|
<input type="hidden" value="" name="dependencyType" id="dependencyType">
|
|
</form>
|
|
<p>{{if .Issue.IsPull}}
|
|
{{.locale.Tr "repo.issues.dependency.pr_remove_text"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.dependency.issue_remove_text"}}
|
|
{{end}}</p>
|
|
</div>
|
|
{{$ModalButtonCancelText := .locale.Tr "repo.issues.dependency.cancel"}}
|
|
{{$ModalButtonOkText := .locale.Tr "repo.issues.dependency.remove"}}
|
|
{{template "base/modal_actions_confirm" (dict "." . "ModalButtonCancelText" $ModalButtonCancelText "ModalButtonOkText" $ModalButtonOkText)}}
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
|
|
<div class="ui divider"></div>
|
|
<div class="ui equal width compact grid">
|
|
{{$issueReferenceLink := printf "%s#%d" .Issue.Repo.FullName .Issue.Index}}
|
|
<div class="row gt-ac" data-tooltip-content="{{$issueReferenceLink}}">
|
|
<span class="text column truncate">{{.locale.Tr "repo.issues.reference_link" $issueReferenceLink}}</span>
|
|
<button class="ui two wide button column gt-p-3" data-clipboard-text="{{$issueReferenceLink}}">{{svg "octicon-copy" 14}}</button>
|
|
</div>
|
|
</div>
|
|
|
|
{{if and .IsRepoAdmin (not .Repository.IsArchived)}}
|
|
<div class="ui divider"></div>
|
|
<div class="ui watching">
|
|
<button class="fluid ui show-modal button {{if .Issue.IsLocked}} negative {{end}}" data-modal="#lock">
|
|
{{if .Issue.IsLocked}}
|
|
{{svg "octicon-key"}}
|
|
{{.locale.Tr "repo.issues.unlock"}}
|
|
{{else}}
|
|
{{svg "octicon-lock"}}
|
|
{{.locale.Tr "repo.issues.lock"}}
|
|
{{end}}
|
|
</button>
|
|
</div>
|
|
<div class="ui tiny modal" id="lock">
|
|
<div class="header">
|
|
{{if .Issue.IsLocked}}
|
|
{{.locale.Tr "repo.issues.unlock.title"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.lock.title"}}
|
|
{{end}}
|
|
</div>
|
|
<div class="content">
|
|
<div class="ui warning message text left">
|
|
{{if .Issue.IsLocked}}
|
|
{{.locale.Tr "repo.issues.unlock.notice_1"}}<br>
|
|
{{.locale.Tr "repo.issues.unlock.notice_2"}}<br>
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.lock.notice_1"}}<br>
|
|
{{.locale.Tr "repo.issues.lock.notice_2"}}<br>
|
|
{{.locale.Tr "repo.issues.lock.notice_3"}}<br>
|
|
{{end}}
|
|
</div>
|
|
|
|
<form class="ui form" action="{{.Issue.Link}}{{if .Issue.IsLocked}}/unlock{{else}}/lock{{end}}"
|
|
method="post">
|
|
{{.CsrfTokenHtml}}
|
|
|
|
{{if not .Issue.IsLocked}}
|
|
<div class="field">
|
|
<strong> {{.locale.Tr "repo.issues.lock.reason"}} </strong>
|
|
</div>
|
|
|
|
<div class="field">
|
|
<div class="ui fluid dropdown selection" tabindex="0">
|
|
|
|
<select name="reason">
|
|
<option value=""> </option>
|
|
{{range .LockReasons}}
|
|
<option value="{{.}}">{{.}}</option>
|
|
{{end}}
|
|
</select>
|
|
{{svg "octicon-triangle-down" 14 "dropdown icon"}}
|
|
|
|
<div class="default text"> </div>
|
|
|
|
<div class="menu">
|
|
{{range .LockReasons}}
|
|
<div class="item" data-value="{{.}}">{{.}}</div>
|
|
{{end}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
|
|
<div class="text right actions">
|
|
<button class="ui cancel button">{{.locale.Tr "settings.cancel"}}</button>
|
|
<button class="ui red button">
|
|
{{if .Issue.IsLocked}}
|
|
{{.locale.Tr "repo.issues.unlock_confirm"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.lock_confirm"}}
|
|
{{end}}
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
<button class="fluid ui show-modal button negative gt-mt-3" data-modal="#delete">
|
|
{{svg "octicon-trash"}}
|
|
{{.locale.Tr "repo.issues.delete"}}
|
|
</button>
|
|
<div class="ui gitea-confirm-modal modal" id="delete">
|
|
<div class="header">
|
|
{{if .Issue.IsPull}}
|
|
{{.locale.Tr "repo.pulls.delete.title"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.delete.title"}}
|
|
{{end}}
|
|
</div>
|
|
<div class="content">
|
|
<p>
|
|
{{if .Issue.IsPull}}
|
|
{{.locale.Tr "repo.pulls.delete.text"}}
|
|
{{else}}
|
|
{{.locale.Tr "repo.issues.delete.text"}}
|
|
{{end}}
|
|
</p>
|
|
</div>
|
|
<form action="{{.Issue.Link}}/delete" method="post">
|
|
{{.CsrfTokenHtml}}
|
|
{{template "base/modal_actions_confirm" .}}
|
|
</form>
|
|
</div>
|
|
{{end}}
|
|
|
|
{{if and .Issue.IsPull .IsIssuePoster (not .Issue.IsClosed) .Issue.PullRequest.HeadRepo}}
|
|
{{if and (not (eq .Issue.PullRequest.HeadRepo.FullName .Issue.PullRequest.BaseRepo.FullName)) .CanWriteToHeadRepo}}
|
|
<div class="ui divider"></div>
|
|
<div class="inline field">
|
|
<div class="ui checkbox" id="allow-edits-from-maintainers"
|
|
data-url="{{.Issue.Link}}"
|
|
data-tooltip-content="{{.locale.Tr "repo.pulls.allow_edits_from_maintainers_desc"}}"
|
|
data-prompt-error="{{.locale.Tr "repo.pulls.allow_edits_from_maintainers_err"}}"
|
|
>
|
|
<label><strong>{{.locale.Tr "repo.pulls.allow_edits_from_maintainers"}}</strong></label>
|
|
<input type="checkbox" {{if .Issue.PullRequest.AllowMaintainerEdit}}checked{{end}}>
|
|
</div>
|
|
</div>
|
|
{{end}}
|
|
{{end}}
|
|
</div>
|
|
</div>
|