@procore/data-table 14.5.1 → 14.6.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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Change Log
2
2
 
3
+ ## 14.6.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 2bbf160ec: Prevent filters from resetting to initial state on every columnDefinition changes.
8
+ - 1908a0e84: Expose `groupSelectsChildren` on `TableProps` and `getServerSideSelectionState` on `TableApi` in order to support group row selection on SSRM tables
9
+
10
+ ### Patch Changes
11
+
12
+ - ba88a21d9: Fixes type definitions.
13
+ - Updated dependencies [ba88a21d9]
14
+ - @procore/labs-group-by-select@3.1.2
15
+
3
16
  ## 14.5.1
4
17
 
5
18
  ### Patch Changes
@@ -656,9 +669,9 @@ TextCellColumnDefinition<
656
669
  'customBottomRowRenderer', // pinned row renderer
657
670
  string,
658
671
  string
659
- >;
672
+ >
660
673
  // v8
661
- TextCellColumnDefinition<string, string, string>;
674
+ TextCellColumnDefinition<string, string, string>
662
675
  ```
663
676
 
664
677
  ### Server Side Row Model Breaking Changes
@@ -577,6 +577,10 @@ interface TableApi {
577
577
  getFilteredAndSortedRowNodes: () => RowNode[];
578
578
  getListFilter: (field: string) => Promise<any | undefined>;
579
579
  getListFilters: (fields?: string[]) => Promise<ListFilter[]>;
580
+ /**
581
+ * Enables the ability to grab the complete selection state of an SSRM table when some of the selected rows have not yet been fetched.
582
+ */
583
+ getServerSideSelectionState: () => ReturnType<GridApi['getServerSideSelectionState']> | undefined;
580
584
  getTableConfiguration: () => DataTableConfig;
581
585
  getBulkEditColumns: () => ColumnDefinition[];
582
586
  hideContextPanel: ContextPanelApi['hide'];
@@ -641,7 +645,7 @@ interface TableApi {
641
645
  */
642
646
  setIsRowSelectable?(isRowSelectableFunc: IsRowSelectable): void;
643
647
  }
644
- type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
648
+ type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getServerSideSelectionState' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
645
649
  type AgDomLayout = 'normal' | 'autoHeight' | 'print' | undefined;
646
650
  interface IsRowSelectable {
647
651
  (node: RowNode): boolean;
@@ -932,6 +936,7 @@ interface TableProps<TRow = any, TBottomRow = any> {
932
936
  getSubtotalLabel?: (columnDefinition: ColumnDefinition, rowData: TRow, value: string | number) => string;
933
937
  groupDefaultExpanded?: number;
934
938
  groupIncludeFooter?: boolean;
939
+ groupSelectsChildren?: boolean;
935
940
  headerHeight?: number;
936
941
  hideActionsOnGroupedRow?: boolean;
937
942
  initialGroupOrderComparator?: (nodeA: RowNode, nodeB: RowNode) => number;
@@ -1340,7 +1345,11 @@ declare const _default$1: (({ analytics, children, columnDefinitions: _columnDef
1340
1345
  overlayMatchesTriggerWidth?: boolean | undefined;
1341
1346
  }>;
1342
1347
  RowGroupSelector: React__default.FC<{
1343
- localeText: GroupBySelectProps;
1348
+ localeText: {
1349
+ reset: string;
1350
+ placeholder: string;
1351
+ selectedItemsPrefix?: string | undefined;
1352
+ };
1344
1353
  }>;
1345
1354
  Search: React__default.FunctionComponent<SearchProps>;
1346
1355
  Table: React__default.FC<Omit<TableProps<any, any>, "selectionSSREnabled" | "modules">>;
@@ -1373,7 +1382,11 @@ declare const _default: (({ analytics, children, columnDefinitions: _columnDefin
1373
1382
  overlayMatchesTriggerWidth?: boolean | undefined;
1374
1383
  }>;
1375
1384
  RowGroupSelector: React__default.FC<{
1376
- localeText: GroupBySelectProps;
1385
+ localeText: {
1386
+ reset: string;
1387
+ placeholder: string;
1388
+ selectedItemsPrefix?: string | undefined;
1389
+ };
1377
1390
  }>;
1378
1391
  Search: React__default.FunctionComponent<SearchProps>;
1379
1392
  Table: React__default.FC<Omit<TableProps<any, any>, "rows" | "modules">>;
@@ -577,6 +577,10 @@ interface TableApi {
577
577
  getFilteredAndSortedRowNodes: () => RowNode[];
578
578
  getListFilter: (field: string) => Promise<any | undefined>;
579
579
  getListFilters: (fields?: string[]) => Promise<ListFilter[]>;
580
+ /**
581
+ * Enables the ability to grab the complete selection state of an SSRM table when some of the selected rows have not yet been fetched.
582
+ */
583
+ getServerSideSelectionState: () => ReturnType<GridApi['getServerSideSelectionState']> | undefined;
580
584
  getTableConfiguration: () => DataTableConfig;
581
585
  getBulkEditColumns: () => ColumnDefinition[];
582
586
  hideContextPanel: ContextPanelApi['hide'];
@@ -641,7 +645,7 @@ interface TableApi {
641
645
  */
642
646
  setIsRowSelectable?(isRowSelectableFunc: IsRowSelectable): void;
643
647
  }
644
- type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
648
+ type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getServerSideSelectionState' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
645
649
  type AgDomLayout = 'normal' | 'autoHeight' | 'print' | undefined;
646
650
  interface IsRowSelectable {
647
651
  (node: RowNode): boolean;
@@ -932,6 +936,7 @@ interface TableProps<TRow = any, TBottomRow = any> {
932
936
  getSubtotalLabel?: (columnDefinition: ColumnDefinition, rowData: TRow, value: string | number) => string;
933
937
  groupDefaultExpanded?: number;
934
938
  groupIncludeFooter?: boolean;
939
+ groupSelectsChildren?: boolean;
935
940
  headerHeight?: number;
936
941
  hideActionsOnGroupedRow?: boolean;
937
942
  initialGroupOrderComparator?: (nodeA: RowNode, nodeB: RowNode) => number;
@@ -1340,7 +1345,11 @@ declare const _default$1: (({ analytics, children, columnDefinitions: _columnDef
1340
1345
  overlayMatchesTriggerWidth?: boolean | undefined;
1341
1346
  }>;
1342
1347
  RowGroupSelector: React__default.FC<{
1343
- localeText: GroupBySelectProps;
1348
+ localeText: {
1349
+ reset: string;
1350
+ placeholder: string;
1351
+ selectedItemsPrefix?: string | undefined;
1352
+ };
1344
1353
  }>;
1345
1354
  Search: React__default.FunctionComponent<SearchProps>;
1346
1355
  Table: React__default.FC<Omit<TableProps<any, any>, "selectionSSREnabled" | "modules">>;
@@ -1373,7 +1382,11 @@ declare const _default: (({ analytics, children, columnDefinitions: _columnDefin
1373
1382
  overlayMatchesTriggerWidth?: boolean | undefined;
1374
1383
  }>;
1375
1384
  RowGroupSelector: React__default.FC<{
1376
- localeText: GroupBySelectProps;
1385
+ localeText: {
1386
+ reset: string;
1387
+ placeholder: string;
1388
+ selectedItemsPrefix?: string | undefined;
1389
+ };
1377
1390
  }>;
1378
1391
  Search: React__default.FunctionComponent<SearchProps>;
1379
1392
  Table: React__default.FC<Omit<TableProps<any, any>, "rows" | "modules">>;
@@ -56133,6 +56133,14 @@ function findNode(predicate, gridApi) {
56133
56133
  return searchTarget;
56134
56134
  }
56135
56135
 
56136
+ // src/utils/isServerSideGroupSelectionState.ts
56137
+ function isServerSideGroupSelectionState(value) {
56138
+ if (value === null) {
56139
+ return false;
56140
+ }
56141
+ return value.selectAll === void 0;
56142
+ }
56143
+
56136
56144
  // src/GenericHeader/genericHeader.scss
56137
56145
  var css7 = `.ag-header-cell .data-table-header-menu {
56138
56146
  opacity: 1;
@@ -56546,13 +56554,22 @@ var GenericHeaderRenderer = (props) => {
56546
56554
  return;
56547
56555
  }
56548
56556
  function updateSelectAllCheckbox(e) {
56557
+ var _a2;
56549
56558
  if (e.source === "uiSelectAll") {
56550
56559
  return;
56551
56560
  }
56561
+ const selectionState = props.api.getServerSideSelectionState();
56562
+ const isGroupSelection = isServerSideGroupSelectionState(selectionState);
56563
+ const isSelectionStatePartialSelected = Boolean(
56564
+ (_a2 = selectionState == null ? void 0 : selectionState.toggledNodes) == null ? void 0 : _a2.length
56565
+ );
56566
+ const isSelectionStateSelectAll = !isSelectionStatePartialSelected && Boolean(
56567
+ isGroupSelection ? selectionState.selectAllChildren : selectionState == null ? void 0 : selectionState.selectAll
56568
+ );
56552
56569
  const isPagination = Boolean(props.api.paginationGetRowCount());
56553
56570
  const currentRows = getCurrentRows(props.api, isPagination);
56554
- const isAllSelected = currentRows.length && currentRows.every(isRowSelected);
56555
- const isPartialSelected = !isAllSelected && currentRows.some(isRowSelected);
56571
+ const isAllSelected = isPagination ? currentRows.length && currentRows.every(isRowSelected) : isSelectionStateSelectAll;
56572
+ const isPartialSelected = isPagination ? !isAllSelected && currentRows.some(isRowSelected) : isSelectionStatePartialSelected;
56556
56573
  if (isAllSelected) {
56557
56574
  setSelectAll("all" /* All */);
56558
56575
  } else if (isPartialSelected) {
@@ -56577,24 +56594,28 @@ var GenericHeaderRenderer = (props) => {
56577
56594
  };
56578
56595
  }, [isFirstColumn2, props.selectionSSREnabled, props.api, onSSDR]);
56579
56596
  const toggleSelectAll = React83__default.default.useCallback(() => {
56580
- var _a2, _b, _c;
56597
+ var _a2, _b, _c, _d, _e;
56581
56598
  const nextSelectedState = selectAll === "all" /* All */ ? "none" /* None */ : "all" /* All */;
56582
56599
  setSelectAll(nextSelectedState);
56583
56600
  (_a2 = props.onSelectAll) == null ? void 0 : _a2.call(props, nextSelectedState);
56584
56601
  const isSelectAll = nextSelectedState == "all" /* All */;
56585
56602
  if (props.selectionSSREnabled) {
56586
56603
  const isPagination = Boolean(props.api.paginationGetRowCount());
56587
- const rowsIdsToSelectOrDeselect = getCurrentRows(
56588
- props.api,
56589
- isPagination
56590
- ).map((node) => node.id);
56591
- isSelectAll ? (_b = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _b.selectRows(
56592
- rowsIdsToSelectOrDeselect,
56593
- "uiSelectAll"
56594
- ) : (_c = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _c.deselectRows(
56595
- rowsIdsToSelectOrDeselect,
56596
- "uiSelectAll"
56597
- );
56604
+ if (isPagination) {
56605
+ const rowsIdsToSelectOrDeselect = getCurrentRows(
56606
+ props.api,
56607
+ isPagination
56608
+ ).map((node) => node.id);
56609
+ isSelectAll ? (_b = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _b.selectRows(
56610
+ rowsIdsToSelectOrDeselect,
56611
+ "uiSelectAll"
56612
+ ) : (_c = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _c.deselectRows(
56613
+ rowsIdsToSelectOrDeselect,
56614
+ "uiSelectAll"
56615
+ );
56616
+ } else {
56617
+ isSelectAll ? (_d = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _d.selectAll() : (_e = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _e.deselectAll();
56618
+ }
56598
56619
  } else {
56599
56620
  isSelectAll ? props.api.selectAllFiltered() : props.api.deselectAllFiltered();
56600
56621
  }
@@ -56975,7 +56996,7 @@ function shapeActiveFilters(filters = emptyArray2) {
56975
56996
  field
56976
56997
  };
56977
56998
  });
56978
- return { state };
56999
+ return state;
56979
57000
  }
56980
57001
  function useFilterStorage({
56981
57002
  columnDefinitions,
@@ -56986,7 +57007,7 @@ function useFilterStorage({
56986
57007
  filterable: emptyObj,
56987
57008
  filterOptions: emptyObj,
56988
57009
  possibleFilters: emptyArray2,
56989
- selectedFilters: emptyObj
57010
+ selectedFilters: shapeActiveFilters(initialSelectedFilters)
56990
57011
  });
56991
57012
  function getOptions(field) {
56992
57013
  return filtersState.filterOptions[field];
@@ -57009,16 +57030,25 @@ function useFilterStorage({
57009
57030
  const filterableColumns = columnDefinitions.filter(
57010
57031
  (col) => col.filterRenderer
57011
57032
  );
57012
- const { state } = shapeActiveFilters(initialSelectedFilters);
57033
+ const filterableMap = filterableColumns.reduce((acc, curr) => {
57034
+ return {
57035
+ ...acc,
57036
+ [curr.field]: curr
57037
+ };
57038
+ }, {});
57039
+ const selectedFiltersState = Object.entries(
57040
+ filtersState.selectedFilters ?? {}
57041
+ ).filter(([field]) => Object.keys(filterableMap).includes(field)).reduce(
57042
+ (acc, [field, filterState]) => ({
57043
+ ...acc,
57044
+ [field]: filterState
57045
+ }),
57046
+ {}
57047
+ );
57013
57048
  setFiltersState((prev) => ({
57014
57049
  ...prev,
57015
- filterable: filterableColumns.reduce((acc, curr) => {
57016
- return {
57017
- ...acc,
57018
- [curr.field]: curr
57019
- };
57020
- }, {}),
57021
- selectedFilters: state,
57050
+ filterable: filterableMap,
57051
+ selectedFilters: selectedFiltersState,
57022
57052
  possibleFilters: filterableColumns.sort(sortColumnDefinitionsByFilterIndex).map(getFieldAttr)
57023
57053
  }));
57024
57054
  }, [columnDefinitions]);
@@ -57032,7 +57062,7 @@ function useFilterStorage({
57032
57062
  (selectedFilters) => {
57033
57063
  setFiltersState((prev) => ({
57034
57064
  ...prev,
57035
- selectedFilters: shapeActiveFilters(selectedFilters).state
57065
+ selectedFilters: shapeActiveFilters(selectedFilters)
57036
57066
  }));
57037
57067
  },
57038
57068
  []
@@ -81233,6 +81263,15 @@ var useTableApi = ({
81233
81263
  }),
81234
81264
  [columnApi, gridApi, rowHeight, filterStorage]
81235
81265
  );
81266
+ function deselectParentsWithoutChildrenOrSelectAll(state, gridApi2) {
81267
+ var _a, _b, _c;
81268
+ if (state.selectAllChildren === false && !((_a = state.toggledNodes) == null ? void 0 : _a.length)) {
81269
+ (_b = gridApi2.getRowNode(state.nodeId || "")) == null ? void 0 : _b.setSelected(false);
81270
+ }
81271
+ (_c = state.toggledNodes) == null ? void 0 : _c.forEach(
81272
+ (node) => deselectParentsWithoutChildrenOrSelectAll(node, gridApi2)
81273
+ );
81274
+ }
81236
81275
  const onSelectionChanged = (rowNode) => {
81237
81276
  var _a;
81238
81277
  const isGrouped = rowNode.group || ((_a = rowNode.parent) == null ? void 0 : _a.group) && !isNodeRootLevelOfGrid(rowNode.parent);
@@ -81254,13 +81293,18 @@ var useTableApi = ({
81254
81293
  currAffectedRows
81255
81294
  );
81256
81295
  const rowValues = Object.values(rowsToUpdate);
81257
- rowValues.forEach((row2) => {
81258
- row2.node.setSelected(
81259
- row2.selectedState === rowSelectionState.selected,
81260
- false,
81261
- "checkboxSelected"
81262
- );
81263
- });
81296
+ const selectionState = gridApi == null ? void 0 : gridApi.getServerSideSelectionState();
81297
+ if (selectionState && isServerSideGroupSelectionState(selectionState) && gridApi) {
81298
+ deselectParentsWithoutChildrenOrSelectAll(selectionState, gridApi);
81299
+ } else {
81300
+ rowValues.forEach((row2) => {
81301
+ row2.node.setSelected(
81302
+ row2.selectedState === rowSelectionState.selected,
81303
+ false,
81304
+ "checkboxSelected"
81305
+ );
81306
+ });
81307
+ }
81264
81308
  rowSelectionRef.current.affectedRows = {
81265
81309
  ...currAffectedRows,
81266
81310
  ...rowsToUpdate
@@ -81384,6 +81428,7 @@ function buildPartialTableApi({
81384
81428
  rowSelectionRef
81385
81429
  }) : void 0;
81386
81430
  };
81431
+ const getServerSideSelectionState = () => gridApi == null ? void 0 : gridApi.getServerSideSelectionState();
81387
81432
  const getTableConfiguration = () => {
81388
81433
  var _a;
81389
81434
  const columnState = (columnApi == null ? void 0 : columnApi.getColumnState().filter(
@@ -81499,6 +81544,7 @@ function buildPartialTableApi({
81499
81544
  getRootAggregateData,
81500
81545
  getRowData,
81501
81546
  getSelectedRows: getSelectedRows2,
81547
+ getServerSideSelectionState,
81502
81548
  getTableConfiguration,
81503
81549
  refreshCells,
81504
81550
  setPinnedBottomRowData,
@@ -82587,7 +82633,7 @@ var Table = (props) => {
82587
82633
  groupDefaultExpanded: props.groupDefaultExpanded,
82588
82634
  groupIncludeFooter: !onSSDR && props.groupIncludeFooter === void 0 ? true : props.groupIncludeFooter,
82589
82635
  getGroupRowAgg: props.getGroupRowAgg ? getGroupRowAgg : void 0,
82590
- groupSelectsChildren: !onSSDR,
82636
+ groupSelectsChildren: props.groupSelectsChildren || !onSSDR,
82591
82637
  groupSelectsFiltered: true,
82592
82638
  headerHeight: props.headerHeight,
82593
82639
  icons: tableIcons,
@@ -56119,6 +56119,14 @@ function findNode(predicate, gridApi) {
56119
56119
  return searchTarget;
56120
56120
  }
56121
56121
 
56122
+ // src/utils/isServerSideGroupSelectionState.ts
56123
+ function isServerSideGroupSelectionState(value) {
56124
+ if (value === null) {
56125
+ return false;
56126
+ }
56127
+ return value.selectAll === void 0;
56128
+ }
56129
+
56122
56130
  // src/GenericHeader/genericHeader.scss
56123
56131
  var css7 = `.ag-header-cell .data-table-header-menu {
56124
56132
  opacity: 1;
@@ -56532,13 +56540,22 @@ var GenericHeaderRenderer = (props) => {
56532
56540
  return;
56533
56541
  }
56534
56542
  function updateSelectAllCheckbox(e) {
56543
+ var _a2;
56535
56544
  if (e.source === "uiSelectAll") {
56536
56545
  return;
56537
56546
  }
56547
+ const selectionState = props.api.getServerSideSelectionState();
56548
+ const isGroupSelection = isServerSideGroupSelectionState(selectionState);
56549
+ const isSelectionStatePartialSelected = Boolean(
56550
+ (_a2 = selectionState == null ? void 0 : selectionState.toggledNodes) == null ? void 0 : _a2.length
56551
+ );
56552
+ const isSelectionStateSelectAll = !isSelectionStatePartialSelected && Boolean(
56553
+ isGroupSelection ? selectionState.selectAllChildren : selectionState == null ? void 0 : selectionState.selectAll
56554
+ );
56538
56555
  const isPagination = Boolean(props.api.paginationGetRowCount());
56539
56556
  const currentRows = getCurrentRows(props.api, isPagination);
56540
- const isAllSelected = currentRows.length && currentRows.every(isRowSelected);
56541
- const isPartialSelected = !isAllSelected && currentRows.some(isRowSelected);
56557
+ const isAllSelected = isPagination ? currentRows.length && currentRows.every(isRowSelected) : isSelectionStateSelectAll;
56558
+ const isPartialSelected = isPagination ? !isAllSelected && currentRows.some(isRowSelected) : isSelectionStatePartialSelected;
56542
56559
  if (isAllSelected) {
56543
56560
  setSelectAll("all" /* All */);
56544
56561
  } else if (isPartialSelected) {
@@ -56563,24 +56580,28 @@ var GenericHeaderRenderer = (props) => {
56563
56580
  };
56564
56581
  }, [isFirstColumn2, props.selectionSSREnabled, props.api, onSSDR]);
56565
56582
  const toggleSelectAll = React83.useCallback(() => {
56566
- var _a2, _b, _c;
56583
+ var _a2, _b, _c, _d, _e;
56567
56584
  const nextSelectedState = selectAll === "all" /* All */ ? "none" /* None */ : "all" /* All */;
56568
56585
  setSelectAll(nextSelectedState);
56569
56586
  (_a2 = props.onSelectAll) == null ? void 0 : _a2.call(props, nextSelectedState);
56570
56587
  const isSelectAll = nextSelectedState == "all" /* All */;
56571
56588
  if (props.selectionSSREnabled) {
56572
56589
  const isPagination = Boolean(props.api.paginationGetRowCount());
56573
- const rowsIdsToSelectOrDeselect = getCurrentRows(
56574
- props.api,
56575
- isPagination
56576
- ).map((node) => node.id);
56577
- isSelectAll ? (_b = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _b.selectRows(
56578
- rowsIdsToSelectOrDeselect,
56579
- "uiSelectAll"
56580
- ) : (_c = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _c.deselectRows(
56581
- rowsIdsToSelectOrDeselect,
56582
- "uiSelectAll"
56583
- );
56590
+ if (isPagination) {
56591
+ const rowsIdsToSelectOrDeselect = getCurrentRows(
56592
+ props.api,
56593
+ isPagination
56594
+ ).map((node) => node.id);
56595
+ isSelectAll ? (_b = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _b.selectRows(
56596
+ rowsIdsToSelectOrDeselect,
56597
+ "uiSelectAll"
56598
+ ) : (_c = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _c.deselectRows(
56599
+ rowsIdsToSelectOrDeselect,
56600
+ "uiSelectAll"
56601
+ );
56602
+ } else {
56603
+ isSelectAll ? (_d = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _d.selectAll() : (_e = tableRef == null ? void 0 : tableRef.current) == null ? void 0 : _e.deselectAll();
56604
+ }
56584
56605
  } else {
56585
56606
  isSelectAll ? props.api.selectAllFiltered() : props.api.deselectAllFiltered();
56586
56607
  }
@@ -56961,7 +56982,7 @@ function shapeActiveFilters(filters = emptyArray2) {
56961
56982
  field
56962
56983
  };
56963
56984
  });
56964
- return { state };
56985
+ return state;
56965
56986
  }
56966
56987
  function useFilterStorage({
56967
56988
  columnDefinitions,
@@ -56972,7 +56993,7 @@ function useFilterStorage({
56972
56993
  filterable: emptyObj,
56973
56994
  filterOptions: emptyObj,
56974
56995
  possibleFilters: emptyArray2,
56975
- selectedFilters: emptyObj
56996
+ selectedFilters: shapeActiveFilters(initialSelectedFilters)
56976
56997
  });
56977
56998
  function getOptions(field) {
56978
56999
  return filtersState.filterOptions[field];
@@ -56995,16 +57016,25 @@ function useFilterStorage({
56995
57016
  const filterableColumns = columnDefinitions.filter(
56996
57017
  (col) => col.filterRenderer
56997
57018
  );
56998
- const { state } = shapeActiveFilters(initialSelectedFilters);
57019
+ const filterableMap = filterableColumns.reduce((acc, curr) => {
57020
+ return {
57021
+ ...acc,
57022
+ [curr.field]: curr
57023
+ };
57024
+ }, {});
57025
+ const selectedFiltersState = Object.entries(
57026
+ filtersState.selectedFilters ?? {}
57027
+ ).filter(([field]) => Object.keys(filterableMap).includes(field)).reduce(
57028
+ (acc, [field, filterState]) => ({
57029
+ ...acc,
57030
+ [field]: filterState
57031
+ }),
57032
+ {}
57033
+ );
56999
57034
  setFiltersState((prev) => ({
57000
57035
  ...prev,
57001
- filterable: filterableColumns.reduce((acc, curr) => {
57002
- return {
57003
- ...acc,
57004
- [curr.field]: curr
57005
- };
57006
- }, {}),
57007
- selectedFilters: state,
57036
+ filterable: filterableMap,
57037
+ selectedFilters: selectedFiltersState,
57008
57038
  possibleFilters: filterableColumns.sort(sortColumnDefinitionsByFilterIndex).map(getFieldAttr)
57009
57039
  }));
57010
57040
  }, [columnDefinitions]);
@@ -57018,7 +57048,7 @@ function useFilterStorage({
57018
57048
  (selectedFilters) => {
57019
57049
  setFiltersState((prev) => ({
57020
57050
  ...prev,
57021
- selectedFilters: shapeActiveFilters(selectedFilters).state
57051
+ selectedFilters: shapeActiveFilters(selectedFilters)
57022
57052
  }));
57023
57053
  },
57024
57054
  []
@@ -81219,6 +81249,15 @@ var useTableApi = ({
81219
81249
  }),
81220
81250
  [columnApi, gridApi, rowHeight, filterStorage]
81221
81251
  );
81252
+ function deselectParentsWithoutChildrenOrSelectAll(state, gridApi2) {
81253
+ var _a, _b, _c;
81254
+ if (state.selectAllChildren === false && !((_a = state.toggledNodes) == null ? void 0 : _a.length)) {
81255
+ (_b = gridApi2.getRowNode(state.nodeId || "")) == null ? void 0 : _b.setSelected(false);
81256
+ }
81257
+ (_c = state.toggledNodes) == null ? void 0 : _c.forEach(
81258
+ (node) => deselectParentsWithoutChildrenOrSelectAll(node, gridApi2)
81259
+ );
81260
+ }
81222
81261
  const onSelectionChanged = (rowNode) => {
81223
81262
  var _a;
81224
81263
  const isGrouped = rowNode.group || ((_a = rowNode.parent) == null ? void 0 : _a.group) && !isNodeRootLevelOfGrid(rowNode.parent);
@@ -81240,13 +81279,18 @@ var useTableApi = ({
81240
81279
  currAffectedRows
81241
81280
  );
81242
81281
  const rowValues = Object.values(rowsToUpdate);
81243
- rowValues.forEach((row2) => {
81244
- row2.node.setSelected(
81245
- row2.selectedState === rowSelectionState.selected,
81246
- false,
81247
- "checkboxSelected"
81248
- );
81249
- });
81282
+ const selectionState = gridApi == null ? void 0 : gridApi.getServerSideSelectionState();
81283
+ if (selectionState && isServerSideGroupSelectionState(selectionState) && gridApi) {
81284
+ deselectParentsWithoutChildrenOrSelectAll(selectionState, gridApi);
81285
+ } else {
81286
+ rowValues.forEach((row2) => {
81287
+ row2.node.setSelected(
81288
+ row2.selectedState === rowSelectionState.selected,
81289
+ false,
81290
+ "checkboxSelected"
81291
+ );
81292
+ });
81293
+ }
81250
81294
  rowSelectionRef.current.affectedRows = {
81251
81295
  ...currAffectedRows,
81252
81296
  ...rowsToUpdate
@@ -81370,6 +81414,7 @@ function buildPartialTableApi({
81370
81414
  rowSelectionRef
81371
81415
  }) : void 0;
81372
81416
  };
81417
+ const getServerSideSelectionState = () => gridApi == null ? void 0 : gridApi.getServerSideSelectionState();
81373
81418
  const getTableConfiguration = () => {
81374
81419
  var _a;
81375
81420
  const columnState = (columnApi == null ? void 0 : columnApi.getColumnState().filter(
@@ -81485,6 +81530,7 @@ function buildPartialTableApi({
81485
81530
  getRootAggregateData,
81486
81531
  getRowData,
81487
81532
  getSelectedRows: getSelectedRows2,
81533
+ getServerSideSelectionState,
81488
81534
  getTableConfiguration,
81489
81535
  refreshCells,
81490
81536
  setPinnedBottomRowData,
@@ -82573,7 +82619,7 @@ var Table = (props) => {
82573
82619
  groupDefaultExpanded: props.groupDefaultExpanded,
82574
82620
  groupIncludeFooter: !onSSDR && props.groupIncludeFooter === void 0 ? true : props.groupIncludeFooter,
82575
82621
  getGroupRowAgg: props.getGroupRowAgg ? getGroupRowAgg : void 0,
82576
- groupSelectsChildren: !onSSDR,
82622
+ groupSelectsChildren: props.groupSelectsChildren || !onSSDR,
82577
82623
  groupSelectsFiltered: true,
82578
82624
  headerHeight: props.headerHeight,
82579
82625
  icons: tableIcons,
@@ -577,6 +577,10 @@ interface TableApi {
577
577
  getFilteredAndSortedRowNodes: () => RowNode[];
578
578
  getListFilter: (field: string) => Promise<any | undefined>;
579
579
  getListFilters: (fields?: string[]) => Promise<ListFilter[]>;
580
+ /**
581
+ * Enables the ability to grab the complete selection state of an SSRM table when some of the selected rows have not yet been fetched.
582
+ */
583
+ getServerSideSelectionState: () => ReturnType<GridApi['getServerSideSelectionState']> | undefined;
580
584
  getTableConfiguration: () => DataTableConfig;
581
585
  getBulkEditColumns: () => ColumnDefinition[];
582
586
  hideContextPanel: ContextPanelApi['hide'];
@@ -641,7 +645,7 @@ interface TableApi {
641
645
  */
642
646
  setIsRowSelectable?(isRowSelectableFunc: IsRowSelectable): void;
643
647
  }
644
- type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
648
+ type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getServerSideSelectionState' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
645
649
  type AgDomLayout = 'normal' | 'autoHeight' | 'print' | undefined;
646
650
  interface IsRowSelectable {
647
651
  (node: RowNode): boolean;
@@ -932,6 +936,7 @@ interface TableProps<TRow = any, TBottomRow = any> {
932
936
  getSubtotalLabel?: (columnDefinition: ColumnDefinition, rowData: TRow, value: string | number) => string;
933
937
  groupDefaultExpanded?: number;
934
938
  groupIncludeFooter?: boolean;
939
+ groupSelectsChildren?: boolean;
935
940
  headerHeight?: number;
936
941
  hideActionsOnGroupedRow?: boolean;
937
942
  initialGroupOrderComparator?: (nodeA: RowNode, nodeB: RowNode) => number;
@@ -1340,7 +1345,11 @@ declare const _default$1: (({ analytics, children, columnDefinitions: _columnDef
1340
1345
  overlayMatchesTriggerWidth?: boolean | undefined;
1341
1346
  }>;
1342
1347
  RowGroupSelector: React__default.FC<{
1343
- localeText: GroupBySelectProps;
1348
+ localeText: {
1349
+ reset: string;
1350
+ placeholder: string;
1351
+ selectedItemsPrefix?: string | undefined;
1352
+ };
1344
1353
  }>;
1345
1354
  Search: React__default.FunctionComponent<SearchProps>;
1346
1355
  Table: React__default.FC<Omit<TableProps<any, any>, "selectionSSREnabled" | "modules">>;
@@ -1373,7 +1382,11 @@ declare const _default: (({ analytics, children, columnDefinitions: _columnDefin
1373
1382
  overlayMatchesTriggerWidth?: boolean | undefined;
1374
1383
  }>;
1375
1384
  RowGroupSelector: React__default.FC<{
1376
- localeText: GroupBySelectProps;
1385
+ localeText: {
1386
+ reset: string;
1387
+ placeholder: string;
1388
+ selectedItemsPrefix?: string | undefined;
1389
+ };
1377
1390
  }>;
1378
1391
  Search: React__default.FunctionComponent<SearchProps>;
1379
1392
  Table: React__default.FC<Omit<TableProps<any, any>, "rows" | "modules">>;
@@ -577,6 +577,10 @@ interface TableApi {
577
577
  getFilteredAndSortedRowNodes: () => RowNode[];
578
578
  getListFilter: (field: string) => Promise<any | undefined>;
579
579
  getListFilters: (fields?: string[]) => Promise<ListFilter[]>;
580
+ /**
581
+ * Enables the ability to grab the complete selection state of an SSRM table when some of the selected rows have not yet been fetched.
582
+ */
583
+ getServerSideSelectionState: () => ReturnType<GridApi['getServerSideSelectionState']> | undefined;
580
584
  getTableConfiguration: () => DataTableConfig;
581
585
  getBulkEditColumns: () => ColumnDefinition[];
582
586
  hideContextPanel: ContextPanelApi['hide'];
@@ -641,7 +645,7 @@ interface TableApi {
641
645
  */
642
646
  setIsRowSelectable?(isRowSelectableFunc: IsRowSelectable): void;
643
647
  }
644
- type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
648
+ type PartialTableApi = Pick<TableApi, 'applyTransaction' | 'applyServerSideTransaction' | 'collapseAll' | 'deselectAll' | 'expandAll' | 'getColumnDefinitions' | 'getDetailGridTableApi' | 'getFilteredAndSortedRowNodes' | 'getRootAggregateData' | 'getRowData' | 'getSelectedRows' | 'getServerSideSelectionState' | 'getTableConfiguration' | 'refreshCells' | 'scrollToRow' | 'selectAll' | 'setPinnedBottomRowData' | 'setRowData' | 'setRowNodeExpanded' | 'sizeColumnsToFit'>;
645
649
  type AgDomLayout = 'normal' | 'autoHeight' | 'print' | undefined;
646
650
  interface IsRowSelectable {
647
651
  (node: RowNode): boolean;
@@ -932,6 +936,7 @@ interface TableProps<TRow = any, TBottomRow = any> {
932
936
  getSubtotalLabel?: (columnDefinition: ColumnDefinition, rowData: TRow, value: string | number) => string;
933
937
  groupDefaultExpanded?: number;
934
938
  groupIncludeFooter?: boolean;
939
+ groupSelectsChildren?: boolean;
935
940
  headerHeight?: number;
936
941
  hideActionsOnGroupedRow?: boolean;
937
942
  initialGroupOrderComparator?: (nodeA: RowNode, nodeB: RowNode) => number;
@@ -1340,7 +1345,11 @@ declare const _default$1: (({ analytics, children, columnDefinitions: _columnDef
1340
1345
  overlayMatchesTriggerWidth?: boolean | undefined;
1341
1346
  }>;
1342
1347
  RowGroupSelector: React__default.FC<{
1343
- localeText: GroupBySelectProps;
1348
+ localeText: {
1349
+ reset: string;
1350
+ placeholder: string;
1351
+ selectedItemsPrefix?: string | undefined;
1352
+ };
1344
1353
  }>;
1345
1354
  Search: React__default.FunctionComponent<SearchProps>;
1346
1355
  Table: React__default.FC<Omit<TableProps<any, any>, "selectionSSREnabled" | "modules">>;
@@ -1373,7 +1382,11 @@ declare const _default: (({ analytics, children, columnDefinitions: _columnDefin
1373
1382
  overlayMatchesTriggerWidth?: boolean | undefined;
1374
1383
  }>;
1375
1384
  RowGroupSelector: React__default.FC<{
1376
- localeText: GroupBySelectProps;
1385
+ localeText: {
1386
+ reset: string;
1387
+ placeholder: string;
1388
+ selectedItemsPrefix?: string | undefined;
1389
+ };
1377
1390
  }>;
1378
1391
  Search: React__default.FunctionComponent<SearchProps>;
1379
1392
  Table: React__default.FC<Omit<TableProps<any, any>, "rows" | "modules">>;
@@ -56046,6 +56046,14 @@ function findNode(predicate, gridApi) {
56046
56046
  return searchTarget;
56047
56047
  }
56048
56048
 
56049
+ // src/utils/isServerSideGroupSelectionState.ts
56050
+ function isServerSideGroupSelectionState(value) {
56051
+ if (value === null) {
56052
+ return false;
56053
+ }
56054
+ return value.selectAll === void 0;
56055
+ }
56056
+
56049
56057
  // src/GenericHeader/genericHeader.scss
56050
56058
  var css7 = `.ag-header-cell .data-table-header-menu {
56051
56059
  opacity: 1;
@@ -56455,10 +56463,18 @@ var GenericHeaderRenderer = (props) => {
56455
56463
  if (e.source === "uiSelectAll") {
56456
56464
  return;
56457
56465
  }
56466
+ const selectionState = props.api.getServerSideSelectionState();
56467
+ const isGroupSelection = isServerSideGroupSelectionState(selectionState);
56468
+ const isSelectionStatePartialSelected = Boolean(
56469
+ selectionState?.toggledNodes?.length
56470
+ );
56471
+ const isSelectionStateSelectAll = !isSelectionStatePartialSelected && Boolean(
56472
+ isGroupSelection ? selectionState.selectAllChildren : selectionState?.selectAll
56473
+ );
56458
56474
  const isPagination = Boolean(props.api.paginationGetRowCount());
56459
56475
  const currentRows = getCurrentRows(props.api, isPagination);
56460
- const isAllSelected = currentRows.length && currentRows.every(isRowSelected);
56461
- const isPartialSelected = !isAllSelected && currentRows.some(isRowSelected);
56476
+ const isAllSelected = isPagination ? currentRows.length && currentRows.every(isRowSelected) : isSelectionStateSelectAll;
56477
+ const isPartialSelected = isPagination ? !isAllSelected && currentRows.some(isRowSelected) : isSelectionStatePartialSelected;
56462
56478
  if (isAllSelected) {
56463
56479
  setSelectAll("all" /* All */);
56464
56480
  } else if (isPartialSelected) {
@@ -56489,17 +56505,21 @@ var GenericHeaderRenderer = (props) => {
56489
56505
  const isSelectAll = nextSelectedState == "all" /* All */;
56490
56506
  if (props.selectionSSREnabled) {
56491
56507
  const isPagination = Boolean(props.api.paginationGetRowCount());
56492
- const rowsIdsToSelectOrDeselect = getCurrentRows(
56493
- props.api,
56494
- isPagination
56495
- ).map((node) => node.id);
56496
- isSelectAll ? tableRef?.current?.selectRows(
56497
- rowsIdsToSelectOrDeselect,
56498
- "uiSelectAll"
56499
- ) : tableRef?.current?.deselectRows(
56500
- rowsIdsToSelectOrDeselect,
56501
- "uiSelectAll"
56502
- );
56508
+ if (isPagination) {
56509
+ const rowsIdsToSelectOrDeselect = getCurrentRows(
56510
+ props.api,
56511
+ isPagination
56512
+ ).map((node) => node.id);
56513
+ isSelectAll ? tableRef?.current?.selectRows(
56514
+ rowsIdsToSelectOrDeselect,
56515
+ "uiSelectAll"
56516
+ ) : tableRef?.current?.deselectRows(
56517
+ rowsIdsToSelectOrDeselect,
56518
+ "uiSelectAll"
56519
+ );
56520
+ } else {
56521
+ isSelectAll ? tableRef?.current?.selectAll() : tableRef?.current?.deselectAll();
56522
+ }
56503
56523
  } else {
56504
56524
  isSelectAll ? props.api.selectAllFiltered() : props.api.deselectAllFiltered();
56505
56525
  }
@@ -56872,7 +56892,7 @@ function shapeActiveFilters(filters = emptyArray2) {
56872
56892
  field
56873
56893
  };
56874
56894
  });
56875
- return { state };
56895
+ return state;
56876
56896
  }
56877
56897
  function useFilterStorage({
56878
56898
  columnDefinitions,
@@ -56883,7 +56903,7 @@ function useFilterStorage({
56883
56903
  filterable: emptyObj,
56884
56904
  filterOptions: emptyObj,
56885
56905
  possibleFilters: emptyArray2,
56886
- selectedFilters: emptyObj
56906
+ selectedFilters: shapeActiveFilters(initialSelectedFilters)
56887
56907
  });
56888
56908
  function getOptions(field) {
56889
56909
  return filtersState.filterOptions[field];
@@ -56906,16 +56926,25 @@ function useFilterStorage({
56906
56926
  const filterableColumns = columnDefinitions.filter(
56907
56927
  (col) => col.filterRenderer
56908
56928
  );
56909
- const { state } = shapeActiveFilters(initialSelectedFilters);
56929
+ const filterableMap = filterableColumns.reduce((acc, curr) => {
56930
+ return {
56931
+ ...acc,
56932
+ [curr.field]: curr
56933
+ };
56934
+ }, {});
56935
+ const selectedFiltersState = Object.entries(
56936
+ filtersState.selectedFilters ?? {}
56937
+ ).filter(([field]) => Object.keys(filterableMap).includes(field)).reduce(
56938
+ (acc, [field, filterState]) => ({
56939
+ ...acc,
56940
+ [field]: filterState
56941
+ }),
56942
+ {}
56943
+ );
56910
56944
  setFiltersState((prev) => ({
56911
56945
  ...prev,
56912
- filterable: filterableColumns.reduce((acc, curr) => {
56913
- return {
56914
- ...acc,
56915
- [curr.field]: curr
56916
- };
56917
- }, {}),
56918
- selectedFilters: state,
56946
+ filterable: filterableMap,
56947
+ selectedFilters: selectedFiltersState,
56919
56948
  possibleFilters: filterableColumns.sort(sortColumnDefinitionsByFilterIndex).map(getFieldAttr)
56920
56949
  }));
56921
56950
  }, [columnDefinitions]);
@@ -56929,7 +56958,7 @@ function useFilterStorage({
56929
56958
  (selectedFilters) => {
56930
56959
  setFiltersState((prev) => ({
56931
56960
  ...prev,
56932
- selectedFilters: shapeActiveFilters(selectedFilters).state
56961
+ selectedFilters: shapeActiveFilters(selectedFilters)
56933
56962
  }));
56934
56963
  },
56935
56964
  []
@@ -81069,6 +81098,14 @@ var useTableApi = ({
81069
81098
  }),
81070
81099
  [columnApi, gridApi, rowHeight, filterStorage]
81071
81100
  );
81101
+ function deselectParentsWithoutChildrenOrSelectAll(state, gridApi2) {
81102
+ if (state.selectAllChildren === false && !state.toggledNodes?.length) {
81103
+ gridApi2.getRowNode(state.nodeId || "")?.setSelected(false);
81104
+ }
81105
+ state.toggledNodes?.forEach(
81106
+ (node) => deselectParentsWithoutChildrenOrSelectAll(node, gridApi2)
81107
+ );
81108
+ }
81072
81109
  const onSelectionChanged = (rowNode) => {
81073
81110
  const isGrouped = rowNode.group || rowNode.parent?.group && !isNodeRootLevelOfGrid(rowNode.parent);
81074
81111
  const currAffectedRows = rowSelectionRef.current.affectedRows;
@@ -81089,13 +81126,18 @@ var useTableApi = ({
81089
81126
  currAffectedRows
81090
81127
  );
81091
81128
  const rowValues = Object.values(rowsToUpdate);
81092
- rowValues.forEach((row2) => {
81093
- row2.node.setSelected(
81094
- row2.selectedState === rowSelectionState.selected,
81095
- false,
81096
- "checkboxSelected"
81097
- );
81098
- });
81129
+ const selectionState = gridApi?.getServerSideSelectionState();
81130
+ if (selectionState && isServerSideGroupSelectionState(selectionState) && gridApi) {
81131
+ deselectParentsWithoutChildrenOrSelectAll(selectionState, gridApi);
81132
+ } else {
81133
+ rowValues.forEach((row2) => {
81134
+ row2.node.setSelected(
81135
+ row2.selectedState === rowSelectionState.selected,
81136
+ false,
81137
+ "checkboxSelected"
81138
+ );
81139
+ });
81140
+ }
81099
81141
  rowSelectionRef.current.affectedRows = {
81100
81142
  ...currAffectedRows,
81101
81143
  ...rowsToUpdate
@@ -81217,6 +81259,7 @@ function buildPartialTableApi({
81217
81259
  rowSelectionRef
81218
81260
  }) : void 0;
81219
81261
  };
81262
+ const getServerSideSelectionState = () => gridApi?.getServerSideSelectionState();
81220
81263
  const getTableConfiguration = () => {
81221
81264
  const columnState = columnApi?.getColumnState().filter(
81222
81265
  (column2) => !["rowActions", "rowActions-pinned"].includes(
@@ -81330,6 +81373,7 @@ function buildPartialTableApi({
81330
81373
  getRootAggregateData,
81331
81374
  getRowData,
81332
81375
  getSelectedRows: getSelectedRows2,
81376
+ getServerSideSelectionState,
81333
81377
  getTableConfiguration,
81334
81378
  refreshCells,
81335
81379
  setPinnedBottomRowData,
@@ -82381,7 +82425,7 @@ var Table = (props) => {
82381
82425
  groupDefaultExpanded: props.groupDefaultExpanded,
82382
82426
  groupIncludeFooter: !onSSDR && props.groupIncludeFooter === void 0 ? true : props.groupIncludeFooter,
82383
82427
  getGroupRowAgg: props.getGroupRowAgg ? getGroupRowAgg : void 0,
82384
- groupSelectsChildren: !onSSDR,
82428
+ groupSelectsChildren: props.groupSelectsChildren || !onSSDR,
82385
82429
  groupSelectsFiltered: true,
82386
82430
  headerHeight: props.headerHeight,
82387
82431
  icons: tableIcons,
@@ -56032,6 +56032,14 @@ function findNode(predicate, gridApi) {
56032
56032
  return searchTarget;
56033
56033
  }
56034
56034
 
56035
+ // src/utils/isServerSideGroupSelectionState.ts
56036
+ function isServerSideGroupSelectionState(value) {
56037
+ if (value === null) {
56038
+ return false;
56039
+ }
56040
+ return value.selectAll === void 0;
56041
+ }
56042
+
56035
56043
  // src/GenericHeader/genericHeader.scss
56036
56044
  var css7 = `.ag-header-cell .data-table-header-menu {
56037
56045
  opacity: 1;
@@ -56441,10 +56449,18 @@ var GenericHeaderRenderer = (props) => {
56441
56449
  if (e.source === "uiSelectAll") {
56442
56450
  return;
56443
56451
  }
56452
+ const selectionState = props.api.getServerSideSelectionState();
56453
+ const isGroupSelection = isServerSideGroupSelectionState(selectionState);
56454
+ const isSelectionStatePartialSelected = Boolean(
56455
+ selectionState?.toggledNodes?.length
56456
+ );
56457
+ const isSelectionStateSelectAll = !isSelectionStatePartialSelected && Boolean(
56458
+ isGroupSelection ? selectionState.selectAllChildren : selectionState?.selectAll
56459
+ );
56444
56460
  const isPagination = Boolean(props.api.paginationGetRowCount());
56445
56461
  const currentRows = getCurrentRows(props.api, isPagination);
56446
- const isAllSelected = currentRows.length && currentRows.every(isRowSelected);
56447
- const isPartialSelected = !isAllSelected && currentRows.some(isRowSelected);
56462
+ const isAllSelected = isPagination ? currentRows.length && currentRows.every(isRowSelected) : isSelectionStateSelectAll;
56463
+ const isPartialSelected = isPagination ? !isAllSelected && currentRows.some(isRowSelected) : isSelectionStatePartialSelected;
56448
56464
  if (isAllSelected) {
56449
56465
  setSelectAll("all" /* All */);
56450
56466
  } else if (isPartialSelected) {
@@ -56475,17 +56491,21 @@ var GenericHeaderRenderer = (props) => {
56475
56491
  const isSelectAll = nextSelectedState == "all" /* All */;
56476
56492
  if (props.selectionSSREnabled) {
56477
56493
  const isPagination = Boolean(props.api.paginationGetRowCount());
56478
- const rowsIdsToSelectOrDeselect = getCurrentRows(
56479
- props.api,
56480
- isPagination
56481
- ).map((node) => node.id);
56482
- isSelectAll ? tableRef?.current?.selectRows(
56483
- rowsIdsToSelectOrDeselect,
56484
- "uiSelectAll"
56485
- ) : tableRef?.current?.deselectRows(
56486
- rowsIdsToSelectOrDeselect,
56487
- "uiSelectAll"
56488
- );
56494
+ if (isPagination) {
56495
+ const rowsIdsToSelectOrDeselect = getCurrentRows(
56496
+ props.api,
56497
+ isPagination
56498
+ ).map((node) => node.id);
56499
+ isSelectAll ? tableRef?.current?.selectRows(
56500
+ rowsIdsToSelectOrDeselect,
56501
+ "uiSelectAll"
56502
+ ) : tableRef?.current?.deselectRows(
56503
+ rowsIdsToSelectOrDeselect,
56504
+ "uiSelectAll"
56505
+ );
56506
+ } else {
56507
+ isSelectAll ? tableRef?.current?.selectAll() : tableRef?.current?.deselectAll();
56508
+ }
56489
56509
  } else {
56490
56510
  isSelectAll ? props.api.selectAllFiltered() : props.api.deselectAllFiltered();
56491
56511
  }
@@ -56858,7 +56878,7 @@ function shapeActiveFilters(filters = emptyArray2) {
56858
56878
  field
56859
56879
  };
56860
56880
  });
56861
- return { state };
56881
+ return state;
56862
56882
  }
56863
56883
  function useFilterStorage({
56864
56884
  columnDefinitions,
@@ -56869,7 +56889,7 @@ function useFilterStorage({
56869
56889
  filterable: emptyObj,
56870
56890
  filterOptions: emptyObj,
56871
56891
  possibleFilters: emptyArray2,
56872
- selectedFilters: emptyObj
56892
+ selectedFilters: shapeActiveFilters(initialSelectedFilters)
56873
56893
  });
56874
56894
  function getOptions(field) {
56875
56895
  return filtersState.filterOptions[field];
@@ -56892,16 +56912,25 @@ function useFilterStorage({
56892
56912
  const filterableColumns = columnDefinitions.filter(
56893
56913
  (col) => col.filterRenderer
56894
56914
  );
56895
- const { state } = shapeActiveFilters(initialSelectedFilters);
56915
+ const filterableMap = filterableColumns.reduce((acc, curr) => {
56916
+ return {
56917
+ ...acc,
56918
+ [curr.field]: curr
56919
+ };
56920
+ }, {});
56921
+ const selectedFiltersState = Object.entries(
56922
+ filtersState.selectedFilters ?? {}
56923
+ ).filter(([field]) => Object.keys(filterableMap).includes(field)).reduce(
56924
+ (acc, [field, filterState]) => ({
56925
+ ...acc,
56926
+ [field]: filterState
56927
+ }),
56928
+ {}
56929
+ );
56896
56930
  setFiltersState((prev) => ({
56897
56931
  ...prev,
56898
- filterable: filterableColumns.reduce((acc, curr) => {
56899
- return {
56900
- ...acc,
56901
- [curr.field]: curr
56902
- };
56903
- }, {}),
56904
- selectedFilters: state,
56932
+ filterable: filterableMap,
56933
+ selectedFilters: selectedFiltersState,
56905
56934
  possibleFilters: filterableColumns.sort(sortColumnDefinitionsByFilterIndex).map(getFieldAttr)
56906
56935
  }));
56907
56936
  }, [columnDefinitions]);
@@ -56915,7 +56944,7 @@ function useFilterStorage({
56915
56944
  (selectedFilters) => {
56916
56945
  setFiltersState((prev) => ({
56917
56946
  ...prev,
56918
- selectedFilters: shapeActiveFilters(selectedFilters).state
56947
+ selectedFilters: shapeActiveFilters(selectedFilters)
56919
56948
  }));
56920
56949
  },
56921
56950
  []
@@ -81055,6 +81084,14 @@ var useTableApi = ({
81055
81084
  }),
81056
81085
  [columnApi, gridApi, rowHeight, filterStorage]
81057
81086
  );
81087
+ function deselectParentsWithoutChildrenOrSelectAll(state, gridApi2) {
81088
+ if (state.selectAllChildren === false && !state.toggledNodes?.length) {
81089
+ gridApi2.getRowNode(state.nodeId || "")?.setSelected(false);
81090
+ }
81091
+ state.toggledNodes?.forEach(
81092
+ (node) => deselectParentsWithoutChildrenOrSelectAll(node, gridApi2)
81093
+ );
81094
+ }
81058
81095
  const onSelectionChanged = (rowNode) => {
81059
81096
  const isGrouped = rowNode.group || rowNode.parent?.group && !isNodeRootLevelOfGrid(rowNode.parent);
81060
81097
  const currAffectedRows = rowSelectionRef.current.affectedRows;
@@ -81075,13 +81112,18 @@ var useTableApi = ({
81075
81112
  currAffectedRows
81076
81113
  );
81077
81114
  const rowValues = Object.values(rowsToUpdate);
81078
- rowValues.forEach((row2) => {
81079
- row2.node.setSelected(
81080
- row2.selectedState === rowSelectionState.selected,
81081
- false,
81082
- "checkboxSelected"
81083
- );
81084
- });
81115
+ const selectionState = gridApi?.getServerSideSelectionState();
81116
+ if (selectionState && isServerSideGroupSelectionState(selectionState) && gridApi) {
81117
+ deselectParentsWithoutChildrenOrSelectAll(selectionState, gridApi);
81118
+ } else {
81119
+ rowValues.forEach((row2) => {
81120
+ row2.node.setSelected(
81121
+ row2.selectedState === rowSelectionState.selected,
81122
+ false,
81123
+ "checkboxSelected"
81124
+ );
81125
+ });
81126
+ }
81085
81127
  rowSelectionRef.current.affectedRows = {
81086
81128
  ...currAffectedRows,
81087
81129
  ...rowsToUpdate
@@ -81203,6 +81245,7 @@ function buildPartialTableApi({
81203
81245
  rowSelectionRef
81204
81246
  }) : void 0;
81205
81247
  };
81248
+ const getServerSideSelectionState = () => gridApi?.getServerSideSelectionState();
81206
81249
  const getTableConfiguration = () => {
81207
81250
  const columnState = columnApi?.getColumnState().filter(
81208
81251
  (column2) => !["rowActions", "rowActions-pinned"].includes(
@@ -81316,6 +81359,7 @@ function buildPartialTableApi({
81316
81359
  getRootAggregateData,
81317
81360
  getRowData,
81318
81361
  getSelectedRows: getSelectedRows2,
81362
+ getServerSideSelectionState,
81319
81363
  getTableConfiguration,
81320
81364
  refreshCells,
81321
81365
  setPinnedBottomRowData,
@@ -82367,7 +82411,7 @@ var Table = (props) => {
82367
82411
  groupDefaultExpanded: props.groupDefaultExpanded,
82368
82412
  groupIncludeFooter: !onSSDR && props.groupIncludeFooter === void 0 ? true : props.groupIncludeFooter,
82369
82413
  getGroupRowAgg: props.getGroupRowAgg ? getGroupRowAgg : void 0,
82370
- groupSelectsChildren: !onSSDR,
82414
+ groupSelectsChildren: props.groupSelectsChildren || !onSSDR,
82371
82415
  groupSelectsFiltered: true,
82372
82416
  headerHeight: props.headerHeight,
82373
82417
  icons: tableIcons,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@procore/data-table",
3
- "version": "14.5.1",
3
+ "version": "14.6.0",
4
4
  "description": "Complex data grid built on top of ag-grid, with DST components and styles.",
5
5
  "main": "dist/modern/index.js",
6
6
  "module": "dist/modern/index.mjs",
@@ -36,6 +36,7 @@
36
36
  "cypress:run": "cypress run -b ${CYPRESS_BROWSER-chrome} --spec ${CYPRESS_SPEC-cypress/e2e/**/*.e2e.ts}",
37
37
  "cypress:run:all": "start-server-and-test storybook-static:server http://127.0.0.1:6006 'yarn cypress:run'",
38
38
  "cypress:install": "cypress install",
39
+ "lint:types": "tsc --noEmit",
39
40
  "prettier": "prettier --write",
40
41
  "prettier:check": "prettier --check",
41
42
  "storybook": "storybook dev -p 6006",
@@ -75,7 +76,7 @@
75
76
  },
76
77
  "dependencies": {
77
78
  "@procore/labs-datetime-select": "0.1.0",
78
- "@procore/labs-group-by-select": "3.1.1",
79
+ "@procore/labs-group-by-select": "3.1.2",
79
80
  "@procore/toast-alert": "5.1.0",
80
81
  "classnames": "2.5.1",
81
82
  "date-fns": "2.29.1",