@paubox/ui 3.5.0 → 4.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);
@@ -36753,7 +36767,7 @@ var Table = function(param) {
36753
36767
  indeterminate: table.getIsSomeRowsSelected(),
36754
36768
  onChange: table.getToggleAllPageRowsSelectedHandler(),
36755
36769
  disabled: disableControls,
36756
- "data-testid": "".concat(testId, "-header-checkbox")
36770
+ "data-testid": "".concat(tableId, "-header-checkbox")
36757
36771
  });
36758
36772
  },
36759
36773
  cell: function(param) {
@@ -36766,13 +36780,13 @@ var Table = function(param) {
36766
36780
  return e.stopPropagation();
36767
36781
  },
36768
36782
  onChange: row.getToggleSelectedHandler(),
36769
- "data-testid": "".concat(testId, "-row-").concat(row.id, "-checkbox")
36783
+ "data-testid": "".concat(tableId, "-row-").concat(row.id, "-checkbox")
36770
36784
  });
36771
36785
  }
36772
36786
  };
36773
36787
  }, [
36774
36788
  disableControls,
36775
- testId
36789
+ tableId
36776
36790
  ]);
36777
36791
  var handleContextMenu = useCallback(function(e, row) {
36778
36792
  e.stopPropagation();
@@ -36801,7 +36815,7 @@ var Table = function(param) {
36801
36815
  e.stopPropagation();
36802
36816
  handleContextMenu(e, row);
36803
36817
  },
36804
- "data-testid": "".concat(testId, "-row-").concat(row.id, "-context-menu-button"),
36818
+ "data-testid": "".concat(tableId, "-row-").concat(row.id, "-context-menu-button"),
36805
36819
  style: {
36806
36820
  margin: '0 auto'
36807
36821
  },
@@ -36811,7 +36825,7 @@ var Table = function(param) {
36811
36825
  };
36812
36826
  }, [
36813
36827
  handleContextMenu,
36814
- testId,
36828
+ tableId,
36815
36829
  ctxMenuRow
36816
36830
  ]);
36817
36831
  var allColumns = useMemo(function() {
@@ -36879,7 +36893,7 @@ var Table = function(param) {
36879
36893
  getFilteredRowModel: getFilteredRowModel(),
36880
36894
  onRowSelectionChange: onRowSelectionChange,
36881
36895
  enableRowSelection: !!enableRowSelection,
36882
- onColumnSizingChange: setColumnSizing,
36896
+ onColumnSizingChange: handleColumnSizingChange,
36883
36897
  columnResizeMode: 'onChange'
36884
36898
  });
36885
36899
  var renderPagination = function() {
@@ -36892,7 +36906,7 @@ var Table = function(param) {
36892
36906
  resetContainerScroll();
36893
36907
  onPageSizeChange(size);
36894
36908
  },
36895
- testId: "".concat(testId, "-pagination")
36909
+ testId: "".concat(tableId, "-pagination")
36896
36910
  };
36897
36911
  return paginationMode === 'page' && 'currentPage' in pageInfo ? /*#__PURE__*/ jsx(Pagination, _object_spread_props$2(_object_spread$2({
36898
36912
  mode: "page",
@@ -36914,6 +36928,7 @@ var Table = function(param) {
36914
36928
  };
36915
36929
  var showTopBar = hasPaginationHandlers || toolbar;
36916
36930
  return /*#__PURE__*/ jsxs("div", {
36931
+ "data-testid": tableId,
36917
36932
  children: [
36918
36933
  showTopBar && /*#__PURE__*/ jsxs(TopBar, {
36919
36934
  children: [
@@ -36977,7 +36992,7 @@ var Table = function(param) {
36977
36992
  table: table,
36978
36993
  disableControls: disableControls,
36979
36994
  dense: dense,
36980
- testId: testId
36995
+ tableId: tableId
36981
36996
  }),
36982
36997
  /*#__PURE__*/ jsx(TableBody, {
36983
36998
  table: table,
@@ -36985,7 +37000,7 @@ var Table = function(param) {
36985
37000
  onRowClick: onRowClick,
36986
37001
  getRowDisabled: getRowDisabled,
36987
37002
  dense: dense,
36988
- testId: testId
37003
+ tableId: tableId
36989
37004
  })
36990
37005
  ]
36991
37006
  })
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": "4.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 {};