add multiple type to table

This commit is contained in:
Alexander Navarro 2023-09-24 12:30:29 -03:00
parent 739ee87879
commit 3299a8f65c
2 changed files with 51 additions and 6 deletions

View file

@ -3,18 +3,26 @@ import React, { useMemo, type ChangeEventHandler } from 'react';
export type DataItem = Record<string, any>; export type DataItem = Record<string, any>;
interface Props { interface Props {
onChange: (value: string | null) => void; onChange: (value: string | string[] | null) => void;
data: DataItem[]; data: DataItem[];
keyData: string; keyData: string;
isMultiple?: boolean;
} }
export default function Select({ export default function Select({
data, data,
keyData, keyData,
isMultiple = false,
onChange, onChange,
}: Props): JSX.Element { }: Props): JSX.Element {
const options = useMemo(() => { const options = useMemo(() => {
let options = data.map((item) => item[keyData]); let options = [];
if (isMultiple) {
options = data.flatMap((item) => item[keyData]);
} else {
options = data.map((item) => item[keyData]);
}
options = [...new Set(options)]; options = [...new Set(options)];
@ -33,13 +41,33 @@ export default function Select({
return options; return options;
}, [data, keyData]); }, [data, keyData]);
const onSelectChange: ChangeEventHandler<HTMLSelectElement> = ({
target,
}): void => {
if (!isMultiple) {
const value = target.value !== '' ? target.value : null;
onChange(value);
}
const values = [];
// FIXME: This looks awfull, when updating the input use something better.
for (let index = 0; index < target.options.length; index++) {
const option = target.options[index];
if (!option.selected) continue;
values.push(option.value);
}
onChange(values);
};
return ( return (
<select <select
name="fooe" name="fooe"
id="foo" id="foo"
onChange={({ target }) => multiple={isMultiple}
{ onChange(target.value !== '' ? target.value : null); } onChange={onSelectChange}
}
> >
{options} {options}
</select> </select>

View file

@ -26,7 +26,7 @@ interface Props {
interface Filter { interface Filter {
type: HeaderType; type: HeaderType;
value: string; value: string | string[];
} }
export default function Table({ data, headers }: Props): JSX.Element { export default function Table({ data, headers }: Props): JSX.Element {
@ -40,6 +40,11 @@ export default function Table({ data, headers }: Props): JSX.Element {
return data === filter.value; return data === filter.value;
case HeaderType.Select: case HeaderType.Select:
return data === filter.value; return data === filter.value;
case HeaderType.Multiple:
if (typeof filter.value === 'string') {
return data.includes(filter.value);
}
return filter.value.every((filter: string) => data.includes(filter));
} }
return true; return true;
@ -62,6 +67,7 @@ export default function Table({ data, headers }: Props): JSX.Element {
type: HeaderType, type: HeaderType,
value: any, value: any,
): void => { ): void => {
console.log(value);
setFilters((prev) => { setFilters((prev) => {
if (value === null) { if (value === null) {
// eslint-disable-next-line @typescript-eslint/no-dynamic-delete // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
@ -134,6 +140,17 @@ export default function Table({ data, headers }: Props): JSX.Element {
}} }}
/> />
); );
case HeaderType.Multiple:
return (
<Select
isMultiple
data={data}
keyData={header.key}
onChange={(value) => {
handleUpdateFilters(header.key, header.type, value);
}}
/>
);
default: default:
break; break;