feat: require data-modal-id for delete buttons (#8711)

All instances should have a `data-modal-id` now. Throw a user-friendly error if this is not the case (custom templates, or missed cases).

Checked via `rg -P -e '^(?=.*delete-button)' | grep -v "data-modal-id"`

Removed two instances of delete modals and one case of simplified logic.

## Rationale
I am currently surveying the existing modals in Forgejo in the context of eventually replacing the modals implementation with our own modal implementation. This refactor fixes one of the many inconsistencies that the current usage of modals has. It should explicitly specify which modal should be used to avoids any problems if new modals are introduced on the page (for example via https://codeberg.org/forgejo/forgejo/pulls/8662).

Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/8711
Reviewed-by: oliverpool <oliverpool@noreply.codeberg.org>
Co-authored-by: Gusted <postmaster@gusted.xyz>
Co-committed-by: Gusted <postmaster@gusted.xyz>
This commit is contained in:
Gusted 2025-08-08 01:53:23 +02:00 committed by Gusted
commit 72bac98365
29 changed files with 50 additions and 76 deletions

View file

@ -404,7 +404,7 @@
<div class="field"> <div class="field">
<button class="ui primary button">{{ctx.Locale.Tr "admin.auths.update"}}</button> <button class="ui primary button">{{ctx.Locale.Tr "admin.auths.update"}}</button>
<button class="ui red button delete-button" data-url="{{$.Link}}/delete" data-id="{{.Source.ID}}">{{ctx.Locale.Tr "admin.auths.delete"}}</button> <button class="ui red button delete-button" data-url="{{$.Link}}/delete" data-id="{{.Source.ID}}" data-modal-id="delete-auth-source">{{ctx.Locale.Tr "admin.auths.delete"}}</button>
</div> </div>
</form> </form>
</div> </div>
@ -421,7 +421,7 @@
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-auth-source">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "admin.auths.delete_auth_title"}} {{ctx.Locale.Tr "admin.auths.delete_auth_title"}}

View file

@ -62,7 +62,7 @@
</td> </td>
<td> <td>
<div class="tw-flex tw-gap-2"> <div class="tw-flex tw-gap-2">
<a class="delete-button" href="" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-data-uid="{{.UID}}">{{svg "octicon-trash"}}</a> <a class="delete-button" href="" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-data-uid="{{.UID}}" data-modal-id="delete-email">{{svg "octicon-trash"}}</a>
</div> </div>
</td> </td>
</tr> </tr>
@ -104,7 +104,7 @@
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-email">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "admin.emails.delete"}} {{ctx.Locale.Tr "admin.emails.delete"}}

View file

@ -72,7 +72,7 @@
</td> </td>
<td>{{ctx.Locale.TrSize .CalculateBlobSize}}</td> <td>{{ctx.Locale.TrSize .CalculateBlobSize}}</td>
<td>{{DateUtils.AbsoluteShort .Version.CreatedUnix}}</td> <td>{{DateUtils.AbsoluteShort .Version.CreatedUnix}}</td>
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.Version.ID}}" data-name="{{.Package.Name}}" data-data-version="{{.Version.Version}}">{{svg "octicon-trash"}}</a></td> <td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.Version.ID}}" data-name="{{.Package.Name}}" data-data-version="{{.Version.Version}}" data-modal-id="delete-package">{{svg "octicon-trash"}}</a></td>
</tr> </tr>
{{else}} {{else}}
<tr><td class="tw-text-center" colspan="10">{{ctx.Locale.Tr "repo.pulls.no_results"}}</td></tr> <tr><td class="tw-text-center" colspan="10">{{ctx.Locale.Tr "repo.pulls.no_results"}}</td></tr>
@ -84,7 +84,7 @@
{{template "base/paginate" .}} {{template "base/paginate" .}}
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-package">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "packages.settings.delete"}} {{ctx.Locale.Tr "packages.settings.delete"}}

View file

