я косяк, поправил веб. Капитан, работайте!
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -2,6 +2,11 @@
|
||||
* Экспорт /reports — выбор раздела и формата (Excel / PDF).
|
||||
*/
|
||||
(function (global) {
|
||||
let btnEl = null;
|
||||
let menuEl = null;
|
||||
let isOpen = false;
|
||||
let suppressOutsideCloseUntil = 0;
|
||||
|
||||
function appendFilterContext(params) {
|
||||
const farms = global.WespReportsFilters?.getSelectedFarmNames?.() || [];
|
||||
const dispensers = global.WespReportsFilters?.getSelectedDispenserNames?.() || [];
|
||||
@@ -34,34 +39,89 @@
|
||||
window.location.href = buildExportUrl(format, section);
|
||||
}
|
||||
|
||||
function isMenuTarget(target) {
|
||||
if (!target || !btnEl || !menuEl) return false;
|
||||
return btnEl.contains(target) || menuEl.contains(target);
|
||||
}
|
||||
|
||||
function positionMenu() {
|
||||
if (!btnEl || !menuEl || !isOpen) return;
|
||||
const rect = btnEl.getBoundingClientRect();
|
||||
let top = rect.bottom + 6;
|
||||
const menuHeight = menuEl.offsetHeight || 320;
|
||||
if (top + menuHeight > window.innerHeight - 12) {
|
||||
top = Math.max(12, rect.top - menuHeight - 6);
|
||||
}
|
||||
menuEl.style.top = `${top}px`;
|
||||
menuEl.style.right = `${Math.max(12, window.innerWidth - rect.right)}px`;
|
||||
menuEl.style.left = "auto";
|
||||
menuEl.style.width = "";
|
||||
menuEl.style.transform = "";
|
||||
}
|
||||
|
||||
function closeMenu() {
|
||||
const menu = document.getElementById("reportsExportMenu");
|
||||
const btn = document.getElementById("reportsExportBtn");
|
||||
if (menu) menu.hidden = true;
|
||||
if (btn) btn.setAttribute("aria-expanded", "false");
|
||||
isOpen = false;
|
||||
suppressOutsideCloseUntil = 0;
|
||||
if (menuEl) {
|
||||
menuEl.hidden = true;
|
||||
menuEl.setAttribute("hidden", "");
|
||||
menuEl.classList.remove("reports-export-dropdown__menu--open");
|
||||
menuEl.style.top = "";
|
||||
menuEl.style.right = "";
|
||||
menuEl.style.left = "";
|
||||
menuEl.style.width = "";
|
||||
menuEl.style.transform = "";
|
||||
}
|
||||
if (btnEl) btnEl.setAttribute("aria-expanded", "false");
|
||||
window.removeEventListener("resize", positionMenu);
|
||||
window.removeEventListener("scroll", positionMenu, true);
|
||||
}
|
||||
|
||||
function openMenu() {
|
||||
global.WespReportsDateRange?.close?.();
|
||||
global.WespReportsFilterDropdown?.closeAll?.();
|
||||
isOpen = true;
|
||||
suppressOutsideCloseUntil = Date.now() + 180;
|
||||
if (menuEl) {
|
||||
menuEl.removeAttribute("hidden");
|
||||
menuEl.hidden = false;
|
||||
menuEl.classList.add("reports-export-dropdown__menu--open");
|
||||
}
|
||||
if (btnEl) btnEl.setAttribute("aria-expanded", "true");
|
||||
positionMenu();
|
||||
requestAnimationFrame(() => positionMenu());
|
||||
window.addEventListener("resize", positionMenu);
|
||||
window.addEventListener("scroll", positionMenu, true);
|
||||
}
|
||||
|
||||
function toggleMenu() {
|
||||
const menu = document.getElementById("reportsExportMenu");
|
||||
const btn = document.getElementById("reportsExportBtn");
|
||||
if (!menu || !btn) return;
|
||||
const open = menu.hidden;
|
||||
menu.hidden = !open;
|
||||
btn.setAttribute("aria-expanded", open ? "true" : "false");
|
||||
if (isOpen) closeMenu();
|
||||
else openMenu();
|
||||
}
|
||||
|
||||
function init() {
|
||||
const btn = document.getElementById("reportsExportBtn");
|
||||
const menu = document.getElementById("reportsExportMenu");
|
||||
if (!btn || !menu || btn.dataset.bound) return;
|
||||
btn.dataset.bound = "1";
|
||||
btnEl = document.getElementById("reportsExportBtn");
|
||||
menuEl = document.getElementById("reportsExportMenu");
|
||||
if (!btnEl || !menuEl || btnEl.dataset.bound) return;
|
||||
btnEl.dataset.bound = "1";
|
||||
|
||||
btn.addEventListener("click", (e) => {
|
||||
e.stopPropagation();
|
||||
toggleMenu();
|
||||
});
|
||||
if (menuEl.parentElement !== document.body) {
|
||||
document.body.appendChild(menuEl);
|
||||
}
|
||||
|
||||
menu.querySelectorAll("[data-reports-export-format]").forEach((item) => {
|
||||
btnEl.addEventListener(
|
||||
"pointerdown",
|
||||
(e) => {
|
||||
if (e.button !== 0) return;
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
e.stopImmediatePropagation();
|
||||
toggleMenu();
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
menuEl.querySelectorAll("[data-reports-export-format]").forEach((item) => {
|
||||
item.addEventListener("click", (e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
@@ -73,14 +133,30 @@
|
||||
});
|
||||
});
|
||||
|
||||
menu.addEventListener("mousedown", (e) => e.stopPropagation());
|
||||
menu.addEventListener("click", (e) => e.stopPropagation());
|
||||
menuEl.addEventListener("mousedown", (e) => e.stopPropagation());
|
||||
menuEl.addEventListener("click", (e) => e.stopPropagation());
|
||||
|
||||
document.addEventListener(
|
||||
"pointerdown",
|
||||
(e) => {
|
||||
if (Date.now() < suppressOutsideCloseUntil) return;
|
||||
if (!isOpen) return;
|
||||
if (isMenuTarget(e.target)) return;
|
||||
closeMenu();
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
document.addEventListener("click", () => closeMenu());
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Escape") closeMenu();
|
||||
if (e.key === "Escape" && isOpen) closeMenu();
|
||||
});
|
||||
}
|
||||
|
||||
global.WespReportsExport = { init, buildExportUrl, download, appendFilterContext };
|
||||
global.WespReportsExport = {
|
||||
init,
|
||||
buildExportUrl,
|
||||
download,
|
||||
appendFilterContext,
|
||||
close: closeMenu,
|
||||
};
|
||||
})(typeof window !== "undefined" ? window : globalThis);
|
||||
|
||||
Reference in New Issue
Block a user