function searchCheckbox(
data,
options
) {
options = {
value: [],
optionsCheckboxes: undefined,
optionsSearch: {
filter: fullSearchFilter
},
...options
};
data = Array.from(data);
let checkboxes = Inputs.checkbox(data, options.optionsCheckboxes || options);
const search = Inputs.search(data, options.optionsSearch || options);
const btnAll = html`<button>All</button>`;
const btnNone = html`<button>None</button>`;
let selected = new Map(Array.from(options.value).map((d) => [d, true]));
function selectedToArray() {
return Array.from(selected.entries())
.filter(([k, v]) => v)
.map(([k, v]) => k);
}
function changeSome(sel, changeTo) {
for (let o of sel) selected.set(o, changeTo);
}
function selectedFromArray(sel) {
changeSome(data, false);
changeSome(sel, true);
}
let output = html`<output>`;
const component = html`${
options.label ? `<label>${options.label}</label><br>` : ""
}${search}
${btnAll}
${btnNone}
${output}
${checkboxes}`;
Object.defineProperty(component, "value", {
get() {
return selectedToArray();
},
set(v) {
selectedFromArray(v);
}
});
btnAll.addEventListener("click", () => {
changeSome(search.value, true);
checkboxes.value = selectedToArray();
component.dispatchEvent(new Event("input", { bubbles: true }));
});
btnNone.addEventListener("click", () => {
changeSome(search.value, false);
checkboxes.value = selectedToArray();
component.dispatchEvent(new Event("input", { bubbles: true }));
});
component.value = selectedToArray();
search.addEventListener("input", (evt) => {
for (let check of checkboxes.querySelectorAll("input")) {
if (search.value.includes(data[+check.value])) {
check.parentElement.style.display = "inline-block";
} else {
check.parentElement.style.display = "none";
}
}
});
checkboxes.addEventListener("input", (evt) => {
evt.stopPropagation();
component.value = checkboxes.value;
component.dispatchEvent(new Event("input", { bubbles: true }));
});
return component;
}