Ask with Unraid's own dialog, not the browser's
Every confirm() and prompt() in the plugin could be switched off from inside itself — one tick of "prevent this page from creating additional dialogs" and all 32 of them returned false while drawing nothing, across every tab, until a full reload. swal is already global on every webGUI page and core uses it 370 times without a single confirm(), so this costs no new dependency. vvConfirmRun() is the one that mattered: it returned a boolean to three callers testing !it, and an unawaited promise is always truthy, so leaving those alone would have run every job without asking. The wrapper's callback is a classic function expression on purpose — SweetAlert only calls back on cancel when the callback's own source declares a parameter, and an arrow would have hung the promise forever.
This commit is contained in:
@@ -485,18 +485,18 @@ function _bindEvents() {
|
||||
|
||||
// Delete folder
|
||||
document.querySelectorAll('[data-delete-folder]').forEach(el => {
|
||||
el.addEventListener('click', e => {
|
||||
el.addEventListener('click', async e => {
|
||||
e.stopPropagation();
|
||||
const fid = el.dataset.deleteFolder;
|
||||
const f = (_data.folders||[]).find(x=>x.id===fid);
|
||||
if (!f || !confirm(`Delete "${f.name}"? Containers will be ungrouped.`)) return;
|
||||
if (!f || !await vvConfirm(`Delete "${f.name}"? Containers will be ungrouped.`)) return;
|
||||
_api({action:'delete_folder',folder_id:fid}, r => { if(r.ok) _reload(); else alert('Delete failed: '+(r.error||'?')); });
|
||||
});
|
||||
});
|
||||
|
||||
// New folder
|
||||
document.getElementById('vv-dk-add-folder')?.addEventListener('click', () => {
|
||||
const name = prompt('New folder name:');
|
||||
document.getElementById('vv-dk-add-folder')?.addEventListener('click', async () => {
|
||||
const name = await vvPrompt('New folder name:');
|
||||
if (name?.trim()) _api({action:'create_folder',name:name.trim()}, r => { if(r.ok) _reload(); else alert(r.error); });
|
||||
});
|
||||
}
|
||||
@@ -520,11 +520,11 @@ function _showPopover(x, y) {
|
||||
pop.style.top = Math.min(y+8, vh-180)+'px';
|
||||
|
||||
pop.querySelectorAll('[data-fid]').forEach(el => {
|
||||
el.addEventListener('click', () => {
|
||||
el.addEventListener('click', async () => {
|
||||
const fid = el.dataset.fid;
|
||||
_hidePopover();
|
||||
if (fid==='__new__') {
|
||||
const name = prompt('New folder name:');
|
||||
const name = await vvPrompt('New folder name:');
|
||||
if (!name?.trim()) return;
|
||||
_api({action:'create_folder',name:name.trim()}, r => {
|
||||
if (!r.ok) { alert(r.error); return; }
|
||||
@@ -558,8 +558,8 @@ function _syncC2J() {
|
||||
_api({action:'sync_conf_to_json'}, r => { if(r.ok) _reload(); else alert(r.error); });
|
||||
}
|
||||
document.getElementById('vv-dk-sync-c2j').addEventListener('click', _syncC2J);
|
||||
document.getElementById('vv-dk-sync-j2c').addEventListener('click', () => {
|
||||
if (!confirm('Overwrite conf map with current JSON state?')) return;
|
||||
document.getElementById('vv-dk-sync-j2c').addEventListener('click', async () => {
|
||||
if (!await vvConfirm('Overwrite conf map with current JSON state?')) return;
|
||||
_api({action:'sync_json_to_conf'}, r => { if(r.ok) _reload(); else alert(r.error); });
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user