mirror of
https://github.com/go-gitea/gitea
synced 2024-11-05 04:47:02 +01:00
Fix and clean up ConfirmModal
(#31283)
Bug: orange button color was removed in https://github.com/go-gitea/gitea/pull/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>
This commit is contained in:
parent
15debbbe4e
commit
291a00dc57
@ -295,8 +295,8 @@ async function linkAction(e) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isRisky = el.classList.contains('red') || el.classList.contains('yellow') || el.classList.contains('orange') || el.classList.contains('negative');
|
const isRisky = el.classList.contains('red') || el.classList.contains('negative');
|
||||||
if (await confirmModal({content: modalConfirmContent, buttonColor: isRisky ? 'orange' : 'primary'})) {
|
if (await confirmModal(modalConfirmContent, {confirmButtonColor: isRisky ? 'red' : 'primary'})) {
|
||||||
await doRequest();
|
await doRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +1,23 @@
|
|||||||
import $ from 'jquery';
|
import $ from 'jquery';
|
||||||
import {svg} from '../../svg.js';
|
import {svg} from '../../svg.js';
|
||||||
import {htmlEscape} from 'escape-goat';
|
import {htmlEscape} from 'escape-goat';
|
||||||
|
import {createElementFromHTML} from '../../utils/dom.js';
|
||||||
|
|
||||||
const {i18n} = window.config;
|
const {i18n} = window.config;
|
||||||
|
|
||||||
export async function confirmModal(opts = {content: '', buttonColor: 'primary'}) {
|
export function confirmModal(content, {confirmButtonColor = 'primary'} = {}) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
const $modal = $(`
|
const modal = createElementFromHTML(`
|
||||||
<div class="ui g-modal-confirm modal">
|
<div class="ui g-modal-confirm modal">
|
||||||
<div class="content">${htmlEscape(opts.content)}</div>
|
<div class="content">${htmlEscape(content)}</div>
|
||||||
<div class="actions">
|
<div class="actions">
|
||||||
<button class="ui cancel button">${svg('octicon-x')} ${i18n.modal_cancel}</button>
|
<button class="ui cancel button">${svg('octicon-x')} ${htmlEscape(i18n.modal_cancel)}</button>
|
||||||
<button class="ui ${opts.buttonColor || 'primary'} ok button">${svg('octicon-check')} ${i18n.modal_confirm}</button>
|
<button class="ui ${confirmButtonColor} ok button">${svg('octicon-check')} ${htmlEscape(i18n.modal_confirm)}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
`);
|
`);
|
||||||
|
document.body.append(modal);
|
||||||
$modal.appendTo(document.body);
|
const $modal = $(modal);
|
||||||
$modal.modal({
|
$modal.modal({
|
||||||
onApprove() {
|
onApprove() {
|
||||||
resolve(true);
|
resolve(true);
|
||||||
|
@ -76,7 +76,7 @@ function initRepoIssueListCheckboxes() {
|
|||||||
// for delete
|
// for delete
|
||||||
if (action === 'delete') {
|
if (action === 'delete') {
|
||||||
const confirmText = e.target.getAttribute('data-action-delete-confirm');
|
const confirmText = e.target.getAttribute('data-action-delete-confirm');
|
||||||
if (!await confirmModal({content: confirmText, buttonColor: 'orange'})) {
|
if (!await confirmModal(confirmText, {confirmButtonColor: 'red'})) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -297,3 +297,10 @@ export function replaceTextareaSelection(textarea, text) {
|
|||||||
textarea.dispatchEvent(new CustomEvent('change', {bubbles: true, cancelable: true}));
|
textarea.dispatchEvent(new CustomEvent('change', {bubbles: true, cancelable: true}));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Warning: Do not enter any unsanitized variables here
|
||||||
|
export function createElementFromHTML(htmlString) {
|
||||||
|
const div = document.createElement('div');
|
||||||
|
div.innerHTML = htmlString.trim();
|
||||||
|
return div.firstChild;
|
||||||
|
}
|
||||||
|
5
web_src/js/utils/dom.test.js
Normal file
5
web_src/js/utils/dom.test.js
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import {createElementFromHTML} from './dom.js';
|
||||||
|
|
||||||
|
test('createElementFromHTML', () => {
|
||||||
|
expect(createElementFromHTML('<a>foo<span>bar</span></a>').outerHTML).toEqual('<a>foo<span>bar</span></a>');
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user