(function () { "use strict"; // --- Açık / koyu tema ------------------------------------------------------------ document.addEventListener("click", function (e) { var toggle = e.target.closest("[data-theme-toggle]"); if (!toggle) return; e.preventDefault(); var root = document.documentElement; var next = root.getAttribute("data-bs-theme") === "dark" ? "light" : "dark"; root.setAttribute("data-bs-theme", next); try { localStorage.setItem("theme", next); } catch (err) {} }); // --- HTMX ile doldurulan modal ------------------------------------------------------ // Modal içeriğini yüklemek için: hx-get="..." hx-target="#htmx-modal-dialog" // Sunucu "closeModal" HX-Trigger olayını gönderince modal kapanır. var modalEl = document.getElementById("htmx-modal"); if (modalEl) { var modal = bootstrap.Modal.getOrCreateInstance(modalEl); document.body.addEventListener("htmx:afterSwap", function (e) { if (e.detail.target.id === "htmx-modal-dialog" && !modalEl.classList.contains("show")) { modal.show(); } }); document.body.addEventListener("closeModal", function () { modal.hide(); }); // Sunucu "reloadPage" gönderirse sayfayı yenile (ör. üretim işinde aşama güncellemesi) document.body.addEventListener("reloadPage", function () { window.location.reload(); }); modalEl.addEventListener("hidden.bs.modal", function () { document.getElementById("htmx-modal-dialog").innerHTML = ""; }); } // --- Onay penceresi ----------------------------------------------------------------- //
veya HTMX elemanında hx-confirm="..." var confirmEl = document.getElementById("confirm-modal"); var pendingAction = null; function askConfirm(message, onConfirm) { if (!confirmEl) { onConfirm(); return; } confirmEl.querySelector("[data-confirm-message]").textContent = message; pendingAction = onConfirm; bootstrap.Modal.getOrCreateInstance(confirmEl).show(); } if (confirmEl) { confirmEl.querySelector("[data-confirm-ok]").addEventListener("click", function () { bootstrap.Modal.getOrCreateInstance(confirmEl).hide(); if (pendingAction) { var action = pendingAction; pendingAction = null; action(); } }); } document.addEventListener("submit", function (e) { var form = e.target; if (!form.dataset.confirm || form.dataset.confirmed) return; e.preventDefault(); askConfirm(form.dataset.confirm, function () { form.dataset.confirmed = "1"; form.requestSubmit ? form.requestSubmit() : form.submit(); }); }); document.body.addEventListener("htmx:confirm", function (e) { if (!e.detail.question) return; e.preventDefault(); askConfirm(e.detail.question, function () { e.detail.issueRequest(true); }); }); // --- Dinamik formset satırları --------------------------------------------------- //
… // …
document.addEventListener("click", function (e) { var add = e.target.closest("[data-formset-add]"); if (!add) return; e.preventDefault(); var box = add.closest("[data-formset]"); var prefix = box.dataset.formset; var total = box.querySelector("#id_" + prefix + "-TOTAL_FORMS"); var index = parseInt(total.value, 10); var html = box.querySelector("template[data-formset-template]").innerHTML.replace(/__prefix__/g, index); var body = box.querySelector("[data-formset-body]"); body.insertAdjacentHTML("beforeend", html); total.value = index + 1; htmx.process(body.lastElementChild); body.lastElementChild.dispatchEvent(new Event("change", { bubbles: true })); }); document.addEventListener("click", function (e) { var remove = e.target.closest("[data-formset-remove]"); if (!remove) return; e.preventDefault(); var row = remove.closest("[data-formset-row]"); var del = row.querySelector("input[name$='-DELETE']"); if (del) { del.checked = true; row.classList.add("d-none"); } else { row.remove(); } document.body.dispatchEvent(new Event("change", { bubbles: true })); }); // --- Hazır kesim ebadı seçimi ------------------------------------------------------ document.addEventListener("change", function (e) { if (!e.target.matches("[data-trim-preset]") || !e.target.value) return; var parts = e.target.value.split("x"); var w = document.getElementById("id_trim_width_mm"); var h = document.getElementById("id_trim_height_mm"); w.value = parts[0]; h.value = parts[1]; w.dispatchEvent(new Event("change", { bubbles: true })); }); // --- Filtre formları: seçim değişince kendiliğinden uygula -------------------------- document.addEventListener("change", function (e) { var form = e.target.closest("form[data-autosubmit]"); if (form && e.target.matches("select, input[type=date]")) form.submit(); }); // --- Davet bağlantısını kopyala -------------------------------------------------- document.addEventListener("click", function (e) { var btn = e.target.closest("[data-copy]"); if (!btn) return; e.preventDefault(); navigator.clipboard.writeText(btn.dataset.copy).then(function () { var original = btn.innerHTML; btn.innerHTML = ' ' + (document.documentElement.lang === "en" ? "Copied" : "Kopyalandı"); setTimeout(function () { btn.innerHTML = original; }, 1500); }); }); })();