@bsol-oss/react-datatable5 9.1.0 → 10.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # React Datatable
2
2
 
3
- The datetable package is built on top of `@tanstack/react-table` and `chakra-ui` to create a robust datatable. This hook simplifies to initialize the state management for controlling the datatable, and it offers several predefined tables and controls in to enhance data visualization.
3
+ The datetable package is built on top of `@tanstack/react-table` and `chakra-ui` to create a datatable. This hook simplifies to initialize the state management for controlling the datatable, and it offers several predefined tables and controls in to enhance data visualization.
4
4
 
5
5
  ## Installation
6
6
 
@@ -23,22 +23,7 @@ const datatableServer = useDataTableServer({ url: "<some-url>" });
23
23
 
24
24
  ```tsx
25
25
  <DataTable columns={columns} data={data} {...datatable}>
26
- <Flex>
27
- <TablePagination />
28
- <EditViewButton />
29
- <EditFilterButton />
30
- <EditOrderButton />
31
- <PageSizeControl />
32
- <TableSelector />
33
- <GlobalFilter />
34
- </Flex>
35
- <Table>
36
- <TableHeader canResize />
37
- <TableBody />
38
- <TableFooter />
39
- </Table>
40
- <PageSizeControl />
41
- <TablePagination />
26
+ <DataDisplay />
42
27
  </DataTable>
43
28
  ```
44
29
 
@@ -46,29 +31,7 @@ const datatableServer = useDataTableServer({ url: "<some-url>" });
46
31
 
47
32
  ```tsx
48
33
  <DataTableServer columns={columns} {...datatable}>
49
- <Flex>
50
- <TablePagination />
51
- <EditViewButton />
52
- <EditFilterButton />
53
- <DensityToggleButton />
54
- <EditOrderButton />
55
- <PageSizeControl />
56
- <TableSelector />
57
- <GlobalFilter />
58
- </Flex>
59
- <Table>
60
- <TableHeader canResize />
61
- <TableBody />
62
- <TableFooter />
63
- </Table>
64
- <Flex>
65
- <TablePagination />
66
- <EditViewButton />
67
- <EditFilterButton />
68
- <EditOrderButton />
69
- <PageSizeControl />
70
- <TableSelector />
71
- </Flex>
34
+ <DataDisplay />
72
35
  </DataTableServer>
73
36
  ```
74
37
 
package/dist/index.d.ts CHANGED
@@ -22,13 +22,9 @@ interface DensityToggleButtonProps {
22
22
  declare const DensityToggleButton: ({ text, icon, }: DensityToggleButtonProps) => react_jsx_runtime.JSX.Element;
23
23
 
24
24
  interface EditFilterButtonProps {
25
- text?: string;
26
- title?: string;
27
- closeText?: string;
28
- resetText?: string;
29
25
  icon?: React.ReactElement;
30
26
  }
31
- declare const EditFilterButton: ({ text, title, closeText, resetText, icon, }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
27
+ declare const FilterDialog: ({ icon, }: EditFilterButtonProps) => react_jsx_runtime.JSX.Element;
32
28
 
33
29
  interface EditOrderButtonProps {
34
30
  title?: string;
@@ -45,11 +41,9 @@ interface EditSortingButtonProps {
45
41
  declare const EditSortingButton: ({ text, icon, title, }: EditSortingButtonProps) => react_jsx_runtime.JSX.Element;
46
42
 
47
43
  interface EditViewButtonProps {
48
- text?: string;
49
44
  icon?: React__default.ReactElement;
50
- title?: string;
51
45
  }
52
- declare const EditViewButton: ({ text, icon, title, }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
46
+ declare const ViewDialog: ({ icon }: EditViewButtonProps) => react_jsx_runtime.JSX.Element;
53
47
 
54
48
  interface PageSizeControlProps {
55
49
  pageSizes?: number[];
@@ -73,7 +67,7 @@ declare const ResetSortingButton: ({ text, }: ResetSortingButtonProps) => react_
73
67
 
74
68
  declare const RowCountText: () => react_jsx_runtime.JSX.Element;
75
69
 
76
- declare const TablePagination: () => react_jsx_runtime.JSX.Element;
70
+ declare const Pagination: () => react_jsx_runtime.JSX.Element;
77
71
 
78
72
  interface CardHeaderProps<TData> {
79
73
  row: Row<TData>;
@@ -159,6 +153,7 @@ interface DataTableProps<TData = unknown> {
159
153
  setColumnOrder: OnChangeFn<ColumnOrderState>;
160
154
  setDensity: OnChangeFn<DensityState>;
161
155
  setColumnVisibility: OnChangeFn<VisibilityState>;
156
+ translate: UseTranslationResponse<any, any>;
162
157
  }
163
158
  /**
164
159
  * DataTable will create a context to hold all values to
@@ -170,7 +165,7 @@ interface DataTableProps<TData = unknown> {
170
165
  *
171
166
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
172
167
  */
173
- declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
168
+ declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, translate, children, }: DataTableProps<TData>): react_jsx_runtime.JSX.Element;
174
169
 
175
170
  interface DataTableDefaultState {
176
171
  sorting?: SortingState;
@@ -184,6 +179,7 @@ interface DataTableDefaultState {
184
179
  }
185
180
  interface UseDataTableProps {
186
181
  default?: DataTableDefaultState;
182
+ keyPrefix?: string;
187
183
  }
188
184
  interface UseDataTableReturn {
189
185
  sorting: SortingState;
@@ -202,8 +198,9 @@ interface UseDataTableReturn {
202
198
  setColumnOrder: OnChangeFn<ColumnOrderState>;
203
199
  setDensity: OnChangeFn<DensityState>;
204
200
  setColumnVisibility: OnChangeFn<VisibilityState>;
201
+ translate: UseTranslationResponse<any, any>;
205
202
  }
206
- declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }?: UseDataTableProps) => UseDataTableReturn;
203
+ declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, keyPrefix, }?: UseDataTableProps) => UseDataTableReturn;
207
204
 
208
205
  interface UseDataTableServerProps extends UseDataTableProps {
209
206
  /**
@@ -229,7 +226,7 @@ interface Result<T = unknown> {
229
226
  interface DataResponse<T = unknown> extends Result<T> {
230
227
  count: number;
231
228
  }
232
- declare const useDataTableServer: <TData>({ url, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }: UseDataTableServerProps) => UseDataTableServerReturn<TData>;
229
+ declare const useDataTableServer: <TData>({ url, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, keyPrefix, }: UseDataTableServerProps) => UseDataTableServerReturn<TData>;
233
230
 
234
231
  interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown>> {
235
232
  children: ReactNode | ReactNode[];
@@ -262,6 +259,7 @@ interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown
262
259
  setColumnVisibility: OnChangeFn<VisibilityState>;
263
260
  query: UseQueryResult<TData>;
264
261
  url: string;
262
+ translate: UseTranslationResponse<any, any>;
265
263
  }
266
264
  /**
267
265
  * DataTableServer will create a context to hold all values to
@@ -274,7 +272,7 @@ interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown
274
272
  *
275
273
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
276
274
  */
277
- declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }: DataTableServerProps<TData>): react_jsx_runtime.JSX.Element;
275
+ declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, url, translate, children, }: DataTableServerProps<TData>): react_jsx_runtime.JSX.Element;
278
276
 
