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.
@@ -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 ? 2 : 1);
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-colors hover:bg-ds-surface-2 hover:text-ds-1 hover:opacity-100";
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, "relative z-10", isActive ? "text-ds-on-accent" : "text-ds-2"),
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-on-accent"),
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.jsxs)("div", {
341
- className: "relative overflow-hidden rounded-xl border border-ds-border-2 bg-ds-surface-1 p-1",
342
- children: [visibleActionIds.length > 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
343
- "aria-hidden": "true",
344
- className: "pointer-events-none absolute bottom-1 top-1 rounded-lg border border-ds-border-accent/35 bg-ds-accent shadow-[0_8px_20px_rgba(79,43,226,0.34)] transition-transform duration-300 ease-out",
345
- style: {
346
- width: `calc((100% - 0.5rem) / ${visibleActionIds.length})`,
347
- transform: `translateX(${visualActiveIndex * 100}%)`,
348
- insetInlineStart: "0.25rem"
349
- }
350
- }) : null, /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
351
- className: "grid min-w-[290px] items-center",
352
- style: { gridTemplateColumns: `repeat(${visibleActionIds.length}, minmax(0, 1fr))` },
353
- children: [
354
- showRefreshButton ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ToolbarActionButton, {
355
- title: labels.refresh,
356
- label: labels.refresh,
357
- isActive: activeAction === "refresh",
358
- onClick: () => {
359
- setActiveAction("refresh");
360
- onExport?.();
361
- },
362
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_icons.RefreshIcon, {
363
- className: TABLE_CONTROL_ICON_CLASS_NAME$1,
364
- "aria-hidden": "true"
365
- })
366
- }) : null,
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] bg-ds-surface-2 ",
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 && rowActions.length > 0 ? 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-z-YDzi0N.cjs.map
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 ![Unified Crystal Filters](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/data_table_crystal_filters_verification_1771807771898.png)\n <!-- slide -->\n ![Crystal Combobox Dropdown](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/crystal_look_verification_final_1771807597075.png)\n <!-- slide -->\n ![Global Unification Verification Recording](file:///Users/dani.dev/.gemini/antigravity/brain/cddc57db-96d9-409e-add9-b0c887fa88f1/verify_global_crystal_style_1771807684506.webp)\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