1(() => { 2 const featuredCards = [...document.querySelectorAll(".wpgo-relaunch-featured-card")]; 3 4 featuredCards.forEach((card) => { 5 card.addEventListener("click", (event) => { 6 if (event.target instanceof Element && event.target.closest("a")) return; 7 8 const link = card.querySelector( 9 ".wpgo-relaunch-featured-card__link, .wpgo-relaunch-text-link a", 10 ); 11 link?.click(); 12 }); 13 }); 14 15 const catalogue = document.querySelector("[data-wpgo-home-catalogue]"); 16 if (!catalogue) return; 17 18 const filterButtons = [...catalogue.querySelectorAll("[data-filter]")]; 19 const groups = [...catalogue.querySelectorAll("[data-group]")]; 20 const products = [...catalogue.querySelectorAll("[data-product]")]; 21 const search = catalogue.querySelector("[data-plugin-search]"); 22 const sort = catalogue.querySelector("[data-plugin-sort]"); 23 const count = catalogue.querySelector("[data-visible-count]"); 24 const empty = catalogue.querySelector("[data-empty-state]"); 25 let activeFilter = "all"; 26 27 const apply = () => { 28 const query = search.value.trim().toLocaleLowerCase("en-GB"); 29 const direction = sort.value; 30 let visible = 0; 31 32 groups.forEach((group) => { 33 const category = group.dataset.group; 34 const target = group.querySelector("[data-group-products]"); 35 const matches = products 36 .filter((product) => product.dataset.category === category) 37 .filter((product) => { 38 const matchesFilter = activeFilter === "all" || category === activeFilter; 39 const searchable = product.textContent.toLocaleLowerCase("en-GB"); 40 return matchesFilter && (!query || searchable.includes(query)); 41 }) 42 .sort((a, b) => { 43 if (direction === "az") return a.dataset.name.localeCompare(b.dataset.name); 44 if (direction === "za") return b.dataset.name.localeCompare(a.dataset.name); 45 return Number(a.dataset.order) - Number(b.dataset.order); 46 }); 47 48 matches.forEach((product) => { 49 product.hidden = false; 50 target.append(product); 51 }); 52 53 products 54 .filter((product) => product.dataset.category === category && !matches.includes(product)) 55 .forEach((product) => { 56 product.hidden = true; 57 target.append(product); 58 }); 59 60 group.hidden = matches.length === 0; 61 visible += matches.length; 62 }); 63 64 count.textContent = String(visible); 65 empty.hidden = visible !== 0; 66 }; 67 68 filterButtons.forEach((button) => { 69 button.addEventListener("click", () => { 70 activeFilter = button.dataset.filter; 71 filterButtons.forEach((candidate) => { 72 const active = candidate === button; 73 candidate.classList.toggle("is-active", active); 74 candidate.setAttribute("aria-pressed", String(active)); 75 }); 76 apply(); 77 }); 78 }); 79 80 search.addEventListener("input", apply); 81 sort.addEventListener("change", apply); 82 apply(); 83})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.