279
277
  interface TableBodyProps {
280
278
  pinnedBgColor?: {
@@ -301,7 +299,6 @@ interface TableControlsProps {
301
299
  totalText?: string;
302
300
  fitTableWidth?: boolean;
303
301
  fitTableHeight?: boolean;
304
- isMobile?: boolean;
305
302
  children?: ReactNode;
306
303
  showGlobalFilter?: boolean;
307
304
  showFilter?: boolean;
@@ -311,12 +308,13 @@ interface TableControlsProps {
311
308
  showPagination?: boolean;
312
309
  showPageSizeControl?: boolean;
313
310
  showPageCountText?: boolean;
311
+ showView?: boolean;
314
312
  filterOptions?: string[];
315
313
  extraItems?: ReactNode;
316
314
  loading?: boolean;
317
315
  hasError?: boolean;
318
316
  }
319
- declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
317
+ declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => react_jsx_runtime.JSX.Element;
320
318
 
321
319
  interface TableFooterProps {
322
320
  pinnedBgColor?: {
@@ -420,6 +418,7 @@ interface DataTableContext<TData = unknown> {
420
418
  globalFilter: string;
421
419
  setGlobalFilter: OnChangeFn<string>;
422
420
  type: "client" | "server";
421
+ translate: UseTranslationResponse<any, any>;
423
422
  }
424
423
  declare const DataTableContext: React$1.Context<DataTableContext<unknown>>;
425
424
 
@@ -433,9 +432,10 @@ interface GetColumnsConfigs<K extends RowData> {
433
432
  [key in K as string]?: object;
434
433
  };
435
434
  defaultWidth?: number;
435
+ translate?: UseTranslationResponse<any, any>;
436
436
  }
437
437
  declare const widthSanityCheck: <K extends unknown>(widthList: number[], ignoreList: K[], properties: { [key in K as string]?: object | undefined; }) => void;
438
- declare const getColumns: <TData extends unknown>({ schema, ignore, width, meta, defaultWidth, }: GetColumnsConfigs<TData>) => ColumnDef<TData>[];
438
+ declare const getColumns: <TData extends unknown>({ schema, ignore, width, meta, defaultWidth, translate, }: GetColumnsConfigs<TData>) => ColumnDef<TData>[];
439
439
 
440
440
  interface EmptyStateProps {
441
441
  title?: string;
@@ -537,8 +537,10 @@ interface RangeDatePickerProps extends Props, RangeCalendarProps {
537
537
  interface RecordDisplayProps {
538
538
  object: object | null;
539
539
  boxProps?: BoxProps;
540
+ translate?: UseTranslationResponse<any, any>;
541
+ prefix?: string;
540
542
  }
541
- declare const RecordDisplay: ({ object, boxProps }: RecordDisplayProps) => react_jsx_runtime.JSX.Element;
543
+ declare const RecordDisplay: ({ object, boxProps, translate, prefix, }: RecordDisplayProps) => react_jsx_runtime.JSX.Element;
542
544
 
543
545
  declare module "@tanstack/react-table" {
544
546
  interface ColumnMeta<TData extends RowData, TValue> {
@@ -598,4 +600,4 @@ declare module "@tanstack/react-table" {
598
600
  }
599
601
  }
600
602
 
601
- export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, EditFilterButton, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, EditViewButton, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterOptions, type FilterOptionsProps, Form, type FormProps, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, type RangeCalendarProps, type RangeDatePickerProps, RecordDisplay, type RecordDisplayProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, TableOrderer, TablePagination, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataTableProps, type UseDataTableReturn, type UseDataTableServerProps, type UseDataTableServerReturn, type UseFormProps, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
603
+ export { type CalendarProps, CardHeader, type CardHeaderProps, type CustomJSONSchema7Definition, DataDisplay, type DataDisplayProps, type DataResponse, DataTable, type DataTableDefaultState, type DataTableProps, DataTableServer, type DataTableServerProps, type DatePickerProps, DefaultCardTitle, DefaultTable, type DefaultTableProps, DensityToggleButton, type DensityToggleButtonProps, type EditFilterButtonProps, EditOrderButton, type EditOrderButtonProps, EditSortingButton, type EditSortingButtonProps, type EditViewButtonProps, EmptyState, type EmptyStateProps, ErrorAlert, type ErrorAlertProps, FilterDialog, FilterOptions, type FilterOptionsProps, Form, type FormProps, type GetColumnsConfigs, type GetDateColorProps, type GetMultiDatesProps, type GetRangeDatesProps, type GetStyleProps, type GetVariantProps, GlobalFilter, PageSizeControl, type PageSizeControlProps, Pagination, type RangeCalendarProps, type RangeDatePickerProps, RecordDisplay, type RecordDisplayProps, ReloadButton, type ReloadButtonProps, ResetFilteringButton, type ResetFilteringButtonProps, ResetSelectionButton, type ResetSelectionButtonProps, ResetSortingButton, type ResetSortingButtonProps, type Result, RowCountText, Table, TableBody, type TableBodyProps, TableCardContainer, type TableCardContainerProps, TableCards, type TableCardsProps, TableComponent, TableControls, type TableControlsProps, TableFilter, TableFilterTags, TableFooter, type TableFooterProps, TableHeader, type TableHeaderProps, TableLoadingComponent, type TableLoadingComponentProps, TableOrderer, type TableProps, type TableRendererProps, type TableRowSelectorProps, TableSelector, TableSorter, TableViewer, TextCell, type TextCellProps, type UseDataTableProps, type UseDataTableReturn, type UseDataTableServerProps, type UseDataTableServerReturn, type UseFormProps, ViewDialog, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
package/dist/index.js CHANGED
@@ -26,11 +26,11 @@ var reactQuery = require('@tanstack/react-query');
26
26
  var io5 = require('react-icons/io5');
27
27
  var gr = require('react-icons/gr');
28
28
  var hi = require('react-icons/hi');
29
+ var reactI18next = require('react-i18next');
29
30
  var axios = require('axios');
30
31
  var reactHookForm = require('react-hook-form');
31
32
  var dayjs = require('dayjs');
32
33
  var ti = require('react-icons/ti');
33
- var reactI18next = require('react-i18next');
34
34
 
35
35
  function _interopNamespaceDefault(e) {
36
36
  var n = Object.create(null);
@@ -56,6 +56,7 @@ const DataTableContext = React.createContext({
56
56
  globalFilter: "",
57
57
  setGlobalFilter: () => { },
58
58
  type: "client",
59
+ translate: {},
59
60
  });
60
61
 
61
62
  const useDataTableContext = () => {
@@ -95,7 +96,7 @@ react.Dialog.Backdrop;
95
96
  const DialogTitle = react.Dialog.Title;
96
97
  react.Dialog.Description;
97
98
  const DialogTrigger = react.Dialog.Trigger;
98
- const DialogActionTrigger = react.Dialog.ActionTrigger;
99
+ react.Dialog.ActionTrigger;
99
100
 
100
101
  const Radio = React__namespace.forwardRef(function Radio(props, ref) {
101
102
  const { children, inputProps, rootRef, ...rest } = props;
@@ -373,9 +374,10 @@ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
373
374
  }, children: text }));
374
375
  };
375
376
 
376
- const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsxRuntime.jsx(md.MdFilterAlt, {}), }) => {
377
+ const FilterDialog = ({ icon = jsxRuntime.jsx(md.MdFilterAlt, {}), }) => {
377
378
  const filterModal = react.useDisclosure();
378
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: jsxRuntime.jsxs(DialogRoot, { children: [jsxRuntime.jsx(DialogTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { as: react.Box, variant: "ghost", onClick: filterModal.onOpen, children: [icon, " ", text] }) }), jsxRuntime.jsxs(DialogContent, { children: [jsxRuntime.jsx(DialogHeader, { children: jsxRuntime.jsx(DialogTitle, { children: title }) }), jsxRuntime.jsx(DialogBody, { children: jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: "1rem", children: [jsxRuntime.jsx(TableFilter, {}), jsxRuntime.jsx(ResetFilteringButton, { text: resetText })] }) }), jsxRuntime.jsxs(DialogFooter, { children: [jsxRuntime.jsx(DialogActionTrigger, { asChild: true, children: jsxRuntime.jsx(react.Button, { onClick: filterModal.onClose, children: closeText }) }), jsxRuntime.jsx(react.Button, { children: "Save" })] }), jsxRuntime.jsx(DialogCloseTrigger, {})] })] }) }) }));
379
+ const { translate } = useDataTableContext();
380
+ return (jsxRuntime.jsxs(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: [jsxRuntime.jsx(DialogTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { as: react.Box, variant: "ghost", onClick: filterModal.onOpen, children: [icon, " ", translate.t("filterDialog.buttonText")] }) }), jsxRuntime.jsxs(DialogContent, { children: [jsxRuntime.jsx(DialogHeader, { children: jsxRuntime.jsx(DialogTitle, { children: translate.t("filterDialog.title") }) }), jsxRuntime.jsx(DialogBody, { display: "flex", flexFlow: "column", children: jsxRuntime.jsx(TableFilter, {}) }), jsxRuntime.jsxs(DialogFooter, { children: [jsxRuntime.jsx(ResetFilteringButton, { text: translate.t("filterDialog.reset") }), jsxRuntime.jsx(react.Button, { onClick: filterModal.onClose, variant: "subtle", children: translate.t("filterDialog.close") })] }), jsxRuntime.jsx(DialogCloseTrigger, { onClick: filterModal.onClose })] })] }));
379
381
  };
380
382
 
381
383
  const ColumnOrderChanger = ({ columns }) => {
@@ -2452,9 +2454,10 @@ const TableViewer = () => {
2452
2454
  }) }));
2453
2455
  };
2454
2456
 
