From 9d35aaf6735f23aec235081e6c5e4baa16dbd07f Mon Sep 17 00:00:00 2001 From: Maxim Dolgolyov Date: Mon, 22 Jun 2026 16:48:24 +0300 Subject: [PATCH] =?UTF-8?q?fix(admin/access):=20=D0=BD=D0=B0=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=BD=D1=8B=D0=B5=20confirm()=20=E2=86=92=20=D1=81=D1=82?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD=D0=B0?= =?UTF-8?q?=D1=8F=20=D0=BC=D0=BE=D0=B4=D0=B0=D0=BB=D0=BA=D0=B0=20LS.confir?= =?UTF-8?q?m?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Раздел «Доступ · контент» использовал браузерный confirm() («Подтвердите действие на localhost…») для закрытия доступа у всех классов и копирования. Заменены все 5 вызовов на LS.confirm (та же модалка, что в остальном админ- разделе): «Закрыть доступ» (danger) и «Скопировать доступ» (danger:false). Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/js/admin/sections/access.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/js/admin/sections/access.js b/frontend/js/admin/sections/access.js index b4c0f4c..5eccd86 100644 --- a/frontend/js/admin/sections/access.js +++ b/frontend/js/admin/sections/access.js @@ -311,7 +311,7 @@ } async function bulk(allow) { - if (!allow && !confirm(`Закрыть «${_selContent.title}» у всех классов?`)) return; + if (!allow && !await LS.confirm(`Закрыть доступ к «${_selContent.title}» у всех классов?`, { title: 'Закрыть доступ', confirmText: 'Закрыть' })) return; const classes = _targets.classes || []; try { await Promise.all(classes.map(c => @@ -436,7 +436,7 @@ if (!sel || !sel.value) { LS.toast('Выберите класс-источник', 'error'); return; } const srcId = Number(sel.value); const srcName = sel.options[sel.selectedIndex].text; - if (!confirm(`Скопировать весь открытый доступ из «${srcName}» в «${_selClass.name}»? Текущие правила класса дополнятся.`)) return; + if (!await LS.confirm(`Скопировать весь открытый доступ из «${srcName}» в «${_selClass.name}»? Текущие правила класса дополнятся.`, { title: 'Скопировать доступ', confirmText: 'Скопировать', danger: false })) return; try { const src = await LS.accessClassOpen(srcId); const items = CONTENT_TYPES.flatMap(t => (src[bucket(t)] || []).map(ref => [t, ref])); @@ -449,7 +449,7 @@ } async function classBulk(allow) { - if (!allow && !confirm(`Закрыть весь контент у класса «${_selClass.name}»?`)) return; + if (!allow && !await LS.confirm(`Закрыть весь контент у класса «${_selClass.name}»?`, { title: 'Закрыть доступ', confirmText: 'Закрыть' })) return; const all = CONTENT_TYPES.flatMap(t => itemsOf(t).map(it => [t, it[keyName(t)]])); try { await Promise.all(all.map(([type, ref]) => @@ -543,7 +543,7 @@ const classes = _matrix.classes || []; const allOpen = classes.length && classes.every(c => ((_matrix.open[c.id] || {})[type] || []).includes(ref)); const open = !allOpen; - if (!open && !confirm(`Закрыть «${contentTitle(type, ref)}» у всех классов?`)) return; + if (!open && !await LS.confirm(`Закрыть доступ к «${contentTitle(type, ref)}» у всех классов?`, { title: 'Закрыть доступ', confirmText: 'Закрыть' })) return; try { await Promise.all(classes.map(c => LS.accessSetRule(type, ref, 'class', c.id, open ? 1 : null))); classes.forEach(c => mxApply(_matrix.open[c.id] || (_matrix.open[c.id] = {}), type, ref, open)); @@ -557,7 +557,7 @@ const allOpen = items.length && items.every(([t, ref]) => (o[t] || []).includes(ref)); const open = !allOpen; const cls = (_matrix.classes.find(c => c.id === classId) || {}).name || ('#' + classId); - if (!open && !confirm(`Закрыть весь контент у класса «${cls}»?`)) return; + if (!open && !await LS.confirm(`Закрыть весь контент у класса «${cls}»?`, { title: 'Закрыть доступ', confirmText: 'Закрыть' })) return; try { await Promise.all(items.map(([t, ref]) => LS.accessSetRule(t, ref, 'class', classId, open ? 1 : null))); items.forEach(([t, ref]) => mxApply(o, t, ref, open));