@ -84,7 +84,7 @@
<td>{{ctx.Locale.TrSize .LFSSize}}</td> <td>{{ctx.Locale.TrSize .LFSSize}}</td>
<td>{{DateUtils.AbsoluteShort .UpdatedUnix}}</td> <td>{{DateUtils.AbsoluteShort .UpdatedUnix}}</td>
<td>{{DateUtils.AbsoluteShort .CreatedUnix}}</td> <td>{{DateUtils.AbsoluteShort .CreatedUnix}}</td>
<td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.ID}}" data-name="{{.Name}}">{{svg "octicon-trash"}}</a></td> <td><a class="delete-button" href="" data-url="{{$.Link}}/delete?page={{$.Page.Paginater.Current}}&sort={{$.SortType}}" data-id="{{.ID}}" data-name="{{.Name}}" data-modal-id="delete-repo">{{svg "octicon-trash"}}</a></td>
</tr> </tr>
{{else}} {{else}}
<tr><td class="tw-text-center" colspan="12">{{ctx.Locale.Tr "repo.pulls.no_results"}}</td></tr> <tr><td class="tw-text-center" colspan="12">{{ctx.Locale.Tr "repo.pulls.no_results"}}</td></tr>
@ -96,7 +96,7 @@
{{template "base/paginate" .}} {{template "base/paginate" .}}
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-repo">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.settings.delete"}} {{ctx.Locale.Tr "repo.settings.delete"}}

View file

@ -19,7 +19,7 @@
</div> </div>
<div> <div>
{{if or (eq .Process.Type "request") (eq .Process.Type "normal")}} {{if or (eq .Process.Type "request") (eq .Process.Type "normal")}}
<a class="delete-button icon" href="" data-url="{{.root.Link}}/cancel/{{.Process.PID}}" data-id="{{.Process.PID}}" data-name="{{.Process.Description}}">{{svg "octicon-trash" 16 "text-red"}}</a> <a class="delete-button icon" href="" data-url="{{.root.Link}}/cancel/{{.Process.PID}}" data-id="{{.Process.PID}}" data-name="{{.Process.Description}}" data-modal-id="cancel-process">{{svg "octicon-trash" 16 "text-red"}}</a>
{{end}} {{end}}
</div> </div>
</div> </div>

View file

@ -35,7 +35,7 @@
{{end}} {{end}}
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="cancel-process">
<div class="header"> <div class="header">
{{ctx.Locale.Tr "admin.monitor.process.cancel"}} {{ctx.Locale.Tr "admin.monitor.process.cancel"}}
</div> </div>

View file

@ -14,14 +14,14 @@
<label for="org_name">{{ctx.Locale.Tr "org.org_name_holder"}}</label> <label for="org_name">{{ctx.Locale.Tr "org.org_name_holder"}}</label>
<input id="org_name" name="org_name" value="" autocomplete="off" autofocus required> <input id="org_name" name="org_name" value="" autocomplete="off" autofocus required>
</div> </div>
<button class="ui red button delete-button" data-type="form" data-form="#delete-form"> <button class="ui red button delete-button" data-type="form" data-form="#delete-form" data-modal-id="delete-org">
{{ctx.Locale.Tr "org.settings.confirm_delete_account"}} {{ctx.Locale.Tr "org.settings.confirm_delete_account"}}
</button> </button>
</form> </form>
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-org">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "org.settings.delete_org_title"}} {{ctx.Locale.Tr "org.settings.delete_org_title"}}

View file

@ -124,7 +124,7 @@
{{else}} {{else}}
<button class="ui primary button">{{ctx.Locale.Tr "org.teams.update_settings"}}</button> <button class="ui primary button">{{ctx.Locale.Tr "org.teams.update_settings"}}</button>
{{if not (eq .Team.LowerName "owners")}} {{if not (eq .Team.LowerName "owners")}}
<button class="ui red button delete-button" data-url="{{.OrgLink}}/teams/{{.Team.Name | PathEscape}}/delete">{{ctx.Locale.Tr "org.teams.delete_team"}}</button> <button class="ui red button delete-button" data-url="{{.OrgLink}}/teams/{{.Team.Name | PathEscape}}/delete" data-modal-id="delete-team">{{ctx.Locale.Tr "org.teams.delete_team"}}</button>
{{end}} {{end}}
{{end}} {{end}}
</div> </div>
@ -135,7 +135,7 @@
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-team">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "org.teams.delete_team_title"}} {{ctx.Locale.Tr "org.teams.delete_team_title"}}

