AttributeFilter = component(
({ applyFilter, file, savedProps = {}, debug = false }) => {
const [columns, setColumns] = useState([]);
const [columnValues, setColumnValues] = useState([]);
const [filterColumn, setFilterColumn] = useState(
chainingGetter(savedProps, 'value', 'filterColumn') || "case:concept:name"
);
const [inverse, setInverse] = useState(
chainingGetter(savedProps, 'value', 'inverse') || false
);
const [mode, setMode] = useState(
chainingGetter(savedProps, 'value', 'mode') || 'contain'
);
const [selected, setSelected] = useState(
chainingGetter(savedProps, 'value', 'selected') || []
);
useEffect(() => {
const fetchColumns = async () => {
const response = await fetch(`${apiUrl}/get_columns`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ file })
});
const columns = await response.json();
setColumns(columns);
};
fetchColumns();
}, []);
useEffect(() => {
const fetchColumnValues = async () => {
const response = await fetch(`${apiUrl}/get_column_values`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ file, column: filterColumn })
});
const values = await response.json();
setColumnValues(values);
};
fetchColumnValues();
}, [filterColumn]);
return jsx`
<div>
<div>
<span>Select column:
<select onChange=${e =>
setFilterColumn(e.target.value)} value=${filterColumn}>
${columns.map(
(column, idx) =>
jsx`<option key=${idx} value=${column}>${column}</option>`
)}
</select>
</span>
</div>
<div>
<span>Set filter mode:
<select onChange=${e => setMode(e.target.value)} value=${mode}>
<option value="trim">Trim</option>
<option value="contain">Contain</option>
</select>
</span>
</div>
<div>
<span>Enable inverse filtering:
<input
type="checkbox"
onChange=${e => setInverse(e.target.checked)}
checked=${inverse}
/>
</span>
</div>
<div>
<${MultiSelect}
options=${columnValues}
onChange=${selection => setSelected(selection)}
selection=${selected}
debug=${debug}
/>
</div>
<div>
<button onClick=${() =>
applyFilter({
name: 'Attribute',
value: { mode, inverse, selected, filterColumn }
})}>Apply filter</button>
</div>
</div>
`;
}
)