Skip to content

Commit 291a00d

Browse files
silverwindwxiaoguangdelvh
authored
Fix and clean up ConfirmModal (#31283)
Bug: orange button color was removed in #30475, replaced with red Bug: translation text was not html-escaped Refactor: Replaced as much jQuery as possible, added useful `createElementFromHTML` Refactor: Remove colors checks that don't exist on `.link-action` <img width="381" alt="image" src="https://github.com/go-gitea/gitea/assets/115237/5900bf6a-8a86-4a86-b368-0559cbfea66e"> --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com> Co-authored-by: delvh <dev.lh@web.de>
1 parent 15debbb commit 291a00d

File tree

5 files changed

+28
-15
lines changed

5 files changed

+28
-15
lines changed

web_src/js/features/common-global.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -295,8 +295,8 @@ async function linkAction(e) {
295295
return;
296296
}
297297

298-
const isRisky = el.classList.contains('red') || el.classList.contains('yellow') || el.classList.contains('orange') || el.classList.contains('negative');
299-
if (await confirmModal({content: modalConfirmContent, buttonColor: isRisky ? 'orange' : 'primary'})) {
298+
const isRisky = el.classList.contains('red') || el.classList.contains('negative');
299+
if (await confirmModal(modalConfirmContent, {confirmButtonColor: isRisky ? 'red' : 'primary'})) {
300300
await doRequest();
301301
}
302302
}

web_src/js/features/comp/ConfirmModal.js

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
import $ from 'jquery';
22
import {svg} from '../../svg.js';
33
import {htmlEscape} from 'escape-goat';
4+
import {createElementFromHTML} from '../../utils/dom.js';
45

56
const {i18n} = window.config;
67

7-
export async function confirmModal(opts = {content: '', buttonColor: 'primary'}) {
8+
export function confirmModal(content, {confirmButtonColor = 'primary'} = {}) {
89
return new Promise((resolve) => {
9-
const $modal = $(`
10-
<div class="ui g-modal-confirm modal">
11-
<div class="content">${htmlEscape(opts.content)}</div>
12-
<div class="actions">
13-
<button class="ui cancel button">${svg('octicon-x')} ${i18n.modal_cancel}</button>
14-
<button class="ui ${opts.buttonColor || 'primary'} ok button">${svg('octicon-check')} ${i18n.modal_confirm}</button>
15-
</div>
16-
</div>
17-
`);
18-
19-
$modal.appendTo(document.body);
10+
const modal = createElementFromHTML(`
11+
<div class="ui g-modal-confirm modal">
12+
<div class="content">${htmlEscape(content)}</div>
13+
<div class="actions">
14+
<button class="ui cancel button">${svg('octicon-x')} ${htmlEscape(i18n.modal_cancel)}</button>
15+
<button class="ui ${confirmButtonColor} ok button">${svg('octicon-check')} ${htmlEscape(i18n.modal_confirm)}</button>
16+
</div>
17+
</div>
18+
`);
19+
document.body.append(modal);
20+
const $modal = $(modal);
2021
$modal.modal({
2122
onApprove() {
2223
resolve(true);

web_src/js/features/repo-issue-list.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ function initRepoIssueListCheckboxes() {
7676
// for delete
7777
if (action === 'delete') {
7878
const confirmText = e.target.getAttribute('data-action-delete-confirm');
79-
if (!await confirmModal({content: confirmText, buttonColor: 'orange'})) {
79+
if (!await confirmModal(confirmText, {confirmButtonColor: 'red'})) {
8080
return;
8181
}
8282
}

web_src/js/utils/dom.js

+7
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,10 @@ export function replaceTextareaSelection(textarea, text) {
297297
textarea.dispatchEvent(new CustomEvent('change', {bubbles: true, cancelable: true}));
298298
}
299299
}
300+
301+
// Warning: Do not enter any unsanitized variables here
302+
export function createElementFromHTML(htmlString) {
303+
const div = document.createElement('div');
304+
div.innerHTML = htmlString.trim();
305+
return div.firstChild;
306+
}

web_src/js/utils/dom.test.js

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import {createElementFromHTML} from './dom.js';
2+
3+
test('createElementFromHTML', () => {
4+
expect(createElementFromHTML('<a>foo<span>bar</span></a>').outerHTML).toEqual('<a>foo<span>bar</span></a>');
5+
});

0 commit comments

Comments
 (0)