View file

@ -66,7 +66,7 @@
{{else}} {{else}}
<a class="link-action flex-text-inline" href data-url="{{.Link ctx}}/close">{{svg "octicon-skip" 14}}{{ctx.Locale.Tr "repo.projects.close"}}</a> <a class="link-action flex-text-inline" href data-url="{{.Link ctx}}/close">{{svg "octicon-skip" 14}}{{ctx.Locale.Tr "repo.projects.close"}}</a>
{{end}} {{end}}
<a class="delete-button flex-text-inline" href="#" data-url="{{.Link ctx}}/delete">{{svg "octicon-trash" 14}}{{ctx.Locale.Tr "repo.issues.label_delete"}}</a> <a class="delete-button flex-text-inline" href="#" data-url="{{.Link ctx}}/delete" data-modal-id="delete-project">{{svg "octicon-trash" 14}}{{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
</div> </div>
{{end}} {{end}}
</div> </div>
@ -82,7 +82,7 @@
</div> </div>
{{if and $.CanWriteProjects (not $.Repository.IsArchived)}} {{if and $.CanWriteProjects (not $.Repository.IsArchived)}}
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-project">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.projects.deletion"}} {{ctx.Locale.Tr "repo.projects.deletion"}}

View file

@ -20,7 +20,7 @@
{{ctx.Locale.Tr "repo.projects.close"}} {{ctx.Locale.Tr "repo.projects.close"}}
</button> </button>
{{end}} {{end}}
<button class="item btn delete-button" data-url="{{.Link}}/delete" data-id="{{.Project.ID}}"> <button class="item btn delete-button" data-url="{{.Link}}/delete" data-id="{{.Project.ID}}" data-modal-id="delete-project">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.issues.label_delete"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}
</button> </button>
@ -167,7 +167,7 @@
</div> </div>
{{if .CanWriteProjects}} {{if .CanWriteProjects}}
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-project">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.projects.deletion"}} {{ctx.Locale.Tr "repo.projects.deletion"}}

View file

@ -195,7 +195,7 @@
</span> </span>
</button> </button>
{{else}} {{else}}
<button class="btn interact-bg tw-p-2 delete-button delete-branch-button" data-url="{{$.Link}}/delete?name={{.DBBranch.Name}}&page={{$.Page.Paginater.Current}}" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.delete" (.DBBranch.Name)}}" data-name="{{.DBBranch.Name}}"> <button class="btn interact-bg tw-p-2 delete-button delete-branch-button" data-url="{{$.Link}}/delete?name={{.DBBranch.Name}}&page={{$.Page.Paginater.Current}}" data-tooltip-content="{{ctx.Locale.Tr "repo.branch.delete" (.DBBranch.Name)}}" data-name="{{.DBBranch.Name}}" data-modal-id="delete-branch">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
</button> </button>
{{end}} {{end}}
@ -210,7 +210,7 @@
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-branch">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.branch.delete_html"}} <span class="name"></span> {{ctx.Locale.Tr "repo.branch.delete_html"}} <span class="name"></span>

View file

@ -1,4 +1,4 @@
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-label">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.issues.label_deletion"}} {{ctx.Locale.Tr "repo.issues.label_deletion"}}

View file

