add multiple type to table
This commit is contained in:
parent
739ee87879
commit
3299a8f65c
2 changed files with 51 additions and 6 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue