document.addEventListener('DOMContentLoaded', () => { // We instantiate the class when the DOM is ready new PartnerExpoSearch(); }); class PartnerExpoSearch { constructor() { this.els = { shell: document.getElementById("pexpo-core-shell"), topbar: document.getElementById("pexpo-core-topbar"), filterWrap: document.getElementById("pexpo-core-filterWrap"), filterBtn: document.getElementById("pexpo-core-filterBtn"), filterDrawer: document.getElementById("pexpo-core-filterDrawer"), drawerBackdrop: document.getElementById("pexpo-core-drawerBackdrop"), filterFTag: document.getElementById("pexpo-core-tag-toggle"), filterTags: document.getElementById("pexpo-core-tags"), filterCompanies: document.getElementById("pexpo-core-companies"), qInput: document.getElementById("pexpo-core-q"), masonry: document.getElementById("pexpo-core-masonry"), measure: document.getElementById("pexpo-core-measure"), emptyResult: document.getElementById("pexpo-core-emptyResult"), count: document.getElementById("pexpo-core-count"), layoutMeta: document.getElementById("pexpo-core-layoutMeta"), sortSelect: document.getElementById("pexpo-core-sortSelect"), filterApply: document.getElementById("pexpo-core-filterApply"), pageNum: document.getElementById("pexpo-core-page-number"), pagePrev: document.getElementById("pexpo-core-page-prev"), pageNext: document.getElementById("pexpo-core-page-next"), }; this.state = { filters: { q: "", sort: "relevance", force_tags: false, tags: [], companies: [], resultsPerPage: 20, page: 1, }, activeSortKey: "relevance", total: '', pages: 1, results: [], layoutQueued: false }; this.SORTS = { relevance: "Relevánsság (legjobb → legrosszabb)", date_desc: "Dátum (új → régi)", date_asc: "Dátum (régi → új)", title_asc: "Cím (A → Z)", title_desc: "Cím (Z → A)", }; if (this.els.shell) { this.init(); } } init() { this.initMultiSelect(); this.initSortDropdown(); this.bindEvents(); this.syncTopbarHeight(); this.initResizeObserver(); // Initial Fetch this.fetchData(); } // ---------- Initialization Helpers ---------- initMultiSelect() { if (typeof MultiSelect !== 'undefined') { new MultiSelect(this.els.filterTags, { search: true, selectAll: false, onSelect: (value) => { if (!this.state.filters.tags.includes(value)) { this.state.filters.tags.push(value); } }, onUnselect: (value) => { this.state.filters.tags = this.state.filters.tags.filter(tag => tag !== value); } }); new MultiSelect(this.els.filterCompanies, { search: true, selectAll: false, onSelect: (value) => { if (!this.state.filters.companies.includes(value)) { this.state.filters.companies.push(value); } }, onUnselect: (value) => { this.state.filters.companies = this.state.filters.companies.filter(company => company !== value); } }); } else { console.warn("MultiSelect library not found."); } } initSortDropdown() { if (!this.els.sortSelect) return; this.els.sortSelect.innerHTML = Object.entries(this.SORTS) .map(([k, label]) => ``) .join(""); this.els.sortSelect.value = this.state.activeSortKey; } initResizeObserver() { const ro = new ResizeObserver(() => { this.syncTopbarHeight(); this.requestLayout(); }); ro.observe(this.els.shell); ro.observe(this.els.masonry); } // ---------- Event Binding ---------- bindEvents() { // Sort if (this.els.sortSelect) { this.els.sortSelect.addEventListener("change", () => { this.state.activeSortKey = this.els.sortSelect.value; this.state.filters.sort = this.state.activeSortKey; this.fetchData(); }); } // Search this.els.qInput.addEventListener("keyup", (e) => { if (e.key === "Enter") { this.state.filters.q = this.els.qInput.value.trim(); this.fetchData(); } }); // Tag Toggle this.els.filterFTag.addEventListener("change", () => { this.state.filters.force_tags = this.els.filterFTag.checked; }); // Drawer Toggle this.els.filterBtn.addEventListener("click", () => { const isOpen = this.els.filterDrawer.classList.contains("pexpo-core-open"); this.setDrawerOpen(!isOpen); }); this.els.filterApply.addEventListener("click", () => { this.fetchData(); this.setDrawerOpen(false); }); this.els.drawerBackdrop.addEventListener("click", () => this.setDrawerOpen(false)); document.addEventListener("keydown", (e) => { if (e.key === "Escape" && this.els.filterDrawer.classList.contains("pexpo-core-open")) { this.setDrawerOpen(false); } }); this.els.pageNext.addEventListener("click", () => { if (this.state.filters.page < this.state.pages) { this.state.filters.page += 1; this.fetchData(); } }); this.els.pagePrev.addEventListener("click", () => { if (this.state.filters.page > 1) { this.state.filters.page -= 1; this.fetchData(); } }); } // ---------- Fetch ---------- async fetchData() { this.els.masonry.style.opacity = "0.5"; try { const queryString = this.encodeDataToURL(this.state.filters); const response = await fetch(`/wp-json/pexpo/v1/query?${queryString}`); const data = await response.json(); this.state.results = data['results'] || []; this.state.total = data['found'] || 0; this.state.pages = data['pages'] || 1; console.log("Fetched data:", data['pages']); this.requestLayout(); } catch (error) { console.error("Search failed:", error); this.els.masonry.innerHTML = `