@ -45,12 +45,9 @@
<div class="label-operation tw-flex"> <div class="label-operation tw-flex">
{{template "repo/issue/labels/label_archived" .}} {{template "repo/issue/labels/label_archived" .}}
<div class="tw-flex tw-ml-auto"> <div class="tw-flex tw-ml-auto">
{{if and (not $.PageIsOrgSettingsLabels) (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls)}} {{if or ($.PageIsOrgSettingsLabels) (and (not $.Repository.IsArchived) (or $.CanWriteIssues $.CanWritePulls))}}
<a class="edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} {{if gt .ArchivedUnix 0}}data-is-archived{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a> <a class="edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} {{if gt .ArchivedUnix 0}}data-is-archived{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
<a class="delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a> <a class="delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-modal-id="delete-label">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
{{else if $.PageIsOrgSettingsLabels}}
<a class="edit-label-button" href="#" data-id="{{.ID}}" data-title="{{.Name}}" {{if .Exclusive}}data-exclusive{{end}} {{if gt .ArchivedUnix 0}}data-is-archived{{end}} data-num-issues="{{.NumIssues}}" data-description="{{.Description}}" data-color={{.Color}}>{{svg "octicon-pencil"}} {{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
<a class="delete-button" href="#" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}} {{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
{{end}} {{end}}
</div> </div>
</div> </div>

View file

@ -78,7 +78,7 @@
{{else}} {{else}}
<a class="link-action flex-text-inline" href data-url="{{$.Link}}/{{.ID}}/close">{{svg "octicon-x" 14}}{{ctx.Locale.Tr "repo.milestones.close"}}</a> <a class="link-action flex-text-inline" href data-url="{{$.Link}}/{{.ID}}/close">{{svg "octicon-x" 14}}{{ctx.Locale.Tr "repo.milestones.close"}}</a>
{{end}} {{end}}
<a class="delete-button flex-text-inline" href="#" data-url="{{$.RepoLink}}/milestones/delete" data-id="{{.ID}}">{{svg "octicon-trash" 14}}{{ctx.Locale.Tr "repo.issues.label_delete"}}</a> <a class="delete-button flex-text-inline" href="#" data-url="{{$.RepoLink}}/milestones/delete" data-id="{{.ID}}" data-modal-id="delete-milestone">{{svg "octicon-trash" 14}}{{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
</div> </div>
{{end}} {{end}}
</div> </div>
@ -96,7 +96,7 @@
</div> </div>
{{if or .CanWriteIssues .CanWritePulls}} {{if or .CanWriteIssues .CanWritePulls}}
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-milestone">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.milestones.deletion"}} {{ctx.Locale.Tr "repo.milestones.deletion"}}

View file

@ -168,7 +168,7 @@
<span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span> <span class="no-content">{{ctx.Locale.Tr "repo.issues.no_content"}}</span>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-branch">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.branch.delete" .HeadTarget}} {{ctx.Locale.Tr "repo.branch.delete" .HeadTarget}}

View file

@ -45,7 +45,7 @@
</div> </div>
</div> </div>
<div class="item-section-right"> <div class="item-section-right">
<button class="delete-button ui button" data-url="{{.DeleteBranchLink}}">{{ctx.Locale.Tr "repo.branch.delete_html"}}</button> <button class="delete-button ui button" data-url="{{.DeleteBranchLink}}" data-modal-id="delete-branch">{{ctx.Locale.Tr "repo.branch.delete_html"}}</button>
</div> </div>
</div> </div>
{{end}} {{end}}
@ -63,7 +63,7 @@
</div> </div>
{{if and .IsPullBranchDeletable (not .IsPullRequestBroken)}} {{if and .IsPullBranchDeletable (not .IsPullRequestBroken)}}
<div class="item-section-right"> <div class="item-section-right">
<button class="delete-button ui button" data-url="{{.DeleteBranchLink}}">{{ctx.Locale.Tr "repo.branch.delete_html"}}</button> <button class="delete-button ui button" data-url="{{.DeleteBranchLink}}" data-modal-id="delete-branch">{{ctx.Locale.Tr "repo.branch.delete_html"}}</button>
</div> </div>
{{end}} {{end}}
</div> </div>

View file

@ -126,17 +126,4 @@
</div> </div>
</div> </div>
{{if (and ($.Permission.CanWrite $.UnitTypeCode) .PageIsTagList)}}
<div class="ui g-modal-confirm delete modal">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.release.delete_tag"}}
</div>
<div class="content">
<p>{{ctx.Locale.Tr "repo.release.deletion_tag_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
{{end}}
{{template "base/footer" .}} {{template "base/footer" .}}

View file

@ -139,7 +139,7 @@
<a class="ui small button" href="{{.RepoLink}}/releases"> <a class="ui small button" href="{{.RepoLink}}/releases">
{{ctx.Locale.Tr "repo.release.cancel"}} {{ctx.Locale.Tr "repo.release.cancel"}}
</a> </a>
<a class="ui small red button delete-button" data-url="{{$.RepoLink}}/releases/delete" data-id="{{.ID}}"> <a class="ui small red button delete-button" data-url="{{$.RepoLink}}/releases/delete" data-id="{{.ID}}" data-modal-id="delete-release">
{{ctx.Locale.Tr "repo.release.delete_release"}} {{ctx.Locale.Tr "repo.release.delete_release"}}
</a> </a>
{{if .IsDraft}} {{if .IsDraft}}
@ -169,7 +169,7 @@
</div> </div>
{{if .PageIsEditRelease}} {{if .PageIsEditRelease}}
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-release">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.release.deletion"}} {{ctx.Locale.Tr "repo.release.deletion"}}

View file

@ -49,7 +49,7 @@
</div> </div>
<div class="flex-item-trailing"> <div class="flex-item-trailing">
<a class="rm ui tiny button" href="{{$.Repository.Link}}/settings/branches/edit?rule_name={{.RuleName}}">{{ctx.Locale.Tr "repo.settings.edit_protected_branch"}}</a> <a class="rm ui tiny button" href="{{$.Repository.Link}}/settings/branches/edit?rule_name={{.RuleName}}">{{ctx.Locale.Tr "repo.settings.edit_protected_branch"}}</a>
<button class="ui red tiny button delete-button" data-url="{{$.Repository.Link}}/settings/branches/{{.ID}}/delete" data-id="{{.ID}}"> <button class="ui red tiny button delete-button" data-url="{{$.Repository.Link}}/settings/branches/{{.ID}}/delete" data-id="{{.ID}}" data-modal-id="delete-protected-branch">
{{ctx.Locale.Tr "repo.settings.protected_branch.delete_rule"}} {{ctx.Locale.Tr "repo.settings.protected_branch.delete_rule"}}
</button> </button>
</div> </div>
@ -64,7 +64,7 @@
{{end}} {{end}}
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-protected-branch">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.settings.protected_branch_deletion"}} {{ctx.Locale.Tr "repo.settings.protected_branch_deletion"}}

