periplo-ui 3.21.1 → 3.21.2

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.
Files changed (32) hide show
  1. package/dist/components/DataTable/DataTable.d.ts +2 -90
  2. package/dist/components/DataTable/DataTable.js +101 -52
  3. package/dist/components/DataTable/DataTable.js.map +1 -1
  4. package/dist/components/DataTable/components/DataTableBody.d.ts +5 -5
  5. package/dist/components/DataTable/components/DataTableBody.js +20 -31
  6. package/dist/components/DataTable/components/DataTableBody.js.map +1 -1
  7. package/dist/components/DataTable/{DataTablePagination.d.ts → components/DataTablePagination.d.ts} +2 -2
  8. package/dist/components/DataTable/{DataTablePagination.js → components/DataTablePagination.js} +2 -2
  9. package/dist/components/DataTable/components/DataTablePagination.js.map +1 -0
  10. package/dist/components/DataTable/components/DataTableRowSelector.d.ts +9 -0
  11. package/dist/components/DataTable/components/DataTableRowSelector.js +21 -0
  12. package/dist/components/DataTable/components/DataTableRowSelector.js.map +1 -0
  13. package/dist/components/DataTable/components/DataTableSelectHeader.d.ts +9 -0
  14. package/dist/components/DataTable/components/DataTableSelectHeader.js +26 -0
  15. package/dist/components/DataTable/components/DataTableSelectHeader.js.map +1 -0
  16. package/dist/components/DataTable/components/DataTableToolbar.d.ts +13 -1
  17. package/dist/components/DataTable/components/DataTableToolbar.js +36 -12
  18. package/dist/components/DataTable/components/DataTableToolbar.js.map +1 -1
  19. package/dist/components/DataTable/data.d.ts +8 -0
  20. package/dist/components/DataTable/data.js +506 -0
  21. package/dist/components/DataTable/data.js.map +1 -0
  22. package/dist/components/DataTable/hooks/useSelection.d.ts +15 -0
  23. package/dist/components/DataTable/hooks/useSelection.js +37 -0
  24. package/dist/components/DataTable/hooks/useSelection.js.map +1 -0
  25. package/dist/components/DataTable/types.d.js +2 -0
  26. package/dist/components/DataTable/types.d.js.map +1 -0
  27. package/dist/components/DataTable/types.d.ts +149 -0
  28. package/package.json +1 -1
  29. package/dist/components/DataTable/DataTablePagination.js.map +0 -1
  30. package/dist/components/DataTable/hooks/useTableSelection.d.ts +0 -14
  31. package/dist/components/DataTable/hooks/useTableSelection.js +0 -55
  32. package/dist/components/DataTable/hooks/useTableSelection.js.map +0 -1
@@ -1,94 +1,6 @@
1
- import { ColumnDef } from '@tanstack/react-table';
2
- import * as React from 'react';
3
- type BasePaginationProps = {
4
- /** Number of rows per page */
5
- readonly pageSize: number;
6
- /** Whether the pagination is in a loading state */
7
- readonly isLoading?: boolean;
8
- /** Text customization for pagination */
9
- readonly labels?: {
10
- /** Text shown before the page size number (default: "Showing") */
11
- showing?: string;
12
- /** Text shown before the total number (default: "of") */
13
- of?: string;
14
- /** Text shown after the total number (default: "results") */
15
- results?: string;
16
- /** Aria label for previous page button (default: "Previous page") */
17
- previousPage?: string;
18
- /** Aria label for next page button (default: "Next page") */
19
- nextPage?: string;
20
- /** Aria label for page number (default: "Page {number}") */
21
- pageLabel?: string;
22
- };
23
- };
24
- type BackendPaginationProps = BasePaginationProps & {
25
- /** Current page */
26
- readonly currentPage: number;
27
- /** Total number of items */
28
- readonly total: number;
29
- /** Callback when page changes */
30
- readonly onPageChange: (page: number) => void;
31
- };
32
- /**
33
- * Type helper to check if a type has an 'id' property
34
- */
35
- type HasId<T> = T extends {
36
- id: string | number;
37
- } ? true : false;
38
- /**
39
- * Props for the DataTable component
40
- * @template TData The type of data being displayed in the table
41
- */
42
- export type DataTableProps<TData> = {
43
- /** Array of column definitions that describe the table structure */
44
- readonly columns: Array<ColumnDef<TData>>;
45
- /** Array of data items to be displayed in the table */
46
- readonly data: Array<TData>;
47
- /** Whether to show the column visibility toggle menu */
48
- readonly showColumnVisibilityControls?: boolean;
49
- /** Whether the table is in a loading state */
50
- readonly isLoading?: boolean;
51
- /** Pagination configuration. If not provided, pagination is disabled */
52
- readonly pagination?: BasePaginationProps | BackendPaginationProps;
53
- /** Primary filters that appear directly above the table */
54
- readonly primaryFilters?: React.ReactNode;
55
- /** Secondary filters that appear in the filters dropdown */
56
- readonly secondaryFilters?: React.ReactNode;
57
- /** Number of active primary filters */
58
- readonly activePrimaryFiltersCount?: number;
59
- /** Number of active secondary filters */
60
- readonly activeSecondaryFiltersCount?: number;
61
- /** Text customization for filters */
62
- readonly labels?: {
63
- /** Text for the column visibility button (default: "Hide columns") */
64
- columnVisibilityButton?: string;
65
- /** Text for the filters button when only secondary filters are present (default: "Filters") */
66
- filters?: string;
67
- /** Text for the more filters button when both primary and secondary filters are present (default: "More filters") */
68
- moreFilters?: string;
69
- };
70
- /** Callback when all rows are selected */
71
- readonly onSelectAll?: (selected: boolean) => void;
72
- /** Callback when a row is selected */
73
- readonly onSelect?: (selected: boolean, row: TData) => void;
74
- /** Optional className for the table container */
75
- readonly className?: string;
76
- /** Optional className for the table */
77
- readonly tableClassName?: string;
78
- } & (HasId<TData> extends true ? {
79
- /** Function to get unique identifier from a row. Not needed when data has 'id' property */
80
- readonly getRowId?: never;
81
- } : {
82
- /** Function to get unique identifier from a row. Required when data doesn't have 'id' property */
83
- readonly getRowId: RowIdentifierFn<TData>;
84
- });
85
- /**
86
- * Function to get a unique identifier from a row
87
- */
88
- type RowIdentifierFn<T> = (row: T) => string;
1
+ import { DataTableProps } from './types';
89
2
  /**
90
3
  * A feature-rich data table component built on top of TanStack Table.
91
4
  * Provides sorting, filtering, pagination, and column visibility controls.
92
5
  */
