stable-diffusion-webui-forge/javascript/inputAccordion.js
2025-07-28 14:52:53 +08:00

75 lines
2.3 KiB
JavaScript

function inputAccordionChecked(id, checked) {
let accordion = gradioApp().getElementById(id);
accordion.visibleCheckbox.checked = checked;
accordion.onVisibleCheckboxChange();
}
function setupAccordion(accordion) {
let labelWrap = accordion.querySelector(".label-wrap");
let gradioCheckbox = gradioApp().querySelector(
"#" + accordion.id + "-checkbox input",
);
let extra = gradioApp().querySelector("#" + accordion.id + "-extra");
let span = labelWrap.querySelector("span");
let linked = true;
let isOpen = function () {
return labelWrap.classList.contains("open");
};
let observerAccordionOpen = new MutationObserver(function (mutations) {
mutations.forEach(function (mutationRecord) {
accordion.classList.toggle("input-accordion-open", isOpen());
if (linked) {
accordion.visibleCheckbox.checked = isOpen();
accordion.onVisibleCheckboxChange();
}
});
});
observerAccordionOpen.observe(labelWrap, {
attributes: true,
attributeFilter: ["class"],
});
if (extra) {
labelWrap.insertBefore(extra, labelWrap.lastElementChild);
}
accordion.onChecked = function (checked) {
if (isOpen() != checked) {
labelWrap.click();
}
};
let visibleCheckbox = document.createElement("INPUT");
visibleCheckbox.type = "checkbox";
visibleCheckbox.checked = isOpen();
visibleCheckbox.id = accordion.id + "-visible-checkbox";
visibleCheckbox.className =
gradioCheckbox.className + " input-accordion-checkbox";
span.insertBefore(visibleCheckbox, span.firstChild);
accordion.visibleCheckbox = visibleCheckbox;
accordion.onVisibleCheckboxChange = function () {
if (linked && isOpen() != visibleCheckbox.checked) {
labelWrap.click();
}
gradioCheckbox.checked = visibleCheckbox.checked;
updateInput(gradioCheckbox);
};
visibleCheckbox.addEventListener("click", function (event) {
linked = false;
event.stopPropagation();
});
visibleCheckbox.addEventListener("input", accordion.onVisibleCheckboxChange);
}
onUiLoaded(function () {
for (let accordion of gradioApp().querySelectorAll(".input-accordion")) {
setupAccordion(accordion);
}
});