View file

@ -29,7 +29,7 @@
</div> </div>
</div> </div>
</div> </div>
<button class="ui red tiny button inline delete-button" data-url="{{$.Link}}/delete" data-id="{{.ID}}"> <button class="ui red tiny button inline delete-button" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-modal-id="delete-collaborator">
{{ctx.Locale.Tr "repo.settings.delete_collaborator"}} {{ctx.Locale.Tr "repo.settings.delete_collaborator"}}
</button> </button>
</div> </div>
@ -75,7 +75,7 @@
</div> </div>
{{if $allowedToChangeTeams}} {{if $allowedToChangeTeams}}
<div class="flex-item-trailing" {{if .IncludesAllRepositories}} data-tooltip-content="{{ctx.Locale.Tr "repo.settings.delete_team_tip"}}"{{end}}> <div class="flex-item-trailing" {{if .IncludesAllRepositories}} data-tooltip-content="{{ctx.Locale.Tr "repo.settings.delete_team_tip"}}"{{end}}>
<button class="ui red tiny button inline delete-button {{if .IncludesAllRepositories}}disabled{{end}}" data-url="{{$.Link}}/team/delete" data-id="{{.ID}}"> <button class="ui red tiny button inline delete-button {{if .IncludesAllRepositories}}disabled{{end}}" data-url="{{$.Link}}/team/delete" data-id="{{.ID}}" data-modal-id="delete-collaborator">
{{ctx.Locale.Tr "repo.settings.delete_collaborator"}} {{ctx.Locale.Tr "repo.settings.delete_collaborator"}}
</button> </button>
</div> </div>
@ -103,7 +103,7 @@
{{end}} {{end}}
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-collaborator">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.settings.collaborator_deletion"}} {{ctx.Locale.Tr "repo.settings.collaborator_deletion"}}

View file

@ -59,7 +59,7 @@
</div> </div>
</div> </div>
<div class="flex-item-trailing"> <div class="flex-item-trailing">
<button class="ui red tiny button delete-button" data-url="{{$.Link}}/delete" data-id="{{.ID}}"> <button class="ui red tiny button delete-button" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-modal-id="delete-deploy-key">
{{ctx.Locale.Tr "settings.delete_key"}} {{ctx.Locale.Tr "settings.delete_key"}}
</button> </button>
</div> </div>
@ -72,7 +72,7 @@
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-deploy-key">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.settings.deploy_key_deletion"}} {{ctx.Locale.Tr "repo.settings.deploy_key_deletion"}}

