feat: vendor edit with name/website/mont_page in admin panel

This commit is contained in:
2026-05-12 16:13:55 +03:00
parent 26f17a8bb6
commit 5a8471e85c
3 changed files with 938 additions and 136 deletions
+35 -22
View File
@@ -4,12 +4,29 @@
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;
let saveTimer = null;
let saveInFlight = false;
function markDirty() {
isDirty = true;
@@ -33,29 +50,9 @@
syncing = false;
}
async function autoSaveMatrix() {
if (saveInFlight) return;
saveInFlight = true;
try {
const formData = new FormData(matrixForm);
const response = await fetch(window.location.href, {
method: "POST",
body: formData,
credentials: "same-origin",
});
if (!response.ok) throw new Error("save failed");
isDirty = false;
} catch (error) {
} finally {
saveInFlight = false;
}
}
matrixForm.addEventListener("change", (event) => {
if (!(event.target && event.target.matches('input[type="checkbox"]'))) return;
markDirty();
if (saveTimer) clearTimeout(saveTimer);
saveTimer = setTimeout(autoSaveMatrix, 250);
});
matrixForm.addEventListener("submit", () => {
@@ -89,4 +86,20 @@
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;
});
})();