2455
- const EditViewButton = ({ text, icon = jsxRuntime.jsx(io.IoMdEye, {}), title = "Edit View", }) => {
2457
+ const ViewDialog = ({ icon = jsxRuntime.jsx(io.IoMdEye, {}) }) => {
2456
2458
  const viewModel = react.useDisclosure();
2457
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(DialogRoot, { children: [jsxRuntime.jsx(react.DialogBackdrop, {}), jsxRuntime.jsx(DialogTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { as: react.Box, variant: "ghost", onClick: viewModel.onOpen, children: [icon, " ", text] }) }), jsxRuntime.jsxs(DialogContent, { children: [jsxRuntime.jsx(DialogCloseTrigger, {}), jsxRuntime.jsxs(DialogHeader, { children: [jsxRuntime.jsx(DialogTitle, {}), title] }), jsxRuntime.jsx(DialogBody, { children: jsxRuntime.jsx(TableViewer, {}) }), jsxRuntime.jsx(DialogFooter, {})] })] }) }));
2459
+ const { translate } = useDataTableContext();
2460
+ return (jsxRuntime.jsxs(DialogRoot, { children: [jsxRuntime.jsx(react.DialogBackdrop, {}), jsxRuntime.jsx(DialogTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { as: react.Box, variant: "ghost", onClick: viewModel.onOpen, children: [icon, " ", translate.t("viewDialog.buttonText")] }) }), jsxRuntime.jsxs(DialogContent, { children: [jsxRuntime.jsx(DialogCloseTrigger, {}), jsxRuntime.jsx(DialogHeader, { children: jsxRuntime.jsx(DialogTitle, { children: translate.t("viewDialog.title") }) }), jsxRuntime.jsx(DialogBody, { children: jsxRuntime.jsx(TableViewer, {}) }), jsxRuntime.jsx(DialogFooter, {})] })] }));
2458
2461
  };
2459
2462
 
2460
2463
  const MenuContent = React__namespace.forwardRef(function MenuContent(props, ref) {
@@ -2490,9 +2493,9 @@ const MenuTrigger = react.Menu.Trigger;
2490
2493
 
2491
2494
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
2492
2495
  const { table } = useDataTableContext();
2493
- return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(MenuRoot, { children: [jsxRuntime.jsx(MenuTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { variant: "ghost", gap: "0.5rem", children: [table.getState().pagination.pageSize, " ", jsxRuntime.jsx(bi.BiDownArrow, {})] }) }), jsxRuntime.jsx(MenuContent, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(MenuItem, { value: `chakra-table-pageSize-${pageSize}`, onClick: () => {
2494
- table.setPageSize(Number(pageSize));
2495
- }, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }) }));
2496
+ return (jsxRuntime.jsxs(MenuRoot, { children: [jsxRuntime.jsx(MenuTrigger, { asChild: true, children: jsxRuntime.jsxs(react.Button, { variant: "ghost", gap: "0.5rem", children: [table.getState().pagination.pageSize, " ", jsxRuntime.jsx(bi.BiDownArrow, {})] }) }), jsxRuntime.jsx(MenuContent, { children: pageSizes.map((pageSize) => (jsxRuntime.jsx(MenuItem, { value: `chakra-table-pageSize-${pageSize}`, onClick: () => {
2497
+ table.setPageSize(Number(pageSize));
2498
+ }, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }));
2496
2499
  };
2497
2500
 
2498
2501
  const ResetSelectionButton = ({ text = "Reset Selection", }) => {
@@ -2578,7 +2581,7 @@ const PaginationPageText = React__namespace.forwardRef(function PaginationPageTe
2578
2581
  });
2579
2582
 
2580
2583
  // TODO: not working in client side
2581
- const TablePagination = () => {
2584
+ const Pagination = () => {
2582
2585
  const { table, type } = useDataTableContext();
2583
2586
  const getCount = () => {
2584
2587
  if (type === "client") {
@@ -2606,12 +2609,18 @@ const snakeToLabel = (str) => {
2606
2609
  .join(" "); // Join with space
2607
2610
  };
2608
2611
 
2609
- const RecordDisplay = ({ object, boxProps }) => {
2612
+ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
2613
+ const getColumn = ({ field }) => {
2614
+ if (translate !== undefined) {
2615
+ return translate.t(`${prefix}${field}`);
2616
+ }
2617
+ return snakeToLabel(field);
2618
+ };
2610
2619
  if (object === null) {
2611
2620
  return jsxRuntime.jsx(jsxRuntime.Fragment, { children: "null" });
2612
2621
  }
2613
2622
  return (jsxRuntime.jsx(react.Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
2614
- return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "gray.400", children: snakeToLabel(field) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
2623
+ return (jsxRuntime.jsxs(react.Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsxRuntime.jsx(react.Text, { color: "gray.400", children: getColumn({ field }) }), typeof value === "object" ? (jsxRuntime.jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsxRuntime.jsx(react.Text, { children: JSON.stringify(value) }))] }, field));
2615
2624
  }) }));
2616
2625
  };
2617
2626
 
@@ -2795,7 +2804,7 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
2795
2804
  *
2796
2805
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2797
2806
  */
2798
- function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) {
2807
+ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, translate, children, }) {
2799
2808
  const table = reactTable.useReactTable({
2800
2809
  _features: [DensityFeature],
2801
2810
  data: data,
@@ -2844,9 +2853,10 @@ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSel
2844
2853
  });
2845
2854
  return (jsxRuntime.jsx(DataTableContext.Provider, { value: {
2846
2855
  table: table,
2847
- globalFilter: globalFilter,
2848
- setGlobalFilter: setGlobalFilter,
2856
+ globalFilter,
2857
+ setGlobalFilter,
2849
2858
  type: "client",
2859
+ translate,
2850
2860
  }, children: children }));
2851
2861
  }
2852
2862
 
@@ -2865,7 +2875,7 @@ const DataTableServerContext = React.createContext({
2865
2875
  *
2866
2876
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2867
2877
  */
2868
- function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }) {
2878
+ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, url, translate, children, }) {
2869
2879
  const table = reactTable.useReactTable({
2870
2880
  _features: [DensityFeature],
2871
2881
  data: query.data?.data ?? [],
@@ -2918,6 +2928,7 @@ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSel
2918
2928
  globalFilter,
2919
2929
  setGlobalFilter,
2920
2930
  type: "server",
2931
+ translate,
2921
2932
  }, children: jsxRuntime.jsx(DataTableServerContext.Provider, { value: { url, query }, children: children }) }));
2922
2933
  }
2923
2934
 
@@ -3087,12 +3098,13 @@ const TableFilterTags = () => {
3087
3098
  }) }));
3088
3099
  };
3089
3100
 
3090
- const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, }) => {
3091
- return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: jsxRuntime.jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(Tooltip, { content: "An error occurred while fetching data", children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" }) })), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3101
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsxRuntime.jsx(jsxRuntime.Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsxRuntime.jsx(jsxRuntime.Fragment, {}), loading = false, hasError = false, }) => {
3102
+ const { translate } = useDataTableContext();
3103
+ return (jsxRuntime.jsxs(react.Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxRuntime.jsxs(react.Flex, { flexFlow: "column", gap: 2, children: [jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsx(react.Box, { children: showView && jsxRuntime.jsx(ViewDialog, { icon: jsxRuntime.jsx(md.MdOutlineViewColumn, {}) }) }), jsxRuntime.jsxs(react.Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsxRuntime.jsx(react.Spinner, { size: "sm" }), hasError && (jsxRuntime.jsx(Tooltip, { content: translate.t("hasError"), children: jsxRuntime.jsx(react.Icon, { as: bs.BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsxRuntime.jsx(GlobalFilter, {}), showFilter && jsxRuntime.jsx(FilterDialog, {}), showReload && jsxRuntime.jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsxRuntime.jsx(react.Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3092
3104
  return (jsxRuntime.jsxs(react.Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxRuntime.jsxs(react.Text, { children: [column, ":"] }), jsxRuntime.jsx(FilterOptions, { column: column })] }, column));
3093
3105
  }) })), showFilterTags && (jsxRuntime.jsx(react.Flex, { children: jsxRuntime.jsx(TableFilterTags, {}) }))] }), jsxRuntime.jsx(react.Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
3094
3106
  backgroundColor: "gray.900",
3095
- }, children: children }), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsxRuntime.jsx(PageSizeControl, {}), showPageCountText && (jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: totalText }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(TablePagination, {}) })] })] }));
3107
+ }, children: children }), jsxRuntime.jsxs(react.Flex, { justifyContent: "space-between", children: [jsxRuntime.jsxs(react.Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsxRuntime.jsx(PageSizeControl, {}), showPageCountText && (jsxRuntime.jsxs(react.Flex, { children: [jsxRuntime.jsx(react.Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsxRuntime.jsx(RowCountText, {})] }))] }), jsxRuntime.jsx(react.Box, { justifySelf: "end", children: showPagination && jsxRuntime.jsx(Pagination, {}) })] })] }));
3096
3108
  };
