|
@@ -201,6 +201,28 @@
|
|
|
return { refresh: () => { refreshButton(); renderList(); } };
|
|
return { refresh: () => { refreshButton(); renderList(); } };
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ let menuDismissBound = false;
|
|
|
|
|
+
|
|
|
|
|
+ /** 点击空白处 / Esc 关闭下拉(按钮本身已 stopPropagation,不会误关) */
|
|
|
|
|
+ function bindMenuDismiss() {
|
|
|
|
|
+ if (menuDismissBound) return;
|
|
|
|
|
+ menuDismissBound = true;
|
|
|
|
|
+ document.addEventListener('click', (event) => {
|
|
|
|
|
+ document.querySelectorAll('.ops-multi').forEach((root) => {
|
|
|
|
|
+ const menu = root.querySelector('.ops-multi-menu');
|
|
|
|
|
+ if (!menu || menu.hidden) return;
|
|
|
|
|
+ if (root.contains(event.target)) return;
|
|
|
|
|
+ menu.hidden = true;
|
|
|
|
|
+ const btn = root.querySelector('.ops-multi-btn');
|
|
|
|
|
+ if (btn) btn.setAttribute('aria-expanded', 'false');
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+ document.addEventListener('keydown', (event) => {
|
|
|
|
|
+ if (event.key !== 'Escape') return;
|
|
|
|
|
+ document.querySelectorAll('.ops-multi-menu').forEach((menu) => { menu.hidden = true; });
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
function renderBar() {
|
|
function renderBar() {
|
|
|
const bar = $('opsBar');
|
|
const bar = $('opsBar');
|
|
|
if (!bar) return;
|
|
if (!bar) return;
|
|
@@ -818,6 +840,7 @@
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
function bindOnce() {
|
|
function bindOnce() {
|
|
|
|
|
+ bindMenuDismiss();
|
|
|
const uploadBtn = $('btnOpsUpload');
|
|
const uploadBtn = $('btnOpsUpload');
|
|
|
if (uploadBtn) uploadBtn.addEventListener('click', openUpload);
|
|
if (uploadBtn) uploadBtn.addEventListener('click', openUpload);
|
|
|
const recordsBtn = $('btnOpsRecords');
|
|
const recordsBtn = $('btnOpsRecords');
|