93
- export declare function DataTable<TData extends object>({ columns: userColumns, data, getRowId, showColumnVisibilityControls, isLoading, pagination, primaryFilters, secondaryFilters, activePrimaryFiltersCount, activeSecondaryFiltersCount, labels, onSelectAll, onSelect, className, tableClassName, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
94
- export {};
6
+ export declare function DataTable<TData extends object>({ columns: userColumns, data, getRowId, showColumnVisibilityControls, isLoading, pagination, primaryFilters, secondaryFilters, activePrimaryFiltersCount, activeSecondaryFiltersCount, selection, labels, className, tableClassName, }: DataTableProps<TData>): import("react/jsx-runtime").JSX.Element;
@@ -1,14 +1,15 @@
1
1
  "use client";
2
- import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { useReactTable, getCoreRowModel, getPaginationRowModel, flexRender } from '@tanstack/react-table';
2
+ import { jsx, jsxs } from 'react/jsx-runtime';
3
+ import { getPaginationRowModel, useReactTable, getCoreRowModel, flexRender } from '@tanstack/react-table';
4
4
  import * as React from 'react';
5
- import { Checkbox } from '../Checkbox/Checkbox.js';
6
5
  import { Table, TableHeader, TableRow, TableHead } from '../Table/Table.js';
7
6
  import { Typography } from '../Typography/Typography.js';
8
7
  import { DataTableBody } from './components/DataTableBody.js';
8
+ import { DataTablePagination } from './components/DataTablePagination.js';
9
+ import { DataTableRowSelector } from './components/DataTableRowSelector.js';
10
+ import { DataTableSelectHeader } from './components/DataTableSelectHeader.js';
9
11
  import { DataTableToolbar } from './components/DataTableToolbar.js';
10
- import { DataTablePagination } from './DataTablePagination.js';
11
- import { useTableSelection } from './hooks/useTableSelection.js';
12
+ import { useSelection } from './hooks/useSelection.js';
12
13
  import { cn } from '../../lib/utils.js';
13
14
 
14
15
  function DataTable({
@@ -22,51 +23,110 @@ function DataTable({
22
23
  secondaryFilters,
23
24
  activePrimaryFiltersCount = 0,
24
25
  activeSecondaryFiltersCount = 0,
26
+ selection,
25
27
  labels = {
26
28
  columnVisibilityButton: "Hide columns",
27
29
  filters: "Filters",
28
30
  moreFilters: "More filters"
29
31
  },
30
- onSelectAll,
31
- onSelect,
32
32
  className,
33
33
  tableClassName
34
34
  }) {
35
35
  const [columnVisibility, setColumnVisibility] = React.useState({});
36
36
  const [pageIndex, setPageIndex] = React.useState(0);
37
- const isBackendPagination = pagination && "onPageChange" in pagination;
37
+ const isBackendPagination = pagination !== undefined && "onPageChange" in pagination;
38
38
  const total = isBackendPagination ? pagination.total : data.length;
39
- const pageSize = pagination?.pageSize ?? data.length;
39
+ const pageSize = pagination?.pageSize ?? (isLoading ? 10 : data.length);
40
40
  const totalPages = Math.ceil(total / pageSize);
41
- const { isSelectable, isAllRowsSelected, rowSelection, handleSelectAll, handleRowSelect } = useTableSelection({
41
+ const { selectedIds, handleRowSelect, handleSelectAll } = useSelection({
42
42
  data,
43
43
  getRowId,
44
- onSelectAll,
45
- onSelect
44
+ selection
46
45
  });
46
+ const rowSelection = React.useMemo(
47
+ () => Object.fromEntries(Array.from(selectedIds).map((id) => [id, true])),
48
+ [selectedIds]
49
+ );
50
+ const SelectColumnHeader = React.useCallback(
51
+ () => /* @__PURE__ */ jsx(
52
+ DataTableSelectHeader,
53
+ {
54
+ isBackendPagination,
55
+ selectedIds,
56
+ data,
57
+ handleSelectAll,
58
+ isLoading
59
+ }
60
+ ),
61
+ [isBackendPagination, selectedIds, data, handleSelectAll, isLoading]
62
+ );
63
+ const SelectColumnCell = React.useCallback(
64
+ ({ row }) => /* @__PURE__ */ jsx(DataTableRowSelector, { row, selectedIds, getRowId, handleRowSelect }),
65
+ [selectedIds, getRowId, handleRowSelect]
66
+ );
67
+ const tableColumns = React.useMemo(() => {
68
+ const baseColumns = [...userColumns];
69
+ if (selection !== undefined) {
70
+ const selectColumn = {
71
+ id: "select",
72
+ size: 50,
73
+ cell: SelectColumnCell,
74
+ header: SelectColumnHeader
75
+ };
76
+ baseColumns.unshift(selectColumn);
77
+ }
78
+ return baseColumns;
79
+ }, [userColumns, selection, SelectColumnCell, SelectColumnHeader]);
80
+ const toolbarSelectionProps = React.useMemo(() => {
81
+ if (isBackendPagination && selection) {
82
+ return {
83
+ isSelectionStarted: selection.isSelectionStarted,
84
+ onSelectionStart: selection.onSelectionStart,
85
+ onSelectionCancel: selection.onSelectionCancel,
86
+ selectionSummary: selection.labels?.selectionSummary,
87
+ labels: selection.labels
88
+ };
89
+ }
90
+ return undefined;
91
+ }, [isBackendPagination, selection]);
92
+ const currentPage = isBackendPagination ? pagination.currentPage : pageIndex + 1;
93
+ const handlePageChange = isBackendPagination ? pagination.onPageChange : (page) => setPageIndex(page - 1);
94
+ const tablePaginationState = React.useMemo(() => {
95
+ if (!pagination) {
96
+ return undefined;
97
+ }
98
+ return {
99
+ pageIndex: isBackendPagination ? pagination.currentPage - 1 : pageIndex,
100
+ pageSize
101
+ };
102
+ }, [pagination, isBackendPagination, pageIndex, pageSize]);
103
+ const tableGetPaginationRowModel = React.useMemo(() => {
104
+ return pagination && !isBackendPagination ? getPaginationRowModel() : undefined;
105
+ }, [pagination, isBackendPagination]);
106
+ const tableOnPaginationChange = React.useCallback(
107
+ (updater) => {
108
+ if (typeof updater === "function") {
109
+ const newState = updater({ pageIndex, pageSize });
110
+ setPageIndex(newState.pageIndex);
111
+ }
112
+ },
113
+ [pageIndex, pageSize, setPageIndex]
114
+ );
47
115
  const table = useReactTable({
48
116
  data,
49
- columns: userColumns,
117
+ columns: tableColumns,
50
118
  getCoreRowModel: getCoreRowModel(),
51
- getPaginationRowModel: pagination && !isBackendPagination ? getPaginationRowModel() : undefined,
119
+ getPaginationRowModel: tableGetPaginationRowModel,
52
120
  onColumnVisibilityChange: setColumnVisibility,
53
- enableRowSelection: isSelectable,
121
+ enableRowSelection: !!selection,
54
122
  getRowId,
55
123
  state: {
56
124
  columnVisibility,
57
125
  rowSelection,
58
- pagination: pagination ? {
59
- pageIndex: isBackendPagination ? pagination.currentPage - 1 : pageIndex,
60
- pageSize
61
- } : undefined
126
+ pagination: tablePaginationState
62
127
  },
63
128
  manualPagination: isBackendPagination,
64
- onPaginationChange: isBackendPagination ? undefined : (updater) => {
65
- if (typeof updater === "function") {
66
- const newState = updater({ pageIndex, pageSize });
67
- setPageIndex(newState.pageIndex);
68
- }
69
- }
129
+ onPaginationChange: isBackendPagination ? undefined : tableOnPaginationChange
70
130
  });
71
131
  return /* @__PURE__ */ jsxs("div", { className: cn("flex h-full min-h-0 w-full flex-1 flex-col gap-2 overflow-hidden", className), children: [
72
132
  /* @__PURE__ */ jsx(
@@ -78,41 +138,30 @@ function DataTable({
78
138
  secondaryFilters,
79
139
  activePrimaryFiltersCount,
80
140
  activeSecondaryFiltersCount,
81
- labels
141
+ labels,
142
+ selection: toolbarSelectionProps
82
143
  }
83
144
  ),
84
145
  /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-1 flex-col rounded-md border bg-white", children: [
85
- /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: /* @__PURE__ */ jsx("div", { className: "h-full overflow-auto", children: /* @__PURE__ */ jsxs(Table, { className: "w-full", tableClassName: cn("table-fixed", tableClassName), children: [
86
- /* @__PURE__ */ jsx(TableHeader, { className: "sticky top-0 z-10 bg-neutral-50", children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsxs(TableRow, { children: [
87
- isSelectable && /* @__PURE__ */ jsx(TableHead, { className: "w-[50px]", children: /* @__PURE__ */ jsx(
88
- Checkbox,
89
- {
90
- checked: isAllRowsSelected,
91
- onCheckedChange: handleSelectAll,
92
- disabled: isLoading || !data.length,
93
- "aria-label": "Select all rows"
94
- }
95
- ) }),
96
- headerGroup.headers.map((header) => /* @__PURE__ */ jsx(
97
- TableHead,
98
- {
99
- className: "whitespace-normal",
100
- style: { width: header.column.columnDef.size },
101
- children: /* @__PURE__ */ jsx(Typography, { weight: "medium", children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) })
102
- },
103
- header.id
104
- ))
105
- ] }, headerGroup.id)) }),
146
+ /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto", children: /* @__PURE__ */ jsx("div", { className: "h-full overflow-auto", children: /* @__PURE__ */ jsxs(Table, { className: "w-full overscroll-contain", tableClassName: cn("table-fixed ", tableClassName), children: [
147
+ /* @__PURE__ */ jsx(TableHeader, { className: "sticky top-0 z-10 bg-neutral-50", children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx(TableRow, { children: headerGroup.headers.map((header) => /* @__PURE__ */ jsx(
148
+ TableHead,
149
+ {
150
+ className: "whitespace-normal",
151
+ style: { width: header.column.columnDef.size },
152
+ children: /* @__PURE__ */ jsx(Typography, { weight: "medium", children: header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext()) })
153
+ },
154
+ header.id
155
+ )) }, headerGroup.id)) }),
106
156
  /* @__PURE__ */ jsx(
107
157
  DataTableBody,
108
158
  {
109
159
  table,
110
160
  isLoading,
111
- isSelectable,
161
+ isSelectable: selection !== undefined,
112
162
  pageSize,
113
163
  getRowId,
114
- rowSelection,
115
- handleRowSelect
164
+ rowSelection
116
165
  }
117
166
  )
118
167
  ] }) }) }),
@@ -122,9 +171,9 @@ function DataTable({
122
171
  table,
123
172
  total,
124
173
  pageSize,
125
- currentPage: isBackendPagination ? pagination.currentPage : table.getState().pagination.pageIndex + 1 || 1,
174
+ currentPage,
126
175
  totalPages,
127
- onPageChange: isBackendPagination ? pagination.onPageChange : undefined,
176
+ onPageChange: handlePageChange,
128
177
  isLoading: pagination.isLoading,
129
178
  labels: pagination.labels
130
179
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable.js","sources":["../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n/* eslint-disable @typescript-eslint/no-dynamic-delete */\n'use client'\n\nimport {\n ColumnDef,\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n useReactTable,\n VisibilityState,\n} from '@tanstack/react-table'\nimport * as React from 'react'\n\nimport { Checkbox } from '../Checkbox'\nimport { Table as TableComponent, TableHeader, TableHead, TableRow } from '../Table'\nimport { Typography } from '../Typography'\n\nimport { DataTableBody } from './components/DataTableBody'\nimport { DataTableToolbar } from './components/DataTableToolbar'\nimport { DataTablePagination } from './DataTablePagination'\nimport { useTableSelection } from './hooks/useTableSelection'\n\nimport { cn } from '@/lib/utils'\n\ntype BasePaginationProps = {\n /** Number of rows per page */\n readonly pageSize: number\n /** Whether the pagination is in a loading state */\n readonly isLoading?: boolean\n /** Text customization for pagination */\n readonly labels?: {\n /** Text shown before the page size number (default: \"Showing\") */\n showing?: string\n /** Text shown before the total number (default: \"of\") */\n of?: string\n /** Text shown after the total number (default: \"results\") */\n results?: string\n /** Aria label for previous page button (default: \"Previous page\") */\n previousPage?: string\n /** Aria label for next page button (default: \"Next page\") */\n nextPage?: string\n /** Aria label for page number (default: \"Page {number}\") */\n pageLabel?: string\n }\n}\n\ntype BackendPaginationProps = BasePaginationProps & {\n /** Current page */\n readonly currentPage: number\n /** Total number of items */\n readonly total: number\n /** Callback when page changes */\n readonly onPageChange: (page: number) => void\n}\n\n/**\n * Type helper to check if a type has an 'id' property\n */\ntype HasId<T> = T extends { id: string | number } ? true : false\n\n/**\n * Props for the DataTable component\n * @template TData The type of data being displayed in the table\n */\nexport type DataTableProps<TData> = {\n /** Array of column definitions that describe the table structure */\n readonly columns: Array<ColumnDef<TData>>\n /** Array of data items to be displayed in the table */\n readonly data: Array<TData>\n /** Whether to show the column visibility toggle menu */\n readonly showColumnVisibilityControls?: boolean\n /** Whether the table is in a loading state */\n readonly isLoading?: boolean\n /** Pagination configuration. If not provided, pagination is disabled */\n readonly pagination?: BasePaginationProps | BackendPaginationProps\n /** Primary filters that appear directly above the table */\n readonly primaryFilters?: React.ReactNode\n /** Secondary filters that appear in the filters dropdown */\n readonly secondaryFilters?: React.ReactNode\n /** Number of active primary filters */\n readonly activePrimaryFiltersCount?: number\n /** Number of active secondary filters */\n readonly activeSecondaryFiltersCount?: number\n /** Text customization for filters */\n readonly labels?: {\n /** Text for the column visibility button (default: \"Hide columns\") */\n columnVisibilityButton?: string\n /** Text for the filters button when only secondary filters are present (default: \"Filters\") */\n filters?: string\n /** Text for the more filters button when both primary and secondary filters are present (default: \"More filters\") */\n moreFilters?: string\n }\n /** Callback when all rows are selected */\n readonly onSelectAll?: (selected: boolean) => void\n /** Callback when a row is selected */\n readonly onSelect?: (selected: boolean, row: TData) => void\n /** Optional className for the table container */\n readonly className?: string\n /** Optional className for the table */\n readonly tableClassName?: string\n} & (HasId<TData> extends true\n ? {\n /** Function to get unique identifier from a row. Not needed when data has 'id' property */\n readonly getRowId?: never\n }\n : {\n /** Function to get unique identifier from a row. Required when data doesn't have 'id' property */\n readonly getRowId: RowIdentifierFn<TData>\n })\n\n/**\n * Function to get a unique identifier from a row\n */\ntype RowIdentifierFn<T> = (row: T) => string\n\n/**\n * A feature-rich data table component built on top of TanStack Table.\n * Provides sorting, filtering, pagination, and column visibility controls.\n */\nexport function DataTable<TData extends object>({\n columns: userColumns,\n data,\n getRowId = (row: TData) => (row as { id: string }).id,\n showColumnVisibilityControls = true,\n isLoading = false,\n pagination,\n primaryFilters,\n secondaryFilters,\n activePrimaryFiltersCount = 0,\n activeSecondaryFiltersCount = 0,\n labels = {\n columnVisibilityButton: 'Hide columns',\n filters: 'Filters',\n moreFilters: 'More filters',\n },\n onSelectAll,\n onSelect,\n className,\n tableClassName,\n}: DataTableProps<TData>) {\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [pageIndex, setPageIndex] = React.useState(0)\n\n const isBackendPagination = pagination && 'onPageChange' in pagination\n const total = isBackendPagination ? pagination.total : data.length\n const pageSize = pagination?.pageSize ?? data.length\n const totalPages = Math.ceil(total / pageSize)\n\n const { isSelectable, isAllRowsSelected, rowSelection, handleSelectAll, handleRowSelect } = useTableSelection({\n data,\n getRowId,\n onSelectAll,\n onSelect,\n })\n\n const table = useReactTable({\n data,\n columns: userColumns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: pagination && !isBackendPagination ? getPaginationRowModel() : undefined,\n onColumnVisibilityChange: setColumnVisibility,\n enableRowSelection: isSelectable,\n getRowId: getRowId,\n state: {\n columnVisibility,\n rowSelection,\n pagination: pagination\n ? {\n pageIndex: isBackendPagination ? pagination.currentPage - 1 : pageIndex,\n pageSize,\n }\n : undefined,\n },\n manualPagination: isBackendPagination,\n onPaginationChange: isBackendPagination\n ? undefined\n : (updater) => {\n if (typeof updater === 'function') {\n const newState = updater({ pageIndex, pageSize })\n setPageIndex(newState.pageIndex)\n }\n },\n })\n\n return (\n <div className={cn('flex h-full min-h-0 w-full flex-1 flex-col gap-2 overflow-hidden', className)}>\n <DataTableToolbar\n table={table}\n showColumnVisibilityControls={showColumnVisibilityControls}\n primaryFilters={primaryFilters}\n secondaryFilters={secondaryFilters}\n activePrimaryFiltersCount={activePrimaryFiltersCount}\n activeSecondaryFiltersCount={activeSecondaryFiltersCount}\n labels={labels}\n />\n\n <div className=\"flex min-h-0 flex-1 flex-col rounded-md border bg-white\">\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <div className=\"h-full overflow-auto\">\n <TableComponent className=\"w-full\" tableClassName={cn('table-fixed', tableClassName)}>\n <TableHeader className=\"sticky top-0 z-10 bg-neutral-50\">\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {isSelectable && (\n <TableHead className=\"w-[50px]\">\n <Checkbox\n checked={isAllRowsSelected}\n onCheckedChange={handleSelectAll}\n disabled={isLoading || !data.length}\n aria-label=\"Select all rows\"\n />\n </TableHead>\n )}\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"whitespace-normal\"\n style={{ width: header.column.columnDef.size }}\n >\n <Typography weight=\"medium\">\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </Typography>\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <DataTableBody\n table={table}\n isLoading={isLoading}\n isSelectable={isSelectable}\n pageSize={pageSize}\n getRowId={getRowId}\n rowSelection={rowSelection}\n handleRowSelect={handleRowSelect}\n />\n </TableComponent>\n </div>\n </div>\n {!!pagination && (\n <div className=\"border-t px-4 py-2\">\n <DataTablePagination\n table={table}\n total={total}\n pageSize={pageSize}\n currentPage={\n isBackendPagination ? pagination.currentPage : table.getState().pagination.pageIndex + 1 || 1\n }\n totalPages={totalPages}\n onPageChange={isBackendPagination ? pagination.onPageChange : undefined}\n isLoading={pagination.isLoading}\n labels={pagination.labels}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAwHO;AAAyC;AACrC;AACT;AACmD;AACpB;AACnB;AACZ;AACA;AACA;AAC4B;AACE;AACrB;AACiB;AACf;AACI;AACf;AACA;AACA;AACA;AAEF;AACE;AACA;AAEA;AACA;AACA;AACA;AAEA;AAA8G;AAC5G;AACA;AACA;AACA;AAGF;AAA4B;AAC1B;AACS;AACwB;AACqD;AAC5D;AACN;AACpB;AACO;AACL;AACA;AAEI;AACgE;AAC9D;AAEF;AACN;AACkB;AAIZ;AACE;AACA;AAA+B;AACjC;AACF;AAGN;AAEI;AAAA;AAAC;AAAA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACF;AAGE;AAGM;AAGO;AAEG;AAAC;AAAA;AACU;AACQ;AACY;AAClB;AAAA;AAEf;AAGA;AAAC;AAAA;AAEW;AACmC;AAM7C;AAAA;AARY;AAUf;AAGP;AACA;AAAC;AAAA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACF;AAGN;AAGI;AAAC;AAAA;AACC;AACA;AACA;AAE8F;AAE9F;AAC8D;AACxC;AACH;AAAA;AAEvB;AAEJ;AAGN;;"}
1
+ {"version":3,"file":"DataTable.js","sources":["../../../src/components/DataTable/DataTable.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */\n/* eslint-disable @typescript-eslint/no-dynamic-delete */\n'use client'\n\nimport {\n flexRender,\n getCoreRowModel,\n getPaginationRowModel,\n useReactTable,\n VisibilityState,\n Row,\n PaginationState,\n Updater,\n} from '@tanstack/react-table'\nimport * as React from 'react'\n\nimport { Table as TableComponent, TableHeader, TableHead, TableRow } from '../Table'\nimport { Typography } from '../Typography'\n\nimport { DataTableBody } from './components/DataTableBody'\nimport { DataTablePagination } from './components/DataTablePagination'\nimport { DataTableRowSelector } from './components/DataTableRowSelector'\nimport { DataTableSelectHeader } from './components/DataTableSelectHeader'\nimport { DataTableToolbar } from './components/DataTableToolbar'\nimport { useSelection } from './hooks/useSelection'\nimport { DataTableProps } from './types'\n\nimport { cn } from '@/lib/utils'\n\n/**\n * A feature-rich data table component built on top of TanStack Table.\n * Provides sorting, filtering, pagination, and column visibility controls.\n */\nexport function DataTable<TData extends object>({\n columns: userColumns,\n data,\n getRowId = (row: TData) => (row as { id: string }).id,\n showColumnVisibilityControls = true,\n isLoading = false,\n pagination,\n primaryFilters,\n secondaryFilters,\n activePrimaryFiltersCount = 0,\n activeSecondaryFiltersCount = 0,\n selection,\n labels = {\n columnVisibilityButton: 'Hide columns',\n filters: 'Filters',\n moreFilters: 'More filters',\n },\n className,\n tableClassName,\n}: DataTableProps<TData>) {\n const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})\n const [pageIndex, setPageIndex] = React.useState(0)\n\n const isBackendPagination = pagination !== undefined && 'onPageChange' in pagination\n\n const total = isBackendPagination ? pagination.total : data.length\n const pageSize = pagination?.pageSize ?? (isLoading ? 10 : data.length)\n const totalPages = Math.ceil(total / pageSize)\n\n const { selectedIds, handleRowSelect, handleSelectAll } = useSelection({\n data,\n getRowId,\n selection,\n })\n\n const rowSelection = React.useMemo(\n () => Object.fromEntries(Array.from(selectedIds).map((id) => [id, true])),\n [selectedIds],\n )\n\n const SelectColumnHeader = React.useCallback(\n () => (\n <DataTableSelectHeader\n isBackendPagination={isBackendPagination}\n selectedIds={selectedIds}\n data={data}\n handleSelectAll={handleSelectAll}\n isLoading={isLoading}\n />\n ),\n [isBackendPagination, selectedIds, data, handleSelectAll, isLoading],\n )\n\n const SelectColumnCell = React.useCallback(\n ({ row }: { row: Row<TData> }) => (\n <DataTableRowSelector row={row} selectedIds={selectedIds} getRowId={getRowId} handleRowSelect={handleRowSelect} />\n ),\n [selectedIds, getRowId, handleRowSelect],\n )\n\n const tableColumns = React.useMemo(() => {\n const baseColumns = [...userColumns]\n if (selection !== undefined) {\n const selectColumn = {\n id: 'select',\n size: 50,\n cell: SelectColumnCell,\n header: SelectColumnHeader,\n }\n baseColumns.unshift(selectColumn)\n }\n return baseColumns\n }, [userColumns, selection, SelectColumnCell, SelectColumnHeader])\n\n const toolbarSelectionProps = React.useMemo(() => {\n if (isBackendPagination && selection) {\n return {\n isSelectionStarted: selection.isSelectionStarted,\n onSelectionStart: selection.onSelectionStart,\n onSelectionCancel: selection.onSelectionCancel,\n selectionSummary: selection.labels?.selectionSummary,\n labels: selection.labels,\n }\n }\n return undefined\n }, [isBackendPagination, selection])\n\n const currentPage = isBackendPagination ? pagination.currentPage : pageIndex + 1\n const handlePageChange = isBackendPagination ? pagination.onPageChange : (page: number) => setPageIndex(page - 1)\n\n const tablePaginationState = React.useMemo(() => {\n if (!pagination) {\n return undefined\n }\n return {\n pageIndex: isBackendPagination ? pagination.currentPage - 1 : pageIndex,\n pageSize,\n }\n }, [pagination, isBackendPagination, pageIndex, pageSize])\n\n const tableGetPaginationRowModel = React.useMemo(() => {\n return pagination && !isBackendPagination ? getPaginationRowModel() : undefined\n }, [pagination, isBackendPagination])\n\n const tableOnPaginationChange = React.useCallback(\n (updater: Updater<PaginationState>) => {\n if (typeof updater === 'function') {\n const newState = updater({ pageIndex, pageSize })\n setPageIndex(newState.pageIndex)\n }\n },\n [pageIndex, pageSize, setPageIndex],\n )\n\n const table = useReactTable({\n data,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: tableGetPaginationRowModel,\n onColumnVisibilityChange: setColumnVisibility,\n enableRowSelection: !!selection,\n getRowId: getRowId,\n state: {\n columnVisibility,\n rowSelection,\n pagination: tablePaginationState,\n },\n manualPagination: isBackendPagination,\n onPaginationChange: isBackendPagination ? undefined : tableOnPaginationChange,\n })\n\n return (\n <div className={cn('flex h-full min-h-0 w-full flex-1 flex-col gap-2 overflow-hidden', className)}>\n <DataTableToolbar\n table={table}\n showColumnVisibilityControls={showColumnVisibilityControls}\n primaryFilters={primaryFilters}\n secondaryFilters={secondaryFilters}\n activePrimaryFiltersCount={activePrimaryFiltersCount}\n activeSecondaryFiltersCount={activeSecondaryFiltersCount}\n labels={labels}\n selection={toolbarSelectionProps}\n />\n\n <div className=\"flex min-h-0 flex-1 flex-col rounded-md border bg-white\">\n <div className=\"min-h-0 flex-1 overflow-auto\">\n <div className=\"h-full overflow-auto\">\n <TableComponent className=\"w-full overscroll-contain\" tableClassName={cn('table-fixed ', tableClassName)}>\n <TableHeader className=\"sticky top-0 z-10 bg-neutral-50\">\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className=\"whitespace-normal\"\n style={{ width: header.column.columnDef.size }}\n >\n <Typography weight=\"medium\">\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n </Typography>\n </TableHead>\n ))}\n </TableRow>\n ))}\n </TableHeader>\n <DataTableBody\n table={table}\n isLoading={isLoading}\n isSelectable={selection !== undefined}\n pageSize={pageSize}\n getRowId={getRowId}\n rowSelection={rowSelection}\n />\n </TableComponent>\n </div>\n </div>\n {!!pagination && (\n <div className=\"border-t px-4 py-2\">\n <DataTablePagination\n table={table}\n total={total}\n pageSize={pageSize}\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={handlePageChange}\n isLoading={pagination.isLoading}\n labels={pagination.labels}\n />\n </div>\n )}\n </div>\n </div>\n )\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAiCO;AAAyC;AACrC;AACT;AACmD;AACpB;AACnB;AACZ;AACA;AACA;AAC4B;AACE;AAC9B;AACS;AACiB;AACf;AACI;AACf;AACA;AAEF;AACE;AACA;AAEA;AAEA;AACA;AACA;AAEA;AAAuE;AACrE;AACA;AACA;AAGF;AAA2B;AAC+C;AAC5D;AAGd;AAAiC;AAE7B;AAAC;AAAA;AACC;AACA;AACA;AACA;AACA;AAAA;AACF;AAEiE;AAGrE;AAA+B;AAEqF;AAE3E;AAGzC;AACE;AACA;AACE;AAAqB;AACf;AACE;AACA;AACE;AAEV;AAAgC;AAElC;AAAO;AAGT;AACE;AACE;AAAO;AACyB;AACF;AACC;AACO;AAClB;AACpB;AAEF;AAAO;AAGT;AACA;AAEA;AACE;AACE;AAAO;AAET;AAAO;AACyD;AAC9D;AACF;AAGF;AACE;AAAsE;AAGxE;AAAsC;AAElC;AACE;AACA;AAA+B;AACjC;AACF;AACkC;AAGpC;AAA4B;AAC1B;AACS;AACwB;AACV;AACG;AACJ;AACtB;AACO;AACL;AACA;AACY;AACd;AACkB;AACoC;AAGxD;AAEI;AAAA;AAAC;AAAA;AACC;AACA;AACA;AACA;AACA;AACA;AACA;AACW;AAAA;AACb;AAGE;AAGM;AAIQ;AAAC;AAAA;AAEW;AACmC;AAM7C;AAAA;AARY;AAatB;AACA;AAAC;AAAA;AACC;AACA;AAC4B;AAC5B;AACA;AACA;AAAA;AACF;AAGN;AAGI;AAAC;AAAA;AACC;AACA;AACA;AACA;AACA;AACc;AACQ;AACH;AAAA;AAEvB;AAEJ;AAGN;;"}
@@ -1,12 +1,12 @@
1
1
  import { Table } from '@tanstack/react-table';
2
+ import { RowIdentifierFn } from '../types';
2
3
  type DataTableBodyProps<TData> = {
3
4
  readonly table: Table<TData>;
4
- readonly isLoading: boolean;
5
- readonly isSelectable: boolean;
5
+ readonly isLoading?: boolean;
6
+ readonly isSelectable?: boolean;
6
7
  readonly pageSize: number;
7
- readonly getRowId: (row: TData) => string;
8
+ readonly getRowId: RowIdentifierFn<TData>;
8
9
  readonly rowSelection: Record<string, boolean>;
9
- readonly handleRowSelect: (checked: boolean, rowData: TData) => void;
10
10
  };
11
- export declare function DataTableBody<TData>({ table, isLoading, isSelectable, pageSize, getRowId, rowSelection, handleRowSelect, }: DataTableBodyProps<TData>): import("react/jsx-runtime").JSX.Element;
11
+ export declare function DataTableBody<TData>({ table, isLoading, isSelectable, pageSize, getRowId, rowSelection, }: DataTableBodyProps<TData>): import("react/jsx-runtime").JSX.Element;
12
12
  export {};
@@ -1,34 +1,36 @@
1
1
  import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { flexRender } from '@tanstack/react-table';
3
- import { Checkbox } from '../../Checkbox/Checkbox.js';
3
+ import * as React from 'react';
4
4
  import { Skeleton } from '../../Skeleton/Skeleton.js';
5
- import { TableBody, TableRow, TableCell } from '../../Table/Table.js';
5
+ import { TableRow, TableCell, TableBody } from '../../Table/Table.js';
6
6
  import { Typography } from '../../Typography/Typography.js';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
 
9
+ const MemoizedTableRow = React.memo(
10
+ function MemoizedTableRow2({
11
+ row,
12
+ isSelected
13
+ }) {
14
+ return /* @__PURE__ */ jsx(TableRow, { "data-selected": isSelected, children: row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(TableCell, { style: { width: cell.column.columnDef.size }, children: /* @__PURE__ */ jsx(Typography, { children: cell.column.columnDef.cell && flexRender(cell.column.columnDef.cell, cell.getContext()) }) }, cell.id)) });
15
+ },
16
+ (prevProps, nextProps) => prevProps.row === nextProps.row && prevProps.isSelected === nextProps.isSelected
17
+ );
9
18
  function DataTableBody({
10
19
  table,
11
20
  isLoading,
12
21
  isSelectable,
13
22
  pageSize,
14
23
  getRowId,
15
- rowSelection,
16
- handleRowSelect
24
+ rowSelection
17
25
  }) {
18
26
  if (isLoading) {
19
- return /* @__PURE__ */ jsx(TableBody, { children: Array.from({ length: pageSize }).map((_unused, rowIndex) => /* @__PURE__ */ jsxs(TableRow, { children: [
20
- isSelectable && /* @__PURE__ */ jsx(TableCell, { className: "w-[50px]", children: /* @__PURE__ */ jsx(Checkbox, { checked: false, disabled: true }) }),
21
- table.getAllColumns().filter((column) => column.getIsVisible()).map((column) => /* @__PURE__ */ jsx(
22
- TableCell,
23
- {
24
- style: { width: column.columnDef.size },
25
- children: /* @__PURE__ */ jsx("div", { className: cn("flex items-center justify-center", column.id === "actions" && "justify-end"), children: /* @__PURE__ */ jsx(Skeleton, { className: cn(column.id === "actions" ? "h-8 w-8" : "h-[20px] w-full") }) })
26
- },
27
- `skeleton-cell-${rowIndex.toString()}-${column.id}`
28
- ))
29
- ] }, `skeleton-row-${rowIndex.toString()}`)) });
27
+ return /* @__PURE__ */ jsx(TableBody, { children: Array.from({ length: pageSize }).map((_unused, index) => /* @__PURE__ */ jsxs(TableRow, { children: [
28
+ isSelectable && /* @__PURE__ */ jsx(TableCell, { className: "w-[50px]", children: /* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-5" }) }),
29
+ table.getAllColumns().filter((column) => column.getIsVisible()).map((column) => /* @__PURE__ */ jsx(TableCell, { style: { width: column.columnDef.size }, children: /* @__PURE__ */ jsx("div", { className: cn("flex items-center justify-center", column.id === "actions" && "justify-end"), children: /* @__PURE__ */ jsx(Skeleton, { className: cn(column.id === "actions" ? "h-8 w-8" : "h-[20px] w-full") }) }) }, `skeleton-cell-${String(index)}-${column.id}`))
30
+ ] }, `skeleton-row-${String(index)}`)) });
30
31
  }
31
- if (table.getRowModel().rows.length === 0) {
32
+ const rows = table.getRowModel().rows;
33
+ if (!rows.length) {
32
34
  return /* @__PURE__ */ jsx(TableBody, { children: /* @__PURE__ */ jsx(TableRow, { children: /* @__PURE__ */ jsx(
33
35
  TableCell,
34
36
  {
@@ -38,23 +40,10 @@ function DataTableBody({
38
40
  }
39
41
  ) }) });
40
42
  }
41
- return /* @__PURE__ */ jsx(TableBody, { children: table.getRowModel().rows.map((row) => {
43
+ return /* @__PURE__ */ jsx(TableBody, { children: rows.map((row) => {
42
44
  const rowId = getRowId(row.original);
43
45
  const isSelected = rowSelection[rowId] ?? false;
44
- return /* @__PURE__ */ jsxs(TableRow, { "data-selected": isSelected, children: [
45
- isSelectable && /* @__PURE__ */ jsx(TableCell, { className: "w-[50px]", children: /* @__PURE__ */ jsx(
46
- Checkbox,
47
- {
48
- checked: isSelected,
49
- onCheckedChange: (checked) => {
50
- const isChecked = checked;
51
- handleRowSelect(isChecked, row.original);
52
- },
53
- "aria-label": `Select row ${rowId}`
54
- }
55
- ) }),
56
- row.getVisibleCells().map((cell) => /* @__PURE__ */ jsx(TableCell, { style: { width: cell.column.columnDef.size }, children: /* @__PURE__ */ jsx(Typography, { children: cell.column.columnDef.cell && flexRender(cell.column.columnDef.cell, cell.getContext()) }) }, cell.id))
57
- ] }, rowId);
46
+ return /* @__PURE__ */ jsx(MemoizedTableRow, { row, isSelected }, rowId);
58
47
  }) });
59
48
  }
60
49
 
@@ -1 +1 @@
1
- {"version":3,"file":"DataTableBody.js","sources":["../../../../src/components/DataTable/components/DataTableBody.tsx"],"sourcesContent":["import { Table, flexRender } from '@tanstack/react-table'\n\nimport { Checkbox } from '../../Checkbox'\nimport { Skeleton } from '../../Skeleton'\nimport { TableBody, TableCell, TableRow } from '../../Table'\nimport { Typography } from '../../Typography'\n\nimport { cn } from '@/lib/utils'\n\ntype DataTableBodyProps<TData> = {\n readonly table: Table<TData>\n readonly isLoading: boolean\n readonly isSelectable: boolean\n readonly pageSize: number\n readonly getRowId: (row: TData) => string\n readonly rowSelection: Record<string, boolean>\n readonly handleRowSelect: (checked: boolean, rowData: TData) => void\n}\n\nexport function DataTableBody<TData>({\n table,\n isLoading,\n isSelectable,\n pageSize,\n getRowId,\n rowSelection,\n handleRowSelect,\n}: DataTableBodyProps<TData>) {\n if (isLoading) {\n return (\n <TableBody>\n {Array.from({ length: pageSize }).map((_unused, rowIndex) => (\n <TableRow key={`skeleton-row-${rowIndex.toString()}`}>\n {isSelectable && (\n <TableCell className=\"w-[50px]\">\n <Checkbox checked={false} disabled />\n </TableCell>\n )}\n {table\n .getAllColumns()\n .filter((column) => column.getIsVisible())\n .map((column) => (\n <TableCell\n key={`skeleton-cell-${rowIndex.toString()}-${column.id}`}\n style={{ width: column.columnDef.size }}\n >\n <div className={cn('flex items-center justify-center', column.id === 'actions' && 'justify-end')}>\n <Skeleton className={cn(column.id === 'actions' ? 'h-8 w-8' : 'h-[20px] w-full')} />\n </div>\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n )\n }\n\n if (table.getRowModel().rows.length === 0) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={isSelectable ? table.getAllColumns().length + 1 : table.getAllColumns().length}\n className=\"h-[200px] text-center\"\n >\n <Typography color=\"neutral\">No data available</Typography>\n </TableCell>\n </TableRow>\n </TableBody>\n )\n }\n\n return (\n <TableBody>\n {table.getRowModel().rows.map((row) => {\n const rowId = getRowId(row.original)\n const isSelected = rowSelection[rowId] ?? false\n\n return (\n <TableRow key={rowId} data-selected={isSelected}>\n {isSelectable && (\n <TableCell className=\"w-[50px]\">\n <Checkbox\n checked={isSelected}\n onCheckedChange={(checked) => {\n const isChecked = checked\n handleRowSelect(isChecked, row.original)\n }}\n aria-label={`Select row ${rowId}`}\n />\n </TableCell>\n )}\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} style={{ width: cell.column.columnDef.size }}>\n <Typography>\n {cell.column.columnDef.cell && flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Typography>\n </TableCell>\n ))}\n </TableRow>\n )\n })}\n </TableBody>\n )\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DataTableBody.js","sources":["../../../../src/components/DataTable/components/DataTableBody.tsx"],"sourcesContent":["import { Table, flexRender, Row } from '@tanstack/react-table'\nimport * as React from 'react'\n\nimport { Skeleton } from '../../Skeleton'\nimport { TableBody, TableCell, TableRow } from '../../Table'\nimport { Typography } from '../../Typography'\nimport { RowIdentifierFn } from '../types'\n\nimport { cn } from '@/lib/utils'\n\ntype DataTableBodyProps<TData> = {\n readonly table: Table<TData>\n readonly isLoading?: boolean\n readonly isSelectable?: boolean\n readonly pageSize: number\n readonly getRowId: RowIdentifierFn<TData>\n readonly rowSelection: Record<string, boolean>\n}\n\ntype MemoizedTableRowProps<TData> = {\n row: Row<TData>\n isSelectable: boolean\n isSelected: boolean\n getRowId: (row: TData) => string\n handleRowSelect: (checked: boolean, row: TData) => void\n}\n\nconst MemoizedTableRow = React.memo(\n function MemoizedTableRow<TData>({\n row,\n isSelected,\n }: Omit<MemoizedTableRowProps<TData>, 'isSelectable' | 'getRowId' | 'handleRowSelect'>) {\n return (\n <TableRow data-selected={isSelected}>\n {row.getVisibleCells().map((cell) => (\n <TableCell key={cell.id} style={{ width: cell.column.columnDef.size }}>\n <Typography>\n {cell.column.columnDef.cell && flexRender(cell.column.columnDef.cell, cell.getContext())}\n </Typography>\n </TableCell>\n ))}\n </TableRow>\n )\n },\n (prevProps, nextProps) => prevProps.row === nextProps.row && prevProps.isSelected === nextProps.isSelected,\n) as <TData>(\n props: Omit<MemoizedTableRowProps<TData>, 'isSelectable' | 'getRowId' | 'handleRowSelect'>,\n) => React.ReactElement\n\nexport function DataTableBody<TData>({\n table,\n isLoading,\n isSelectable,\n pageSize,\n getRowId,\n rowSelection,\n}: DataTableBodyProps<TData>) {\n if (isLoading) {\n return (\n <TableBody>\n {Array.from({ length: pageSize }).map((_unused, index) => (\n <TableRow key={`skeleton-row-${String(index)}`}>\n {isSelectable && (\n <TableCell className=\"w-[50px]\">\n <Skeleton className=\"h-5 w-5\" />\n </TableCell>\n )}\n {table\n .getAllColumns()\n .filter((column) => column.getIsVisible())\n .map((column) => (\n <TableCell key={`skeleton-cell-${String(index)}-${column.id}`} style={{ width: column.columnDef.size }}>\n <div className={cn('flex items-center justify-center', column.id === 'actions' && 'justify-end')}>\n <Skeleton className={cn(column.id === 'actions' ? 'h-8 w-8' : 'h-[20px] w-full')} />\n </div>\n </TableCell>\n ))}\n </TableRow>\n ))}\n </TableBody>\n )\n }\n\n const rows = table.getRowModel().rows\n\n if (!rows.length) {\n return (\n <TableBody>\n <TableRow>\n <TableCell\n colSpan={isSelectable ? table.getAllColumns().length + 1 : table.getAllColumns().length}\n className=\"h-[200px] text-center\"\n >\n <Typography color=\"neutral\">No data available</Typography>\n </TableCell>\n </TableRow>\n </TableBody>\n )\n }\n\n return (\n <TableBody>\n {rows.map((row) => {\n const rowId = getRowId(row.original)\n const isSelected = rowSelection[rowId] ?? false\n return <MemoizedTableRow key={rowId} row={row} isSelected={isSelected} />\n })}\n </TableBody>\n )\n}\n"],"names":["MemoizedTableRow"],"mappings":";;;;;;;;AA2BA,MAAM,mBAAmB,KAAM,CAAA,IAAA;AAAA,EAC7B,SAASA,iBAAwB,CAAA;AAAA,IAC/B,GAAA;AAAA,IACA;AAAA,GACsF,EAAA;AACtF,IAAA,2BACG,QAAS,EAAA,EAAA,eAAA,EAAe,UACtB,EAAA,QAAA,EAAA,GAAA,CAAI,iBAAkB,CAAA,GAAA,CAAI,CAAC,IAAA,yBACzB,SAAwB,EAAA,EAAA,KAAA,EAAO,EAAE,KAAO,EAAA,IAAA,CAAK,OAAO,SAAU,CAAA,IAAA,EAC7D,EAAA,QAAA,kBAAA,GAAA,CAAC,cACE,QAAK,EAAA,IAAA,CAAA,MAAA,CAAO,UAAU,IAAQ,IAAA,UAAA,CAAW,KAAK,MAAO,CAAA,SAAA,CAAU,IAAM,EAAA,IAAA,CAAK,YAAY,CAAA,EACzF,KAHc,IAAK,CAAA,EAIrB,CACD,CACH,EAAA,CAAA;AAAA,GAEJ;AAAA,EACA,CAAC,WAAW,SAAc,KAAA,SAAA,CAAU,QAAQ,SAAU,CAAA,GAAA,IAAO,SAAU,CAAA,UAAA,KAAe,SAAU,CAAA;AAClG,CAAA;AAIO,SAAS,aAAqB,CAAA;AAAA,EACnC,KAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAA8B,EAAA;AAC5B,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,uBACG,GAAA,CAAA,SAAA,EAAA,EACE,QAAM,EAAA,KAAA,CAAA,IAAA,CAAK,EAAE,MAAQ,EAAA,QAAA,EAAU,CAAA,CAAE,GAAI,CAAA,CAAC,OAAS,EAAA,KAAA,0BAC7C,QACE,EAAA,EAAA,QAAA,EAAA;AAAA,MACC,YAAA,oBAAA,GAAA,CAAC,aAAU,SAAU,EAAA,UAAA,EACnB,8BAAC,QAAS,EAAA,EAAA,SAAA,EAAU,WAAU,CAChC,EAAA,CAAA;AAAA,MAED,KAAA,CACE,aAAc,EAAA,CACd,MAAO,CAAA,CAAC,WAAW,MAAO,CAAA,YAAA,EAAc,CAAA,CACxC,GAAI,CAAA,CAAC,2BACH,GAAA,CAAA,SAAA,EAAA,EAA8D,KAAO,EAAA,EAAE,KAAO,EAAA,MAAA,CAAO,UAAU,IAAK,EAAA,EACnG,QAAC,kBAAA,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,EAAA,CAAG,oCAAoC,MAAO,CAAA,EAAA,KAAO,SAAa,IAAA,aAAa,CAC7F,EAAA,QAAA,kBAAA,GAAA,CAAC,YAAS,SAAW,EAAA,EAAA,CAAG,MAAO,CAAA,EAAA,KAAO,SAAY,GAAA,SAAA,GAAY,iBAAiB,CAAG,EAAA,CAAA,EACpF,CAHc,EAAA,EAAA,CAAA,cAAA,EAAiB,MAAO,CAAA,KAAK,CAAC,CAAI,CAAA,EAAA,MAAA,CAAO,EAAE,CAAA,CAI3D,CACD;AAAA,KAAA,EAAA,EAfU,gBAAgB,MAAO,CAAA,KAAK,CAAC,CAAA,CAgB5C,CACD,CACH,EAAA,CAAA;AAAA;AAIJ,EAAM,MAAA,IAAA,GAAO,KAAM,CAAA,WAAA,EAAc,CAAA,IAAA;AAEjC,EAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,IACE,uBAAA,GAAA,CAAC,SACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,QACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAS,eAAe,KAAM,CAAA,aAAA,GAAgB,MAAS,GAAA,CAAA,GAAI,KAAM,CAAA,aAAA,EAAgB,CAAA,MAAA;AAAA,QACjF,SAAU,EAAA,uBAAA;AAAA,QAEV,QAAC,kBAAA,GAAA,CAAA,UAAA,EAAA,EAAW,KAAM,EAAA,SAAA,EAAU,QAAiB,EAAA,mBAAA,EAAA;AAAA;AAAA,OAEjD,CACF,EAAA,CAAA;AAAA;AAIJ,EAAA,uBACG,GAAA,CAAA,SAAA,EAAA,EACE,QAAK,EAAA,IAAA,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACjB,IAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,GAAA,CAAI,QAAQ,CAAA;AACnC,IAAM,MAAA,UAAA,GAAa,YAAa,CAAA,KAAK,CAAK,IAAA,KAAA;AAC1C,IAAA,uBAAQ,GAAA,CAAA,gBAAA,EAAA,EAA6B,GAAU,EAAA,UAAA,EAAA,EAAjB,KAAyC,CAAA;AAAA,GACxE,CACH,EAAA,CAAA;AAEJ;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { Table } from '@tanstack/react-table';
2
- interface DataTablePaginationProps<TData> {
2
+ type DataTablePaginationProps<TData> = {
3
3
  /** The table instance from tanstack/react-table */
4
4
  readonly table: Table<TData>;
5
5
  /** Total number of items across all pages (required for backend pagination) */
@@ -31,6 +31,6 @@ interface DataTablePaginationProps<TData> {
31
31
  /** Aria label for page number (default: "Page {number}") */
32
32
  page?: string;
33
33
  };
34
- }
34
+ };
35
35
  export declare function DataTablePagination<TData>({ table, total, pageSize, currentPage, totalPages, onPageChange, className, isLoading, labels, }: DataTablePaginationProps<TData>): import("react/jsx-runtime").JSX.Element;
36
36
  export {};
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Skeleton } from '../Skeleton/Skeleton.js';
3
- import { Pagination } from '../Pagination/Pagination.js';
2
+ import { Pagination } from '../../Pagination/Pagination.js';
3
+ import { Skeleton } from '../../Skeleton/Skeleton.js';
4
4
 
5
5
  function DataTablePagination({
6
6
  table,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTablePagination.js","sources":["../../../../src/components/DataTable/components/DataTablePagination.tsx"],"sourcesContent":["import { Table } from '@tanstack/react-table'\n\nimport { Pagination } from '../../Pagination'\nimport { Skeleton } from '../../Skeleton'\n\ntype DataTablePaginationProps<TData> = {\n /** The table instance from tanstack/react-table */\n readonly table: Table<TData>\n /** Total number of items across all pages (required for backend pagination) */\n readonly total: number\n /** Current page size */\n readonly pageSize: number\n /** Current page number (1-based) */\n readonly currentPage: number\n /** Total number of pages */\n readonly totalPages: number\n /** Called when page changes. If provided, enables backend pagination mode */\n readonly onPageChange?: (page: number) => void\n /** Additional className for the pagination component */\n readonly className?: string\n /** Indicates if the pagination is in a loading state */\n readonly isLoading?: boolean\n /** Text customization for localization */\n readonly labels?: {\n /** Text shown before the page size number (default: \"Showing\") */\n showing?: string\n /** Text shown before the total number (default: \"of\") */\n of?: string\n /** Text shown after the total number (default: \"results\") */\n results?: string\n /** Text for previous page button (default: \"Previous page\") */\n previousPage?: string\n /** Text for next page button (default: \"Next page\") */\n nextPage?: string\n /** Aria label for page number (default: \"Page {number}\") */\n page?: string\n }\n}\n\nexport function DataTablePagination<TData>({\n table,\n total,\n pageSize,\n currentPage,\n totalPages,\n onPageChange,\n className,\n isLoading,\n labels = {},\n}: DataTablePaginationProps<TData>) {\n const {\n showing = 'Showing',\n of = 'of',\n results = 'results',\n previousPage = '',\n nextPage = '',\n page = 'Page {number}',\n } = labels\n\n const isBackendPagination = !!onPageChange\n\n const handlePageChange = (newPage: number) => {\n if (isBackendPagination) {\n onPageChange(newPage)\n } else {\n table.setPageIndex(newPage - 1)\n }\n }\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-between\">\n <Skeleton className=\"h-[20px] w-[175px]\" />\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-[32px] w-[32px]\" />\n <Skeleton className=\"h-[32px] w-[32px]\" />\n <Skeleton className=\"h-[32px] w-[32px]\" />\n <Skeleton className=\"h-[32px] w-[32px]\" />\n <Skeleton className=\"h-[32px] w-[32px]\" />\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"flex w-full flex-col items-center gap-2 md:flex-row md:justify-between\">\n <div className=\"text-sm text-neutral-600\">\n <span>{showing}</span>\n <span className=\"mx-1 font-medium text-neutral-900\">{Math.min(pageSize, total)}</span>\n <span>{of}</span>\n <span className=\"mx-1 font-medium text-neutral-900\">{total}</span>\n <span>{results}</span>\n </div>\n\n <Pagination\n currentPage={currentPage}\n totalPages={totalPages}\n onPageChange={handlePageChange}\n className={className}\n mode=\"button\"\n labels={{\n previous: previousPage,\n next: nextPage,\n page,\n }}\n />\n </div>\n )\n}\n"],"names":[],"mappings":";;;;AAuCO,SAAS,mBAA2B,CAAA;AAAA,EACzC,KAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAS;AACX,CAAoC,EAAA;AAClC,EAAM,MAAA;AAAA,IACJ,OAAU,GAAA,SAAA;AAAA,IACV,EAAK,GAAA,IAAA;AAAA,IACL,OAAU,GAAA,SAAA;AAAA,IACV,YAAe,GAAA,EAAA;AAAA,IACf,QAAW,GAAA,EAAA;AAAA,IACX,IAAO,GAAA;AAAA,GACL,GAAA,MAAA;AAEJ,EAAM,MAAA,mBAAA,GAAsB,CAAC,CAAC,YAAA;AAE9B,EAAM,MAAA,gBAAA,GAAmB,CAAC,OAAoB,KAAA;AAC5C,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA,KACf,MAAA;AACL,MAAM,KAAA,CAAA,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA;AAChC,GACF;AAEA,EAAA,IAAI,SAAW,EAAA;AACb,IACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,mCACb,EAAA,QAAA,EAAA;AAAA,sBAAC,GAAA,CAAA,QAAA,EAAA,EAAS,WAAU,oBAAqB,EAAA,CAAA;AAAA,sBACzC,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,yBACb,EAAA,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,QAAA,EAAA,EAAS,WAAU,mBAAoB,EAAA,CAAA;AAAA,wBACxC,GAAA,CAAC,QAAS,EAAA,EAAA,SAAA,EAAU,mBAAoB,EAAA,CAAA;AAAA,wBACxC,GAAA,CAAC,QAAS,EAAA,EAAA,SAAA,EAAU,mBAAoB,EAAA,CAAA;AAAA,wBACxC,GAAA,CAAC,QAAS,EAAA,EAAA,SAAA,EAAU,mBAAoB,EAAA,CAAA;AAAA,wBACxC,GAAA,CAAC,QAAS,EAAA,EAAA,SAAA,EAAU,mBAAoB,EAAA;AAAA,OAC1C,EAAA;AAAA,KACF,EAAA,CAAA;AAAA;AAIJ,EACE,uBAAA,IAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAU,wEACb,EAAA,QAAA,EAAA;AAAA,oBAAC,IAAA,CAAA,KAAA,EAAA,EAAI,WAAU,0BACb,EAAA,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAM,QAAQ,EAAA,OAAA,EAAA,CAAA;AAAA,sBACf,GAAA,CAAC,UAAK,SAAU,EAAA,mCAAA,EAAqC,eAAK,GAAI,CAAA,QAAA,EAAU,KAAK,CAAE,EAAA,CAAA;AAAA,sBAC/E,GAAA,CAAC,UAAM,QAAG,EAAA,EAAA,EAAA,CAAA;AAAA,sBACT,GAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mCAAA,EAAqC,QAAM,EAAA,KAAA,EAAA,CAAA;AAAA,sBAC3D,GAAA,CAAC,UAAM,QAAQ,EAAA,OAAA,EAAA;AAAA,KACjB,EAAA,CAAA;AAAA,oBAEA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAc,EAAA,gBAAA;AAAA,QACd,SAAA;AAAA,QACA,IAAK,EAAA,QAAA;AAAA,QACL,MAAQ,EAAA;AAAA,UACN,QAAU,EAAA,YAAA;AAAA,UACV,IAAM,EAAA,QAAA;AAAA,UACN;AAAA;AACF;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,9 @@
1
+ import { Row } from '@tanstack/react-table';
2
+ type DataTableRowSelectorProps<TData extends object> = {
3
+ readonly row: Row<TData>;
4
+ readonly selectedIds: Set<string>;
5
+ readonly getRowId: (original: TData) => string;
6
+ readonly handleRowSelect: (rowId: string, checked: boolean) => void;
7
+ };
8
+ export declare function DataTableRowSelector<TData extends object>({ row, selectedIds, getRowId, handleRowSelect, }: DataTableRowSelectorProps<TData>): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,21 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Checkbox } from '../../Checkbox/Checkbox.js';
3
+
4
+ function DataTableRowSelector({
5
+ row,
6
+ selectedIds,
7
+ getRowId,
8
+ handleRowSelect
9
+ }) {
10
+ return /* @__PURE__ */ jsx(
11
+ Checkbox,
12
+ {
13
+ checked: selectedIds.has(getRowId(row.original)),
14
+ onCheckedChange: (checked) => handleRowSelect(getRowId(row.original), !!checked),
15
+ "aria-label": "Select row"
16
+ }
17
+ );
18
+ }
19
+
20
+ export { DataTableRowSelector };
21
+ //# sourceMappingURL=DataTableRowSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableRowSelector.js","sources":["../../../../src/components/DataTable/components/DataTableRowSelector.tsx"],"sourcesContent":["import { Row } from '@tanstack/react-table'\n\nimport { Checkbox } from '@/components/Checkbox'\n\ntype DataTableRowSelectorProps<TData extends object> = {\n readonly row: Row<TData>\n readonly selectedIds: Set<string>\n readonly getRowId: (original: TData) => string\n readonly handleRowSelect: (rowId: string, checked: boolean) => void\n}\n\nexport function DataTableRowSelector<TData extends object>({\n row,\n selectedIds,\n getRowId,\n handleRowSelect,\n}: DataTableRowSelectorProps<TData>) {\n return (\n <Checkbox\n checked={selectedIds.has(getRowId(row.original))}\n onCheckedChange={(checked) => handleRowSelect(getRowId(row.original), !!checked)}\n aria-label=\"Select row\"\n />\n )\n}\n"],"names":[],"mappings":";;;AAWO,SAAS,oBAA2C,CAAA;AAAA,EACzD,GAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAqC,EAAA;AACnC,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAS,WAAY,CAAA,GAAA,CAAI,QAAS,CAAA,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,MAC/C,eAAA,EAAiB,CAAC,OAAA,KAAY,eAAgB,CAAA,QAAA,CAAS,IAAI,QAAQ,CAAA,EAAG,CAAC,CAAC,OAAO,CAAA;AAAA,MAC/E,YAAW,EAAA;AAAA;AAAA,GACb;AAEJ;;;;"}
@@ -0,0 +1,9 @@
1
+ type SelectAllHeaderProps<TData extends object> = {
2
+ readonly isBackendPagination: boolean;
3
+ readonly selectedIds: Set<string>;
4
+ readonly data: Array<TData>;
5
+ readonly handleSelectAll: (checked: boolean) => void;
6
+ readonly isLoading: boolean;
7
+ };
8
+ export declare function DataTableSelectHeader<TData extends object>({ isBackendPagination, selectedIds, data, handleSelectAll, isLoading, }: SelectAllHeaderProps<TData>): import("react/jsx-runtime").JSX.Element | null;
9
+ export {};
@@ -0,0 +1,26 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Checkbox } from '../../Checkbox/Checkbox.js';
3
+
4
+ function DataTableSelectHeader({
5
+ isBackendPagination,
6
+ selectedIds,
7
+ data,
8
+ handleSelectAll,
9
+ isLoading
10
+ }) {
11
+ if (isBackendPagination) {
12
+ return null;
13
+ }
14
+ return /* @__PURE__ */ jsx(
15
+ Checkbox,
16
+ {
17
+ checked: selectedIds.size === data.length,
18
+ onCheckedChange: handleSelectAll,
19
+ disabled: isLoading || !data.length,
20
+ "aria-label": "Select all rows"
21
+ }
22
+ );
23
+ }
24
+
25
+ export { DataTableSelectHeader };
26
+ //# sourceMappingURL=DataTableSelectHeader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataTableSelectHeader.js","sources":["../../../../src/components/DataTable/components/DataTableSelectHeader.tsx"],"sourcesContent":["import { Checkbox } from '@/components/Checkbox'\n\ntype SelectAllHeaderProps<TData extends object> = {\n readonly isBackendPagination: boolean\n readonly selectedIds: Set<string>\n readonly data: Array<TData>\n readonly handleSelectAll: (checked: boolean) => void\n readonly isLoading: boolean\n}\n\nexport function DataTableSelectHeader<TData extends object>({\n isBackendPagination,\n selectedIds,\n data,\n handleSelectAll,\n isLoading,\n}: SelectAllHeaderProps<TData>) {\n if (isBackendPagination) {\n return null\n }\n\n return (\n <Checkbox\n checked={selectedIds.size === data.length}\n onCheckedChange={handleSelectAll}\n disabled={isLoading || !data.length}\n aria-label=\"Select all rows\"\n />\n )\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,qBAA4C,CAAA;AAAA,EAC1D,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAgC,EAAA;AAC9B,EAAA,IAAI,mBAAqB,EAAA;AACvB,IAAO,OAAA,IAAA;AAAA;AAGT,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAS,WAAY,CAAA,IAAA,KAAS,IAAK,CAAA,MAAA;AAAA,MACnC,eAAiB,EAAA,eAAA;AAAA,MACjB,QAAA,EAAU,SAAa,IAAA,CAAC,IAAK,CAAA,MAAA;AAAA,MAC7B,YAAW,EAAA;AAAA;AAAA,GACb;AAEJ;;;;"}