3097
3109
 
3098
3110
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
@@ -3351,7 +3363,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3351
3363
  columnVisibility: {},
3352
3364
  globalFilter: "",
3353
3365
  density: "sm",
3354
- }, } = {
3366
+ }, keyPrefix = "", } = {
3355
3367
  default: {
3356
3368
  sorting: [],
3357
3369
  pagination: {
@@ -3374,6 +3386,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3374
3386
  const [globalFilter, setGlobalFilter] = React.useState(defaultGlobalFilter);
3375
3387
  const [density, setDensity] = React.useState(defaultDensity);
3376
3388
  const [columnVisibility, setColumnVisibility] = React.useState(defaultColumnVisibility);
3389
+ const translate = reactI18next.useTranslation("", { keyPrefix });
3377
3390
  return {
3378
3391
  sorting,
3379
3392
  setSorting,
@@ -3391,6 +3404,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3391
3404
  setDensity,
3392
3405
  columnVisibility,
3393
3406
  setColumnVisibility,
3407
+ translate,
3394
3408
  };
3395
3409
  };
3396
3410
 
@@ -3409,10 +3423,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3409
3423
  columnVisibility: {},
3410
3424
  globalFilter: "",
3411
3425
  density: "sm",
3412
- },
3413
- // debounce = true,
3414
- // debounceDelay = 1000,
3415
- }) => {
3426
+ }, keyPrefix, }) => {
3416
3427
  const [sorting, setSorting] = React.useState(defaultSorting);
3417
3428
  const [columnFilters, setColumnFilters] = React.useState(defaultColumnFilters); // can set initial column filter state here
3418
3429
  const [pagination, setPagination] = React.useState(defaultPagination);
@@ -3442,6 +3453,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3442
3453
  data: [],
3443
3454
  },
3444
3455
  });
3456
+ const translate = reactI18next.useTranslation("", { keyPrefix });
3445
3457
  return {
3446
3458
  sorting,
3447
3459
  setSorting,
@@ -3460,6 +3472,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3460
3472
  columnVisibility,
3461
3473
  setColumnVisibility,
3462
3474
  query,
3475
+ translate,
3463
3476
  };
3464
3477
  };
3465
3478
 
@@ -3481,11 +3494,17 @@ const widthSanityCheck = (widthList, ignoreList, properties) => {
3481
3494
  throw new Error(`The width list is too long given from the number of remaining properties after ignore some.`);
3482
3495
  }
3483
3496
  };
