function sorterSelect(data) {
if (!data || !data.length) {
return html`Please provide valid data as an array`;
}
const columns = Object.keys(data[0]);
const select = multiAutoSelect({
options: columns,
nestedselection: (d, button, ele, fm) => {
if (!fm.order) {
fm.order = [];
}
let options = ["⬆️", "⬇️"];
function getOrder() {
fm.order = [];
for (let child of fm[1].childNodes) {
fm.order.push(child.childNodes[1]?.nodeValue);
}
}
fm.output.addEventListener("update", () => getOrder());
ele.addEventListener("click", () => {
if (ele.childNodes.length === 2) {
let randoption = options[Math.floor(Math.random() * options.length)];
ele.insertBefore(html`${randoption}`, button);
fm.order.push(randoption);
fm.dispatchEvent(new Event("input", { bubbles: true }));
return;
}
let newoption =
(options.indexOf(ele.childNodes[1]?.nodeValue) + 1) % options.length;
ele.removeChild(ele.childNodes[1]);
ele.insertBefore(html`${options[newoption]}`, button);
fm.dispatchEvent(new Event("input", { bubbles: true }));
getOrder();
});
ele.click();
}
});
const control = html`<form>
<div><label>Sort by: ${select}</label></div>
</form>`;
control.value = (a, b) =>
select.value.reduce((prevGroupBy, currGroupBy, index) => {
return (
prevGroupBy ||
(select.order[index] === "⬇️"
? d3.descending(a[currGroupBy], b[currGroupBy])
: d3.ascending(a[currGroupBy], b[currGroupBy]))
);
}, false);
return control;
}