@procore/data-table 14.13.0 → 14.14.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.
@@ -792,6 +792,10 @@ interface DataTableConfig {
792
792
  } | undefined;
793
793
  rowHeight?: RowSize;
794
794
  serverFilters?: IServerFilter[];
795
+ groupRowState?: {
796
+ expandedRoutes: string[];
797
+ collapsedRoutes: string[];
798
+ };
795
799
  }
796
800
  interface HTMLStringExportConfig {
797
801
  header?: React.FunctionComponent;
@@ -1308,6 +1312,7 @@ interface InternalTableContext {
1308
1312
  onBulkEditUpdate: DataTableProps['onBulkEditUpdate'];
1309
1313
  onServerSideDataRequest?: DataTableProps['onServerSideDataRequest'];
1310
1314
  updateServerSideDataSource: (params: UpdateServerSideDataSourceParams) => void;
1315
+ localStoragePersistenceKey?: string;
1311
1316
  onTableConfigChange: () => void;
1312
1317
  rowHeight: RowSize;
1313
1318
  rowSelectionRef?: React__default.MutableRefObject<RowSelectionRef>;
@@ -1317,6 +1322,10 @@ interface InternalTableContext {
1317
1322
  setGridApi: (gridApi: GridApi) => void;
1318
1323
  setRowHeight: (rowHeight: RowSize, createTrackEvent?: boolean, triggerTableConfigChange?: boolean) => void;
1319
1324
  showExpandCollapseAllToggle: boolean;
1325
+ expandCollapseStateRef: React__default.MutableRefObject<{
1326
+ expandedRoutes: string[];
1327
+ collapsedRoutes: string[];
1328
+ }> | null;
1320
1329
  tableRef: React__default.RefObject<TableApi> | null;
1321
1330
  getColumnDefinition: (field: string) => ColumnDefinition | undefined;
1322
1331
  totalRowCount: number;
@@ -792,6 +792,10 @@ interface DataTableConfig {
792
792
  } | undefined;
793
793
  rowHeight?: RowSize;
794
794
  serverFilters?: IServerFilter[];
795
+ groupRowState?: {
796
+ expandedRoutes: string[];
797
+ collapsedRoutes: string[];
798
+ };
795
799
  }
796
800
  interface HTMLStringExportConfig {
797
801
  header?: React.FunctionComponent;
@@ -1308,6 +1312,7 @@ interface InternalTableContext {
1308
1312
  onBulkEditUpdate: DataTableProps['onBulkEditUpdate'];
1309
1313
  onServerSideDataRequest?: DataTableProps['onServerSideDataRequest'];
1310
1314
  updateServerSideDataSource: (params: UpdateServerSideDataSourceParams) => void;
1315
+ localStoragePersistenceKey?: string;
1311
1316
  onTableConfigChange: () => void;
1312
1317
  rowHeight: RowSize;
1313
1318
  rowSelectionRef?: React__default.MutableRefObject<RowSelectionRef>;
@@ -1317,6 +1322,10 @@ interface InternalTableContext {
1317
1322
  setGridApi: (gridApi: GridApi) => void;
1318
1323
  setRowHeight: (rowHeight: RowSize, createTrackEvent?: boolean, triggerTableConfigChange?: boolean) => void;
1319
1324
  showExpandCollapseAllToggle: boolean;
1325
+ expandCollapseStateRef: React__default.MutableRefObject<{
1326
+ expandedRoutes: string[];
1327
+ collapsedRoutes: string[];
1328
+ }> | null;
1320
1329
  tableRef: React__default.RefObject<TableApi> | null;
1321
1330
  getColumnDefinition: (field: string) => ColumnDefinition | undefined;
1322
1331
  totalRowCount: number;
@@ -53395,7 +53395,7 @@ var Renderer9 = ({
53395
53395
  if (isGroup || rowPinned && columnDefinition.aggFunc) {
53396
53396
  return /* @__PURE__ */ React76.createElement(Typography, { ...typographyProps, weight: "semibold" }, label);
53397
53397
  }
53398
- return /* @__PURE__ */ React76.createElement(Pill, { color: getColor(value), className: cx10("pill-cell") }, label?.toUpperCase());
53398
+ return /* @__PURE__ */ React76.createElement(Pill, { color: getColor(value), className: cx10("pill-cell") }, label);
53399
53399
  };
53400
53400
  var PillCellRenderer = withDataTableRenderer(Renderer9, "select");
53401
53401
  var Editor5 = React76.forwardRef(
@@ -53428,7 +53428,7 @@ var Editor5 = React76.forwardRef(
53428
53428
  }
53429
53429
  function getLabel3(item) {
53430
53430
  const unformattedLabel = columnDefinition.getStringFormattedValue?.(item) || "";
53431
- return unformattedLabel.toUpperCase();
53431
+ return unformattedLabel;
53432
53432
  }
53433
53433
  return /* @__PURE__ */ React76.createElement(
53434
53434
  PillSelect,
@@ -56521,9 +56521,10 @@ var GenericHeaderRenderer = (props) => {
56521
56521
  props.api.addEventListener("columnRowGroupChanged", updateExpandedState);
56522
56522
  return () => {
56523
56523
  props.column.removeEventListener("sortChanged", onSortChanged);
56524
- props.api.removeEventListener(
56524
+ removeEventListenerFromGrid(
56525
56525
  "columnRowGroupChanged",
56526
- updateExpandedState
56526
+ updateExpandedState,
56527
+ props.api
56527
56528
  );
56528
56529
  };
56529
56530
  }, [props.column]);
@@ -57589,6 +57590,7 @@ var InternalTableContext = React76.createContext({
57589
57590
  getRowHeight: () => () => rowSize.md,
57590
57591
  grandTotalsLabelInnerRenderer: void 0,
57591
57592
  gridApi: void 0,
57593
+ localStoragePersistenceKey: void 0,
57592
57594
  onBulkEditUpdate: () => Promise.resolve(),
57593
57595
  onServerSideDataRequest: void 0,
57594
57596
  onTableConfigChange: () => {
@@ -57605,6 +57607,7 @@ var InternalTableContext = React76.createContext({
57605
57607
  setRowHeight: () => {
57606
57608
  },
57607
57609
  showExpandCollapseAllToggle: false,
57610
+ expandCollapseStateRef: null,
57608
57611
  tableRef: null,
57609
57612
  getColumnDefinition: () => void 0,
57610
57613
  setSelectedGroupIndex: () => {
@@ -78019,6 +78022,61 @@ var buildDetailRowsConfig_ = (detailRowConfig, {
78019
78022
  };
78020
78023
  };
78021
78024
 
78025
+ // src/utils/expandRows.ts
78026
+ var getGroupRowState = (gridApi, groupDefaultExpanded = 0) => {
78027
+ const expandedRoutes = [];
78028
+ const collapsedRoutes = [];
78029
+ if (gridApi) {
78030
+ gridApi.forEachNode((node) => {
78031
+ const route = node.getRoute();
78032
+ if (route) {
78033
+ const routePath = route.join(",");
78034
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78035
+ if (node.level > defaultExpandLevel - 1) {
78036
+ if (node.expanded) {
78037
+ expandedRoutes.push(routePath);
78038
+ }
78039
+ } else if (!node.expanded) {
78040
+ collapsedRoutes.push(routePath);
78041
+ }
78042
+ }
78043
+ });
78044
+ }
78045
+ return { expandedRoutes, collapsedRoutes };
78046
+ };
78047
+ var setExpandCollapseRow = (gridApi, tableConfig, groupDefaultExpanded = 0) => {
78048
+ const expandedRoutes = tableConfig.groupRowState?.expandedRoutes ?? [];
78049
+ const collapsedRoutes = tableConfig.groupRowState?.collapsedRoutes ?? [];
78050
+ gridApi.forEachNode((node) => {
78051
+ const route = node.getRoute();
78052
+ if (route) {
78053
+ const routePath = route.join(",");
78054
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78055
+ if (node.level > defaultExpandLevel - 1) {
78056
+ if (expandedRoutes.includes(routePath)) {
78057
+ node.setExpanded(true);
78058
+ }
78059
+ } else if (collapsedRoutes.includes(routePath)) {
78060
+ node.setExpanded(false);
78061
+ }
78062
+ }
78063
+ });
78064
+ };
78065
+ var isRowOpenedByDefault = (node, tableConfig, groupDefaultExpanded = 0) => {
78066
+ const expandedRoutes = tableConfig?.groupRowState?.expandedRoutes ?? [];
78067
+ const collapsedRoutes = tableConfig?.groupRowState?.collapsedRoutes ?? [];
78068
+ const route = node.getRoute();
78069
+ if (!route) {
78070
+ return false;
78071
+ }
78072
+ const routePath = route.join(",");
78073
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78074
+ if (node.level > defaultExpandLevel - 1) {
78075
+ return expandedRoutes.includes(routePath);
78076
+ } else
78077
+ return !collapsedRoutes.includes(routePath);
78078
+ };
78079
+
78022
78080
  // src/utils/getRootRowNode.ts
78023
78081
  function getRootRowNode(rowNode) {
78024
78082
  return rowNode.level > 0 && rowNode.parent ? getRootRowNode(rowNode.parent) : rowNode;
@@ -80540,6 +80598,7 @@ var useTableApi = ({
80540
80598
  columnApi,
80541
80599
  columnDefinitions,
80542
80600
  gridApi,
80601
+ groupDefaultExpanded,
80543
80602
  setLoadingStatus,
80544
80603
  wrapperRef
80545
80604
  }) => {
@@ -80731,10 +80790,33 @@ var useTableApi = ({
80731
80790
  const setSearchValue = React76.useCallback(
80732
80791
  (value) => {
80733
80792
  gridApi?.setQuickFilter(value);
80793
+ gridApi?.forEachNodeAfterFilterAndSort((node) => {
80794
+ if (node.id) {
80795
+ const currentNode = rowSelectionRef?.current.affectedRows[node.id];
80796
+ if (currentNode && currentNode.selectedState === rowSelectionState.selected) {
80797
+ node.setSelected(true, false, "checkboxSelected");
80798
+ }
80799
+ }
80800
+ });
80734
80801
  resetPagination();
80802
+ gridApi?.redrawRows();
80735
80803
  },
80736
- [gridApi]
80804
+ [gridApi, rowSelectionRef.current]
80737
80805
  );
80806
+ React76.useEffect(() => {
80807
+ function handleRowSelection(event) {
80808
+ if (event.node.displayed && event.node.id) {
80809
+ rowSelectionRef.current.affectedRows[event.node.id] = {
80810
+ node: event.node,
80811
+ selectedState: event.node.isSelected() ? rowSelectionState.selected : rowSelectionState.unselected
80812
+ };
80813
+ }
80814
+ }
80815
+ gridApi?.addEventListener && gridApi.addEventListener("rowSelected", handleRowSelection);
80816
+ return () => {
80817
+ removeEventListenerFromGrid("rowSelected", handleRowSelection, gridApi);
80818
+ };
80819
+ }, [gridApi]);
80738
80820
  const setLoading = React76.useCallback((loading, message = "") => {
80739
80821
  setLoadingStatus({
80740
80822
  loading,
@@ -80795,6 +80877,7 @@ var useTableApi = ({
80795
80877
  adjustRowDragIcon(gridApi, columnApi);
80796
80878
  });
80797
80879
  }
80880
+ setExpandCollapseRow(gridApi, config, groupDefaultExpanded);
80798
80881
  },
80799
80882
  [columnApi, gridApi, internalSetRowHeight, filterStorage.setSelectedFilters]
80800
80883
  );
@@ -80886,7 +80969,8 @@ var useTableApi = ({
80886
80969
  columnApi,
80887
80970
  rowHeight,
80888
80971
  filterStorage,
80889
- rowSelectionRef
80972
+ rowSelectionRef,
80973
+ groupDefaultExpanded
80890
80974
  }),
80891
80975
  [columnApi, gridApi, rowHeight, filterStorage]
80892
80976
  );
@@ -81154,7 +81238,6 @@ function buildPartialTableApi({
81154
81238
  focusField && gridApi?.setFocusedCell(rowIndex, focusField);
81155
81239
  };
81156
81240
  return {
81157
- getVisibleRowNodes,
81158
81241
  applyTransaction,
81159
81242
  applyServerSideTransaction,
81160
81243
  collapseAll,
@@ -81169,6 +81252,7 @@ function buildPartialTableApi({
81169
81252
  getSelectedRows: getSelectedRows2,
81170
81253
  getServerSideSelectionState,
81171
81254
  getTableConfiguration,
81255
+ getVisibleRowNodes,
81172
81256
  refreshCells,
81173
81257
  setPinnedBottomRowData,
81174
81258
  setRowData,
@@ -81286,6 +81370,12 @@ var DataTable = ({
81286
81370
  const [rowHeight, setRowHeight] = React76.useState(
81287
81371
  initialTableConfig?.rowHeight || rowSize.md
81288
81372
  );
81373
+ const expandCollapseStateRef = React76.useRef(
81374
+ initialTableConfig?.groupRowState || {
81375
+ expandedRoutes: [],
81376
+ collapsedRoutes: []
81377
+ }
81378
+ );
81289
81379
  const rowHeightRef = React76.useRef(
81290
81380
  initialTableConfig?.rowHeight || rowSize.md
81291
81381
  );
@@ -81331,12 +81421,14 @@ var DataTable = ({
81331
81421
  if (localStoragePersistenceKey) {
81332
81422
  storage.local.setItem(localStoragePersistenceKey, {
81333
81423
  ...config,
81424
+ groupRowState: expandCollapseStateRef.current,
81334
81425
  rowHeight: rowHeightRef.current,
81335
81426
  serverFilters: filterStorage.filtersState
81336
81427
  });
81337
81428
  }
81338
81429
  onTableConfigChange?.({
81339
81430
  ...config,
81431
+ groupRowState: expandCollapseStateRef.current,
81340
81432
  rowHeight: rowHeightRef.current,
81341
81433
  serverFilters: filterStorage.filtersState
81342
81434
  });
@@ -81445,6 +81537,7 @@ var DataTable = ({
81445
81537
  onServerSideDataRequest,
81446
81538
  onTableConfigChange: internalOnTableConfigChange,
81447
81539
  rowSelectionRef,
81540
+ expandCollapseStateRef,
81448
81541
  rowHeight,
81449
81542
  searchStorage,
81450
81543
  selectedGroupIndex,
@@ -81546,8 +81639,10 @@ var Table = (props) => {
81546
81639
  columnDefinitions: internalTableContext.columnDefinitions,
81547
81640
  gridApi,
81548
81641
  setLoadingStatus,
81549
- wrapperRef
81642
+ wrapperRef,
81643
+ groupDefaultExpanded: props.groupDefaultExpanded
81550
81644
  });
81645
+ const initialTableConfig = internalTableContext.initialTableConfig;
81551
81646
  React76.useImperativeHandle(internalTableContext.tableRef, () => tableApi, [
81552
81647
  tableApi
81553
81648
  ]);
@@ -82054,6 +82149,34 @@ var Table = (props) => {
82054
82149
  document.getElementsByClassName("ag-body-viewport")[0]?.clientWidth
82055
82150
  );
82056
82151
  }, [setViewportWidth]);
82152
+ const isClientSideGroupOpenByDefault = React76.useCallback(
82153
+ (params) => {
82154
+ const node = params.rowNode;
82155
+ if (!node) {
82156
+ return false;
82157
+ }
82158
+ return isRowOpenedByDefault(
82159
+ node,
82160
+ initialTableConfig,
82161
+ props.groupsAlwaysExpanded ? -1 : props.groupDefaultExpanded
82162
+ );
82163
+ },
82164
+ [initialTableConfig, props.groupDefaultExpanded]
82165
+ );
82166
+ const isServerSideGroupOpenByDefault = React76.useCallback(
82167
+ (params) => {
82168
+ const node = params.rowNode;
82169
+ if (!node) {
82170
+ return false;
82171
+ }
82172
+ return isRowOpenedByDefault(
82173
+ node,
82174
+ initialTableConfig,
82175
+ props.groupsAlwaysExpanded ? -1 : props.groupDefaultExpanded
82176
+ );
82177
+ },
82178
+ [initialTableConfig, props.groupDefaultExpanded]
82179
+ );
82057
82180
  const onGridReady = (params) => {
82058
82181
  internalTableContext.setGridApi(params.api);
82059
82182
  internalTableContext.setColumnApi(params.columnApi);
@@ -82080,13 +82203,26 @@ var Table = (props) => {
82080
82203
  };
82081
82204
  const internalRowGroupOpened = React76.useCallback(
82082
82205
  (event) => {
82206
+ if (internalTableContext.expandCollapseStateRef) {
82207
+ internalTableContext.expandCollapseStateRef.current = getGroupRowState(
82208
+ gridApi,
82209
+ props.groupDefaultExpanded
82210
+ );
82211
+ }
82212
+ internalTableContext.onTableConfigChange();
82083
82213
  props.onRowGroupOpened?.({
82084
82214
  expanded: event.expanded,
82085
82215
  node: serializeNode(event.node),
82086
82216
  rowIndex: event.rowIndex
82087
82217
  });
82088
82218
  },
82089
- [props.onRowGroupOpened]
82219
+ [
82220
+ props.onRowGroupOpened,
82221
+ internalTableContext.onTableConfigChange,
82222
+ tableApi?.getTableConfiguration(),
82223
+ internalTableContext.expandCollapseStateRef?.current,
82224
+ gridApi
82225
+ ]
82090
82226
  );
82091
82227
  const getGroupRowAgg = React76.useCallback(
82092
82228
  (params) => {
@@ -82238,6 +82374,8 @@ var Table = (props) => {
82238
82374
  alwaysAggregateAtRootLevel: !onSSDR,
82239
82375
  autoGroupColumnDef: decoratedAutoGroupColDef,
82240
82376
  cacheBlockSize: props.paginationPageSize || defaultPaginationPageSize,
82377
+ isGroupOpenByDefault: isClientSideGroupOpenByDefault,
82378
+ isServerSideGroupOpenByDefault,
82241
82379
  defaultColDef,
82242
82380
  enableGroupEdit: internalTableContext.enableGroupEditAndValidation,
82243
82381
  enableCellTextSelection: internalTableContext.enableCellTextSelection,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@procore/data-table",
3
- "version": "14.13.0",
3
+ "version": "14.14.0",
4
4
  "description": "Complex data grid built on top of ag-grid, with DST components and styles.",
5
5
  "type": "module",
6
6
  "main": "dist/legacy/index.cjs",
@@ -109,9 +109,9 @@
109
109
  "@dotenvx/dotenvx": "1.6.4",
110
110
  "@ngneat/falso": "6.4.0",
111
111
  "@procore/core-css": "10.17.0",
112
- "@procore/core-icons": "12.1.0",
112
+ "@procore/core-icons": "12.2.0",
113
113
  "@procore/core-prettier": "10.2.0",
114
- "@procore/core-react": "12.10.0",
114
+ "@procore/core-react": "12.11.0",
115
115
  "@procore/eslint-config": "10.0.0",
116
116
  "@procore/globalization-toolkit": "3.1.0",
117
117
  "@procore/labs-financials-utils": "3.0.1",