1
0
Fork 0
mirror of https://github.com/portainer/portainer.git synced 2025-07-23 15:29:42 +02:00

refactor(ui/datatables): allow datatable to globally filter on object value [EE-5824] (#9955)

This commit is contained in:
Chaim Lev-Ari 2023-09-04 10:33:07 +01:00 committed by GitHub
parent 440f4e8dda
commit cb7377ead6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 271 additions and 186 deletions

View file

@ -0,0 +1,10 @@
import { TableOptions } from '@tanstack/react-table';
type OptionExtender<T> = (options: TableOptions<T>) => TableOptions<T>;
export function mergeOptions<T>(
...extenders: Array<OptionExtender<T>>
): OptionExtender<T> {
return (options: TableOptions<T>) =>
extenders.reduce((acc, option) => option(acc), options);
}

View file

@ -0,0 +1,37 @@
import {
RowSelectionState,
TableOptions,
Updater,
} from '@tanstack/react-table';
import { DefaultType } from '../types';
export function withControlledSelected<D extends DefaultType>(
onChange?: (value: string[]) => void,
value?: string[]
) {
return function extendTableOptions(options: TableOptions<D>) {
if (!onChange || !value) {
return options;
}
return {
...options,
state: {
...options.state,
rowSelection: Object.fromEntries(value.map((i) => [i, true])),
},
onRowSelectionChange(updater: Updater<RowSelectionState>) {
const newValue =
typeof updater !== 'function'
? updater
: updater(Object.fromEntries(value.map((i) => [i, true])));
onChange(
Object.entries(newValue)
.filter(([, selected]) => selected)
.map(([id]) => id)
);
},
};
};
}

View file

@ -0,0 +1,15 @@
import { TableOptions } from '@tanstack/react-table';
import { defaultGlobalFilterFn } from '../Datatable';
import { DefaultType } from '../types';
export function withGlobalFilter<D extends DefaultType>(
filterFn: typeof defaultGlobalFilterFn
) {
return function extendOptions(options: TableOptions<D>) {
return {
...options,
globalFilterFn: filterFn,
};
};
}

View file

@ -0,0 +1,15 @@
import { TableOptions } from '@tanstack/react-table';
import { DefaultType } from '../types';
export function withMeta<D extends DefaultType>(meta: Record<string, unknown>) {
return function extendOptions(options: TableOptions<D>) {
return {
...options,
meta: {
...options.meta,
...meta,
},
};
};
}