View file

@ -19,7 +19,7 @@
<a title="{{.URL}}" href="{{$.BaseLink}}/{{.ID}}">{{.URL}}</a> <a title="{{.URL}}" href="{{$.BaseLink}}/{{.ID}}">{{.URL}}</a>
</div> </div>
<a class="muted tw-p-2" href="{{$.BaseLink}}/{{.ID}}">{{svg "octicon-pencil"}}</a> <a class="muted tw-p-2" href="{{$.BaseLink}}/{{.ID}}">{{svg "octicon-pencil"}}</a>
<a class="delete-button tw-p-2" data-url="{{$.Link}}/delete" data-id="{{.ID}}">{{svg "octicon-trash"}}</a> <a class="delete-button tw-p-2" data-url="{{$.Link}}/delete" data-id="{{.ID}}" data-modal-id="delete-webhook">{{svg "octicon-trash"}}</a>
</div> </div>
{{end}} {{end}}
</div> </div>

View file

@ -1,4 +1,4 @@
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-webhook">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.settings.webhook_deletion"}} {{ctx.Locale.Tr "repo.settings.webhook_deletion"}}

View file

@ -42,7 +42,7 @@
{{end}} {{end}}
{{if (and ($.Permission.CanWrite $.UnitTypeCode) $release.IsTag)}} {{if (and ($.Permission.CanWrite $.UnitTypeCode) $release.IsTag)}}
<a class="ui delete-button tw-mr-2 muted" data-url="{{$.RepoLink}}/tags/delete" data-id="{{.ID}}"> <a class="ui delete-button tw-mr-2 muted" data-url="{{$.RepoLink}}/tags/delete" data-id="{{.ID}}" data-modal-id="delete-tag">
{{svg "octicon-trash" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.delete_tag"}} {{svg "octicon-trash" 16 "tw-mr-1"}}{{ctx.Locale.Tr "repo.release.delete_tag"}}
</a> </a>
{{end}} {{end}}
@ -64,7 +64,7 @@
</div> </div>
{{if $.Permission.CanWrite $.UnitTypeCode}} {{if $.Permission.CanWrite $.UnitTypeCode}}
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-tag">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.release.delete_tag"}} {{ctx.Locale.Tr "repo.release.delete_tag"}}

View file

@ -61,7 +61,7 @@
<div class="ui right"> <div class="ui right">
<a class="ui small button" href="{{.RepoLink}}/wiki/{{.PageURL}}?action=_edit">{{ctx.Locale.Tr "repo.wiki.edit_page_button"}}</a> <a class="ui small button" href="{{.RepoLink}}/wiki/{{.PageURL}}?action=_edit">{{ctx.Locale.Tr "repo.wiki.edit_page_button"}}</a>
<a class="ui small primary button" href="{{.RepoLink}}/wiki?action=_new">{{ctx.Locale.Tr "repo.wiki.new_page_button"}}</a> <a class="ui small primary button" href="{{.RepoLink}}/wiki?action=_new">{{ctx.Locale.Tr "repo.wiki.new_page_button"}}</a>
<a class="ui small red button delete-button" href="" data-url="{{.RepoLink}}/wiki/{{.PageURL}}?action=_delete" data-id="{{.PageURL}}">{{ctx.Locale.Tr "repo.wiki.delete_page_button"}}</a> <a class="ui small red button delete-button" href="" data-url="{{.RepoLink}}/wiki/{{.PageURL}}?action=_delete" data-id="{{.PageURL}}" data-modal-id="delete-wiki-page">{{ctx.Locale.Tr "repo.wiki.delete_page_button"}}</a>
</div> </div>
{{end}} {{end}}
</div> </div>
@ -110,7 +110,7 @@
</div> </div>
</div> </div>
<div class="ui g-modal-confirm delete modal"> <div class="ui g-modal-confirm delete modal" id="delete-wiki-page">
<div class="header"> <div class="header">
{{svg "octicon-trash"}} {{svg "octicon-trash"}}
{{ctx.Locale.Tr "repo.wiki.delete_page_button"}} {{ctx.Locale.Tr "repo.wiki.delete_page_button"}}

