refactor: replace Fomantic modal with native dialog (#39846)

Replace Fomantic's hard-forked jQuery modal with native `<dialog>`
elements, advancing https://github.com/go-gitea/gitea/issues/29849. The
UI is visually unchanged. Dialogs open with `show()` over an `inert`
page, so tooltips, popups and toasts mounted on `<body>` stay usable
above them, unlike with `showModal()`
(https://github.com/whatwg/html/issues/9936).

- Remove the Fomantic modal and dimmer, add `showModal` and `hideModal`
- Declare modals as `<dialog class="modal-dialog">`, shown inside a
`.modal-backdrop`, instead of `ui modal` with its unused size classes
- Remove two modals that could never be opened
- Block the page while a modal is open, close the topmost one on Escape
and restore focus to its opener
- Allow stacked modals, use a confirm modal instead of `window.confirm`
for deleting content history
- Hide popups and toasts when a modal opens or closes
- Keep the release notes modal open when generating notes fails

Fixes: https://github.com/go-gitea/gitea/issues/39643
Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
silverwindandwxiaoguang authored and GitHub committed 2026-10-20 12:32:27 +02:00
1 parent 7610336d74
commit e645afbb3f
95 files changed
+607 -1719

No files matched your search

+4 -4
View File
@@ -127,7 +127,7 @@
</button>
</div>
</form>
<div class="ui small modal" id="delete-account">
<dialog class="modal-dialog" id="delete-account">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.delete_account_title"}}
@@ -136,12 +136,12 @@
<p>{{ctx.Locale.Tr "settings.delete_account_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
{{end}}
</div>
<div class="ui small modal" id="delete-email">
<dialog class="modal-dialog" id="delete-email">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.email_deletion"}}
@@ -150,6 +150,6 @@
<p>{{ctx.Locale.Tr "settings.email_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
{{template "user/settings/layout_footer" .}}
@@ -35,7 +35,7 @@
{{end}}
</div>
<div class="ui small modal" id="remove-gitea-oauth2-application">
<dialog class="modal-dialog" id="remove-gitea-oauth2-application">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.remove_oauth2_application"}}
@@ -44,7 +44,7 @@
<p>{{ctx.Locale.Tr "settings.oauth2_application_remove_description"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
<div class="ui bottom attached segment">
+2 -2
View File
@@ -27,7 +27,7 @@
{{end}}
</div>
<div class="ui small modal" id="revoke-gitea-oauth2-grant">
<dialog class="modal-dialog" id="revoke-gitea-oauth2-grant">
<div class="header">
{{svg "octicon-shield" 16 "tw-mr-1"}}
{{ctx.Locale.Tr "settings.revoke_oauth2_grant"}}
@@ -36,5 +36,5 @@
<p>{{ctx.Locale.Tr "settings.revoke_oauth2_grant_description"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
+2 -2
View File
@@ -123,7 +123,7 @@
{{end}}
{{end}}
</div>
<div class="ui small modal" id="delete-gpg">
<dialog class="modal-dialog" id="delete-gpg">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.gpg_key_deletion"}}
@@ -132,5 +132,5 @@
<p>{{ctx.Locale.Tr "settings.gpg_key_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
+2 -2
View File
@@ -55,7 +55,7 @@
</div>
</div>
<div class="ui small modal" id="delete-principal">
<dialog class="modal-dialog" id="delete-principal">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.ssh_principal_deletion"}}
@@ -64,5 +64,5 @@
<p>{{ctx.Locale.Tr "settings.ssh_principal_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
{{end}}
+2 -2
View File
@@ -103,7 +103,7 @@
{{end}}
{{end}}
</div>
<div class="ui small modal" id="delete-ssh">
<dialog class="modal-dialog" id="delete-ssh">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.ssh_key_deletion"}}
@@ -112,5 +112,5 @@
<p>{{ctx.Locale.Tr "settings.ssh_key_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
+8 -6
View File
@@ -38,14 +38,16 @@
</div>
</div>
<form class="ui small modal form-fetch-action" method="post" id="leave-organization">
<dialog class="modal-dialog" id="leave-organization">
<div class="header">
{{ctx.Locale.Tr "org.members.leave"}}
</div>
<div class="content">
<p>{{ctx.Locale.Tr "org.members.leave.detail" (HTMLFormat `<span class="%s"></span>` "organization-name")}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</form>
<form class="form-fetch-action" method="post">
<div class="content">
<p>{{ctx.Locale.Tr "org.members.leave.detail" (HTMLFormat `<span class="%s"></span>` "organization-name")}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</form>
</dialog>
{{template "user/settings/layout_footer" .}}
+4 -15
View File
@@ -35,7 +35,7 @@
<div class="tw-float-right">
{{if $.allowAdopt}}
<button type="button" class="ui button primary show-modal tw-p-2" data-modal="#adopt-unadopted-modal-{{$dirI}}"><span class="icon">{{svg "octicon-plus"}}</span><span class="label">{{ctx.Locale.Tr "repo.adopt_preexisting_label"}}</span></button>
<div class="ui g-modal-confirm modal" id="adopt-unadopted-modal-{{$dirI}}">
<dialog class="modal-dialog" id="adopt-unadopted-modal-{{$dirI}}">
<div class="header">
<span class="label">{{ctx.Locale.Tr "repo.adopt_preexisting"}}</span>
</div>
@@ -47,11 +47,11 @@
<input type="hidden" name="action" value="adopt">
{{template "base/modal_actions_confirm" $}}
</form>
</div>
</dialog>
{{end}}
{{if $.allowDelete}}
<button type="button" class="ui button red show-modal tw-p-2" data-modal="#delete-unadopted-modal-{{$dirI}}"><span class="icon">{{svg "octicon-x"}}</span><span class="label">{{ctx.Locale.Tr "repo.delete_preexisting_label"}}</span></button>
<div class="ui g-modal-confirm modal" id="delete-unadopted-modal-{{$dirI}}">
<dialog class="modal-dialog" id="delete-unadopted-modal-{{$dirI}}">
<div class="header">
<span class="label">{{ctx.Locale.Tr "repo.delete_preexisting"}}</span>
</div>
@@ -63,7 +63,7 @@
<input type="hidden" name="action" value="delete">
{{template "base/modal_actions_confirm" $}}
</form>
</div>
</dialog>
{{end}}
</div>
{{end}}
@@ -114,15 +114,4 @@
</div>
</div>
<div class="ui g-modal-confirm delete modal">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.remove_account_link"}}
</div>
<div class="content">
<p>{{ctx.Locale.Tr "settings.remove_account_link_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
{{template "user/settings/layout_footer" .}}
@@ -48,7 +48,7 @@
{{end}}
</div>
<div class="ui small modal" id="delete-account-link">
<dialog class="modal-dialog" id="delete-account-link">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.remove_account_link"}}
@@ -57,6 +57,6 @@
<p>{{ctx.Locale.Tr "settings.remove_account_link_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
{{end}}
+2 -2
View File
@@ -48,7 +48,7 @@
</button>
</form>
<div class="ui small modal" id="delete-openid">
<dialog class="modal-dialog" id="delete-openid">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.openid_deletion"}}
@@ -57,5 +57,5 @@
<p>{{ctx.Locale.Tr "settings.openid_deletion_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
+2 -2
View File
@@ -22,7 +22,7 @@
</div>
{{end}}
<div class="ui small modal" id="disable-twofa">
<dialog class="modal-dialog" id="disable-twofa">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.twofa_disable"}}
@@ -31,5 +31,5 @@
<p>{{ctx.Locale.Tr "settings.twofa_disable_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>
@@ -35,7 +35,7 @@
</div>
<button type="button" id="register-webauthn" class="ui primary button">{{svg "octicon-key"}} {{ctx.Locale.Tr "settings.webauthn_register_key"}}</button>
</div>
<div class="ui small modal" id="rename-webauthn-nickname">
<dialog class="modal-dialog" id="rename-webauthn-nickname">
<div class="header">
{{svg "octicon-pencil"}}
{{ctx.Locale.Tr "rename"}}
@@ -48,8 +48,8 @@
</div>
{{template "base/modal_actions_confirm" (dict "ModalButtonTypes" "confirm")}}
</form>
</div>
<div class="ui small modal" id="delete-registration">
</dialog>
<dialog class="modal-dialog" id="delete-registration">
<div class="header">
{{svg "octicon-trash"}}
{{ctx.Locale.Tr "settings.webauthn_delete_key"}}
@@ -58,5 +58,5 @@
<p>{{ctx.Locale.Tr "settings.webauthn_delete_key_desc"}}</p>
</div>
{{template "base/modal_actions_confirm" .}}
</div>
</dialog>
</div>