@paubox/ui 3.5.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.esm.js CHANGED
@@ -36210,7 +36210,7 @@ var ResizeHandleContainer = styled.div(_templateObject3$3());
36210
36210
  var ResizeHandle = styled.div(_templateObject4$3(), neutral300$1);
36211
36211
  var SortIcon = styled.span(_templateObject5$2(), spacing(1));
36212
36212
  var TableHeader = function(param) {
36213
- var table = param.table, disableControls = param.disableControls, dense = param.dense, _param_testId = param.testId, testId = _param_testId === void 0 ? 'table' : _param_testId;
36213
+ var table = param.table, disableControls = param.disableControls, dense = param.dense, tableId = param.tableId;
36214
36214
  return /*#__PURE__*/ jsx(StyledHeader, {
36215
36215
  children: table.getHeaderGroups().map(function(headerGroup) {
36216
36216
  return /*#__PURE__*/ jsx("tr", {
@@ -36244,7 +36244,7 @@ var TableHeader = function(param) {
36244
36244
  cursor: header.column.getCanSort() ? 'pointer' : 'default',
36245
36245
  justifyContent: justifyContent
36246
36246
  },
36247
- "data-testid": header.column.getCanSort() ? "".concat(testId, "-column-header-").concat(formatForId(header.id), "-sort-button") : undefined,
36247
+ "data-testid": header.column.getCanSort() ? "".concat(tableId, "-column-header-").concat(formatForId(header.id), "-sort-button") : undefined,
36248
36248
  children: [
36249
36249
  flexRender(header.column.columnDef.header, header.getContext()),
36250
36250
  header.column.getCanSort() && /*#__PURE__*/ jsxs(SortIcon, {
@@ -36406,7 +36406,7 @@ var ClampWrapper = styled.div(_templateObject8(), function(props) {
36406
36406
  return props.maxLines;
36407
36407
  });
36408
36408
  var TableBody = function(param) {
36409
- var table = param.table, enableRowSelection = param.enableRowSelection, onRowClick = param.onRowClick, getRowDisabled = param.getRowDisabled, dense = param.dense, _param_testId = param.testId, testId = _param_testId === void 0 ? 'table' : _param_testId;
36409
+ var table = param.table, enableRowSelection = param.enableRowSelection, onRowClick = param.onRowClick, getRowDisabled = param.getRowDisabled, dense = param.dense, tableId = param.tableId;
36410
36410
  return /*#__PURE__*/ jsx(StyledTableBody, {
36411
36411
  children: table.getRowModel().rows.map(function(row) {
36412
36412
  var rowClickEnabled = enableRowSelection || !!onRowClick;
@@ -36422,7 +36422,7 @@ var TableBody = function(param) {
36422
36422
  cursor: rowClickEnabled ? isDisabled ? 'not-allowed' : 'pointer' : undefined
36423
36423
  },
36424
36424
  enableHover: rowClickEnabled,
36425
- "data-testid": "".concat(testId, "-row-").concat(row.id),
36425
+ "data-testid": "".concat(tableId, "-row-").concat(row.id),
36426
36426
  children: row.getVisibleCells().map(function(cell) {
36427
36427
  var cellValue = cell.getValue();
36428
36428
  var columnDef = cell.column.columnDef;
@@ -36698,11 +36698,25 @@ var BottomBar = styled.div(_templateObject3$1(), spacing(2));
36698
36698
  var TopBarElement = styled.div(_templateObject4$1(), spacing(1));
36699
36699
  var ContextMenuButton = styled(Button)(_templateObject5(), spacing(0.5));
36700
36700
  var Table = function(param) {
36701
- var columns = param.columns, _param_data = param.data, data = _param_data === void 0 ? [] : _param_data, getRowId = param.getRowId, _param_isLoading = param.isLoading, isLoading = _param_isLoading === void 0 ? false : _param_isLoading, _param_paginationMode = param.paginationMode, paginationMode = _param_paginationMode === void 0 ? 'page' : _param_paginationMode, pageInfo = param.pageInfo, subText = param.subText, onPageSizeChange = param.onPageSizeChange, pageSizeOptions = param.pageSizeOptions, onPageChange = param.onPageChange, sortBy = param.sortBy, sortOrder = param.sortOrder, onSortChange = param.onSortChange, _param_enableRowSelection = param.enableRowSelection, enableRowSelection = _param_enableRowSelection === void 0 ? false : _param_enableRowSelection, _param_selectedRows = param.selectedRows, selectedRows = _param_selectedRows === void 0 ? {} : _param_selectedRows, onRowSelectionChange = param.onRowSelectionChange, getRowDisabled = param.getRowDisabled, onRowClick = param.onRowClick, contextMenuActions = param.contextMenuActions, _param_dense = param.dense, dense = _param_dense === void 0 ? false : _param_dense, height = param.height, containerStyle = param.containerStyle, error = param.error, _param_testId = param.testId, testId = _param_testId === void 0 ? 'table' : _param_testId, toolbar = param.toolbar;
36701
+ var columns = param.columns, _param_data = param.data, data = _param_data === void 0 ? [] : _param_data, getRowId = param.getRowId, _param_isLoading = param.isLoading, isLoading = _param_isLoading === void 0 ? false : _param_isLoading, _param_paginationMode = param.paginationMode, paginationMode = _param_paginationMode === void 0 ? 'page' : _param_paginationMode, pageInfo = param.pageInfo, subText = param.subText, onPageSizeChange = param.onPageSizeChange, pageSizeOptions = param.pageSizeOptions, onPageChange = param.onPageChange, sortBy = param.sortBy, sortOrder = param.sortOrder, onSortChange = param.onSortChange, columnSizingProp = param.columnSizing, onColumnSizingChange = param.onColumnSizingChange, _param_enableRowSelection = param.enableRowSelection, enableRowSelection = _param_enableRowSelection === void 0 ? false : _param_enableRowSelection, _param_selectedRows = param.selectedRows, selectedRows = _param_selectedRows === void 0 ? {} : _param_selectedRows, onRowSelectionChange = param.onRowSelectionChange, getRowDisabled = param.getRowDisabled, onRowClick = param.onRowClick, contextMenuActions = param.contextMenuActions, _param_dense = param.dense, dense = _param_dense === void 0 ? false : _param_dense, height = param.height, containerStyle = param.containerStyle, error = param.error, tableId = param.tableId, toolbar = param.toolbar;
36702
36702
  var containerRef = useRef(null);
36703
36703
  var ctxMenuAnchorRef = useRef(null);
36704
- var _useState = _sliced_to_array$1(useState({}), 2), columnSizing = _useState[0], setColumnSizing = _useState[1];
36704
+ // Column widths support both controlled (consumer passes `columnSizing` +
36705
+ // `onColumnSizingChange`, e.g. to persist them) and uncontrolled (internal
36706
+ // state) modes.
36707
+ var _useState = _sliced_to_array$1(useState({}), 2), internalColumnSizing = _useState[0], setInternalColumnSizing = _useState[1];
36708
+ var isSizingControlled = columnSizingProp !== undefined;
36709
+ var columnSizing = isSizingControlled ? columnSizingProp : internalColumnSizing;
36705
36710
  var _useState1 = _sliced_to_array$1(useState(null), 2), ctxMenuRow = _useState1[0], setCtxMenuRow = _useState1[1];
36711
+ var handleColumnSizingChange = useCallback(function(updater) {
36712
+ var next = typeof updater === 'function' ? updater(columnSizing) : updater;
36713
+ if (!isSizingControlled) setInternalColumnSizing(next);
36714
+ onColumnSizingChange === null || onColumnSizingChange === void 0 ? void 0 : onColumnSizingChange(next);
36715
+ }, [
36716
+ columnSizing,
36717
+ isSizingControlled,
36718
+ onColumnSizingChange
36719
+ ]);
36706
36720
  var disableControls = isLoading || !(data === null || data === void 0 ? void 0 : data.length) || !!error;
36707
36721
  var hasSomePageProps = !!(pageInfo || onPageSizeChange || onPageChange);
36708
36722
  var hasPaginationHandlers = !!(onPageSizeChange && onPageChange);
@@ -36724,7 +36738,11 @@ var Table = function(param) {
36724
36738
  id: key,
36725
36739
  accessorKey: key,
36726
36740
  accessorFn: getter,
36727
- enableSorting: sortable,
36741
+ // Sorting is opt-in: a column is only sortable when it explicitly
36742
+ // sets `sortable: true`. (TanStack's own default is `true`, so we
36743
+ // coerce undefined to false here.) This prevents columns whose
36744
+ // backend can't sort them from presenting a sort affordance.
36745
+ enableSorting: sortable !== null && sortable !== void 0 ? sortable : false,
36728
36746
  enableResizing: !autoWidth,
36729
36747
  header: header
36730
36748
  }, restCol), {
@@ -36753,7 +36771,7 @@ var Table = function(param) {
36753
36771
  indeterminate: table.getIsSomeRowsSelected(),
36754
36772
  onChange: table.getToggleAllPageRowsSelectedHandler(),
36755
36773
  disabled: disableControls,
36756
- "data-testid": "".concat(testId, "-header-checkbox")
36774
+ "data-testid": "".concat(tableId, "-header-checkbox")
36757
36775
  });
36758
36776
  },
36759
36777
  cell: function(param) {
@@ -36766,13 +36784,13 @@ var Table = function(param) {
36766
36784
  return e.stopPropagation();
36767
36785
  },
36768
36786
  onChange: row.getToggleSelectedHandler(),
36769
- "data-testid": "".concat(testId, "-row-").concat(row.id, "-checkbox")
36787
+ "data-testid": "".concat(tableId, "-row-").concat(row.id, "-checkbox")
36770
36788
  });
36771
36789
  }
36772
36790
  };
36773
36791
  }, [
36774
36792
  disableControls,
36775
- testId
36793
+ tableId
36776
36794
  ]);
36777
36795
  var handleContextMenu = useCallback(function(e, row) {
36778
36796
  e.stopPropagation();
@@ -36801,7 +36819,7 @@ var Table = function(param) {
36801
36819
  e.stopPropagation();
36802
36820
  handleContextMenu(e, row);
36803
36821
  },
36804
- "data-testid": "".concat(testId, "-row-").concat(row.id, "-context-menu-button"),
36822
+ "data-testid": "".concat(tableId, "-row-").concat(row.id, "-context-menu-button"),
36805
36823
  style: {
36806
36824
  margin: '0 auto'
36807
36825
  },
@@ -36811,7 +36829,7 @@ var Table = function(param) {
36811
36829
  };
36812
36830
  }, [
36813
36831
  handleContextMenu,
36814
- testId,
36832
+ tableId,
36815
36833
  ctxMenuRow
36816
36834
  ]);
36817
36835
  var allColumns = useMemo(function() {
@@ -36879,7 +36897,7 @@ var Table = function(param) {
36879
36897
  getFilteredRowModel: getFilteredRowModel(),
36880
36898
  onRowSelectionChange: onRowSelectionChange,
36881
36899
  enableRowSelection: !!enableRowSelection,
36882
- onColumnSizingChange: setColumnSizing,
36900
+ onColumnSizingChange: handleColumnSizingChange,
36883
36901
  columnResizeMode: 'onChange'
36884
36902
  });
36885
36903
  var renderPagination = function() {
@@ -36892,7 +36910,7 @@ var Table = function(param) {
36892
36910
  resetContainerScroll();
36893
36911
  onPageSizeChange(size);
36894
36912
  },
36895
- testId: "".concat(testId, "-pagination")
36913
+ testId: "".concat(tableId, "-pagination")
36896
36914
  };
36897
36915
  return paginationMode === 'page' && 'currentPage' in pageInfo ? /*#__PURE__*/ jsx(Pagination, _object_spread_props$2(_object_spread$2({
36898
36916
  mode: "page",
@@ -36914,6 +36932,7 @@ var Table = function(param) {
36914
36932
  };
36915
36933
  var showTopBar = hasPaginationHandlers || toolbar;
36916
36934
  return /*#__PURE__*/ jsxs("div", {
36935
+ "data-testid": tableId,
36917
36936
  children: [
36918
36937
  showTopBar && /*#__PURE__*/ jsxs(TopBar, {
36919
36938
  children: [
@@ -36977,7 +36996,7 @@ var Table = function(param) {
36977
36996
  table: table,
36978
36997
  disableControls: disableControls,
36979
36998
  dense: dense,
36980
- testId: testId
36999
+ tableId: tableId
36981
37000
  }),
36982
37001
  /*#__PURE__*/ jsx(TableBody, {
36983
37002
  table: table,
@@ -36985,7 +37004,7 @@ var Table = function(param) {
36985
37004
  onRowClick: onRowClick,
36986
37005
  getRowDisabled: getRowDisabled,
36987
37006
  dense: dense,
36988
- testId: testId
37007
+ tableId: tableId
36989
37008
  })
36990
37009
  ]
36991
37010
  })
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@paubox/ui",
3
3
  "author": "Paubox, Inc.",
4
4
  "description": "Paubox Component Library",
5
- "version": "3.5.0",
5
+ "version": "5.0.0",
6
6
  "type": "module",
7
7
  "private": false,
8
8
  "publishConfig": {
@@ -1,5 +1,5 @@
1
1
  import { CSSProperties, HTMLProps, ReactNode } from 'react';
2
- import { ColumnDef, OnChangeFn, Row } from '@tanstack/react-table';
2
+ import { ColumnDef, OnChangeFn, Row, ColumnSizingState } from '@tanstack/react-table';
3
3
  import { PageInfoPageBased, PageInfoCursorBased } from '../Pagination/Pagination';
4
4
  export type CellOverflow = 'truncate' | 'wrap' | 'clamp';
5
5
  export type ColumnAlign = 'left' | 'right' | 'center';
@@ -43,6 +43,21 @@ interface TableRowProps<T> {
43
43
  getRowDisabled?: (row: T) => boolean;
44
44
  contextMenuActions?: RowAction<T>[];
45
45
  }
46
+ interface TableSizingProps {
47
+ /**
48
+ * Controlled column widths, keyed by column `key`. When provided, the table
49
+ * is controlled — the consumer owns the value (e.g. seeded from persisted
50
+ * state) and must update it via `onColumnSizingChange`. When omitted, the
51
+ * table manages widths internally.
52
+ */
53
+ columnSizing?: ColumnSizingState;
54
+ /**
55
+ * Called with the fully-resolved next column-sizing state whenever the user
56
+ * resizes a column. Mirrors `onSortChange`: the consumer receives a plain
57
+ * value (not a TanStack updater), so it can persist it directly.
58
+ */
59
+ onColumnSizingChange?: (columnSizing: ColumnSizingState) => void;
60
+ }
46
61
  interface PaginationProps {
47
62
  paginationMode?: 'page' | 'cursor';
48
63
  pageInfo?: PageInfoPageBased | PageInfoCursorBased;
@@ -53,7 +68,20 @@ interface PaginationProps {
53
68
  }
54
69
  interface TableDataProps<T> {
55
70
  columns: TableColumn<T>[];
56
- testId?: string;
71
+ /**
72
+ * Stable, app-wide-unique identifier for this table. Required.
73
+ *
74
+ * Serves two purposes:
75
+ * - Namespaces every derived `data-testid` (rows, checkboxes, headers,
76
+ * context menus, pagination) and is rendered as the root `data-testid`.
77
+ * - Acts as the persistence key consumers use to store per-table view
78
+ * state (sort, column widths).
79
+ *
80
+ * Contract: must be stable for the life of the table and unique across the
81
+ * whole app — NOT just the current page. Changing it orphans any persisted
82
+ * state and breaks selectors that reference the old value.
83
+ */
84
+ tableId: string;
57
85
  data?: T[];
58
86
  getRowId: (originalRow: T, index: number, parent?: Row<T> | undefined) => string;
59
87
  isLoading?: boolean;
@@ -63,7 +91,7 @@ interface TableDataProps<T> {
63
91
  error?: string;
64
92
  toolbar?: ReactNode | ReactNode[];
65
93
  }
66
- export interface TableProps<T extends object> extends TableStyleProps, TableRowProps<T>, TableDataProps<T>, PaginationProps {
94
+ export interface TableProps<T extends object> extends TableStyleProps, TableRowProps<T>, TableDataProps<T>, TableSizingProps, PaginationProps {
67
95
  }
68
- export declare const Table: <T extends object>({ columns, data, getRowId, isLoading, paginationMode, pageInfo, subText, onPageSizeChange, pageSizeOptions, onPageChange, sortBy, sortOrder, onSortChange, enableRowSelection, selectedRows, onRowSelectionChange, getRowDisabled, onRowClick, contextMenuActions, dense, height, containerStyle, error, testId, toolbar, }: TableProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
96
+ export declare const Table: <T extends object>({ columns, data, getRowId, isLoading, paginationMode, pageInfo, subText, onPageSizeChange, pageSizeOptions, onPageChange, sortBy, sortOrder, onSortChange, columnSizing: columnSizingProp, onColumnSizingChange, enableRowSelection, selectedRows, onRowSelectionChange, getRowDisabled, onRowClick, contextMenuActions, dense, height, containerStyle, error, tableId, toolbar, }: TableProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
69
97
  export {};
@@ -6,7 +6,7 @@ interface TableBodyProps<T extends object> {
6
6
  title?: string;
7
7
  dense: boolean;
8
8
  getRowDisabled?: (row: T) => boolean;
9
- testId?: string;
9
+ tableId: string;
10
10
  }
11
- export declare const TableBody: <T extends object>({ table, enableRowSelection, onRowClick, getRowDisabled, dense, testId, }: TableBodyProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
11
+ export declare const TableBody: <T extends object>({ table, enableRowSelection, onRowClick, getRowDisabled, dense, tableId, }: TableBodyProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
12
12
  export {};
@@ -3,7 +3,7 @@ interface TableHeaderProps<T> {
3
3
  table: Table<T>;
4
4
  disableControls: boolean;
5
5
  dense: boolean;
6
- testId?: string;
6
+ tableId: string;
7
7
  }
8
- export declare const TableHeader: <T extends object>({ table, disableControls, dense, testId, }: TableHeaderProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
8
+ export declare const TableHeader: <T extends object>({ table, disableControls, dense, tableId, }: TableHeaderProps<T>) => import("@emotion/react/jsx-runtime").JSX.Element;
9
9
  export {};