View file

@ -40,7 +40,7 @@
<div class="field"> <div class="field">
<button class="ui primary button" data-url="{{.Link}}">{{ctx.Locale.Tr "actions.runners.update_runner"}}</button> <button class="ui primary button" data-url="{{.Link}}">{{ctx.Locale.Tr "actions.runners.update_runner"}}</button>
<button class="ui red button delete-button" data-url="{{.Link}}/delete" data-modal="#runner-delete-modal"> <button class="ui red button delete-button" data-url="{{.Link}}/delete" data-modal-id="runner-delete-modal">
{{ctx.Locale.Tr "actions.runners.delete_runner"}}</button> {{ctx.Locale.Tr "actions.runners.delete_runner"}}</button>
</div> </div>
</form> </form>

View file

@ -125,17 +125,6 @@
{{end}} {{end}}
</div> </div>
</div> </div>
{{if and (or $.CanWriteIssues $.CanWritePulls) (not $.Repository.IsArchived)}}
<div class="group">
<a class="flex-text-inline" href="{{$.Link}}/{{.ID}}/edit">{{svg "octicon-pencil" 14}}{{ctx.Locale.Tr "repo.issues.label_edit"}}</a>
{{if .IsClosed}}
<a class="link-action flex-text-inline" href data-url="{{$.Link}}/{{.ID}}/open">{{svg "octicon-check" 14}}{{ctx.Locale.Tr "repo.milestones.open"}}</a>
{{else}}
<a class="link-action flex-text-inline" href data-url="{{$.Link}}/{{.ID}}/close">{{svg "octicon-x" 14}}{{ctx.Locale.Tr "repo.milestones.close"}}</a>
{{end}}
<a class="delete-button flex-text-inline" href="#" data-url="{{$.RepoLink}}/milestones/delete" data-id="{{.ID}}">{{svg "octicon-trash" 14}}{{ctx.Locale.Tr "repo.issues.label_delete"}}</a>
</div>
{{end}}
</div> </div>
{{if .Content}} {{if .Content}}
<div class="markup content"> <div class="markup content">

View file

@ -208,7 +208,7 @@
<button class="ui primary button">{{ctx.Locale.Tr "repo.settings.add_webhook"}}</button> <button class="ui primary button">{{ctx.Locale.Tr "repo.settings.add_webhook"}}</button>
{{else}} {{else}}
<button class="ui primary button">{{ctx.Locale.Tr "repo.settings.update_webhook"}}</button> <button class="ui primary button">{{ctx.Locale.Tr "repo.settings.update_webhook"}}</button>
<a class="ui red delete-button button" data-url="{{.BaseLink}}/delete" data-id="{{.Webhook.ID}}">{{ctx.Locale.Tr "repo.settings.delete_webhook"}}</a> <a class="ui red delete-button button" data-url="{{.BaseLink}}/delete" data-id="{{.Webhook.ID}}" data-modal-id="delete-webhook">{{ctx.Locale.Tr "repo.settings.delete_webhook"}}</a>
{{end}} {{end}}
</fieldset> </fieldset>

View file

@ -369,12 +369,13 @@ export function initGlobalLinkActions() {
e.preventDefault(); e.preventDefault();
const $this = $(this || e.target); const $this = $(this || e.target);
const dataArray = $this.data(); const dataArray = $this.data();
let filter = '';
if ($this[0].getAttribute('data-modal-id')) { const modalID = $this[0].getAttribute('data-modal-id');
filter += `#${$this[0].getAttribute('data-modal-id')}`; if (!modalID) {
throw new Error('This button does not specify which modal it wants to open.');
} }
const $dialog = $(`.delete.modal${filter}`); const $dialog = $(`#${modalID}`);
$dialog.find('.name').text($this.data('name')); $dialog.find('.name').text($this.data('name'));
for (const [key, value] of Object.entries(dataArray)) { for (const [key, value] of Object.entries(dataArray)) {
if (key && key.startsWith('data')) { if (key && key.startsWith('data')) {