erp-pro-ui 0.1.6 → 0.1.7
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/dist/chunks/{data-table-KDM8AEwU.mjs → data-table-B2r5OUFX.mjs} +46 -104
- package/dist/chunks/data-table-B2r5OUFX.mjs.map +1 -0
- package/dist/chunks/{data-table-z-YDzi0N.cjs → data-table-BLt8DTVy.cjs} +46 -104
- package/dist/chunks/data-table-BLt8DTVy.cjs.map +1 -0
- package/dist/components/data-display/data-table/DataTable.d.ts +2 -1
- package/dist/components/data-display/data-table/DataTable.d.ts.map +1 -1
- package/dist/components/data-display/data-table/DataTableRows.d.ts +2 -1
- package/dist/components/data-display/data-table/DataTableRows.d.ts.map +1 -1
- package/dist/components/data-display/data-table/DataTableToolbar.d.ts +2 -1
- package/dist/components/data-display/data-table/DataTableToolbar.d.ts.map +1 -1
- package/dist/components/navigation/tabs/Tabs.d.ts.map +1 -1
- package/dist/data-table.cjs +1 -1
- package/dist/data-table.mjs +1 -1
- package/dist/index.cjs +80 -46
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +81 -47
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/data-table-KDM8AEwU.mjs.map +0 -1
- package/dist/chunks/data-table-z-YDzi0N.cjs.map +0 -1
|
@@ -121,8 +121,8 @@ function EmptyTableState({ colSpan, rowClassName, cellClassName, children }) {
|
|
|
121
121
|
})
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
function DataTableRows({ table, isLoading, bulkSelectionActive, selectedRowIds, onToggleRowSelection, rowMenuOpen, onToggleRowMenu, onCloseRowMenu, onRowAction, rowClassName, cellClassName, hasActiveFilters, searchQuery, renderEmptyState, renderRowActionsCell }) {
|
|
125
|
-
const colSpan = table.getVisibleLeafColumns().length + (bulkSelectionActive ?
|
|
124
|
+
function DataTableRows({ table, hasRowActions, isLoading, bulkSelectionActive, selectedRowIds, onToggleRowSelection, rowMenuOpen, onToggleRowMenu, onCloseRowMenu, onRowAction, rowClassName, cellClassName, hasActiveFilters, searchQuery, renderEmptyState, renderRowActionsCell }) {
|
|
125
|
+
const colSpan = table.getVisibleLeafColumns().length + (bulkSelectionActive ? 1 : 0) + (hasRowActions ? 1 : 0);
|
|
126
126
|
if (isLoading) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(LoadingTableState, {
|
|
127
127
|
colSpan,
|
|
128
128
|
rowClassName,
|
|
@@ -156,7 +156,7 @@ function DataTableRows({ table, isLoading, bulkSelectionActive, selectedRowIds,
|
|
|
156
156
|
className: require_utils.mergeClassNames("px-4 py-3 text-sm text-ds-1", cellClassName),
|
|
157
157
|
children: (0, _tanstack_react_table.flexRender)(cell.column.columnDef.cell, cell.getContext())
|
|
158
158
|
}, cell.id)),
|
|
159
|
-
renderRowActionsCell({
|
|
159
|
+
hasRowActions ? renderRowActionsCell({
|
|
160
160
|
rowIndex: row.index,
|
|
161
161
|
row: row.original,
|
|
162
162
|
isOpen: rowMenuOpen === row.index,
|
|
@@ -164,7 +164,7 @@ function DataTableRows({ table, isLoading, bulkSelectionActive, selectedRowIds,
|
|
|
164
164
|
onToggle: onToggleRowMenu,
|
|
165
165
|
onClose: onCloseRowMenu,
|
|
166
166
|
onRowAction
|
|
167
|
-
})
|
|
167
|
+
}) : null
|
|
168
168
|
]
|
|
169
169
|
}, row.id)) });
|
|
170
170
|
}
|
|
@@ -247,7 +247,7 @@ var ICON_BUTTON_CLASS_NAME = "inline-flex items-center justify-center rounded-lg
|
|
|
247
247
|
var DISABLED_ICON_BUTTON_CLASS_NAME = `${ICON_BUTTON_CLASS_NAME} disabled:cursor-not-allowed disabled:opacity-40`;
|
|
248
248
|
var TABLE_CONTROL_ICON_CLASS_NAME$1 = "h-[18px] w-[18px] shrink-0";
|
|
249
249
|
var TABLE_COMPLEX_ICON_CLASS_NAME$1 = TABLE_CONTROL_ICON_CLASS_NAME$1;
|
|
250
|
-
var TOOLBAR_ACTION_BUTTON_CLASS_NAME = "inline-flex h-9 items-center gap-2 rounded-md border border-transparent bg-transparent px-2.5 text-[12px] font-semibold uppercase tracking-[0.03em] text-ds-2 shadow-none transition-
|
|
250
|
+
var TOOLBAR_ACTION_BUTTON_CLASS_NAME = "inline-flex h-9 items-center gap-2 rounded-md border border-transparent bg-transparent px-2.5 text-[12px] font-semibold uppercase tracking-[0.03em] text-ds-2 shadow-none transition-[border-color,background-color,color] duration-200 hover:border-ds-border-3 hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100";
|
|
251
251
|
function ToolbarIconButton({ title, onClick, disabled, children }) {
|
|
252
252
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_tooltip.Tooltip, {
|
|
253
253
|
content: title,
|
|
@@ -267,9 +267,9 @@ function ToolbarActionButton({ title, label, onClick, isActive = false, icon })
|
|
|
267
267
|
title,
|
|
268
268
|
"aria-label": title,
|
|
269
269
|
"aria-pressed": isActive,
|
|
270
|
-
className: require_utils.mergeClassNames(TOOLBAR_ACTION_BUTTON_CLASS_NAME,
|
|
270
|
+
className: require_utils.mergeClassNames(TOOLBAR_ACTION_BUTTON_CLASS_NAME, isActive ? "border-ds-border-3 bg-ds-surface-2 text-ds-1" : "text-ds-2"),
|
|
271
271
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
272
|
-
className: require_utils.mergeClassNames("inline-flex h-5 w-5 items-center justify-center text-ds-2", isActive && "text-ds-
|
|
272
|
+
className: require_utils.mergeClassNames("inline-flex h-5 w-5 items-center justify-center text-ds-2", isActive && "text-ds-1"),
|
|
273
273
|
children: icon
|
|
274
274
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: label })]
|
|
275
275
|
});
|
|
@@ -293,27 +293,8 @@ function SearchField({ value, onChange, placeholder, direction }) {
|
|
|
293
293
|
})]
|
|
294
294
|
});
|
|
295
295
|
}
|
|
296
|
-
function DataTableToolbar({ direction, showRefreshButton = true, showExportButton = true, searchQuery, onSearchChange, searchPlaceholder, bulkDeleteEnabled, bulkSelectionActive, selectedCount, bulkActionsContent, bulkActionCard, onToggleBulkSelection, onBulkDeleteSelected, onExport, columnMenuOpen, onToggleColumnMenu, onCloseColumnMenu, columns, onColumnToggle, onShowAllColumns, onHideAllColumns, labels, toolbarActions }) {
|
|
296
|
+
function DataTableToolbar({ direction, showRefreshButton = true, showExportButton = true, searchQuery, onSearchChange, searchPlaceholder, bulkDeleteEnabled, bulkSelectionActive, selectedCount, bulkActionsContent, bulkActionCard, onToggleBulkSelection, onBulkDeleteSelected, onRefresh, onExport, columnMenuOpen, onToggleColumnMenu, onCloseColumnMenu, columns, onColumnToggle, onShowAllColumns, onHideAllColumns, labels, toolbarActions }) {
|
|
297
297
|
const hasSelectedRows = selectedCount > 0;
|
|
298
|
-
const visibleActionIds = react.default.useMemo(() => [
|
|
299
|
-
showRefreshButton ? "refresh" : null,
|
|
300
|
-
showExportButton ? "export" : null,
|
|
301
|
-
"columns"
|
|
302
|
-
].filter(Boolean), [showExportButton, showRefreshButton]);
|
|
303
|
-
const [activeAction, setActiveAction] = react.default.useState("columns");
|
|
304
|
-
react.default.useEffect(() => {
|
|
305
|
-
if (columnMenuOpen) {
|
|
306
|
-
setActiveAction("columns");
|
|
307
|
-
return;
|
|
308
|
-
}
|
|
309
|
-
if (!visibleActionIds.includes(activeAction)) setActiveAction(visibleActionIds[0] ?? "columns");
|
|
310
|
-
}, [
|
|
311
|
-
activeAction,
|
|
312
|
-
columnMenuOpen,
|
|
313
|
-
visibleActionIds
|
|
314
|
-
]);
|
|
315
|
-
const logicalActiveIndex = Math.max(visibleActionIds.indexOf(activeAction), 0);
|
|
316
|
-
const visualActiveIndex = direction === "rtl" ? Math.max(visibleActionIds.length - logicalActiveIndex - 1, 0) : logicalActiveIndex;
|
|
317
298
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
318
299
|
className: "border-b border-ds-border-2 px-4 py-3",
|
|
319
300
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -337,61 +318,33 @@ function DataTableToolbar({ direction, showRefreshButton = true, showExportButto
|
|
|
337
318
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
338
319
|
className: "flex items-center gap-1 self-end lg:self-auto",
|
|
339
320
|
children: [
|
|
340
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
showExportButton ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
|
|
368
|
-
title: labels.export,
|
|
369
|
-
label: labels.export,
|
|
370
|
-
isActive: activeAction === "export",
|
|
371
|
-
onClick: () => {
|
|
372
|
-
setActiveAction("export");
|
|
373
|
-
onExport?.();
|
|
374
|
-
},
|
|
375
|
-
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ArrowDownIcon, {
|
|
376
|
-
className: TABLE_CONTROL_ICON_CLASS_NAME$1,
|
|
377
|
-
"aria-hidden": "true"
|
|
378
|
-
})
|
|
379
|
-
}) : null,
|
|
380
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
|
|
381
|
-
onClick: () => {
|
|
382
|
-
setActiveAction("columns");
|
|
383
|
-
onToggleColumnMenu();
|
|
384
|
-
},
|
|
385
|
-
title: labels.columnSettings,
|
|
386
|
-
label: labels.columnSettings,
|
|
387
|
-
isActive: activeAction === "columns" || columnMenuOpen,
|
|
388
|
-
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ColumnsIcon, {
|
|
389
|
-
className: TABLE_COMPLEX_ICON_CLASS_NAME$1,
|
|
390
|
-
"aria-hidden": "true"
|
|
391
|
-
})
|
|
392
|
-
})
|
|
393
|
-
]
|
|
394
|
-
})]
|
|
321
|
+
showRefreshButton ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
|
|
322
|
+
title: labels.refresh,
|
|
323
|
+
label: labels.refresh,
|
|
324
|
+
onClick: onRefresh,
|
|
325
|
+
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.RefreshIcon, {
|
|
326
|
+
className: TABLE_CONTROL_ICON_CLASS_NAME$1,
|
|
327
|
+
"aria-hidden": "true"
|
|
328
|
+
})
|
|
329
|
+
}) : null,
|
|
330
|
+
showExportButton ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
|
|
331
|
+
title: labels.export,
|
|
332
|
+
label: labels.export,
|
|
333
|
+
onClick: onExport,
|
|
334
|
+
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ArrowDownIcon, {
|
|
335
|
+
className: TABLE_CONTROL_ICON_CLASS_NAME$1,
|
|
336
|
+
"aria-hidden": "true"
|
|
337
|
+
})
|
|
338
|
+
}) : null,
|
|
339
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
|
|
340
|
+
onClick: onToggleColumnMenu,
|
|
341
|
+
title: labels.columnSettings,
|
|
342
|
+
label: labels.columnSettings,
|
|
343
|
+
isActive: columnMenuOpen,
|
|
344
|
+
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.ColumnsIcon, {
|
|
345
|
+
className: TABLE_COMPLEX_ICON_CLASS_NAME$1,
|
|
346
|
+
"aria-hidden": "true"
|
|
347
|
+
})
|
|
395
348
|
}),
|
|
396
349
|
toolbarActions,
|
|
397
350
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -881,7 +834,7 @@ function RowActionsCell({ rowIndex, row, isOpen, openDirection, tableContainerRe
|
|
|
881
834
|
tableContainerRef
|
|
882
835
|
]);
|
|
883
836
|
const rowActionsMenu = isOpen ? (0, react_dom.createPortal)(/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
884
|
-
className: "fixed inset-0 z-[220]
|
|
837
|
+
className: "fixed inset-0 z-[220]",
|
|
885
838
|
onClick: onClose
|
|
886
839
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
887
840
|
ref: menuRef,
|
|
@@ -1076,28 +1029,15 @@ function FilterSelectorMenu({ filterOptions, visibleFilters, onToggleFilter, onS
|
|
|
1076
1029
|
});
|
|
1077
1030
|
}
|
|
1078
1031
|
var usesManualPagination = (totalCount, onPaginationChange) => totalCount !== void 0 || typeof onPaginationChange === "function";
|
|
1079
|
-
function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize = 10, maxHeight = "500px", onSearch, onExport, showRefreshButton = true, showExportButton = true, onRowAction, rowActions, onBulkDelete, renderBulkActions, renderBulkActionCard, onFilterChange, onFiltersApply, serverSideFiltering = false, filterOptions: externalFilterOptions, searchPlaceholder = "Search ...", totalCount, onPaginationChange, renderEmptyState, labels: labelsProp, renderFilterSelectorFooterActions, renderFilterRowActions, renderToolbarActions, className, tableContainerClassName, tableClassName, caption, captionClassName, headerClassName, headerRowClassName, headClassName, bodyClassName, rowClassName, cellClassName, footerClassName }) {
|
|
1032
|
+
function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize = 10, maxHeight = "500px", onSearch, onRefresh, onExport, showRefreshButton = true, showExportButton = true, onRowAction, rowActions, onBulkDelete, renderBulkActions, renderBulkActionCard, onFilterChange, onFiltersApply, serverSideFiltering = false, filterOptions: externalFilterOptions, searchPlaceholder = "Search ...", totalCount, onPaginationChange, renderEmptyState, labels: labelsProp, renderFilterSelectorFooterActions, renderFilterRowActions, renderToolbarActions, className, tableContainerClassName, tableClassName, caption, captionClassName, headerClassName, headerRowClassName, headClassName, bodyClassName, rowClassName, cellClassName, footerClassName }) {
|
|
1080
1033
|
const tableRootRef = react.default.useRef(null);
|
|
1081
1034
|
const [tableDirection, setTableDirection] = react.default.useState("ltr");
|
|
1082
1035
|
react.default.useLayoutEffect(() => {
|
|
1083
1036
|
setTableDirection(resolveTableDirection(tableRootRef.current));
|
|
1084
1037
|
}, []);
|
|
1085
1038
|
const isRtl = tableDirection === "rtl";
|
|
1086
|
-
const resolvedRowActions = react.default.useMemo(() => rowActions
|
|
1087
|
-
|
|
1088
|
-
id: "copy",
|
|
1089
|
-
label: "Copy product"
|
|
1090
|
-
},
|
|
1091
|
-
{
|
|
1092
|
-
id: "edit",
|
|
1093
|
-
label: "Edit"
|
|
1094
|
-
},
|
|
1095
|
-
{
|
|
1096
|
-
id: "delete",
|
|
1097
|
-
label: "Delete",
|
|
1098
|
-
variant: "destructive"
|
|
1099
|
-
}
|
|
1100
|
-
], [rowActions]);
|
|
1039
|
+
const resolvedRowActions = react.default.useMemo(() => rowActions ?? [], [rowActions]);
|
|
1040
|
+
const hasRowActions = resolvedRowActions.length > 0;
|
|
1101
1041
|
const labels = react.default.useMemo(() => ({
|
|
1102
1042
|
...DEFAULT_DATA_TABLE_LABELS,
|
|
1103
1043
|
...labelsProp
|
|
@@ -1435,6 +1375,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1435
1375
|
bulkActionCard,
|
|
1436
1376
|
onToggleBulkSelection: handleToggleBulkSelection,
|
|
1437
1377
|
onBulkDeleteSelected: handleBulkDeleteSelected,
|
|
1378
|
+
onRefresh,
|
|
1438
1379
|
onExport,
|
|
1439
1380
|
columnMenuOpen,
|
|
1440
1381
|
onToggleColumnMenu: handleToggleColumnMenu,
|
|
@@ -1474,7 +1415,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1474
1415
|
className: require_utils.mergeClassNames("whitespace-nowrap bg-ds-surface-2 px-4 py-3 text-sm font-semibold text-ds-1", isRtl ? "text-right" : "text-left", headClassName),
|
|
1475
1416
|
children: header.isPlaceholder ? null : (0, _tanstack_react_table.flexRender)(header.column.columnDef.header, header.getContext())
|
|
1476
1417
|
}, header.id)),
|
|
1477
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(TableHead, {
|
|
1418
|
+
hasRowActions ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(TableHead, {
|
|
1478
1419
|
className: require_utils.mergeClassNames("sticky top-0 z-30 border-x border-ds-border-2 bg-ds-surface-2 p-0", isRtl ? "left-0 shadow-[8px_0_12px_-10px_rgba(15,23,42,0.35)]" : "right-0 shadow-[-8px_0_12px_-10px_rgba(15,23,42,0.35)]", ROW_ACTIONS_CELL_WIDTH_CLASS_NAME, headClassName),
|
|
1479
1420
|
children: [
|
|
1480
1421
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
@@ -1490,7 +1431,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1490
1431
|
className: "h-[45px] w-12"
|
|
1491
1432
|
})
|
|
1492
1433
|
]
|
|
1493
|
-
})
|
|
1434
|
+
}) : null
|
|
1494
1435
|
]
|
|
1495
1436
|
}, headerGroup.id))
|
|
1496
1437
|
}),
|
|
@@ -1498,6 +1439,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1498
1439
|
className: bodyClassName,
|
|
1499
1440
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DataTableRows, {
|
|
1500
1441
|
table,
|
|
1442
|
+
hasRowActions,
|
|
1501
1443
|
isLoading,
|
|
1502
1444
|
bulkSelectionActive,
|
|
1503
1445
|
selectedRowIds,
|
|
@@ -1511,7 +1453,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1511
1453
|
hasActiveFilters,
|
|
1512
1454
|
searchQuery,
|
|
1513
1455
|
renderEmptyState,
|
|
1514
|
-
renderRowActionsCell: (context) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowActionsCell, {
|
|
1456
|
+
renderRowActionsCell: (context) => hasRowActions ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RowActionsCell, {
|
|
1515
1457
|
rowIndex: context.rowIndex,
|
|
1516
1458
|
row: context.row,
|
|
1517
1459
|
isOpen: context.isOpen,
|
|
@@ -1522,7 +1464,7 @@ function DataTable({ columns, data, isLoading = false, onColumnToggle, pageSize
|
|
|
1522
1464
|
onRowAction: context.onRowAction,
|
|
1523
1465
|
actions: resolvedRowActions,
|
|
1524
1466
|
direction: tableDirection
|
|
1525
|
-
})
|
|
1467
|
+
}) : null
|
|
1526
1468
|
})
|
|
1527
1469
|
}),
|
|
1528
1470
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(TableFooter, { className: footerClassName })
|
|
@@ -1643,4 +1585,4 @@ Object.defineProperty(exports, "ToolbarIconButton", {
|
|
|
1643
1585
|
}
|
|
1644
1586
|
});
|
|
1645
1587
|
|
|
1646
|
-
//# sourceMappingURL=data-table-
|
|
1588
|
+
//# sourceMappingURL=data-table-BLt8DTVy.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-table-BLt8DTVy.cjs","names":[],"sources":["../../src/components/data-display/data-table/TablePrimitives.tsx","../../src/components/data-display/data-table/DataTableRows.tsx","../../src/components/data-display/data-table/DataTableControls.tsx","../../src/components/data-display/data-table/DataTableToolbar.tsx","../../src/components/data-display/data-table/DataTableFilters.tsx","../../src/components/data-display/data-table/direction.ts","../../src/components/data-display/data-table/DataTable.tsx"],"sourcesContent":["import React from \"react\";\nimport { mergeClassNames } from \"../../../utils\";\n\nexport const TableContainer = React.forwardRef<\n HTMLDivElement,\n React.ComponentPropsWithoutRef<\"div\">\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={mergeClassNames(\"overflow-auto\", className)}\n {...props}\n />\n));\nTableContainer.displayName = \"TableContainer\";\n\nexport const Table = React.forwardRef<\n HTMLTableElement,\n React.ComponentPropsWithoutRef<\"table\">\n>(({ className, ...props }, ref) => (\n <table\n ref={ref}\n className={mergeClassNames(\"w-full min-w-[800px]\", className)}\n {...props}\n />\n));\nTable.displayName = \"Table\";\n\nexport const TableHeader = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"thead\">\n>(({ className, ...props }, ref) => (\n <thead\n ref={ref}\n className={mergeClassNames(\"sticky top-0 z-10 bg-ds-surface-1\", className)}\n {...props}\n />\n));\nTableHeader.displayName = \"TableHeader\";\n\nexport const TableBody = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"tbody\">\n>(({ className, ...props }, ref) => (\n <tbody ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableBody.displayName = \"TableBody\";\n\nexport const TableFooter = React.forwardRef<\n HTMLTableSectionElement,\n React.ComponentPropsWithoutRef<\"tfoot\">\n>(({ className, ...props }, ref) => (\n <tfoot ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableFooter.displayName = \"TableFooter\";\n\nexport const TableRow = React.forwardRef<\n HTMLTableRowElement,\n React.ComponentPropsWithoutRef<\"tr\">\n>(({ className, ...props }, ref) => (\n <tr ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableRow.displayName = \"TableRow\";\n\nexport const TableHead = React.forwardRef<\n HTMLTableCellElement,\n React.ComponentPropsWithoutRef<\"th\">\n>(({ className, ...props }, ref) => (\n <th ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableHead.displayName = \"TableHead\";\n\nexport const TableCell = React.forwardRef<\n HTMLTableCellElement,\n React.ComponentPropsWithoutRef<\"td\">\n>(({ className, ...props }, ref) => (\n <td ref={ref} className={mergeClassNames(className)} {...props} />\n));\nTableCell.displayName = \"TableCell\";\n\nexport const TableCaption = React.forwardRef<\n HTMLTableCaptionElement,\n React.ComponentPropsWithoutRef<\"caption\">\n>(({ className, ...props }, ref) => (\n <caption\n ref={ref}\n className={mergeClassNames(\"caption-bottom text-sm text-ds-2\", className)}\n {...props}\n />\n));\nTableCaption.displayName = \"TableCaption\";\n","import React from \"react\";\nimport { flexRender, type Table as TanStackTable } from \"@tanstack/react-table\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { LoaderIcon } from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport { TableCell, TableRow } from \"./TablePrimitives\";\n\nexport interface DataTableEmptyStateContext {\n isLoading: boolean;\n hasActiveFilters: boolean;\n searchQuery: string;\n}\n\ninterface TableStateRowProps {\n colSpan: number;\n children: React.ReactNode;\n rowClassName?: string;\n cellClassName?: string;\n}\n\nfunction TableStateRow({\n colSpan,\n children,\n rowClassName,\n cellClassName,\n}: TableStateRowProps) {\n return (\n <TableRow className={rowClassName}>\n <TableCell\n colSpan={colSpan}\n className={mergeClassNames(\n \"px-4 py-12 text-center text-ds-2\",\n cellClassName,\n )}\n >\n {children}\n </TableCell>\n </TableRow>\n );\n}\n\nfunction LoadingTableState({\n colSpan,\n rowClassName,\n cellClassName,\n}: {\n colSpan: number;\n rowClassName?: string;\n cellClassName?: string;\n}) {\n return (\n <TableStateRow\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n <div className=\"flex flex-col items-center gap-3\">\n <LoaderIcon\n className=\"w-8 h-8 animate-spin text-ds-1\"\n aria-hidden=\"true\"\n />\n <span>Loading data...</span>\n </div>\n </TableStateRow>\n );\n}\n\nfunction EmptyTableState({\n colSpan,\n rowClassName,\n cellClassName,\n children,\n}: {\n colSpan: number;\n rowClassName?: string;\n cellClassName?: string;\n children?: React.ReactNode;\n}) {\n return (\n <TableStateRow\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n {children ?? (\n <div className=\"flex flex-col items-center gap-2\">\n <span className=\"text-4xl\">🔍</span>\n <p className=\"font-medium\">No results found</p>\n <p className=\"text-sm\">Try adjusting the filter</p>\n </div>\n )}\n </TableStateRow>\n );\n}\n\nexport interface DataTableRowsProps<T> {\n table: TanStackTable<T>;\n hasRowActions: boolean;\n isLoading: boolean;\n bulkSelectionActive: boolean;\n selectedRowIds: Record<string, boolean>;\n onToggleRowSelection: (rowId: string, checked: boolean) => void;\n rowMenuOpen: number | null;\n onToggleRowMenu: (rowIndex: number) => void;\n onCloseRowMenu: () => void;\n onRowAction?: (action: string, row: T) => void;\n rowClassName?: string;\n cellClassName?: string;\n hasActiveFilters: boolean;\n searchQuery: string;\n renderEmptyState?: (context: DataTableEmptyStateContext) => React.ReactNode;\n renderRowActionsCell: (context: {\n rowIndex: number;\n row: T;\n isOpen: boolean;\n openDirection: \"up\" | \"down\";\n onToggle: (rowIndex: number) => void;\n onClose: () => void;\n onRowAction?: (action: string, row: T) => void;\n }) => React.ReactNode;\n}\n\nexport function DataTableRows<T>({\n table,\n hasRowActions,\n isLoading,\n bulkSelectionActive,\n selectedRowIds,\n onToggleRowSelection,\n rowMenuOpen,\n onToggleRowMenu,\n onCloseRowMenu,\n onRowAction,\n rowClassName,\n cellClassName,\n hasActiveFilters,\n searchQuery,\n renderEmptyState,\n renderRowActionsCell,\n}: DataTableRowsProps<T>) {\n const colSpan =\n table.getVisibleLeafColumns().length +\n (bulkSelectionActive ? 1 : 0) +\n (hasRowActions ? 1 : 0);\n\n if (isLoading) {\n return (\n <LoadingTableState\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n />\n );\n }\n\n if (table.getRowModel().rows.length === 0) {\n const customEmptyState = renderEmptyState?.({\n isLoading,\n hasActiveFilters,\n searchQuery,\n });\n\n return (\n <EmptyTableState\n colSpan={colSpan}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n >\n {customEmptyState}\n </EmptyTableState>\n );\n }\n\n return (\n <>\n {table.getRowModel().rows.map((row) => (\n <TableRow\n key={row.id}\n className={mergeClassNames(\n \"border-b border-ds-border-2 transition-colors hover:bg-ds-surface-2\",\n rowClassName,\n )}\n >\n {bulkSelectionActive ? (\n <TableCell\n className={mergeClassNames(\n \"w-12 px-4 py-3 align-middle\",\n cellClassName,\n )}\n >\n <Checkbox\n aria-label={`Select row ${row.id}`}\n checked={Boolean(selectedRowIds[row.id])}\n onChange={(event) =>\n onToggleRowSelection(row.id, event.target.checked)\n }\n />\n </TableCell>\n ) : null}\n {row.getVisibleCells().map((cell) => (\n <TableCell\n key={cell.id}\n className={mergeClassNames(\n \"px-4 py-3 text-sm text-ds-1\",\n cellClassName,\n )}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n {hasRowActions\n ? renderRowActionsCell({\n rowIndex: row.index,\n row: row.original,\n isOpen: rowMenuOpen === row.index,\n openDirection:\n row.index >= table.getRowModel().rows.length - 2\n ? \"up\"\n : \"down\",\n onToggle: onToggleRowMenu,\n onClose: onCloseRowMenu,\n onRowAction,\n })\n : null}\n </TableRow>\n ))}\n </>\n );\n}\n","import React from \"react\";\nimport { Button } from \"../../forms/button\";\nimport { Checkbox } from \"../../forms/checkbox\";\n\ninterface FilterDropdownProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n direction?: \"ltr\" | \"rtl\";\n}\n\nexport const FilterDropdown: React.FC<FilterDropdownProps> = ({\n isOpen,\n onClose,\n children,\n direction = \"ltr\",\n}) => {\n const panelRef = React.useRef<HTMLDivElement | null>(null);\n\n React.useLayoutEffect(() => {\n if (!isOpen || !panelRef.current) {\n return;\n }\n\n panelRef.current.animate(\n [\n { opacity: 0, transform: \"translateY(-8px) scale(0.98)\" },\n { opacity: 1, transform: \"translateY(0) scale(1)\" },\n ],\n {\n duration: 220,\n easing: \"cubic-bezier(0.22, 1, 0.36, 1)\",\n },\n );\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n return (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n <div\n ref={panelRef}\n className=\"absolute top-full z-50 mt-2 min-w-64 overflow-hidden rounded-[4px] border border-ds-border-2 bg-ds-surface-1 shadow-[0_18px_40px_rgba(15,23,42,0.18)] ring-1 ring-inset ring-ds-border-3/35 backdrop-blur-2xl\"\n style={direction === \"rtl\" ? { left: 0 } : { right: 0 }}\n >\n {children}\n </div>\n </>\n );\n};\n\ninterface FilterButtonProps {\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n hasActive?: boolean;\n}\n\nexport const FilterButton: React.FC<FilterButtonProps> = ({\n icon,\n label,\n onClick,\n hasActive,\n}) => (\n <Button\n onClick={onClick}\n title={label}\n aria-label={label}\n className={`h-10 min-w-10 px-0 py-0 shadow-none ${\n hasActive\n ? \"border-ds-border-accent/20 bg-ds-accent-subtle text-ds-1 hover:bg-ds-accent-subtle hover:opacity-100\"\n : \"border-transparent bg-transparent text-ds-2 hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100\"\n }`}\n >\n {icon}\n </Button>\n);\n\ninterface ColumnToggleLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n}\n\ninterface ColumnToggleProps {\n columns: {\n id: string;\n label: string;\n visible?: boolean;\n }[];\n onToggle: (columnId: string) => void;\n onShowAll?: () => void;\n onHideAll?: () => void;\n labels: ColumnToggleLabels;\n}\n\nexport const ColumnToggle: React.FC<ColumnToggleProps> = ({\n columns,\n onToggle,\n onShowAll,\n onHideAll,\n labels,\n}) => (\n <div className=\"p-4 space-y-3\">\n <div className=\"flex items-center justify-between mb-3\">\n <span className=\"text-sm font-semibold text-ds-1\">{labels.columns}</span>\n </div>\n\n <div className=\"space-y-2 max-h-64 overflow-y-auto\">\n {columns.map((col) => (\n <div\n key={col.id}\n className=\"rounded-[8px] px-2 py-1 hover:bg-ds-surface-2\"\n >\n <Checkbox\n checked={col.visible !== false}\n onChange={() => onToggle(col.id)}\n label={col.label}\n />\n </div>\n ))}\n </div>\n\n {(onShowAll || onHideAll) && (\n <div className=\"flex gap-2 border-t border-ds-border-2 pt-2\">\n {onShowAll && (\n <Button\n onClick={onShowAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-1 shadow-none hover:bg-transparent hover:text-ds-accent-hover hover:opacity-100\"\n >\n {labels.showAll}\n </Button>\n )}\n {onHideAll && (\n <Button\n onClick={onHideAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-2 shadow-none hover:bg-transparent hover:text-ds-1 hover:opacity-100\"\n >\n {labels.hideAll}\n </Button>\n )}\n </div>\n )}\n </div>\n);\n","import React from \"react\";\nimport { Chip } from \"../chip\";\nimport { Button } from \"../../forms/button\";\nimport { Input } from \"../../forms/input\";\nimport { Tooltip } from \"../../overlays/tooltip\";\nimport {\n ArrowDownIcon,\n ColumnsIcon,\n RefreshIcon,\n SearchIcon,\n SelectionIcon,\n TrashIcon,\n} from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\n\nconst ICON_BUTTON_CLASS_NAME =\n \"inline-flex items-center justify-center rounded-lg text-ds-2 transition-colors hover:bg-ds-surface-2 hover:text-ds-1\";\nconst DISABLED_ICON_BUTTON_CLASS_NAME = `${ICON_BUTTON_CLASS_NAME} disabled:cursor-not-allowed disabled:opacity-40`;\nconst TABLE_CONTROL_ICON_CLASS_NAME = \"h-[18px] w-[18px] shrink-0\";\nconst TABLE_COMPLEX_ICON_CLASS_NAME = TABLE_CONTROL_ICON_CLASS_NAME;\nconst TOOLBAR_ACTION_BUTTON_CLASS_NAME =\n \"inline-flex h-9 items-center gap-2 rounded-md border border-transparent bg-transparent px-2.5 text-[12px] font-semibold uppercase tracking-[0.03em] text-ds-2 shadow-none transition-[border-color,background-color,color] duration-200 hover:border-ds-border-3 hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100\";\n\ninterface ToolbarIconButtonProps {\n title: string;\n onClick?: () => void;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nexport function ToolbarIconButton({\n title,\n onClick,\n disabled,\n children,\n}: ToolbarIconButtonProps) {\n return (\n <Tooltip content={title}>\n <Button\n onClick={onClick}\n disabled={disabled}\n title={title}\n aria-label={title}\n className={\n disabled\n ? `${DISABLED_ICON_BUTTON_CLASS_NAME} h-10 w-10 shrink-0 border-transparent bg-transparent px-0 py-0 text-base shadow-none`\n : `${ICON_BUTTON_CLASS_NAME} h-10 w-10 shrink-0 border-transparent bg-transparent px-0 py-0 text-base shadow-none`\n }\n >\n {children}\n </Button>\n </Tooltip>\n );\n}\n\ninterface ToolbarActionButtonProps {\n title: string;\n label: string;\n onClick?: () => void;\n isActive?: boolean;\n icon: React.ReactNode;\n}\n\nfunction ToolbarActionButton({\n title,\n label,\n onClick,\n isActive = false,\n icon,\n}: ToolbarActionButtonProps) {\n return (\n <Button\n onClick={onClick}\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n className={mergeClassNames(\n TOOLBAR_ACTION_BUTTON_CLASS_NAME,\n isActive\n ? \"border-ds-border-3 bg-ds-surface-2 text-ds-1\"\n : \"text-ds-2\",\n )}\n >\n <span\n className={mergeClassNames(\n \"inline-flex h-5 w-5 items-center justify-center text-ds-2\",\n isActive && \"text-ds-1\",\n )}\n >\n {icon}\n </span>\n <span>{label}</span>\n </Button>\n );\n}\n\ninterface SearchFieldProps {\n value: string;\n onChange: (value: string) => void;\n placeholder: string;\n direction: \"ltr\" | \"rtl\";\n}\n\nfunction SearchField({\n value,\n onChange,\n placeholder,\n direction,\n}: SearchFieldProps) {\n return (\n <div className=\"relative w-[300px]\">\n <SearchIcon\n className={`pointer-events-none absolute top-1/2 z-10 -translate-y-1/2 text-ds-2 ${TABLE_CONTROL_ICON_CLASS_NAME}`}\n style={{\n insetInlineStart: \"1rem\",\n }}\n aria-hidden=\"true\"\n />\n <Input\n type=\"text\"\n value={value}\n onChange={(event) => onChange(event.target.value)}\n placeholder={placeholder}\n style={{\n paddingInlineStart: \"2.75rem\",\n textAlign: direction === \"rtl\" ? \"right\" : \"left\",\n }}\n />\n </div>\n );\n}\n\ninterface ToolbarLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n refresh: string;\n export: string;\n columnSettings: string;\n}\n\ninterface DataTableToolbarProps {\n direction: \"ltr\" | \"rtl\";\n showRefreshButton?: boolean;\n showExportButton?: boolean;\n searchQuery: string;\n onSearchChange: (value: string) => void;\n searchPlaceholder: string;\n bulkDeleteEnabled: boolean;\n bulkSelectionActive: boolean;\n selectedCount: number;\n bulkActionsContent?: React.ReactNode;\n bulkActionCard?: React.ReactNode;\n onToggleBulkSelection: () => void;\n onBulkDeleteSelected: () => void;\n onRefresh?: () => void;\n onExport?: () => void;\n columnMenuOpen: boolean;\n onToggleColumnMenu: () => void;\n onCloseColumnMenu: () => void;\n columns: {\n id: string;\n label: string;\n visible?: boolean;\n }[];\n onColumnToggle?: (columnId: string) => void;\n onShowAllColumns: () => void;\n onHideAllColumns: () => void;\n labels: ToolbarLabels;\n toolbarActions?: React.ReactNode;\n}\n\nexport function DataTableToolbar({\n direction,\n showRefreshButton = true,\n showExportButton = true,\n searchQuery,\n onSearchChange,\n searchPlaceholder,\n bulkDeleteEnabled,\n bulkSelectionActive,\n selectedCount,\n bulkActionsContent,\n bulkActionCard,\n onToggleBulkSelection,\n onBulkDeleteSelected,\n onRefresh,\n onExport,\n columnMenuOpen,\n onToggleColumnMenu,\n onCloseColumnMenu,\n columns,\n onColumnToggle,\n onShowAllColumns,\n onHideAllColumns,\n labels,\n toolbarActions,\n}: DataTableToolbarProps) {\n const hasSelectedRows = selectedCount > 0;\n\n return (\n <div className=\"border-b border-ds-border-2 px-4 py-3\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-1 flex-wrap items-center gap-2\">\n {bulkDeleteEnabled ? (\n <FilterButton\n icon={\n <SelectionIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n label={\n bulkSelectionActive\n ? \"Disable bulk selection\"\n : \"Enable bulk selection\"\n }\n onClick={onToggleBulkSelection}\n hasActive={bulkSelectionActive}\n />\n ) : null}\n\n <SearchField\n value={searchQuery}\n onChange={onSearchChange}\n placeholder={searchPlaceholder}\n direction={direction}\n />\n </div>\n\n <div className=\"flex items-center gap-1 self-end lg:self-auto\">\n {showRefreshButton ? (\n <ToolbarActionButton\n title={labels.refresh}\n label={labels.refresh}\n onClick={onRefresh}\n icon={\n <RefreshIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n ) : null}\n {showExportButton ? (\n <ToolbarActionButton\n title={labels.export}\n label={labels.export}\n onClick={onExport}\n icon={\n <ArrowDownIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n ) : null}\n <ToolbarActionButton\n onClick={onToggleColumnMenu}\n title={labels.columnSettings}\n label={labels.columnSettings}\n isActive={columnMenuOpen}\n icon={\n <ColumnsIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n }\n />\n {toolbarActions}\n\n <div className=\"relative\">\n <FilterDropdown\n isOpen={columnMenuOpen}\n onClose={onCloseColumnMenu}\n direction={direction}\n >\n <ColumnToggle\n columns={columns}\n onToggle={(columnId) => {\n onColumnToggle?.(columnId);\n }}\n onShowAll={onShowAllColumns}\n onHideAll={onHideAllColumns}\n labels={labels}\n />\n </FilterDropdown>\n </div>\n </div>\n </div>\n\n {bulkSelectionActive && hasSelectedRows\n ? (bulkActionCard ?? (\n <div className=\"mt-2 flex flex-col gap-2 rounded-[4px] border border-ds-border-2 bg-ds-surface-2 px-3 py-2 shadow-sm lg:flex-row lg:items-center lg:justify-between\">\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <Chip\n variant=\"soft\"\n color=\"primary\"\n size=\"sm\"\n className=\"uppercase tracking-wide\"\n >\n Bulk actions\n </Chip>\n <p className=\"text-sm font-medium text-ds-1\">\n {selectedCount} {selectedCount === 1 ? \"row\" : \"rows\"}{\" \"}\n selected\n </p>\n </div>\n\n <div className=\"flex flex-wrap items-center gap-2\">\n {bulkActionsContent}\n {bulkDeleteEnabled ? (\n <Button\n onClick={onBulkDeleteSelected}\n primary\n size=\"small\"\n className=\"border-ds-border-accent/20 px-3 py-2 text-sm text-ds-on-accent shadow-lg shadow-ds-accent/20 hover:bg-ds-accent-hover hover:opacity-100\"\n >\n <TrashIcon className=\"h-4 w-4\" aria-hidden=\"true\" />\n Delete selected\n </Button>\n ) : null}\n </div>\n </div>\n ))\n : null}\n </div>\n );\n}\n","import React from \"react\";\nimport { Combobox } from \"../../forms/combobox\";\nimport { MultiSelectCombobox } from \"../../forms/multi-select-combobox\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { Input } from \"../../forms/input\";\nimport { Select } from \"../../forms/select\";\nimport { Switch } from \"../../forms/switch\";\nimport {\n DatePicker,\n type DatePickerValue,\n type DateRangeValue,\n} from \"../../forms/date-picker\";\nimport type { FilterOption, FilterValue, FilterValues } from \"./DataTable\";\n\ntype NumberRangeFilterValue = { min?: number; max?: number };\n\nconst toSelectOptions = (options?: string[]) =>\n (options || []).map((option) => ({\n value: option,\n label: option,\n }));\n\nconst getStringFilterValue = (value?: FilterValue): string =>\n typeof value === \"string\" ? value : \"\";\n\nconst getMultiStringFilterValue = (value?: FilterValue): string[] => {\n if (Array.isArray(value)) {\n return value;\n }\n\n return typeof value === \"string\" && value ? [value] : [];\n};\n\nconst getNumberRangeFilterValue = (\n value?: FilterValue,\n): NumberRangeFilterValue => {\n if (\n !value ||\n typeof value !== \"object\" ||\n \"start\" in value ||\n \"end\" in value\n ) {\n return {};\n }\n\n return value as NumberRangeFilterValue;\n};\n\nconst getDateFilterValue = (value?: FilterValue): DatePickerValue =>\n value instanceof Date || value === null ? value : null;\n\nconst getDateRangeFilterValue = (value?: FilterValue): DateRangeValue => {\n if (\n value &&\n typeof value === \"object\" &&\n \"start\" in value &&\n \"end\" in value\n ) {\n return value as DateRangeValue;\n }\n\n return { start: null, end: null };\n};\n\ntype FilterableColumn = {\n id: string;\n label: string;\n filterable?: boolean;\n multiFilter?: boolean;\n};\n\nfunction buildGeneratedFilterOptions<T>(\n columns: FilterableColumn[],\n data: T[],\n): FilterOption[] {\n return columns\n .filter((column) => column.filterable !== false)\n .map((column) => {\n const uniqueValues = new Set<string>();\n\n data.forEach((row) => {\n const value = (row as Record<string, unknown>)[column.id];\n if (value !== undefined && value !== null && value !== \"\") {\n uniqueValues.add(String(value));\n }\n });\n\n return {\n id: column.id,\n label: column.label,\n options: Array.from(uniqueValues).sort(),\n multiple: column.multiFilter,\n };\n });\n}\n\nexport function resolveFilterOptions<T>(\n columns: FilterableColumn[],\n data: T[],\n externalFilterOptions: FilterOption[] | undefined,\n asyncFilterOptions: Record<string, { options: string[]; isLoading: boolean }>,\n): FilterOption[] {\n if (!externalFilterOptions?.length) {\n return buildGeneratedFilterOptions(columns, data);\n }\n\n return externalFilterOptions.map((filter) => {\n const asyncState = asyncFilterOptions[filter.id];\n if (!asyncState) {\n return filter;\n }\n\n return {\n ...filter,\n options: asyncState.options,\n isLoading: asyncState.isLoading,\n };\n });\n}\n\nfunction matchesSearchQuery<T>(row: T, searchQuery: string): boolean {\n if (!searchQuery.trim()) {\n return true;\n }\n\n const lowerCasedSearch = searchQuery.toLowerCase();\n return Object.values(row as Record<string, unknown>).some((value) =>\n String(value).toLowerCase().includes(lowerCasedSearch),\n );\n}\n\nfunction matchesFilterValue(\n rowValue: unknown,\n filterValue: FilterValue,\n filterType: FilterOption[\"type\"],\n): boolean {\n if (typeof filterValue === \"string\") {\n if (!filterValue) return true;\n\n const rowText = String(rowValue).toLowerCase();\n const filterText = filterValue.toLowerCase();\n return rowText.includes(filterText);\n }\n\n if (Array.isArray(filterValue)) {\n if (!filterValue.length) return true;\n\n const rowText = String(rowValue).toLowerCase();\n return filterValue.some((value) => rowText.includes(value.toLowerCase()));\n }\n\n if (typeof filterValue === \"boolean\") {\n return Boolean(rowValue) === filterValue;\n }\n\n if (filterType === \"date\" && filterValue instanceof Date) {\n const rowDate = new Date(String(rowValue));\n return rowDate.toDateString() === filterValue.toDateString();\n }\n\n if (\n filterType === \"date-range\" &&\n typeof filterValue === \"object\" &&\n filterValue !== null &&\n \"start\" in filterValue\n ) {\n const rangeValue = filterValue as DateRangeValue;\n const rowDate = new Date(String(rowValue));\n\n if (Number.isNaN(rowDate.getTime())) {\n return false;\n }\n\n if (rangeValue.start && rowDate < rangeValue.start) return false;\n if (rangeValue.end) {\n const endDate = new Date(rangeValue.end);\n endDate.setHours(23, 59, 59, 999);\n if (rowDate > endDate) return false;\n }\n\n return true;\n }\n\n if (\n filterType === \"number-range\" &&\n typeof filterValue === \"object\" &&\n filterValue !== null &&\n !(\"start\" in filterValue)\n ) {\n const rangeValue = filterValue as NumberRangeFilterValue;\n const rowNumber = Number(rowValue);\n\n if (Number.isNaN(rowNumber)) {\n return false;\n }\n\n if (rangeValue.min !== undefined && rowNumber < rangeValue.min)\n return false;\n if (rangeValue.max !== undefined && rowNumber > rangeValue.max)\n return false;\n\n return true;\n }\n\n return true;\n}\n\nexport function filterClientData<T>(\n data: T[],\n activeFilters: FilterValues,\n searchQuery: string,\n serverSideFiltering: boolean,\n filterOptions: FilterOption[],\n): T[] {\n if (serverSideFiltering) {\n return data;\n }\n\n return data.filter((row) => {\n if (!matchesSearchQuery(row, searchQuery)) {\n return false;\n }\n\n return Object.entries(activeFilters).every(([filterId, filterValue]) => {\n if (isFilterValueEmpty(filterValue)) {\n return true;\n }\n\n const filterOption = filterOptions.find(\n (filter) => filter.id === filterId,\n );\n const rowValue = (row as Record<string, unknown>)[filterId];\n\n return matchesFilterValue(rowValue, filterValue, filterOption?.type);\n });\n });\n}\n\nexport function useAsyncFilterOptions(\n filterOptions: FilterOption[] | undefined,\n isSelectorOpen: boolean,\n) {\n const [asyncOptions, setAsyncOptions] = React.useState<\n Record<string, { options: string[]; isLoading: boolean }>\n >({});\n\n React.useEffect(() => {\n if (!isSelectorOpen || !filterOptions?.length) return;\n\n filterOptions.forEach((filter) => {\n if (filter.fetchOptions && !asyncOptions[filter.id]) {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: { options: filter.options || [], isLoading: true },\n }));\n\n filter\n .fetchOptions()\n .then((options) => {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: { options, isLoading: false },\n }));\n })\n .catch(() => {\n setAsyncOptions((previous) => ({\n ...previous,\n [filter.id]: {\n options: filter.options || [],\n isLoading: false,\n },\n }));\n });\n }\n });\n }, [filterOptions, isSelectorOpen, asyncOptions]);\n\n return asyncOptions;\n}\n\nexport const isFilterValueEmpty = (value?: FilterValue | null): boolean => {\n if (value === undefined || value === null) {\n return true;\n }\n\n if (typeof value === \"string\") {\n return value === \"\";\n }\n\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n if (value instanceof Date || typeof value === \"boolean\") {\n return false;\n }\n\n if (\"start\" in value || \"end\" in value) {\n const rangeValue = value as DateRangeValue;\n return !rangeValue.start && !rangeValue.end;\n }\n\n return value.min === undefined && value.max === undefined;\n};\n\nexport const isFilterActive = (value?: FilterValue): boolean =>\n !isFilterValueEmpty(value);\n\nfunction LoadingFilterField({ label }: { label: string }) {\n return (\n <div className=\"min-w-[200px] space-y-2 rounded-[10px] border border-ds-border-2 bg-ds-surface-2/70 px-3 py-2\">\n <div className=\"h-3 w-24 animate-pulse rounded bg-ds-surface-3\" />\n <div className=\"h-10 w-full animate-pulse rounded bg-ds-surface-1\" />\n <p className=\"text-xs text-ds-2\">\n Loading {label.toLowerCase()} options...\n </p>\n </div>\n );\n}\n\ninterface NumberRangeFilterProps {\n value: NumberRangeFilterValue;\n onChange: (value: NumberRangeFilterValue) => void;\n}\n\nfunction NumberRangeFilter({ value, onChange }: NumberRangeFilterProps) {\n return (\n <div className=\"flex gap-2\">\n <Input\n type=\"number\"\n placeholder=\"Min\"\n value={value.min?.toString() || \"\"}\n onChange={(e) =>\n onChange({\n ...value,\n min: e.target.value ? Number(e.target.value) : undefined,\n })\n }\n className=\"w-20\"\n />\n <Input\n type=\"number\"\n placeholder=\"Max\"\n value={value.max?.toString() || \"\"}\n onChange={(e) =>\n onChange({\n ...value,\n max: e.target.value ? Number(e.target.value) : undefined,\n })\n }\n className=\"w-20\"\n />\n </div>\n );\n}\n\ninterface FilterFieldControlProps {\n filter: FilterOption;\n value: FilterValue | undefined;\n isActive: boolean;\n onChange: (value: FilterValue) => void;\n}\n\nexport function FilterFieldControl({\n filter,\n value,\n isActive,\n onChange,\n}: FilterFieldControlProps) {\n if (filter.isLoading) {\n return <LoadingFilterField label={filter.label} />;\n }\n\n switch (filter.type) {\n case \"text\":\n return (\n <Input\n value={getStringFilterValue(value)}\n onChange={(event) => onChange(event.target.value)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"select\":\n return (\n <Select\n value={getStringFilterValue(value)}\n onChange={(event) => onChange(event.target.value)}\n options={toSelectOptions(filter.options)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"combobox\":\n return filter.multiple ? (\n <MultiSelectCombobox\n value={getMultiStringFilterValue(value)}\n onChange={(values) => onChange(values)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n ) : (\n <Combobox\n value={getStringFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n );\n case \"checkbox\":\n return (\n <div className=\"flex h-10 items-center px-2\">\n <Checkbox\n checked={Boolean(value)}\n onChange={(event) => onChange(event.target.checked)}\n label={filter.label}\n />\n </div>\n );\n case \"switch\":\n return (\n <div className=\"flex h-10 items-center px-2\">\n <Switch\n checked={Boolean(value)}\n onChange={(event) => onChange(event.target.checked)}\n />\n </div>\n );\n case \"date\":\n return (\n <DatePicker\n mode=\"single\"\n value={getDateFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"date-range\":\n return (\n <DatePicker\n mode=\"range\"\n value={getDateRangeFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n />\n );\n case \"number-range\":\n return (\n <NumberRangeFilter\n value={getNumberRangeFilterValue(value)}\n onChange={onChange}\n />\n );\n default:\n return filter.multiple ? (\n <MultiSelectCombobox\n value={getMultiStringFilterValue(value)}\n onChange={(values) => onChange(values)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n ) : (\n <Combobox\n value={getStringFilterValue(value)}\n onChange={(nextValue) => onChange(nextValue)}\n placeholder={filter.placeholder || filter.label}\n options={toSelectOptions(filter.options)}\n />\n );\n }\n}\n","const rtlLanguages = /^(ar|fa|ur|he)(-|$)/i;\n\nexport type TableDirection = \"ltr\" | \"rtl\";\n\n/**\n * Resolves table direction from nearest `dir` ancestor, document root, or locale.\n * This mirrors Tabs direction behavior so data-display patterns stay consistent.\n */\nexport function resolveTableDirection(\n host: HTMLElement | null,\n): TableDirection {\n if (typeof document === \"undefined\") {\n return \"ltr\";\n }\n\n const nearestWithDirection = host?.closest<HTMLElement>(\"[dir]\");\n const explicitDirection =\n nearestWithDirection?.getAttribute(\"dir\") ??\n document.documentElement.getAttribute(\"dir\") ??\n undefined;\n\n if (explicitDirection === \"rtl\" || explicitDirection === \"ltr\") {\n return explicitDirection;\n }\n\n if (\n typeof navigator !== \"undefined\" &&\n rtlLanguages.test(navigator.language)\n ) {\n return \"rtl\";\n }\n\n return \"ltr\";\n}\n","import React from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n useReactTable,\n getCoreRowModel,\n getPaginationRowModel,\n getFilteredRowModel,\n flexRender,\n type CellContext,\n type ColumnDef,\n type PaginationState,\n type Table as TanStackTable,\n} from \"@tanstack/react-table\";\nimport { Button } from \"../../forms/button\";\nimport { Checkbox } from \"../../forms/checkbox\";\nimport { Input } from \"../../forms/input\";\nimport { Select } from \"../../forms/select\";\nimport { type DatePickerValue } from \"../../forms/date-picker\";\nimport {\n ChevronLeftIcon,\n ChevronRightIcon,\n ChevronsLeftIcon,\n ChevronsRightIcon,\n EllipsisVerticalIcon,\n FilterIcon,\n FilterProfileIcon,\n FilterXIcon,\n LoaderIcon,\n} from \"../../icons\";\nimport { mergeClassNames } from \"../../../utils\";\nimport {\n TableContainer,\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n} from \"./TablePrimitives\";\nimport { DataTableRows } from \"./DataTableRows\";\nimport type { DataTableEmptyStateContext } from \"./DataTableRows\";\nimport { DataTableToolbar, ToolbarIconButton } from \"./DataTableToolbar\";\nimport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\nimport {\n FilterFieldControl,\n filterClientData,\n isFilterActive,\n resolveFilterOptions,\n useAsyncFilterOptions,\n} from \"./DataTableFilters\";\nimport { resolveTableDirection, type TableDirection } from \"./direction\";\nexport {\n TableContainer,\n Table,\n TableHeader,\n TableBody,\n TableFooter,\n TableRow,\n TableHead,\n TableCell,\n TableCaption,\n} from \"./TablePrimitives\";\nexport type { DataTableEmptyStateContext } from \"./DataTableRows\";\nexport {\n ColumnToggle,\n FilterButton,\n FilterDropdown,\n} from \"./DataTableControls\";\nexport { ToolbarIconButton } from \"./DataTableToolbar\";\n\n// Filter option type - can be static or async\nexport interface FilterOption {\n id: string;\n label: string;\n type?:\n | \"text\"\n | \"select\"\n | \"combobox\"\n | \"checkbox\"\n | \"switch\"\n | \"date\"\n | \"date-range\"\n | \"number-range\";\n placeholder?: string;\n options?: string[]; // Static options\n // Async options support\n queryKey?: string | string[]; // React Query key for caching\n fetchOptions?: () => Promise<string[]>; // Async function to fetch options\n isLoading?: boolean; // Loading state (managed externally)\n multiple?: boolean; // Enable multi-select\n /* Crystal UI Unification */\n /*\n ### Automated Browser Testing\n The filters were verified using the browser subagent, confirming that each filter type correctly updates the table data in real-time and adheres to our new unified \"Crystal\" aesthetic.\n\n ````carousel\n \n <!-- slide -->\n \n <!-- slide -->\n \n ````\n\n ### Key Successes:\n - **Unified Aesthetic**: All components now share a consistent `backdrop-blur-xl` and semi-transparent background.\n - **Improved Visual Hierarchy**: The crystal effect makes the components feel integrated with the page while still being clearly interactive.\n - **Robust Logic**: Maintained all advanced filtering logic (date ranges, numeric ranges, partial matches) while upgrading the visual layer.\n */\n}\n\n// Filter value can be single string, array of strings, or range objects\nexport type FilterValue =\n | string\n | string[]\n | boolean\n | DatePickerValue\n | { min?: number; max?: number };\nexport type FilterValues = Record<string, FilterValue>;\n\nexport interface DataTableBulkActionContext<T> {\n selectedRows: T[];\n selectedCount: number;\n clearSelection: () => void;\n disableBulkSelection: () => void;\n}\n\nexport interface DataTableCellRenderContext<T> {\n value: unknown;\n row: T;\n rowIndex: number;\n columnId: string;\n}\n\nexport interface DataTableColumn<T> {\n id: string;\n label: string;\n visible?: boolean;\n filterable?: boolean;\n multiFilter?: boolean;\n priority?: number;\n renderCell?: (context: DataTableCellRenderContext<T>) => React.ReactNode;\n}\n\nexport interface DataTableRowAction<T> {\n id: string;\n label: string;\n variant?: \"default\" | \"destructive\";\n onClick?: (row: T) => void;\n}\n\nexport interface DataTableTextLabels {\n columns: string;\n showAll: string;\n hideAll: string;\n refresh: string;\n export: string;\n columnSettings: string;\n showFilters: string;\n addFilter: string;\n clearFilters: string;\n filterProfiles: string;\n saveNewFilterProfile: string;\n}\n\nconst DEFAULT_DATA_TABLE_LABELS: DataTableTextLabels = {\n columns: \"COLUMNS\",\n showAll: \"SHOW ALL\",\n hideAll: \"HIDE ALL\",\n refresh: \"REFRESH\",\n export: \"EXPORT\",\n columnSettings: \"COLUMNS\",\n showFilters: \"SHOW FILTERS\",\n addFilter: \"Add filter\",\n clearFilters: \"Clear filters\",\n filterProfiles: \"Filter profiles\",\n saveNewFilterProfile: \"Save new filter profile\",\n};\n\nexport interface FilterSelectorFooterContext {\n onShowAll: () => void;\n onHideAll: () => void;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface DataTableProps<T = Record<string, any>> {\n columns: DataTableColumn<T>[];\n data: T[];\n isLoading?: boolean; // Table data loading state\n onColumnToggle?: (columnId: string) => void;\n /** Number of items per page */\n pageSize?: number;\n /** Maximum height for the scrollable table area */\n maxHeight?: string;\n onSearch?: (query: string) => void;\n onRefresh?: () => void;\n onExport?: () => void;\n showRefreshButton?: boolean;\n showExportButton?: boolean;\n onRowAction?: (action: string, row: T) => void;\n rowActions?: DataTableRowAction<T>[];\n onBulkDelete?: (rows: T[]) => void;\n renderBulkActions?: (\n context: DataTableBulkActionContext<T>,\n ) => React.ReactNode;\n renderBulkActionCard?: (\n context: DataTableBulkActionContext<T>,\n ) => React.ReactNode;\n onFilterChange?: (filters: FilterValues) => void;\n // Filter options - can include async filters\n filterOptions?: FilterOption[];\n // Called when filters are applied (for server-side filtering)\n onFiltersApply?: (filters: FilterValues) => void;\n // Enable server-side filtering mode\n serverSideFiltering?: boolean;\n searchPlaceholder?: string;\n children?: React.ReactNode;\n /** Total row count for server-side pagination */\n totalCount?: number;\n /** Callback when pagination changes (for server-side pagination) */\n onPaginationChange?: (pageIndex: number, pageSize: number) => void;\n renderEmptyState?: (context: DataTableEmptyStateContext) => React.ReactNode;\n labels?: Partial<DataTableTextLabels>;\n renderFilterSelectorFooterActions?: (\n context: FilterSelectorFooterContext,\n ) => React.ReactNode;\n renderFilterRowActions?: React.ReactNode;\n renderToolbarActions?: React.ReactNode;\n className?: string;\n tableContainerClassName?: string;\n tableClassName?: string;\n caption?: React.ReactNode;\n captionClassName?: string;\n headerClassName?: string;\n headerRowClassName?: string;\n headClassName?: string;\n bodyClassName?: string;\n rowClassName?: string;\n cellClassName?: string;\n footerClassName?: string;\n}\n\nfunction renderDefaultCellValue(value: unknown): React.ReactNode {\n if (value === undefined || value === null || value === \"\") {\n return \"-\";\n }\n\n if (typeof value === \"boolean\") {\n return value ? \"Yes\" : \"No\";\n }\n\n if (Array.isArray(value)) {\n return value.length > 0 ? value.join(\", \") : \"-\";\n }\n\n return value as React.ReactNode;\n}\n\ninterface FilterProfileProps {\n isOpen: boolean;\n onClose: () => void;\n onSaveProfile: (name: string) => void;\n}\n\nexport const FilterProfile: React.FC<FilterProfileProps> = ({\n isOpen,\n onClose,\n onSaveProfile,\n}) => {\n const [profileName, setProfileName] = React.useState(\"\");\n\n const handleSave = () => {\n if (profileName.trim()) {\n onSaveProfile(profileName);\n setProfileName(\"\");\n onClose();\n }\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 bg-black/50 flex items-center justify-center z-50\"\n onClick={onClose}\n >\n <div\n className=\"bg-ds-surface-1 border border-ds-border-2 rounded-xl p-6 max-w-md w-full mx-4\"\n onClick={(e) => e.stopPropagation()}\n >\n <h2 className=\"text-2xl font-bold text-ds-1 mb-4\">Add new profile</h2>\n\n <label className=\"mb-2 block text-sm font-medium text-ds-1\">\n Enter filter profile name:\n </label>\n <Input\n type=\"text\"\n value={profileName}\n onChange={(e) => setProfileName(e.target.value)}\n placeholder=\"Enter value\"\n className=\"\"\n onKeyDown={(e) => e.key === \"Enter\" && handleSave()}\n />\n\n <div className=\"flex justify-end gap-3 mt-6\">\n <Button onClick={onClose} className=\"min-w-28\" size=\"medium\">\n Cancel\n </Button>\n <Button\n onClick={handleSave}\n disabled={!profileName.trim()}\n className=\"min-w-28\"\n size=\"medium\"\n primary\n >\n Save\n </Button>\n </div>\n </div>\n </div>\n );\n};\n\nconst TABLE_CONTROL_ICON_CLASS_NAME = \"h-[18px] w-[18px] shrink-0\";\nconst TABLE_COMPLEX_ICON_CLASS_NAME = TABLE_CONTROL_ICON_CLASS_NAME;\nconst DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 30, 50, 100] as const;\nconst ROW_ACTIONS_CELL_WIDTH_CLASS_NAME = \"w-12 min-w-12 max-w-12\";\nconst ROW_ACTIONS_MENU_MIN_WIDTH_PX = 140;\nconst ROW_ACTIONS_MENU_MAX_WIDTH_PX = 200;\nconst ROW_ACTIONS_MENU_GAP_PX = 6;\nconst ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX = 8;\nconst ROW_ACTIONS_MENU_RIGHT_GUTTER_PX = 0;\nconst ROW_ACTIONS_MENU_LEFT_GUTTER_PX = 0;\n\ninterface RowActionsCellProps<T> {\n rowIndex: number;\n row: T;\n isOpen: boolean;\n openDirection: \"up\" | \"down\";\n tableContainerRef: React.RefObject<HTMLDivElement | null>;\n onToggle: (rowIndex: number) => void;\n onClose: () => void;\n onRowAction?: (action: string, row: T) => void;\n actions: DataTableRowAction<T>[];\n direction: TableDirection;\n}\n\nfunction RowActionsCell<T>({\n rowIndex,\n row,\n isOpen,\n openDirection,\n tableContainerRef,\n onToggle,\n onClose,\n onRowAction,\n actions,\n direction,\n}: RowActionsCellProps<T>) {\n const toggleAnchorRef = React.useRef<HTMLDivElement | null>(null);\n const menuRef = React.useRef<HTMLDivElement | null>(null);\n const [menuPosition, setMenuPosition] = React.useState<{\n top: number;\n right?: number;\n left?: number;\n } | null>(null);\n\n const updateMenuPosition = React.useCallback(() => {\n if (!isOpen || !toggleAnchorRef.current) {\n return;\n }\n\n const anchorRect = toggleAnchorRef.current.getBoundingClientRect();\n const tableRect = tableContainerRef.current?.getBoundingClientRect();\n const menuHeight =\n menuRef.current?.getBoundingClientRect().height ??\n Math.max(actions.length, 1) * 36 + 12;\n\n const spaceBelow =\n window.innerHeight -\n anchorRect.bottom -\n ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX;\n const spaceAbove = anchorRect.top - ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX;\n\n const openUpward =\n openDirection === \"up\"\n ? spaceBelow < menuHeight || spaceAbove > spaceBelow\n : spaceBelow < menuHeight && spaceAbove > spaceBelow;\n\n const targetTop = openUpward\n ? anchorRect.top - menuHeight - ROW_ACTIONS_MENU_GAP_PX\n : anchorRect.bottom + ROW_ACTIONS_MENU_GAP_PX;\n\n const maxTop = Math.max(\n ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX,\n window.innerHeight - menuHeight - ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX,\n );\n const clampedTop = Math.min(\n Math.max(targetTop, ROW_ACTIONS_MENU_VIEWPORT_PADDING_PX),\n maxTop,\n );\n\n if (direction === \"rtl\") {\n const leftOffset = Math.max(\n (tableRect?.left ?? anchorRect.left) + ROW_ACTIONS_MENU_LEFT_GUTTER_PX,\n ROW_ACTIONS_MENU_LEFT_GUTTER_PX,\n );\n\n setMenuPosition({\n top: clampedTop,\n left: leftOffset,\n });\n\n return;\n }\n\n const rightOffset = Math.max(\n window.innerWidth -\n (tableRect?.right ?? anchorRect.right) +\n ROW_ACTIONS_MENU_RIGHT_GUTTER_PX,\n ROW_ACTIONS_MENU_RIGHT_GUTTER_PX,\n );\n\n setMenuPosition({\n top: clampedTop,\n right: rightOffset,\n });\n }, [actions.length, direction, isOpen, openDirection, tableContainerRef]);\n\n React.useLayoutEffect(() => {\n if (!isOpen) {\n setMenuPosition(null);\n return;\n }\n\n updateMenuPosition();\n const rafId = window.requestAnimationFrame(updateMenuPosition);\n return () => window.cancelAnimationFrame(rafId);\n }, [isOpen, updateMenuPosition]);\n\n React.useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onClose();\n }\n };\n\n const handleViewportChange = () => onClose();\n const tableContainerElement = tableContainerRef.current;\n\n window.addEventListener(\"keydown\", handleEscape);\n window.addEventListener(\"resize\", handleViewportChange);\n window.addEventListener(\"scroll\", handleViewportChange, true);\n tableContainerElement?.addEventListener(\"scroll\", handleViewportChange, {\n passive: true,\n });\n\n return () => {\n window.removeEventListener(\"keydown\", handleEscape);\n window.removeEventListener(\"resize\", handleViewportChange);\n window.removeEventListener(\"scroll\", handleViewportChange, true);\n tableContainerElement?.removeEventListener(\n \"scroll\",\n handleViewportChange,\n );\n };\n }, [isOpen, onClose, tableContainerRef]);\n\n const rowActionsMenu = isOpen\n ? createPortal(\n <>\n <div className=\"fixed inset-0 z-[220]\" onClick={onClose} />\n <div\n ref={menuRef}\n className=\"fixed z-[230] min-w-[140px] max-w-[200px] overflow-hidden rounded-lg border border-ds-border-3 bg-ds-surface-2 shadow-xl\"\n style={{\n top: menuPosition?.top,\n right: menuPosition?.right,\n left: menuPosition?.left,\n minWidth: `${ROW_ACTIONS_MENU_MIN_WIDTH_PX}px`,\n maxWidth: `${ROW_ACTIONS_MENU_MAX_WIDTH_PX}px`,\n }}\n onClick={(event) => event.stopPropagation()}\n >\n {actions.map((action) => (\n <Button\n key={action.id}\n onClick={() => {\n action.onClick?.(row);\n onRowAction?.(action.id, row);\n onClose();\n }}\n className={mergeClassNames(\n \"w-full justify-start rounded-none border-none bg-ds-surface-2 px-4 py-2 text-sm font-normal shadow-none hover:bg-ds-surface-3 hover:opacity-100\",\n action.variant === \"destructive\"\n ? \"text-error hover:text-error\"\n : \"text-ds-2 hover:text-ds-1\",\n )}\n >\n {action.label}\n </Button>\n ))}\n </div>\n </>,\n document.body,\n )\n : null;\n\n return (\n <td\n className={mergeClassNames(\n \"relative h-full overflow-hidden border-x border-ds-border-2 bg-ds-surface-1 p-0 align-middle\",\n direction === \"rtl\"\n ? \"sticky left-0 text-left shadow-[8px_0_12px_-10px_rgba(15,23,42,0.35)]\"\n : \"sticky right-0 text-right shadow-[-8px_0_12px_-10px_rgba(15,23,42,0.35)]\",\n ROW_ACTIONS_CELL_WIDTH_CLASS_NAME,\n isOpen ? \"z-20\" : \"z-10\",\n )}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px left-0 z-20 w-px bg-ds-border-2\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px right-0 z-20 w-px bg-ds-border-2\"\n />\n <div\n ref={toggleAnchorRef}\n className={mergeClassNames(\n \"absolute -inset-y-px z-10 flex items-stretch bg-ds-surface-2\",\n direction === \"rtl\" ? \"left-0 justify-start\" : \"right-0 justify-end\",\n )}\n >\n <Button\n onClick={() => onToggle(rowIndex)}\n aria-label=\"Open row actions\"\n className={mergeClassNames(\n \"h-full w-12 rounded-none border-none px-0 py-0 shadow-none hover:opacity-100 \",\n isOpen\n ? \"bg-ds-surface-2 text-ds-1\"\n : \"bg-ds-surface-2 text-ds-2 hover:bg-ds-surface-3 hover:text-ds-1\",\n )}\n >\n <EllipsisVerticalIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </Button>\n </div>\n {rowActionsMenu}\n </td>\n );\n}\n\ninterface DataTablePaginationProps<T> {\n table: TanStackTable<T>;\n totalCount?: number;\n filteredCount: number;\n direction: TableDirection;\n}\n\nfunction DataTablePagination<T>({\n table,\n totalCount,\n filteredCount,\n direction,\n}: DataTablePaginationProps<T>) {\n const { pageIndex, pageSize } = table.getState().pagination;\n const itemCount = totalCount ?? filteredCount;\n const pageStart = itemCount === 0 ? 0 : pageIndex * pageSize + 1;\n const pageEnd = Math.min((pageIndex + 1) * pageSize, itemCount);\n const pageSizeOptions = Array.from(\n new Set([...DEFAULT_PAGE_SIZE_OPTIONS, pageSize]),\n ).sort((left, right) => left - right);\n\n return (\n <div className=\"relative z-10 flex flex-col gap-3 border-t border-ds-border-2 bg-ds-surface-2 px-4 py-3 overflow-visible md:flex-row md:items-center md:justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-ds-2\">\n Showing {pageStart} to {pageEnd} of {itemCount} items\n </span>\n </div>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 overflow-visible\">\n <span className=\"text-sm text-ds-2\">Rows</span>\n <Select\n value={String(pageSize)}\n onChange={(event) => table.setPageSize(Number(event.target.value))}\n aria-label=\"Rows per page\"\n size=\"compact\"\n containerClassName=\"w-[5.5rem] min-w-[5.5rem] shrink-0\"\n triggerClassName=\"px-2.5 font-medium text-ds-1\"\n dropdownClassName=\"top-auto bottom-full z-[80] mb-1 mt-0\"\n options={pageSizeOptions.map((size) => ({\n value: String(size),\n label: String(size),\n }))}\n />\n\n <ToolbarIconButton\n title=\"First page\"\n onClick={() => table.setPageIndex(0)}\n disabled={!table.getCanPreviousPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronsRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronsLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <ToolbarIconButton\n title=\"Previous page\"\n onClick={() => table.previousPage()}\n disabled={!table.getCanPreviousPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <span className=\"inline-flex h-10 shrink-0 items-center rounded-lg px-3 text-sm font-medium text-ds-2\">\n Page {pageIndex + 1} of {table.getPageCount()}\n </span>\n\n <ToolbarIconButton\n title=\"Next page\"\n onClick={() => table.nextPage()}\n disabled={!table.getCanNextPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n\n <ToolbarIconButton\n title=\"Last page\"\n onClick={() => table.setPageIndex(table.getPageCount() - 1)}\n disabled={!table.getCanNextPage()}\n >\n {direction === \"rtl\" ? (\n <ChevronsLeftIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n ) : (\n <ChevronsRightIcon\n className={TABLE_CONTROL_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n )}\n </ToolbarIconButton>\n </div>\n </div>\n );\n}\n\ninterface FilterSelectorMenuProps {\n filterOptions: FilterOption[];\n visibleFilters: string[];\n onToggleFilter: (filterId: string, isVisible: boolean) => void;\n onShowAll: () => void;\n onHideAll: () => void;\n labels: DataTableTextLabels;\n footerActions?: React.ReactNode;\n}\n\nfunction FilterSelectorMenu({\n filterOptions,\n visibleFilters,\n onToggleFilter,\n onShowAll,\n onHideAll,\n labels,\n footerActions,\n}: FilterSelectorMenuProps) {\n return (\n <div className=\"p-4 min-h-58 min-w-48 space-y-3\">\n <div className=\"mb-3 flex items-center justify-between\">\n <span className=\"text-sm font-semibold text-ds-1\">\n {labels.showFilters}\n </span>\n </div>\n {filterOptions.map((filter) => (\n <div\n key={filter.id}\n className=\"min-w-36 rounded-[8px] px-2 py-1 hover:bg-ds-surface-2\"\n >\n <Checkbox\n checked={visibleFilters.includes(filter.id)}\n onChange={(event) =>\n onToggleFilter(filter.id, event.target.checked)\n }\n label={filter.label}\n />\n </div>\n ))}\n <div className=\"flex gap-2 border-t border-ds-border-2 pt-2\">\n <Button\n onClick={onShowAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-1 shadow-none hover:bg-transparent hover:text-ds-accent-hover hover:opacity-100\"\n >\n {labels.showAll}\n </Button>\n <Button\n onClick={onHideAll}\n size=\"small\"\n className=\"flex-1 border-none bg-transparent px-1 py-1 text-xs font-semibold text-ds-2 shadow-none hover:bg-transparent hover:text-ds-1 hover:opacity-100\"\n >\n {labels.hideAll}\n </Button>\n {footerActions}\n </div>\n </div>\n );\n}\n\nconst usesManualPagination = (\n totalCount?: number,\n onPaginationChange?: (pageIndex: number, pageSize: number) => void,\n) => totalCount !== undefined || typeof onPaginationChange === \"function\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function DataTable<T = Record<string, any>>({\n columns,\n data,\n isLoading = false,\n onColumnToggle,\n pageSize = 10,\n maxHeight = \"500px\",\n onSearch,\n onRefresh,\n onExport,\n showRefreshButton = true,\n showExportButton = true,\n onRowAction,\n rowActions,\n onBulkDelete,\n renderBulkActions,\n renderBulkActionCard,\n onFilterChange,\n onFiltersApply,\n serverSideFiltering = false,\n filterOptions: externalFilterOptions,\n searchPlaceholder = \"Search ...\",\n totalCount,\n onPaginationChange,\n renderEmptyState,\n labels: labelsProp,\n renderFilterSelectorFooterActions,\n renderFilterRowActions,\n renderToolbarActions,\n className,\n tableContainerClassName,\n tableClassName,\n caption,\n captionClassName,\n headerClassName,\n headerRowClassName,\n headClassName,\n bodyClassName,\n rowClassName,\n cellClassName,\n footerClassName,\n}: DataTableProps<T>) {\n const tableRootRef = React.useRef<HTMLDivElement | null>(null);\n const [tableDirection, setTableDirection] =\n React.useState<TableDirection>(\"ltr\");\n\n React.useLayoutEffect(() => {\n setTableDirection(resolveTableDirection(tableRootRef.current));\n }, []);\n\n const isRtl = tableDirection === \"rtl\";\n\n const resolvedRowActions = React.useMemo<DataTableRowAction<T>[]>(\n () => rowActions ?? [],\n [rowActions],\n );\n const hasRowActions = resolvedRowActions.length > 0;\n\n const labels = React.useMemo<DataTableTextLabels>(\n () => ({\n ...DEFAULT_DATA_TABLE_LABELS,\n ...labelsProp,\n }),\n [labelsProp],\n );\n\n const [pagination, setPagination] = React.useState<PaginationState>({\n pageIndex: 0,\n pageSize: pageSize,\n });\n const [columnMenuOpen, setColumnMenuOpen] = React.useState(false);\n const [profileMenuOpen, setProfileMenuOpen] = React.useState(false);\n const [profileOpen, setProfileOpen] = React.useState(false);\n const [filterSelectorOpen, setFilterSelectorOpen] = React.useState(false);\n const [visibleFilters, setVisibleFilters] = React.useState<string[]>([]);\n const [activeFilters, setActiveFilters] = React.useState<FilterValues>({});\n const [bulkSelectionActive, setBulkSelectionActive] = React.useState(false);\n const [selectedRowIds, setSelectedRowIds] = React.useState<\n Record<string, boolean>\n >({});\n const [rowMenuOpen, setRowMenuOpen] = React.useState<number | null>(null);\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n const [columnVisibility, setColumnVisibility] = React.useState<\n Record<string, boolean>\n >(() =>\n Object.fromEntries(\n columns.map((column) => [column.id, column.visible !== false]),\n ),\n );\n\n const columnsVisibilitySignature = React.useMemo(\n () =>\n columns\n .map((column) => `${column.id}:${column.visible !== false}`)\n .join(\"|\"),\n [columns],\n );\n\n React.useEffect(() => {\n setColumnVisibility(\n Object.fromEntries(\n columns.map((column) => [column.id, column.visible !== false]),\n ),\n );\n }, [columns, columnsVisibilitySignature]);\n\n const asyncFilterOptions = useAsyncFilterOptions(\n externalFilterOptions,\n filterSelectorOpen,\n );\n\n // Auto-generate filter options from columns that are filterable\n const filterOptions: FilterOption[] = React.useMemo(() => {\n return resolveFilterOptions(\n columns,\n data,\n externalFilterOptions,\n asyncFilterOptions,\n );\n }, [columns, data, externalFilterOptions, asyncFilterOptions]);\n\n const resolvedColumns = React.useMemo(\n () =>\n columns.map((column) => ({\n ...column,\n visible: columnVisibility[column.id] ?? column.visible !== false,\n })),\n [columnVisibility, columns],\n );\n\n const visibleColumns = React.useMemo(\n () => resolvedColumns.filter((column) => column.visible !== false),\n [resolvedColumns],\n );\n const manualPagination = usesManualPagination(totalCount, onPaginationChange);\n const pageCount =\n totalCount === undefined\n ? undefined\n : Math.ceil(totalCount / pagination.pageSize);\n\n // Filter data based on search query and active filters (client-side only)\n const filteredData = React.useMemo(() => {\n return filterClientData(\n data,\n activeFilters,\n searchQuery,\n serverSideFiltering,\n filterOptions,\n );\n }, [data, activeFilters, searchQuery, serverSideFiltering, filterOptions]);\n\n // TanStack Table columns definition\n const tableColumns = React.useMemo<ColumnDef<T>[]>(\n () =>\n visibleColumns.map((col) => ({\n id: col.id,\n accessorKey: col.id,\n header: col.label,\n cell: (info: CellContext<T, unknown>) => {\n const value = info.getValue();\n\n if (col.renderCell) {\n return col.renderCell({\n value,\n row: info.row.original,\n rowIndex: info.row.index,\n columnId: col.id,\n });\n }\n\n return renderDefaultCellValue(value);\n },\n })),\n [visibleColumns],\n );\n\n const updatePagination = React.useCallback(\n (\n updater:\n | PaginationState\n | ((previous: PaginationState) => PaginationState),\n ) => {\n setPagination((previous) => {\n const nextPagination =\n typeof updater === \"function\" ? updater(previous) : updater;\n\n if (\n previous.pageIndex !== nextPagination.pageIndex ||\n previous.pageSize !== nextPagination.pageSize\n ) {\n onPaginationChange?.(\n nextPagination.pageIndex,\n nextPagination.pageSize,\n );\n }\n\n return nextPagination;\n });\n },\n [onPaginationChange],\n );\n\n const table = useReactTable({\n data: filteredData,\n columns: tableColumns,\n getCoreRowModel: getCoreRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n state: {\n pagination,\n globalFilter: searchQuery,\n },\n onPaginationChange: updatePagination,\n manualPagination,\n pageCount,\n });\n\n const visibleRows = table.getRowModel().rows;\n const bulkDeleteEnabled = typeof onBulkDelete === \"function\";\n const selectedRows = React.useMemo(\n () =>\n visibleRows\n .filter((row) => selectedRowIds[row.id])\n .map((row) => row.original),\n [selectedRowIds, visibleRows],\n );\n const allVisibleRowsSelected =\n visibleRows.length > 0 &&\n visibleRows.every((row) => selectedRowIds[row.id]);\n\n React.useEffect(() => {\n updatePagination((previous) =>\n previous.pageIndex === 0 ? previous : { ...previous, pageIndex: 0 },\n );\n }, [activeFilters, searchQuery, updatePagination]);\n\n React.useEffect(() => {\n setSelectedRowIds((previous) => {\n const visibleRowIds = new Set(visibleRows.map((row) => row.id));\n const nextSelection = Object.fromEntries(\n Object.entries(previous).filter(\n ([rowId, isSelected]) => isSelected && visibleRowIds.has(rowId),\n ),\n );\n\n const previousKeys = Object.keys(previous).sort().join(\"|\");\n const nextKeys = Object.keys(nextSelection).sort().join(\"|\");\n\n return previousKeys === nextKeys ? previous : nextSelection;\n });\n }, [visibleRows]);\n\n const applyFilters = React.useCallback(\n (nextFilters: FilterValues) => {\n setActiveFilters(nextFilters);\n onFilterChange?.(nextFilters);\n\n if (serverSideFiltering) {\n onFiltersApply?.(nextFilters);\n }\n },\n [onFilterChange, onFiltersApply, serverSideFiltering],\n );\n\n const handleSearchChange = React.useCallback(\n (value: string) => {\n setSearchQuery(value);\n onSearch?.(value);\n },\n [onSearch],\n );\n\n const handleFilterChange = React.useCallback(\n (filterId: string, value: FilterValue) => {\n applyFilters({\n ...activeFilters,\n [filterId]: value,\n });\n },\n [activeFilters, applyFilters],\n );\n\n const handleResetFilters = React.useCallback(() => {\n applyFilters({});\n }, [applyFilters]);\n\n const handleToggleFilterVisibility = React.useCallback(\n (filterId: string, isVisible: boolean) => {\n setVisibleFilters((previous) => {\n if (isVisible) {\n return previous.includes(filterId)\n ? previous\n : [...previous, filterId];\n }\n\n return previous.filter((id) => id !== filterId);\n });\n\n if (!isVisible && filterId in activeFilters) {\n const nextFilters = { ...activeFilters };\n delete nextFilters[filterId];\n applyFilters(nextFilters);\n }\n },\n [activeFilters, applyFilters],\n );\n\n const handleShowAllFilters = React.useCallback(() => {\n setVisibleFilters(filterOptions.map((filter) => filter.id));\n }, [filterOptions]);\n\n const handleHideAllFilters = React.useCallback(() => {\n setVisibleFilters([]);\n handleResetFilters();\n }, [handleResetFilters]);\n\n const handleToggleRowMenu = React.useCallback((rowIndex: number) => {\n setRowMenuOpen((previous) => (previous === rowIndex ? null : rowIndex));\n }, []);\n const handleCloseRowMenu = React.useCallback(() => {\n setRowMenuOpen(null);\n }, []);\n const tableContainerRef = React.useRef<HTMLDivElement | null>(null);\n\n const handleToggleFilterSelector = React.useCallback(() => {\n setFilterSelectorOpen((previous) => !previous);\n }, []);\n\n const handleToggleProfileMenu = React.useCallback(() => {\n setProfileMenuOpen((previous) => !previous);\n }, []);\n\n const handleToggleColumnMenu = React.useCallback(() => {\n setColumnMenuOpen((previous) => !previous);\n }, []);\n\n const handleToggleColumnVisibility = React.useCallback(\n (columnId: string) => {\n setColumnVisibility((previous) => ({\n ...previous,\n [columnId]: !(previous[columnId] ?? true),\n }));\n onColumnToggle?.(columnId);\n },\n [onColumnToggle],\n );\n\n const handleShowAllColumns = React.useCallback(() => {\n setColumnVisibility(\n Object.fromEntries(columns.map((column) => [column.id, true])),\n );\n }, [columns]);\n\n const handleHideAllColumns = React.useCallback(() => {\n setColumnVisibility(\n Object.fromEntries(columns.map((column) => [column.id, false])),\n );\n }, [columns]);\n\n const handleToggleBulkSelection = React.useCallback(() => {\n setBulkSelectionActive((previous) => {\n if (previous) {\n setSelectedRowIds({});\n }\n\n return !previous;\n });\n }, []);\n\n const handleToggleRowSelection = React.useCallback(\n (rowId: string, checked: boolean) => {\n setSelectedRowIds((previous) => {\n if (checked) {\n return {\n ...previous,\n [rowId]: true,\n };\n }\n\n const nextSelection = { ...previous };\n delete nextSelection[rowId];\n return nextSelection;\n });\n },\n [],\n );\n\n const handleToggleAllVisibleRows = React.useCallback(\n (checked: boolean) => {\n setSelectedRowIds((previous) => {\n const nextSelection = { ...previous };\n\n visibleRows.forEach((row) => {\n if (checked) {\n nextSelection[row.id] = true;\n } else {\n delete nextSelection[row.id];\n }\n });\n\n return nextSelection;\n });\n },\n [visibleRows],\n );\n\n const handleBulkDeleteSelected = React.useCallback(() => {\n if (!onBulkDelete || selectedRows.length === 0) {\n return;\n }\n\n onBulkDelete(selectedRows);\n setSelectedRowIds({});\n }, [onBulkDelete, selectedRows]);\n\n const handleClearSelectedRows = React.useCallback(() => {\n setSelectedRowIds({});\n }, []);\n\n const handleDisableBulkSelection = React.useCallback(() => {\n setBulkSelectionActive(false);\n setSelectedRowIds({});\n }, []);\n\n const bulkActionContext = React.useMemo<DataTableBulkActionContext<T>>(\n () => ({\n selectedRows,\n selectedCount: selectedRows.length,\n clearSelection: handleClearSelectedRows,\n disableBulkSelection: handleDisableBulkSelection,\n }),\n [handleClearSelectedRows, handleDisableBulkSelection, selectedRows],\n );\n\n const bulkActionsContent = renderBulkActions?.(bulkActionContext);\n const bulkActionCard = renderBulkActionCard?.(bulkActionContext);\n\n const handleOpenProfile = React.useCallback(() => {\n setProfileOpen(true);\n setProfileMenuOpen(false);\n }, []);\n\n const hasActiveFilters = Object.values(activeFilters).some(isFilterActive);\n\n const handleSaveProfile = (profileName: string) => {\n void {\n name: profileName,\n filters: activeFilters,\n timestamp: new Date().toISOString(),\n };\n };\n\n return (\n <div\n ref={tableRootRef}\n dir={tableDirection}\n className={mergeClassNames(\"space-y-0\", className)}\n >\n {/* Row 1: Filters Row - Separated with border */}\n <div className=\"relative z-[60] mb-4 min-h-[80px] flex items-center justify-between gap-4 rounded-[8px] border border-ds-border-2 bg-ds-surface-1 px-4 py-4\">\n <div className=\"flex items-center gap-3 flex-wrap\">\n {filterOptions\n .filter((filter) => visibleFilters.includes(filter.id))\n .map((filter, index) => {\n const isActive = isFilterActive(activeFilters[filter.id]);\n\n return (\n <div\n key={filter.id}\n className={mergeClassNames(\n \"min-w-[200px]\",\n index > 0 && \"border-ds-border-2 ps-3\",\n index > 0 && (isRtl ? \"border-r\" : \"border-l\"),\n )}\n >\n <FilterFieldControl\n filter={filter}\n value={activeFilters[filter.id]}\n isActive={isActive}\n onChange={(value) => handleFilterChange(filter.id, value)}\n />\n </div>\n );\n })}\n </div>\n\n {/* Right side icons */}\n <div className=\"flex items-center gap-1 ml-auto\">\n <div className=\"relative\">\n <ToolbarIconButton\n onClick={handleToggleFilterSelector}\n title={labels.addFilter}\n >\n <FilterIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n <FilterDropdown\n isOpen={filterSelectorOpen}\n onClose={() => setFilterSelectorOpen(false)}\n direction={tableDirection}\n >\n <FilterSelectorMenu\n filterOptions={filterOptions}\n visibleFilters={visibleFilters}\n onToggleFilter={handleToggleFilterVisibility}\n onShowAll={handleShowAllFilters}\n onHideAll={handleHideAllFilters}\n labels={labels}\n footerActions={renderFilterSelectorFooterActions?.({\n onShowAll: handleShowAllFilters,\n onHideAll: handleHideAllFilters,\n })}\n />\n </FilterDropdown>\n </div>\n <ToolbarIconButton\n onClick={handleResetFilters}\n disabled={!hasActiveFilters}\n title={labels.clearFilters}\n >\n <FilterXIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n <div className=\"relative\">\n <ToolbarIconButton\n onClick={handleToggleProfileMenu}\n title={labels.filterProfiles}\n >\n <FilterProfileIcon\n className={TABLE_COMPLEX_ICON_CLASS_NAME}\n aria-hidden=\"true\"\n />\n </ToolbarIconButton>\n <FilterDropdown\n isOpen={profileMenuOpen}\n onClose={() => setProfileMenuOpen(false)}\n direction={tableDirection}\n >\n <div className=\"p-2 min-w-48\">\n <Button\n onClick={handleOpenProfile}\n className=\"w-full justify-start border-2 border-dashed border-ds-border-accent/40 bg-transparent px-4 py-3 text-start text-sm font-medium text-ds-1 shadow-none hover:bg-ds-accent-subtle hover:opacity-100\"\n >\n {labels.saveNewFilterProfile}\n </Button>\n </div>\n </FilterDropdown>\n </div>\n {renderFilterRowActions}\n </div>\n </div>\n {/* Table */}\n <div className=\"relative overflow-visible rounded-lg border border-ds-border-2 bg-ds-surface-1\">\n <DataTableToolbar\n direction={tableDirection}\n showRefreshButton={showRefreshButton}\n showExportButton={showExportButton}\n searchQuery={searchQuery}\n onSearchChange={handleSearchChange}\n searchPlaceholder={searchPlaceholder}\n bulkDeleteEnabled={bulkDeleteEnabled}\n bulkSelectionActive={bulkSelectionActive}\n selectedCount={selectedRows.length}\n bulkActionsContent={bulkActionsContent}\n bulkActionCard={bulkActionCard}\n onToggleBulkSelection={handleToggleBulkSelection}\n onBulkDeleteSelected={handleBulkDeleteSelected}\n onRefresh={onRefresh}\n onExport={onExport}\n columnMenuOpen={columnMenuOpen}\n onToggleColumnMenu={handleToggleColumnMenu}\n onCloseColumnMenu={() => setColumnMenuOpen(false)}\n columns={resolvedColumns}\n onColumnToggle={handleToggleColumnVisibility}\n onShowAllColumns={handleShowAllColumns}\n onHideAllColumns={handleHideAllColumns}\n labels={labels}\n toolbarActions={renderToolbarActions}\n />\n\n {/* Table Container */}\n <TableContainer\n ref={tableContainerRef}\n className={tableContainerClassName}\n style={{ maxHeight }}\n >\n <Table className={tableClassName}>\n {caption ? (\n <TableCaption className={captionClassName}>\n {caption}\n </TableCaption>\n ) : null}\n <TableHeader className={mergeClassNames(\"z-40\", headerClassName)}>\n {table.getHeaderGroups().map((headerGroup) => (\n <TableRow\n key={headerGroup.id}\n className={mergeClassNames(\n \"border-b border-ds-border-2\",\n headerRowClassName,\n )}\n >\n {bulkSelectionActive ? (\n <TableHead\n className={mergeClassNames(\n \"w-12 bg-ds-surface-2 px-4 py-3\",\n headClassName,\n )}\n >\n <Checkbox\n aria-label=\"Select all visible rows\"\n checked={allVisibleRowsSelected}\n onChange={(event) =>\n handleToggleAllVisibleRows(event.target.checked)\n }\n />\n </TableHead>\n ) : null}\n {headerGroup.headers.map((header) => (\n <TableHead\n key={header.id}\n className={mergeClassNames(\n \"whitespace-nowrap bg-ds-surface-2 px-4 py-3 text-sm font-semibold text-ds-1\",\n isRtl ? \"text-right\" : \"text-left\",\n headClassName,\n )}\n >\n {header.isPlaceholder\n ? null\n : flexRender(\n header.column.columnDef.header,\n header.getContext(),\n )}\n </TableHead>\n ))}\n {hasRowActions ? (\n <TableHead\n className={mergeClassNames(\n \"sticky top-0 z-30 border-x border-ds-border-2 bg-ds-surface-2 p-0\",\n isRtl\n ? \"left-0 shadow-[8px_0_12px_-10px_rgba(15,23,42,0.35)]\"\n : \"right-0 shadow-[-8px_0_12px_-10px_rgba(15,23,42,0.35)]\",\n ROW_ACTIONS_CELL_WIDTH_CLASS_NAME,\n headClassName,\n )}\n >\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px left-0 z-30 w-px bg-ds-border-2\"\n />\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute -inset-y-px right-0 z-30 w-px bg-ds-border-2\"\n />\n <div aria-hidden=\"true\" className=\"h-[45px] w-12\" />\n </TableHead>\n ) : null}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className={bodyClassName}>\n <DataTableRows\n table={table}\n hasRowActions={hasRowActions}\n isLoading={isLoading}\n bulkSelectionActive={bulkSelectionActive}\n selectedRowIds={selectedRowIds}\n onToggleRowSelection={handleToggleRowSelection}\n rowMenuOpen={rowMenuOpen}\n onToggleRowMenu={handleToggleRowMenu}\n onCloseRowMenu={handleCloseRowMenu}\n onRowAction={onRowAction}\n rowClassName={rowClassName}\n cellClassName={cellClassName}\n hasActiveFilters={hasActiveFilters}\n searchQuery={searchQuery}\n renderEmptyState={renderEmptyState}\n renderRowActionsCell={(context) =>\n hasRowActions ? (\n <RowActionsCell\n rowIndex={context.rowIndex}\n row={context.row}\n isOpen={context.isOpen}\n openDirection={context.openDirection}\n tableContainerRef={tableContainerRef}\n onToggle={context.onToggle}\n onClose={context.onClose}\n onRowAction={context.onRowAction}\n actions={resolvedRowActions}\n direction={tableDirection}\n />\n ) : null\n }\n />\n </TableBody>\n <TableFooter className={footerClassName} />\n </Table>\n </TableContainer>\n\n <div className={footerClassName}>\n <DataTablePagination\n table={table}\n totalCount={totalCount}\n filteredCount={filteredData.length}\n direction={tableDirection}\n />\n </div>\n </div>\n {/* Profile Modal */}\n <FilterProfile\n isOpen={profileOpen}\n onClose={() => setProfileOpen(false)}\n onSaveProfile={(name) => {\n handleSaveProfile(name);\n setProfileOpen(false);\n }}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -75,6 +75,7 @@ export interface DataTableProps<T = Record<string, any>> {
|
|
|
75
75
|
/** Maximum height for the scrollable table area */
|
|
76
76
|
maxHeight?: string;
|
|
77
77
|
onSearch?: (query: string) => void;
|
|
78
|
+
onRefresh?: () => void;
|
|
78
79
|
onExport?: () => void;
|
|
79
80
|
showRefreshButton?: boolean;
|
|
80
81
|
showExportButton?: boolean;
|
|
@@ -117,5 +118,5 @@ interface FilterProfileProps {
|
|
|
117
118
|
onSaveProfile: (name: string) => void;
|
|
118
119
|
}
|
|
119
120
|
export declare const FilterProfile: React.FC<FilterProfileProps>;
|
|
120
|
-
export default function DataTable<T = Record<string, any>>({ columns, data, isLoading, onColumnToggle, pageSize, maxHeight, onSearch, onExport, showRefreshButton, showExportButton, onRowAction, rowActions, onBulkDelete, renderBulkActions, renderBulkActionCard, onFilterChange, onFiltersApply, serverSideFiltering, filterOptions: externalFilterOptions, searchPlaceholder, totalCount, onPaginationChange, renderEmptyState, labels: labelsProp, renderFilterSelectorFooterActions, renderFilterRowActions, renderToolbarActions, className, tableContainerClassName, tableClassName, caption, captionClassName, headerClassName, headerRowClassName, headClassName, bodyClassName, rowClassName, cellClassName, footerClassName, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
121
|
+
export default function DataTable<T = Record<string, any>>({ columns, data, isLoading, onColumnToggle, pageSize, maxHeight, onSearch, onRefresh, onExport, showRefreshButton, showExportButton, onRowAction, rowActions, onBulkDelete, renderBulkActions, renderBulkActionCard, onFilterChange, onFiltersApply, serverSideFiltering, filterOptions: externalFilterOptions, searchPlaceholder, totalCount, onPaginationChange, renderEmptyState, labels: labelsProp, renderFilterSelectorFooterActions, renderFilterRowActions, renderToolbarActions, className, tableContainerClassName, tableClassName, caption, captionClassName, headerClassName, headerRowClassName, headClassName, bodyClassName, rowClassName, cellClassName, footerClassName, }: DataTableProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
121
122
|
//# sourceMappingURL=DataTable.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/data-table/DataTable.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../../src/components/data-display/data-table/DataTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export interface DataTableEmptyStateContext {
|
|
|
7
7
|
}
|
|
8
8
|
export interface DataTableRowsProps<T> {
|
|
9
9
|
table: TanStackTable<T>;
|
|
10
|
+
hasRowActions: boolean;
|
|
10
11
|
isLoading: boolean;
|
|
11
12
|
bulkSelectionActive: boolean;
|
|
12
13
|
selectedRowIds: Record<string, boolean>;
|
|
@@ -30,5 +31,5 @@ export interface DataTableRowsProps<T> {
|
|
|
30
31
|
onRowAction?: (action: string, row: T) => void;
|
|
31
32
|
}) => React.ReactNode;
|
|
32
33
|
}
|
|
33
|
-
export declare function DataTableRows<T>({ table, isLoading, bulkSelectionActive, selectedRowIds, onToggleRowSelection, rowMenuOpen, onToggleRowMenu, onCloseRowMenu, onRowAction, rowClassName, cellClassName, hasActiveFilters, searchQuery, renderEmptyState, renderRowActionsCell, }: DataTableRowsProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
34
|
+
export declare function DataTableRows<T>({ table, hasRowActions, isLoading, bulkSelectionActive, selectedRowIds, onToggleRowSelection, rowMenuOpen, onToggleRowMenu, onCloseRowMenu, onRowAction, rowClassName, cellClassName, hasActiveFilters, searchQuery, renderEmptyState, renderRowActionsCell, }: DataTableRowsProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
34
35
|
//# sourceMappingURL=DataTableRows.d.ts.map
|