3484
- const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, }) => {
3497
+ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
3485
3498
  const { properties } = schema;
3486
3499
  idListSanityCheck("ignore", ignore, properties);
3487
3500
  widthSanityCheck(width, ignore, properties);
3488
3501
  idListSanityCheck("meta", Object.keys(meta), properties);
3502
+ const getColumn = ({ column }) => {
3503
+ if (translate !== undefined) {
3504
+ return translate.t(`${column}`);
3505
+ }
3506
+ return snakeToLabel(column);
3507
+ };
3489
3508
  const keys = Object.keys(properties);
3490
3509
  const ignored = keys.filter((key) => {
3491
3510
  return !ignore.some((shouldIgnoreKey) => key === shouldIgnoreKey);
@@ -3499,18 +3518,18 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
3499
3518
  // @ts-expect-error find type for unknown
3500
3519
  const value = props.row.original[column];
3501
3520
  if (typeof value === "object") {
3502
- return (jsxRuntime.jsx(react.Grid, { overflow: "auto", children: jsxRuntime.jsx(RecordDisplay, { object: value }) }));
3521
+ return (jsxRuntime.jsx(react.Grid, { overflow: "auto", children: jsxRuntime.jsx(RecordDisplay, { object: value, translate }) }));
3503
3522
  }
3504
3523
  return jsxRuntime.jsx(TextCell, { children: value });
3505
3524
  },
3506
3525
  header: (columnHeader) => {
3507
3526
  const displayName = columnHeader.column.columnDef.meta?.displayName ??
3508
- snakeToLabel(column);
3527
+ getColumn({ column });
3509
3528
  return jsxRuntime.jsx("span", { children: displayName });
3510
3529
  },
3511
3530
  footer: (columnFooter) => {
3512
3531
  const displayName = columnFooter.column.columnDef.meta?.displayName ??
3513
- snakeToLabel(column);
3532
+ getColumn({ column });
3514
3533
  return jsxRuntime.jsx("span", { children: displayName });
3515
3534
  },
3516
3535
  size: width[index] ?? defaultWidth,
@@ -4807,16 +4826,16 @@ exports.DataTableServer = DataTableServer;
4807
4826
  exports.DefaultCardTitle = DefaultCardTitle;
4808
4827
  exports.DefaultTable = DefaultTable;
4809
4828
  exports.DensityToggleButton = DensityToggleButton;
4810
- exports.EditFilterButton = EditFilterButton;
4811
4829
  exports.EditOrderButton = EditOrderButton;
4812
4830
  exports.EditSortingButton = EditSortingButton;
4813
- exports.EditViewButton = EditViewButton;
4814
4831
  exports.EmptyState = EmptyState;
4815
4832
  exports.ErrorAlert = ErrorAlert;
4833
+ exports.FilterDialog = FilterDialog;
4816
4834
  exports.FilterOptions = FilterOptions;
4817
4835
  exports.Form = Form;
4818
4836
  exports.GlobalFilter = GlobalFilter;
4819
4837
  exports.PageSizeControl = PageSizeControl;
4838
+ exports.Pagination = Pagination;
4820
4839
  exports.RecordDisplay = RecordDisplay;
4821
4840
  exports.ReloadButton = ReloadButton;
4822
4841
  exports.ResetFilteringButton = ResetFilteringButton;
@@ -4835,11 +4854,11 @@ exports.TableFooter = TableFooter;
4835
4854
  exports.TableHeader = TableHeader;
4836
4855
  exports.TableLoadingComponent = TableLoadingComponent;
4837
4856
  exports.TableOrderer = TableOrderer;
4838
- exports.TablePagination = TablePagination;
4839
4857
  exports.TableSelector = TableSelector;
4840
4858
  exports.TableSorter = TableSorter;
4841
4859
  exports.TableViewer = TableViewer;
4842
4860
  exports.TextCell = TextCell;
4861
+ exports.ViewDialog = ViewDialog;
4843
4862
  exports.getColumns = getColumns;
4844
4863
  exports.getMultiDates = getMultiDates;
4845
4864
  exports.getRangeDates = getRangeDates;
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Popover, Field as Field$1, HoverCard, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
2
+ import { Button as Button$1, AbsoluteCenter, Spinner, Span, IconButton, Portal, Dialog, RadioGroup as RadioGroup$1, Grid, Box, Slider as Slider$1, HStack, For, Flex, Text, Tag as Tag$1, Input, useDisclosure, DialogBackdrop, CheckboxCard as CheckboxCard$1, Menu, createRecipeContext, createContext as createContext$1, Pagination as Pagination$1, usePaginationContext, Image, Card, DataList, Checkbox as Checkbox$1, Table as Table$1, Tooltip as Tooltip$1, Group, InputElement, Icon, MenuRoot as MenuRoot$1, MenuTrigger as MenuTrigger$1, EmptyState as EmptyState$2, VStack, List, Alert, Popover, Field as Field$1, HoverCard, NumberInput, Accordion, Show, RadioCard, CheckboxGroup, Heading, Center } from '@chakra-ui/react';
3
3
  import { AiOutlineColumnWidth } from 'react-icons/ai';
4
4
  import * as React from 'react';
5
5
  import React__default, { createContext, useContext, useState, useEffect, useRef } from 'react';
@@ -25,17 +25,18 @@ import { useQueryClient, useQuery } from '@tanstack/react-query';
25
25
  import { IoReload } from 'react-icons/io5';
26
26
  import { GrAscend, GrDescend } from 'react-icons/gr';
27
27
  import { HiColorSwatch, HiOutlineInformationCircle } from 'react-icons/hi';
28
+ import { useTranslation } from 'react-i18next';
28
29
  import axios from 'axios';
29
30
  import { useFormContext, FormProvider, useForm as useForm$1 } from 'react-hook-form';
30
31
  import dayjs from 'dayjs';
31
32
  import { TiDeleteOutline } from 'react-icons/ti';
32
- import { useTranslation } from 'react-i18next';
33
33
 
34
34
  const DataTableContext = createContext({
35
35
  table: {},
36
36
  globalFilter: "",
37
37
  setGlobalFilter: () => { },
38
38
  type: "client",
39
+ translate: {},
39
40
  });
40
41
 
41
42
  const useDataTableContext = () => {
@@ -75,7 +76,7 @@ Dialog.Backdrop;
75
76
  const DialogTitle = Dialog.Title;
76
77
  Dialog.Description;
77
78
  const DialogTrigger = Dialog.Trigger;
78
- const DialogActionTrigger = Dialog.ActionTrigger;
79
+ Dialog.ActionTrigger;
79
80
 
80
81
  const Radio = React.forwardRef(function Radio(props, ref) {
81
82
  const { children, inputProps, rootRef, ...rest } = props;
@@ -353,9 +354,10 @@ const ResetFilteringButton = ({ text = "Reset Filtering", }) => {
353
354
  }, children: text }));
354
355
  };
355
356
 
356
- const EditFilterButton = ({ text, title = "Edit Filter", closeText = "Close", resetText = "Reset", icon = jsx(MdFilterAlt, {}), }) => {
357
+ const FilterDialog = ({ icon = jsx(MdFilterAlt, {}), }) => {
357
358
  const filterModal = useDisclosure();
358
- return (jsx(Fragment, { children: jsx(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: jsxs(DialogRoot, { children: [jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", onClick: filterModal.onOpen, children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: title }) }), jsx(DialogBody, { children: jsxs(Flex, { flexFlow: "column", gap: "1rem", children: [jsx(TableFilter, {}), jsx(ResetFilteringButton, { text: resetText })] }) }), jsxs(DialogFooter, { children: [jsx(DialogActionTrigger, { asChild: true, children: jsx(Button$1, { onClick: filterModal.onClose, children: closeText }) }), jsx(Button$1, { children: "Save" })] }), jsx(DialogCloseTrigger, {})] })] }) }) }));
359
+ const { translate } = useDataTableContext();
360
+ return (jsxs(DialogRoot, { size: ["full", "full", "md", "md"], open: filterModal.open, children: [jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", onClick: filterModal.onOpen, children: [icon, " ", translate.t("filterDialog.buttonText")] }) }), jsxs(DialogContent, { children: [jsx(DialogHeader, { children: jsx(DialogTitle, { children: translate.t("filterDialog.title") }) }), jsx(DialogBody, { display: "flex", flexFlow: "column", children: jsx(TableFilter, {}) }), jsxs(DialogFooter, { children: [jsx(ResetFilteringButton, { text: translate.t("filterDialog.reset") }), jsx(Button$1, { onClick: filterModal.onClose, variant: "subtle", children: translate.t("filterDialog.close") })] }), jsx(DialogCloseTrigger, { onClick: filterModal.onClose })] })] }));
359
361
  };
360
362
 
361
363
  const ColumnOrderChanger = ({ columns }) => {
@@ -2432,9 +2434,10 @@ const TableViewer = () => {
2432
2434
  }) }));
2433
2435
  };
2434
2436
 
2435
- const EditViewButton = ({ text, icon = jsx(IoMdEye, {}), title = "Edit View", }) => {
2437
+ const ViewDialog = ({ icon = jsx(IoMdEye, {}) }) => {
2436
2438
  const viewModel = useDisclosure();
2437
- return (jsx(Fragment, { children: jsxs(DialogRoot, { children: [jsx(DialogBackdrop, {}), jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", onClick: viewModel.onOpen, children: [icon, " ", text] }) }), jsxs(DialogContent, { children: [jsx(DialogCloseTrigger, {}), jsxs(DialogHeader, { children: [jsx(DialogTitle, {}), title] }), jsx(DialogBody, { children: jsx(TableViewer, {}) }), jsx(DialogFooter, {})] })] }) }));
2439
+ const { translate } = useDataTableContext();
2440
+ return (jsxs(DialogRoot, { children: [jsx(DialogBackdrop, {}), jsx(DialogTrigger, { asChild: true, children: jsxs(Button$1, { as: Box, variant: "ghost", onClick: viewModel.onOpen, children: [icon, " ", translate.t("viewDialog.buttonText")] }) }), jsxs(DialogContent, { children: [jsx(DialogCloseTrigger, {}), jsx(DialogHeader, { children: jsx(DialogTitle, { children: translate.t("viewDialog.title") }) }), jsx(DialogBody, { children: jsx(TableViewer, {}) }), jsx(DialogFooter, {})] })] }));
2438
2441
  };
2439
2442
 
2440
2443
  const MenuContent = React.forwardRef(function MenuContent(props, ref) {
@@ -2470,9 +2473,9 @@ const MenuTrigger = Menu.Trigger;
2470
2473
 
2471
2474
  const PageSizeControl = ({ pageSizes = [10, 20, 30, 40, 50], }) => {
2472
2475
  const { table } = useDataTableContext();
2473
- return (jsx(Fragment, { children: jsxs(MenuRoot, { children: [jsx(MenuTrigger, { asChild: true, children: jsxs(Button$1, { variant: "ghost", gap: "0.5rem", children: [table.getState().pagination.pageSize, " ", jsx(BiDownArrow, {})] }) }), jsx(MenuContent, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { value: `chakra-table-pageSize-${pageSize}`, onClick: () => {
2474
- table.setPageSize(Number(pageSize));
2475
- }, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }) }));
2476
+ return (jsxs(MenuRoot, { children: [jsx(MenuTrigger, { asChild: true, children: jsxs(Button$1, { variant: "ghost", gap: "0.5rem", children: [table.getState().pagination.pageSize, " ", jsx(BiDownArrow, {})] }) }), jsx(MenuContent, { children: pageSizes.map((pageSize) => (jsx(MenuItem, { value: `chakra-table-pageSize-${pageSize}`, onClick: () => {
2477
+ table.setPageSize(Number(pageSize));
2478
+ }, children: pageSize }, `chakra-table-pageSize-${pageSize}`))) })] }));
2476
2479
  };
2477
2480
 
2478
2481
  const ResetSelectionButton = ({ text = "Reset Selection", }) => {
@@ -2507,11 +2510,11 @@ const variantMap = {
2507
2510
  };
2508
2511
  const PaginationRoot = React.forwardRef(function PaginationRoot(props, ref) {
2509
2512
  const { size = "sm", variant = "outline", getHref, ...rest } = props;
2510
- return (jsx(RootPropsProvider, { value: { size, variantMap: variantMap[variant], getHref }, children: jsx(Pagination.Root, { ref: ref, type: getHref ? "link" : "button", ...rest }) }));
2513
+ return (jsx(RootPropsProvider, { value: { size, variantMap: variantMap[variant], getHref }, children: jsx(Pagination$1.Root, { ref: ref, type: getHref ? "link" : "button", ...rest }) }));
2511
2514
  });
2512
2515
  const PaginationEllipsis = React.forwardRef(function PaginationEllipsis(props, ref) {
2513
2516
  const { size, variantMap } = useRootProps();
2514
- return (jsx(Pagination.Ellipsis, { ref: ref, ...props, asChild: true, children: jsx(Button$1, { as: "span", variant: variantMap.ellipsis, size: size, children: jsx(HiMiniEllipsisHorizontal, {}) }) }));
2517
+ return (jsx(Pagination$1.Ellipsis, { ref: ref, ...props, asChild: true, children: jsx(Button$1, { as: "span", variant: variantMap.ellipsis, size: size, children: jsx(HiMiniEllipsisHorizontal, {}) }) }));
2515
2518
  });
2516
2519
  const PaginationItem = React.forwardRef(function PaginationItem(props, ref) {
2517
2520
  const { page } = usePaginationContext();
@@ -2521,7 +2524,7 @@ const PaginationItem = React.forwardRef(function PaginationItem(props, ref) {
2521
2524
  if (getHref) {
2522
2525
  return (jsx(LinkButton, { href: getHref(props.value), variant: variant, size: size, children: props.value }));
2523
2526
  }
2524
- return (jsx(Pagination.Item, { ref: ref, ...props, asChild: true, children: jsx(Button$1, { variant: variant, size: size, children: props.value }) }));
2527
+ return (jsx(Pagination$1.Item, { ref: ref, ...props, asChild: true, children: jsx(Button$1, { variant: variant, size: size, children: props.value }) }));
2525
2528
  });
2526
2529
  const PaginationPrevTrigger = React.forwardRef(function PaginationPrevTrigger(props, ref) {
2527
2530
  const { size, variantMap, getHref } = useRootProps();
@@ -2529,7 +2532,7 @@ const PaginationPrevTrigger = React.forwardRef(function PaginationPrevTrigger(pr
2529
2532
  if (getHref) {
2530
2533
  return (jsx(LinkButton, { href: previousPage != null ? getHref(previousPage) : undefined, variant: variantMap.default, size: size, children: jsx(HiChevronLeft, {}) }));
2531
2534
  }
2532
- return (jsx(Pagination.PrevTrigger, { ref: ref, asChild: true, ...props, children: jsx(IconButton, { variant: variantMap.default, size: size, children: jsx(HiChevronLeft, {}) }) }));
2535
+ return (jsx(Pagination$1.PrevTrigger, { ref: ref, asChild: true, ...props, children: jsx(IconButton, { variant: variantMap.default, size: size, children: jsx(HiChevronLeft, {}) }) }));
2533
2536
  });
2534
2537
  const PaginationNextTrigger = React.forwardRef(function PaginationNextTrigger(props, ref) {
2535
2538
  const { size, variantMap, getHref } = useRootProps();
@@ -2537,10 +2540,10 @@ const PaginationNextTrigger = React.forwardRef(function PaginationNextTrigger(pr
2537
2540
  if (getHref) {
2538
2541
  return (jsx(LinkButton, { href: nextPage != null ? getHref(nextPage) : undefined, variant: variantMap.default, size: size, children: jsx(HiChevronRight, {}) }));
2539
2542
  }
2540
- return (jsx(Pagination.NextTrigger, { ref: ref, asChild: true, ...props, children: jsx(IconButton, { variant: variantMap.default, size: size, children: jsx(HiChevronRight, {}) }) }));
2543
+ return (jsx(Pagination$1.NextTrigger, { ref: ref, asChild: true, ...props, children: jsx(IconButton, { variant: variantMap.default, size: size, children: jsx(HiChevronRight, {}) }) }));
2541
2544
  });
2542
2545
  const PaginationItems = (props) => {
2543
- return (jsx(Pagination.Context, { children: ({ pages }) => pages.map((page, index) => {
2546
+ return (jsx(Pagination$1.Context, { children: ({ pages }) => pages.map((page, index) => {
2544
2547
  return page.type === "ellipsis" ? (jsx(PaginationEllipsis, { index: index, ...props }, index)) : (jsx(PaginationItem, { type: "page", value: page.value, ...props }, index));
2545
2548
  }) }));
2546
2549
  };
@@ -2558,7 +2561,7 @@ const PaginationPageText = React.forwardRef(function PaginationPageText(props, r
2558
2561
  });
2559
2562
 
2560
2563
  // TODO: not working in client side
2561
- const TablePagination = () => {
2564
+ const Pagination = () => {
2562
2565
  const { table, type } = useDataTableContext();
2563
2566
  const getCount = () => {
2564
2567
  if (type === "client") {
@@ -2586,12 +2589,18 @@ const snakeToLabel = (str) => {
2586
2589
  .join(" "); // Join with space
2587
2590
  };
2588
2591
 
2589
- const RecordDisplay = ({ object, boxProps }) => {
2592
+ const RecordDisplay = ({ object, boxProps, translate, prefix = "", }) => {
2593
+ const getColumn = ({ field }) => {
2594
+ if (translate !== undefined) {
2595
+ return translate.t(`${prefix}${field}`);
2596
+ }
2597
+ return snakeToLabel(field);
2598
+ };
2590
2599
  if (object === null) {
2591
2600
  return jsx(Fragment, { children: "null" });
2592
2601
  }
2593
2602
  return (jsx(Grid, { rowGap: 1, padding: 1, overflow: "auto", ...boxProps, children: Object.entries(object).map(([field, value]) => {
2594
- return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "gray.400", children: snakeToLabel(field) }), typeof value === "object" ? (jsx(RecordDisplay, { object: value })) : (jsx(Text, { children: JSON.stringify(value) }))] }, field));
2603
+ return (jsxs(Grid, { columnGap: 2, gridTemplateColumns: "auto 1fr", children: [jsx(Text, { color: "gray.400", children: getColumn({ field }) }), typeof value === "object" ? (jsx(RecordDisplay, { object: value, prefix: `${prefix}${field}.`, translate: translate })) : (jsx(Text, { children: JSON.stringify(value) }))] }, field));
2595
2604
  }) }));
2596
2605
  };
2597
2606
 
@@ -2775,7 +2784,7 @@ const fuzzyFilter = (row, columnId, value, addMeta) => {
2775
2784
  *
2776
2785
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2777
2786
  */
2778
- function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }) {
2787
+ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, translate, children, }) {
2779
2788
  const table = useReactTable({
2780
2789
  _features: [DensityFeature],
2781
2790
  data: data,
@@ -2824,9 +2833,10 @@ function DataTable({ columns, data, enableRowSelection = true, enableMultiRowSel
2824
2833
  });
2825
2834
  return (jsx(DataTableContext.Provider, { value: {
2826
2835
  table: table,
2827
- globalFilter: globalFilter,
2828
- setGlobalFilter: setGlobalFilter,
2836
+ globalFilter,
2837
+ setGlobalFilter,
2829
2838
  type: "client",
2839
+ translate,
2830
2840
  }, children: children }));
2831
2841
  }
2832
2842
 
@@ -2845,7 +2855,7 @@ const DataTableServerContext = createContext({
2845
2855
  *
2846
2856
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
2847
2857
  */
2848
- function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }) {
2858
+ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSelection = true, enableSubRowSelection = true, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, url, translate, children, }) {
2849
2859
  const table = useReactTable({
2850
2860
  _features: [DensityFeature],
2851
2861
  data: query.data?.data ?? [],
@@ -2898,6 +2908,7 @@ function DataTableServer({ columns, enableRowSelection = true, enableMultiRowSel
2898
2908
  globalFilter,
2899
2909
  setGlobalFilter,
2900
2910
  type: "server",
2911
+ translate,
2901
2912
  }, children: jsx(DataTableServerContext.Provider, { value: { url, query }, children: children }) }));
2902
2913
  }
2903
2914
 
@@ -3067,12 +3078,13 @@ const TableFilterTags = () => {
3067
3078
  }) }));
3068
3079
  };
3069
3080
 
3070
- const TableControls = ({ totalText = "Total:", fitTableWidth = false, fitTableHeight = false, isMobile = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
3071
- return (jsxs(Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: jsx(EditViewButton, { text: isMobile ? undefined : "View", icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: "An error occurred while fetching data", children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && (jsx(Fragment, { children: jsx(EditFilterButton, { text: isMobile ? undefined : "Advanced Filter" }) })), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3081
+ const TableControls = ({ fitTableWidth = false, fitTableHeight = false, children = jsx(Fragment, {}), showGlobalFilter = false, showFilter = false, showFilterName = false, showFilterTags = false, showReload = false, showPagination = true, showPageSizeControl = true, showPageCountText = true, showView = true, filterOptions = [], extraItems = jsx(Fragment, {}), loading = false, hasError = false, }) => {
3082
+ const { translate } = useDataTableContext();
3083
+ return (jsxs(Grid, { templateRows: "auto 1fr auto", width: fitTableWidth ? "fit-content" : "100%", height: fitTableHeight ? "fit-content" : "100%", gap: "0.5rem", children: [jsxs(Flex, { flexFlow: "column", gap: 2, children: [jsxs(Flex, { justifyContent: "space-between", children: [jsx(Box, { children: showView && jsx(ViewDialog, { icon: jsx(MdOutlineViewColumn, {}) }) }), jsxs(Flex, { gap: "0.5rem", alignItems: "center", justifySelf: "end", children: [loading && jsx(Spinner, { size: "sm" }), hasError && (jsx(Tooltip, { content: translate.t("hasError"), children: jsx(Icon, { as: BsExclamationCircleFill, color: "red.400" }) })), showGlobalFilter && jsx(GlobalFilter, {}), showFilter && jsx(FilterDialog, {}), showReload && jsx(ReloadButton, {}), extraItems] })] }), filterOptions.length > 0 && (jsx(Flex, { flexFlow: "column", gap: "0.5rem", children: filterOptions.map((column) => {
3072
3084
  return (jsxs(Flex, { alignItems: "center", flexFlow: "wrap", gap: "0.5rem", children: [showFilterName && jsxs(Text, { children: [column, ":"] }), jsx(FilterOptions, { column: column })] }, column));
3073
3085
  }) })), showFilterTags && (jsx(Flex, { children: jsx(TableFilterTags, {}) }))] }), jsx(Grid, { overflow: "auto", backgroundColor: "gray.50", _dark: {
3074
3086
  backgroundColor: "gray.900",
3075
- }, children: children }), jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsx(PageSizeControl, {}), showPageCountText && (jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: totalText }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(TablePagination, {}) })] })] }));
3087
+ }, children: children }), jsxs(Flex, { justifyContent: "space-between", children: [jsxs(Flex, { gap: "1rem", alignItems: "center", children: [showPageSizeControl && jsx(PageSizeControl, {}), showPageCountText && (jsxs(Flex, { children: [jsx(Text, { paddingRight: "0.5rem", children: translate.t("rowcount.total") }), jsx(RowCountText, {})] }))] }), jsx(Box, { justifySelf: "end", children: showPagination && jsx(Pagination, {}) })] })] }));
3076
3088
  };
3077
3089
 
3078
3090
  const TableFooter = ({ pinnedBgColor = { light: "gray.50", dark: "gray.700" }, showSelector = false, alwaysShowSelector = true, }) => {
@@ -3331,7 +3343,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3331
3343
  columnVisibility: {},
3332
3344
  globalFilter: "",
3333
3345
  density: "sm",
3334
- }, } = {
3346
+ }, keyPrefix = "", } = {
3335
3347
  default: {
3336
3348
  sorting: [],
3337
3349
  pagination: {
@@ -3354,6 +3366,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3354
3366
  const [globalFilter, setGlobalFilter] = useState(defaultGlobalFilter);
3355
3367
  const [density, setDensity] = useState(defaultDensity);
3356
3368
  const [columnVisibility, setColumnVisibility] = useState(defaultColumnVisibility);
3369
+ const translate = useTranslation("", { keyPrefix });
3357
3370
  return {
3358
3371
  sorting,
3359
3372
  setSorting,
@@ -3371,6 +3384,7 @@ const useDataTable = ({ default: { sorting: defaultSorting = [], pagination: def
3371
3384
  setDensity,
3372
3385
  columnVisibility,
3373
3386
  setColumnVisibility,
3387
+ translate,
3374
3388
  };
3375
3389
  };
3376
3390
 
@@ -3389,10 +3403,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3389
3403
  columnVisibility: {},
3390
3404
  globalFilter: "",
3391
3405
  density: "sm",
3392
- },
3393
- // debounce = true,
3394
- // debounceDelay = 1000,
3395
- }) => {
3406
+ }, keyPrefix, }) => {
3396
3407
  const [sorting, setSorting] = useState(defaultSorting);
3397
3408
  const [columnFilters, setColumnFilters] = useState(defaultColumnFilters); // can set initial column filter state here
3398
3409
  const [pagination, setPagination] = useState(defaultPagination);
@@ -3422,6 +3433,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3422
3433
  data: [],
3423
3434
  },
3424
3435
  });
3436
+ const translate = useTranslation("", { keyPrefix });
3425
3437
  return {
3426
3438
  sorting,
3427
3439
  setSorting,
@@ -3440,6 +3452,7 @@ const useDataTableServer = ({ url, default: { sorting: defaultSorting = [], pagi
3440
3452
  columnVisibility,
3441
3453
  setColumnVisibility,
3442
3454
  query,
3455
+ translate,
3443
3456
  };
3444
3457
  };
3445
3458
 
@@ -3461,11 +3474,17 @@ const widthSanityCheck = (widthList, ignoreList, properties) => {
3461
3474
  throw new Error(`The width list is too long given from the number of remaining properties after ignore some.`);
3462
3475
  }
3463
3476
  };
3464
- const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, }) => {
3477
+ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth = 400, translate, }) => {
3465
3478
  const { properties } = schema;
3466
3479
  idListSanityCheck("ignore", ignore, properties);
3467
3480
  widthSanityCheck(width, ignore, properties);
3468
3481
  idListSanityCheck("meta", Object.keys(meta), properties);
3482
+ const getColumn = ({ column }) => {
3483
+ if (translate !== undefined) {
3484
+ return translate.t(`${column}`);
3485
+ }
3486
+ return snakeToLabel(column);
3487
+ };
3469
3488
  const keys = Object.keys(properties);
3470
3489
  const ignored = keys.filter((key) => {
3471
3490
  return !ignore.some((shouldIgnoreKey) => key === shouldIgnoreKey);
@@ -3479,18 +3498,18 @@ const getColumns = ({ schema, ignore = [], width = [], meta = {}, defaultWidth =
3479
3498
  // @ts-expect-error find type for unknown
3480
3499
  const value = props.row.original[column];
3481
3500
  if (typeof value === "object") {
3482
- return (jsx(Grid, { overflow: "auto", children: jsx(RecordDisplay, { object: value }) }));
3501
+ return (jsx(Grid, { overflow: "auto", children: jsx(RecordDisplay, { object: value, translate }) }));
3483
3502
  }
3484
3503
  return jsx(TextCell, { children: value });
3485
3504
  },
3486
3505
  header: (columnHeader) => {
3487
3506
  const displayName = columnHeader.column.columnDef.meta?.displayName ??
3488
- snakeToLabel(column);
3507
+ getColumn({ column });
3489
3508
  return jsx("span", { children: displayName });
3490
3509
  },
3491
3510
  footer: (columnFooter) => {
3492
3511
  const displayName = columnFooter.column.columnDef.meta?.displayName ??
3493
- snakeToLabel(column);
3512
+ getColumn({ column });
3494
3513
  return jsx("span", { children: displayName });
3495
3514
  },
3496
3515
  size: width[index] ?? defaultWidth,
@@ -4780,4 +4799,4 @@ const getMultiDates = ({ selected, selectedDate, selectedDates, selectable, }) =
4780
4799
  }
4781
4800
  };
4782
4801
 
4783
- export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditFilterButton, EditOrderButton, EditSortingButton, EditViewButton, EmptyState, ErrorAlert, FilterOptions, Form, GlobalFilter, PageSizeControl, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TablePagination, TableSelector, TableSorter, TableViewer, TextCell, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
4802
+ export { CardHeader, DataDisplay, DataTable, DataTableServer, DefaultCardTitle, DefaultTable, DensityToggleButton, EditOrderButton, EditSortingButton, EmptyState, ErrorAlert, FilterDialog, FilterOptions, Form, GlobalFilter, PageSizeControl, Pagination, RecordDisplay, ReloadButton, ResetFilteringButton, ResetSelectionButton, ResetSortingButton, RowCountText, Table, TableBody, TableCardContainer, TableCards, TableComponent, TableControls, TableFilter, TableFilterTags, TableFooter, TableHeader, TableLoadingComponent, TableOrderer, TableSelector, TableSorter, TableViewer, TextCell, ViewDialog, getColumns, getMultiDates, getRangeDates, useDataTable, useDataTableContext, useDataTableServer, useForm, widthSanityCheck };
@@ -0,0 +1,5 @@
1
+ /// <reference types="react" />
2
+ export interface EditFilterButtonProps {
3
+ icon?: React.ReactElement;
4
+ }
5
+ export declare const FilterDialog: ({ icon, }: EditFilterButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const Pagination: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export interface EditViewButtonProps {
3
+ icon?: React.ReactElement;
4
+ }
5
+ export declare const ViewDialog: ({ icon }: EditViewButtonProps) => import("react/jsx-runtime").JSX.Element;
@@ -2,6 +2,7 @@ import { ColumnDef, ColumnFiltersState, ColumnOrderState, FilterFn, OnChangeFn,
2
2
  import { ReactNode } from "react";
3
3
  import { RankingInfo } from "@tanstack/match-sorter-utils";
4
4
  import { DensityState } from "../Controls/DensityFeature";
5
+ import { UseTranslationResponse } from "react-i18next";
5
6
  declare module "@tanstack/react-table" {
6
7
  interface FilterFns {
7
8
  fuzzy: FilterFn<unknown>;
@@ -47,6 +48,7 @@ export interface DataTableProps<TData = unknown> {
47
48
  setColumnOrder: OnChangeFn<ColumnOrderState>;
48
49
  setDensity: OnChangeFn<DensityState>;
49
50
  setColumnVisibility: OnChangeFn<VisibilityState>;
51
+ translate: UseTranslationResponse<any, any>;
50
52
  }
51
53
  /**
52
54
  * DataTable will create a context to hold all values to
@@ -58,4 +60,4 @@ export interface DataTableProps<TData = unknown> {
58
60
  *
59
61
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
60
62
  */
61
- export declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, children, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
63
+ export declare function DataTable<TData = unknown>({ columns, data, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, translate, children, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
@@ -3,6 +3,7 @@ import { UseQueryResult } from "@tanstack/react-query";
3
3
  import { ColumnDef, ColumnFiltersState, ColumnOrderState, OnChangeFn, PaginationState, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
4
4
  import { DensityState } from "../Controls/DensityFeature";
5
5
  import { DataResponse } from "./useDataTableServer";
6
+ import { UseTranslationResponse } from "react-i18next";
6
7
  export interface DataTableServerProps<TData extends DataResponse = DataResponse<unknown>> {
7
8
  children: ReactNode | ReactNode[];
8
9
  /**
@@ -34,6 +35,7 @@ export interface DataTableServerProps<TData extends DataResponse = DataResponse<
34
35
  setColumnVisibility: OnChangeFn<VisibilityState>;
35
36
  query: UseQueryResult<TData>;
36
37
  url: string;
38
+ translate: UseTranslationResponse<any, any>;
37
39
  }
38
40
  /**
39
41
  * DataTableServer will create a context to hold all values to
@@ -46,4 +48,4 @@ export interface DataTableServerProps<TData extends DataResponse = DataResponse<
46
48
  *
47
49
  * @link https://tanstack.com/table/latest/docs/guide/column-defs
48
50
  */
49
- export declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, children, url, }: DataTableServerProps<TData>): import("react/jsx-runtime").JSX.Element;
51
+ export declare function DataTableServer<TData extends DataResponse = DataResponse<unknown>>({ columns, enableRowSelection, enableMultiRowSelection, enableSubRowSelection, columnOrder, columnFilters, columnVisibility, density, globalFilter, pagination, sorting, rowSelection, setPagination, setSorting, setColumnFilters, setRowSelection, setGlobalFilter, setColumnOrder, setDensity, setColumnVisibility, query, url, translate, children, }: DataTableServerProps<TData>): import("react/jsx-runtime").JSX.Element;
@@ -3,7 +3,6 @@ export interface TableControlsProps {
3
3
  totalText?: string;
4
4
  fitTableWidth?: boolean;
5
5
  fitTableHeight?: boolean;
6
- isMobile?: boolean;
7
6
  children?: ReactNode;
8
7
  showGlobalFilter?: boolean;
9
8
  showFilter?: boolean;
@@ -13,9 +12,10 @@ export interface TableControlsProps {
13
12
  showPagination?: boolean;
14
13
  showPageSizeControl?: boolean;
15
14
  showPageCountText?: boolean;
15
+ showView?: boolean;
16
16
  filterOptions?: string[];
17
17
  extraItems?: ReactNode;
18
18
  loading?: boolean;
19
19
  hasError?: boolean;
20
20
  }
21
- export declare const TableControls: ({ totalText, fitTableWidth, fitTableHeight, isMobile, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
21
+ export declare const TableControls: ({ fitTableWidth, fitTableHeight, children, showGlobalFilter, showFilter, showFilterName, showFilterTags, showReload, showPagination, showPageSizeControl, showPageCountText, showView, filterOptions, extraItems, loading, hasError, }: TableControlsProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,9 @@
1
1
  import { BoxProps } from "@chakra-ui/react";
2
+ import { UseTranslationResponse } from "react-i18next";
2
3
  export interface RecordDisplayProps {
3
4
  object: object | null;
4
5
  boxProps?: BoxProps;
6
+ translate?: UseTranslationResponse<any, any>;
7
+ prefix?: string;
5
8
  }
6
- export declare const RecordDisplay: ({ object, boxProps }: RecordDisplayProps) => import("react/jsx-runtime").JSX.Element;
9
+ export declare const RecordDisplay: ({ object, boxProps, translate, prefix, }: RecordDisplayProps) => import("react/jsx-runtime").JSX.Element;
@@ -1,9 +1,11 @@
1
1
  /// <reference types="react" />
2
2
  import { OnChangeFn, Table } from "@tanstack/react-table";
3
+ import { UseTranslationResponse } from "react-i18next";
3
4
  export interface DataTableContext<TData = unknown> {
4
5
  table: Table<TData>;
5
6
  globalFilter: string;
6
7
  setGlobalFilter: OnChangeFn<string>;
7
8
  type: "client" | "server";
9
+ translate: UseTranslationResponse<any, any>;
8
10
  }
9
11
  export declare const DataTableContext: import("react").Context<DataTableContext<unknown>>;
@@ -1,5 +1,6 @@
1
1
  import { ColumnFiltersState, ColumnOrderState, OnChangeFn, PaginationState, RowSelectionState, SortingState, VisibilityState } from "@tanstack/react-table";
2
2
  import { DensityState } from "../Controls/DensityFeature";
3
+ import { UseTranslationResponse } from "react-i18next";
3
4
  export interface DataTableDefaultState {
4
5
  sorting?: SortingState;
5
6
  columnFilters?: ColumnFiltersState;
@@ -12,6 +13,7 @@ export interface DataTableDefaultState {
12
13
  }
13
14
  export interface UseDataTableProps {
14
15
  default?: DataTableDefaultState;
16
+ keyPrefix?: string;
15
17
  }
16
18
  export interface UseDataTableReturn {
17
19
  sorting: SortingState;
@@ -30,5 +32,6 @@ export interface UseDataTableReturn {
30
32
  setColumnOrder: OnChangeFn<ColumnOrderState>;
31
33
  setDensity: OnChangeFn<DensityState>;
32
34
  setColumnVisibility: OnChangeFn<VisibilityState>;
35
+ translate: UseTranslationResponse<any, any>;
33
36
  }
34
- export declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }?: UseDataTableProps) => UseDataTableReturn;
37
+ export declare const useDataTable: ({ default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, keyPrefix, }?: UseDataTableProps) => UseDataTableReturn;
@@ -24,4 +24,4 @@ export interface Result<T = unknown> {
24
24
  export interface DataResponse<T = unknown> extends Result<T> {
25
25
  count: number;
26
26
  }
27
- export declare const useDataTableServer: <TData>({ url, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, }: UseDataTableServerProps) => UseDataTableServerReturn<TData>;
27
+ export declare const useDataTableServer: <TData>({ url, default: { sorting: defaultSorting, pagination: defaultPagination, rowSelection: defaultRowSelection, columnFilters: defaultColumnFilters, columnOrder: defaultColumnOrder, columnVisibility: defaultColumnVisibility, globalFilter: defaultGlobalFilter, density: defaultDensity, }, keyPrefix, }: UseDataTableServerProps) => UseDataTableServerReturn<TData>;
@@ -1,5 +1,6 @@
1
1
  import { ColumnDef, RowData } from "@tanstack/react-table";
2
2
  import { JSONSchema7 } from "json-schema";
3
+ import { UseTranslationResponse } from "react-i18next";
3
4
  export interface GetColumnsConfigs<K extends RowData> {
4
5
  schema: JSONSchema7;
5
6
  ignore?: K[];
@@ -8,6 +9,7 @@ export interface GetColumnsConfigs<K extends RowData> {
8
9
  [key in K as string]?: object;
9
10
  };
10
11
  defaultWidth?: number;
12
+ translate?: UseTranslationResponse<any, any>;
11
13
  }
12
14
  export declare const widthSanityCheck: <K extends unknown>(widthList: number[], ignoreList: K[], properties: { [key in K as string]?: object | undefined; }) => void;
13
- export declare const getColumns: <TData extends unknown>({ schema, ignore, width, meta, defaultWidth, }: GetColumnsConfigs<TData>) => ColumnDef<TData>[];
15
+ export declare const getColumns: <TData extends unknown>({ schema, ignore, width, meta, defaultWidth, translate, }: GetColumnsConfigs<TData>) => ColumnDef<TData>[];
@@ -58,16 +58,16 @@ declare module "@tanstack/react-table" {
58
58
  }
59
59
  }
60
60
  export * from "./components/Controls/DensityToggleButton";
61
- export * from "./components/Controls/EditFilterButton";
61
+ export * from "./components/Controls/FilterDialog";
62
62
  export * from "./components/Controls/EditOrderButton";
63
63
  export * from "./components/Controls/EditSortingButton";
64
- export * from "./components/Controls/EditViewButton";
64
+ export * from "./components/Controls/ViewDialog";
65
65
  export * from "./components/Controls/PageSizeControl";
66
66
  export * from "./components/Controls/ResetFilteringButton";
67
67
  export * from "./components/Controls/ResetSelectionButton";
68
68
  export * from "./components/Controls/ResetSortingButton";
69
69
  export * from "./components/Controls/RowCountText";
70
- export * from "./components/Controls/TablePagination";
70
+ export * from "./components/Controls/Pagination";
71
71
  export * from "./components/DataTable/CardHeader";
72
72
  export * from "./components/DataTable/DataDisplay";
73
73
  export * from "./components/DataTable/DataTable";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bsol-oss/react-datatable5",
3
- "version": "9.1.0",
3
+ "version": "10.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",