function createFilterControls(columnTypes, data) {
const controls = {};
function updateAndRedraw() {
mutable filteredData = applyFilters(viewof data, controls);
console.log('Data filtered, new count: ', filteredData.length);
dispatchEvent(new CustomEvent('input', { bubbles: true }));
}
for (const [column, type] of Object.entries(columnTypes)) {
let control;
switch (type) {
case 'date': {
const dates = data.map(item => parseDate(item[column])).filter(d => d !== undefined && !isNaN(d.getTime()));
console.log('Date count: ', dates);
const minDate = new Date(Math.min(...dates.map(date => date.getTime())));
const maxDate = new Date(Math.max(...dates.map(date => date.getTime())));
const startDateInput = Inputs.date({label: `${column}: Start Date`, value: minDate, min: minDate, max: maxDate});
const endDateInput = Inputs.date({label: `${column}: End Date`, value: maxDate, min: minDate, max: maxDate});
if (isNaN(minDate.getTime()) || isNaN(maxDate.getTime())) {
console.error('Invalid date computed for controls.');
}
control = {
type: 'date',
element: () => {
const container = document.createElement('div');
container.appendChild(startDateInput);
container.appendChild(endDateInput);
return container;
},
getValue: () => [startDateInput.value, endDateInput.value]
};
break;
}
case 'number': {
const values = data.map(item => parseFloat(item[column])).filter(v => !isNaN(v));
const min = Math.min(...values);
const max = Math.max(...values);
const minInput = Inputs.text({label: `${column}: Minimum Value`, value: min.toString()});
const maxInput = Inputs.text({label: `${column}: Maximum Value`, value: max.toString()});
control = {
type: 'number',
element: () => {
const container = document.createElement('div');
container.appendChild(minInput);
container.appendChild(maxInput);
return container;
},
getValue: () => [parseFloat(minInput.value), parseFloat(maxInput.value)]
};
break;
}
case 'string': {
const uniqueOptions = Array.from(new Set(data.map(item => item[column])));
const selectionForm = createSelectionForm(uniqueOptions, {searchable: true, multiple: true});
control = {
type: 'string',
element: () => selectionForm,
getValue: () => [...selectionForm.querySelectorAll('input:checked')].map(el => el.value)
};
break;
}
}
controls[column] = control;
}
return {controls};
}