function FacetedSearch(
data,
{ attribs, value, filterData = filterDataJS } = {}
) {
if (!data || data.length < 0) {
throw Error("Please provide an array of objects");
}
let changed = false;
const filtersContainer = html`<div id="filters"></div>`;
const target = html`
${filtersContainer}
`;
const filters = new Map();
target.value = data;
target.value.filters = filters;
function recreate(value) {
debugger;
for (let [id, filter] of filters) {
if (value.filters.has(id)) {
filter.selected = value.filters.get(id).selected;
filter.ele.dispatchEvent(new Event("input", {bubbles: true}))
}
}
updateAndRedraw();
}
function redraw() {
filtersContainer.innerHTML = "";
filtersContainer.appendChild(
html`<div >Selected ${target?.value.length} of ${data.length} ${
changed ? "❌" : "✓"
}
${Array.from(filters.values()).map(({ attr, ele }) => {
return html`
<div>${ele}</div>
`;
})}
<button id="applyButton" ${changed ? "" : "disabled"}>Apply</button>
</div>`
);
filtersContainer
.querySelector("#applyButton")
.addEventListener("click", () => {
changed = false;
updateAndRedraw();
filtersContainer.querySelector("#applyButton").disabled = !changed;
});
}
async function onChange() {
changed = true;
redraw();
}
async function updateAndRedraw() {
let before;
if (debug) {
before = performance.now();
}
target.value = await filterData(data, filters);
debug && console.log(`Finished filtering ${performance.now() - before}`);
target.value.filters = filters;
target.dispatchEvent(new Event("input", { bubbles: true }));
redraw();
}
attribs = attribs || Object.keys(data[0]);
for (let attr of attribs) {
if (isNaN(data[0][attr])) {
addSearchCheckboxes({
attr,
filters,
data,
updateAndRedraw,
target
});
} else {
addRange({ attr, filters, data, updateAndRedraw: onChange, target });
}
}
if (value) {
}
redraw();
return target;
}