ctx / docs /assets /javascripts /catalog.js
Stevesolun's picture
Sync ctx a4e14d3
31e282f verified
(function () {
"use strict";
function param(name) {
return new URLSearchParams(window.location.search).get(name) || "";
}
function selectedTypes(root) {
return Array.from(root.querySelectorAll(".ctx-catalog-filters input:checked")).map(
function (input) {
return input.value;
}
);
}
function searchableText(card) {
return (
card.getAttribute("data-type") +
" " +
card.getAttribute("data-search") +
" " +
card.textContent
).toLowerCase();
}
function render(root) {
var queryInput = root.querySelector("#ctx-catalog-query");
var count = root.querySelector("#ctx-catalog-count");
var cards = Array.from(root.querySelectorAll(".ctx-catalog-card"));
var selected = new Set(selectedTypes(root));
var query = (queryInput ? queryInput.value : "").trim().toLowerCase();
var visible = 0;
cards.forEach(function (card) {
var matchesType = selected.has(card.getAttribute("data-type"));
var matchesQuery = !query || searchableText(card).indexOf(query) !== -1;
var show = matchesType && matchesQuery;
card.hidden = !show;
if (show) visible += 1;
});
if (count) {
count.textContent = visible + " tile" + (visible === 1 ? "" : "s") + " shown";
}
}
function initCatalog() {
var root = document.querySelector(".ctx-catalog-app");
if (!root || root.getAttribute("data-catalog-ready") === "true") {
return;
}
root.setAttribute("data-catalog-ready", "true");
var queryInput = root.querySelector("#ctx-catalog-query");
var initialType = param("type");
var initialQuery = param("q");
if (queryInput && initialQuery) {
queryInput.value = initialQuery;
}
if (initialType) {
root.querySelectorAll(".ctx-catalog-filters input").forEach(function (input) {
input.checked = input.value === initialType;
});
}
if (queryInput) {
queryInput.addEventListener("input", function () {
render(root);
});
}
root.querySelectorAll(".ctx-catalog-filters input").forEach(function (input) {
input.addEventListener("change", function () {
render(root);
});
});
render(root);
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", initCatalog, { once: true });
} else {
initCatalog();
}
if (window.document$ && typeof window.document$.subscribe === "function") {
window.document$.subscribe(initCatalog);
}
})();