UNPKG

stylescape

Version:

Stylescape is a visual identity framework developed by Scape Agency.

80 lines (67 loc) 2.68 kB
export class DropdownHandler { private dropdowns: NodeListOf<HTMLElement>; constructor(containerSelector: string = ".select_dropdown") { this.dropdowns = document.querySelectorAll<HTMLElement>(containerSelector); if (this.dropdowns.length === 0) return; this.initializeDropdowns(); this.setupGlobalClickListener(); } private initializeDropdowns() { this.dropdowns.forEach((dropdown) => { const header = dropdown.querySelector<HTMLElement>( ".select_dropdown--header", ); const menu = dropdown.querySelector<HTMLElement>( ".select_dropdown--menu.dropdown--collapse", ); const checkboxes = dropdown.querySelectorAll<HTMLInputElement>( 'input[type="checkbox"]', ); if (!header) return; header.addEventListener("click", () => { if (menu) { menu.classList.toggle("active"); } const flipper = header.querySelector<HTMLElement>( ".flipper--down, .flipper--up", ); if (flipper) { flipper.classList.toggle("flipper--down"); flipper.classList.toggle("flipper--up"); // flipper.classList.toggle("active") } }); checkboxes.forEach((checkbox) => { checkbox.addEventListener("change", () => { this.updateSelectionLabel(dropdown); }); }); this.updateSelectionLabel(dropdown); }); } private updateSelectionLabel(dropdown: HTMLElement) { const countSpan = dropdown.querySelector<HTMLElement>("#selected-count"); const checkboxes = dropdown.querySelectorAll<HTMLInputElement>( 'input[type="checkbox"]', ); if (!countSpan || checkboxes.length === 0) return; const selected = Array.from(checkboxes).filter( (cb) => cb.checked, ).length; countSpan.textContent = `Selected: ${selected} option${selected !== 1 ? "s" : ""}`; } private setupGlobalClickListener() { document.addEventListener("click", (e) => { this.dropdowns.forEach((dropdown) => { const menu = dropdown.querySelector<HTMLElement>( ".dropdown--collapse", ); if (menu && !dropdown.contains(e.target as Node)) { menu.classList.remove("active"); } }); }); } }