106 lines
3.8 KiB
JavaScript
106 lines
3.8 KiB
JavaScript
(function () {
|
|
const matrixForm = document.getElementById("matrixForm");
|
|
const matrixScroll = document.getElementById("matrixScroll");
|
|
const matrixTable = document.getElementById("matrixTable");
|
|
const topScroll = document.getElementById("matrixHScroll");
|
|
const topScrollInner = document.getElementById("matrixHScrollInner");
|
|
document.addEventListener("click", async (event) => {
|
|
const button = event.target.closest("[data-copy-target]");
|
|
if (!button) return;
|
|
const field = document.getElementById(button.dataset.copyTarget);
|
|
if (!field) return;
|
|
field.select();
|
|
field.setSelectionRange(0, field.value.length);
|
|
try {
|
|
await navigator.clipboard.writeText(field.value);
|
|
} catch (error) {
|
|
document.execCommand("copy");
|
|
}
|
|
const originalText = button.textContent;
|
|
button.textContent = "Скопировано";
|
|
setTimeout(() => {
|
|
button.textContent = originalText;
|
|
}, 1600);
|
|
});
|
|
|
|
if (!matrixForm || !matrixScroll || !matrixTable || !topScroll || !topScrollInner) return;
|
|
|
|
let isDirty = false;
|
|
let syncing = false;
|
|
|
|
function markDirty() {
|
|
isDirty = true;
|
|
}
|
|
|
|
function updateTopScrollWidth() {
|
|
topScrollInner.style.width = matrixTable.scrollWidth + "px";
|
|
}
|
|
|
|
function syncScrollFromTop() {
|
|
if (syncing) return;
|
|
syncing = true;
|
|
matrixScroll.scrollLeft = topScroll.scrollLeft;
|
|
syncing = false;
|
|
}
|
|
|
|
function syncScrollFromMatrix() {
|
|
if (syncing) return;
|
|
syncing = true;
|
|
topScroll.scrollLeft = matrixScroll.scrollLeft;
|
|
syncing = false;
|
|
}
|
|
|
|
matrixForm.addEventListener("change", (event) => {
|
|
if (!(event.target && event.target.matches('input[type="checkbox"]'))) return;
|
|
markDirty();
|
|
});
|
|
|
|
matrixForm.addEventListener("submit", () => {
|
|
isDirty = false;
|
|
});
|
|
|
|
window.addEventListener("beforeunload", (event) => {
|
|
if (!isDirty) return;
|
|
event.preventDefault();
|
|
event.returnValue = "";
|
|
});
|
|
|
|
document.addEventListener("click", (event) => {
|
|
const anchor = event.target.closest("a");
|
|
if (!anchor || !isDirty) return;
|
|
const ok = window.confirm("Есть несохраненные изменения матрицы. Нажмите OK, чтобы остаться и сначала сохранить.");
|
|
if (!ok) return;
|
|
event.preventDefault();
|
|
});
|
|
|
|
document.addEventListener("submit", (event) => {
|
|
const form = event.target;
|
|
if (!form || form === matrixForm || !isDirty) return;
|
|
const ok = window.confirm("Есть несохраненные изменения матрицы. Нажмите OK, чтобы остаться и сначала сохранить.");
|
|
if (!ok) return;
|
|
event.preventDefault();
|
|
});
|
|
|
|
topScroll.addEventListener("scroll", syncScrollFromTop);
|
|
matrixScroll.addEventListener("scroll", syncScrollFromMatrix);
|
|
window.addEventListener("resize", updateTopScrollWidth);
|
|
updateTopScrollWidth();
|
|
syncScrollFromMatrix();
|
|
|
|
document.addEventListener("click", (event) => {
|
|
const button = event.target.closest("[data-edit-product]");
|
|
if (!button) return;
|
|
const form = document.querySelector(`[data-product-edit="${button.dataset.editProduct}"]`);
|
|
if (!form) return;
|
|
form.hidden = !form.hidden;
|
|
});
|
|
|
|
document.addEventListener("click", (event) => {
|
|
const button = event.target.closest("[data-edit-vendor]");
|
|
if (!button) return;
|
|
const form = document.querySelector(`[data-vendor-edit="${button.dataset.editVendor}"]`);
|
|
if (!form) return;
|
|
form.hidden = !form.hidden;
|
|
});
|
|
})();
|