@procore/data-table 14.13.0 → 14.15.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.
@@ -9,6 +9,7 @@ var coreIcons = require('@procore/core-icons');
9
9
  var classNames = require('classnames');
10
10
  var dateFns = require('date-fns');
11
11
  var labsFinancialsUtils = require('@procore/labs-financials-utils');
12
+ var format = require('@procore/labs-financials-utils/dist/format');
12
13
  var ulid$1 = require('ulid');
13
14
  var toastAlert = require('@procore/toast-alert');
14
15
  var ReactDOM = require('react-dom');
@@ -1421,7 +1422,7 @@ ag-grid, ag-grid-angular, ag-grid-ng2, ag-grid-polymer, ag-grid-aurelia {
1421
1422
  animation-iteration-count: infinite;
1422
1423
  animation-name: ag-shake-left-to-right;
1423
1424
  }
1424
- @keyframes _ag-shake-left-to-right_1c24o_369 {
1425
+ @keyframes _ag-shake-left-to-right_ye2ai_369 {
1425
1426
  from {
1426
1427
  padding-left: 6px;
1427
1428
  padding-right: 2px;
@@ -5422,7 +5423,7 @@ input[class^=ag-][type=button]:focus, button[class^=ag-]:focus {
5422
5423
  animation-iteration-count: infinite;
5423
5424
  animation-timing-function: linear;
5424
5425
  }
5425
- @keyframes _spin_1c24o_1 {
5426
+ @keyframes _spin_ye2ai_1 {
5426
5427
  from {
5427
5428
  transform: rotate(0deg);
5428
5429
  }
@@ -7507,10 +7508,15 @@ input[class^=ag-][type=range]:disabled {
7507
7508
  }
7508
7509
  .ag-theme-alpine.ag-theme-alpine .ag-row--dt-active {
7509
7510
  background-color: #e4ecfb;
7510
- border-left: 4px solid #2066df;
7511
7511
  }
7512
- .ag-theme-alpine.ag-theme-alpine .ag-row--dt-active > .ag-cell {
7513
- padding-left: 12px;
7512
+ .ag-theme-alpine.ag-theme-alpine .ag-row--dt-active::before {
7513
+ background-color: #2066df;
7514
+ content: "";
7515
+ width: 4px;
7516
+ height: 100%;
7517
+ position: absolute;
7518
+ top: 0;
7519
+ left: 0;
7514
7520
  }
7515
7521
  .ag-theme-alpine.ag-theme-alpine .ag-row--dt-overdue span {
7516
7522
  color: #e61920;
@@ -7922,7 +7928,7 @@ input[class^=ag-][type=range]:disabled {
7922
7928
  padding-left: 16px;
7923
7929
  }
7924
7930
 
7925
- div._contextPanel_1c24o_7148 {
7931
+ div._contextPanel_ye2ai_7153 {
7926
7932
  width: 400px;
7927
7933
  transition: all ease 500ms;
7928
7934
  flex: 0 0 auto;
@@ -7931,7 +7937,7 @@ div._contextPanel_1c24o_7148 {
7931
7937
  border: 1px solid #d6dadc;
7932
7938
  display: flex;
7933
7939
  }
7934
- div._contextPanel--hidden_1c24o_7157 {
7940
+ div._contextPanel--hidden_ye2ai_7162 {
7935
7941
  border: none;
7936
7942
  overflow: hidden;
7937
7943
  padding: 0px;
@@ -7939,50 +7945,50 @@ div._contextPanel--hidden_1c24o_7157 {
7939
7945
  width: 0px;
7940
7946
  }
7941
7947
 
7942
- ._contextPanelWrapper_1c24o_7165 {
7948
+ ._contextPanelWrapper_ye2ai_7170 {
7943
7949
  position: relative;
7944
7950
  flex-grow: 1;
7945
7951
  }
7946
7952
 
7947
- ._contextPanelBody_1c24o_7170 {
7953
+ ._contextPanelBody_ye2ai_7175 {
7948
7954
  width: clamp(380px, 400px, 100%);
7949
7955
  }
7950
7956
 
7951
- ._contextPanel-stickyHeader_1c24o_7174 {
7957
+ ._contextPanel-stickyHeader_ye2ai_7179 {
7952
7958
  background-color: #ffffff;
7953
7959
  position: sticky;
7954
7960
  top: 0;
7955
7961
  z-index: 5;
7956
7962
  }
7957
7963
 
7958
- ._filters-list_1c24o_7181 {
7964
+ ._filters-list_ye2ai_7186 {
7959
7965
  padding: 0;
7960
7966
  margin: 0;
7961
7967
  }
7962
- ._filters-list_1c24o_7181 ol {
7968
+ ._filters-list_ye2ai_7186 ol {
7963
7969
  padding: 0;
7964
7970
  margin: 0;
7965
7971
  }
7966
7972
 
7967
- ._col-drag-column-icon_1c24o_7190 {
7973
+ ._col-drag-column-icon_ye2ai_7195 {
7968
7974
  color: #6a767c;
7969
7975
  }
7970
7976
 
7971
- ._tabular-nums_1c24o_7194 {
7977
+ ._tabular-nums_ye2ai_7199 {
7972
7978
  font-variant-numeric: tabular-nums;
7973
7979
  }`;
7974
7980
  document.head.appendChild(document.createElement("style")).appendChild(document.createTextNode(css));
7975
7981
  var styles_default = {
7976
- "contextPanel": "_contextPanel_1c24o_7148",
7977
- "contextPanel--hidden": "_contextPanel--hidden_1c24o_7157",
7978
- "contextPanelWrapper": "_contextPanelWrapper_1c24o_7165",
7979
- "contextPanelBody": "_contextPanelBody_1c24o_7170",
7980
- "contextPanel-stickyHeader": "_contextPanel-stickyHeader_1c24o_7174",
7981
- "filters-list": "_filters-list_1c24o_7181",
7982
- "col-drag-column-icon": "_col-drag-column-icon_1c24o_7190",
7983
- "tabular-nums": "_tabular-nums_1c24o_7194",
7984
- "ag-shake-left-to-right": "_ag-shake-left-to-right_1c24o_369",
7985
- "spin": "_spin_1c24o_1"
7982
+ "contextPanel": "_contextPanel_ye2ai_7153",
7983
+ "contextPanel--hidden": "_contextPanel--hidden_ye2ai_7162",
7984
+ "contextPanelWrapper": "_contextPanelWrapper_ye2ai_7170",
7985
+ "contextPanelBody": "_contextPanelBody_ye2ai_7175",
7986
+ "contextPanel-stickyHeader": "_contextPanel-stickyHeader_ye2ai_7179",
7987
+ "filters-list": "_filters-list_ye2ai_7186",
7988
+ "col-drag-column-icon": "_col-drag-column-icon_ye2ai_7195",
7989
+ "tabular-nums": "_tabular-nums_ye2ai_7199",
7990
+ "ag-shake-left-to-right": "_ag-shake-left-to-right_ye2ai_369",
7991
+ "spin": "_spin_ye2ai_1"
7986
7992
  };
7987
7993
 
7988
7994
  // src/utils/getCellValueTypographyProps.ts
@@ -8656,12 +8662,12 @@ var DateCellValue = ({
8656
8662
  isGroup,
8657
8663
  value
8658
8664
  }) => {
8659
- const { format } = coreReact.useDateTime();
8665
+ const { format: format2 } = coreReact.useDateTime();
8660
8666
  if (isGroup || isEmptyValue(value)) {
8661
8667
  return null;
8662
8668
  }
8663
8669
  const parsedValue = getDateObject(value);
8664
- const internalValue = parsedValue ? format(
8670
+ const internalValue = parsedValue ? format2(
8665
8671
  parsedValue,
8666
8672
  columnDefinition.cellRendererParams?.dateFormatType || "numeric-date"
8667
8673
  ) : void 0;
@@ -8727,12 +8733,12 @@ var DateTimeCellValue = ({
8727
8733
  isGroup,
8728
8734
  value
8729
8735
  }) => {
8730
- const { format } = coreReact.useDateTime();
8736
+ const { format: format2 } = coreReact.useDateTime();
8731
8737
  if (isGroup || isEmptyValue(value)) {
8732
8738
  return null;
8733
8739
  }
8734
8740
  const parsedValue = getDateObject2(value);
8735
- const internalValue = parsedValue ? format(
8741
+ const internalValue = parsedValue ? format2(
8736
8742
  parsedValue,
8737
8743
  columnDefinition.cellRendererParams?.dateFormatType || "abbr-weekday-abbr-date-at-time"
8738
8744
  ) : void 0;
@@ -16653,7 +16659,7 @@ var calculateOrdinal = (value) => {
16653
16659
  }
16654
16660
  return "th";
16655
16661
  };
16656
- function dateToFormattedString(date, format = "YYYY-MM-DD") {
16662
+ function dateToFormattedString(date, format2 = "YYYY-MM-DD") {
16657
16663
  const fullYear = padStartWidthZeros(date.getFullYear(), 4);
16658
16664
  const months = [
16659
16665
  "January",
@@ -16697,7 +16703,7 @@ function dateToFormattedString(date, format = "YYYY-MM-DD") {
16697
16703
  d: () => `${date.getDay()}`
16698
16704
  };
16699
16705
  const regexp = new RegExp(Object.keys(replace).join("|"), "g");
16700
- return format.replace(regexp, (match) => {
16706
+ return format2.replace(regexp, (match) => {
16701
16707
  if (match in replace) {
16702
16708
  return replace[match]();
16703
16709
  }
@@ -21340,14 +21346,14 @@ var DateFilterModelFormatter = class extends SimpleFilterModelFormatter {
21340
21346
  const isRange = type == SimpleFilter.IN_RANGE || numberOfInputs === 2;
21341
21347
  const dateFrom = parseDateTimeFromString(condition.dateFrom);
21342
21348
  const dateTo = parseDateTimeFromString(condition.dateTo);
21343
- const format = this.dateFilterParams.inRangeFloatingFilterDateFormat;
21349
+ const format2 = this.dateFilterParams.inRangeFloatingFilterDateFormat;
21344
21350
  if (isRange) {
21345
- const formattedFrom = dateFrom !== null ? dateToFormattedString(dateFrom, format) : "null";
21346
- const formattedTo = dateTo !== null ? dateToFormattedString(dateTo, format) : "null";
21351
+ const formattedFrom = dateFrom !== null ? dateToFormattedString(dateFrom, format2) : "null";
21352
+ const formattedTo = dateTo !== null ? dateToFormattedString(dateTo, format2) : "null";
21347
21353
  return `${formattedFrom}-${formattedTo}`;
21348
21354
  }
21349
21355
  if (dateFrom != null) {
21350
- return dateToFormattedString(dateFrom, format);
21356
+ return dateToFormattedString(dateFrom, format2);
21351
21357
  }
21352
21358
  return `${type}`;
21353
21359
  }
@@ -52969,7 +52975,27 @@ var InternalLinkCellRenderer = ({ columnDefinition, isGroup, data, rowHeight, va
52969
52975
  if (isGroup) {
52970
52976
  return /* @__PURE__ */ React76__default.default.createElement(coreReact.Typography, { ...typographyProps, className, weight: "semibold" }, value);
52971
52977
  }
52978
+ const isExternalLink = columnDefinition.cellRendererParams.isExternalLink ?? false;
52972
52979
  const URL = columnDefinition.cellRendererParams.getURL(value, data);
52980
+ if (isExternalLink && value && URL) {
52981
+ return /* @__PURE__ */ React76__default.default.createElement(
52982
+ coreReact.Typography,
52983
+ {
52984
+ ...typographyProps,
52985
+ className,
52986
+ style: { display: "flex", alignItems: "center", gap: "5px" }
52987
+ },
52988
+ internalValue,
52989
+ /* @__PURE__ */ React76__default.default.createElement(
52990
+ coreIcons.ExternalLink,
52991
+ {
52992
+ cursor: "pointer",
52993
+ size: "sm",
52994
+ onClick: () => window.open(URL, "_blank")
52995
+ }
52996
+ )
52997
+ );
52998
+ }
52973
52999
  return URL ? /* @__PURE__ */ React76__default.default.createElement(coreReact.Typography, { ...typographyProps, className }, /* @__PURE__ */ React76__default.default.createElement(coreReact.Link, { href: URL }, internalValue)) : /* @__PURE__ */ React76__default.default.createElement(coreReact.Typography, { ...typographyProps }, internalValue);
52974
53000
  };
52975
53001
  var LinkCellRenderer = withDataTableRenderer(
@@ -52997,9 +53023,10 @@ var InternalNumberCellRenderer = ({ columnDefinition, rowPinned, isGroup, value
52997
53023
  }
52998
53024
  return /* @__PURE__ */ React76__default.default.createElement(React76__default.default.Fragment, null);
52999
53025
  }
53000
- const internalValue = labsFinancialsUtils.formatNumber(value, {
53026
+ const internalValue = format.format(value, {
53001
53027
  maxDecimalPrecision: 15,
53002
53028
  minDecimalPrecision: 0,
53029
+ shouldUseGtk: true,
53003
53030
  symbol: "",
53004
53031
  ...columnDefinition.cellRendererParams?.formatConfig
53005
53032
  });
@@ -53380,7 +53407,7 @@ var Renderer9 = ({
53380
53407
  value,
53381
53408
  rowPinned
53382
53409
  }) => {
53383
- const { getColor } = columnDefinition.cellRendererParams;
53410
+ const { getColor, displayAsPill } = columnDefinition.cellRendererParams;
53384
53411
  const I18n = coreReact.useI18nContext();
53385
53412
  if (isEmptyValue(value)) {
53386
53413
  if (isGroup) {
@@ -53406,10 +53433,10 @@ var Renderer9 = ({
53406
53433
  const typographyProps = getCellValueTypographyProps(
53407
53434
  columnDefinition.cellRendererParams?.typographyProps
53408
53435
  );
53409
- if (isGroup || rowPinned && columnDefinition.aggFunc) {
53436
+ if ((isGroup || rowPinned && columnDefinition.aggFunc) && !displayAsPill) {
53410
53437
  return /* @__PURE__ */ React76__default.default.createElement(coreReact.Typography, { ...typographyProps, weight: "semibold" }, label);
53411
53438
  }
53412
- return /* @__PURE__ */ React76__default.default.createElement(coreReact.Pill, { color: getColor(value), className: cx10("pill-cell") }, label?.toUpperCase());
53439
+ return /* @__PURE__ */ React76__default.default.createElement(coreReact.Pill, { color: getColor(value), className: cx10("pill-cell") }, label);
53413
53440
  };
53414
53441
  var PillCellRenderer = withDataTableRenderer(Renderer9, "select");
53415
53442
  var Editor5 = React76__default.default.forwardRef(
@@ -53442,7 +53469,7 @@ var Editor5 = React76__default.default.forwardRef(
53442
53469
  }
53443
53470
  function getLabel3(item) {
53444
53471
  const unformattedLabel = columnDefinition.getStringFormattedValue?.(item) || "";
53445
- return unformattedLabel.toUpperCase();
53472
+ return unformattedLabel;
53446
53473
  }
53447
53474
  return /* @__PURE__ */ React76__default.default.createElement(
53448
53475
  coreReact.PillSelect,
@@ -54810,8 +54837,8 @@ function transformToExcelStyles(excelDataFormats) {
54810
54837
  if (excelDataFormats === void 0) {
54811
54838
  return void 0;
54812
54839
  }
54813
- return excelDataFormats.map((format) => {
54814
- const { id, ...rest } = format;
54840
+ return excelDataFormats.map((format2) => {
54841
+ const { id, ...rest } = format2;
54815
54842
  return {
54816
54843
  id: toExcelCellClass(id),
54817
54844
  ...rest
@@ -55867,6 +55894,8 @@ var DataTableCellRenderer = ({
55867
55894
  value
55868
55895
  };
55869
55896
  const hasValue = value !== void 0 && value !== null && value !== "";
55897
+ const isSelectCellComponent = columnDefinition.cellEditor?.render?.displayName === "SelectCellEditor";
55898
+ const URL = isSelectCellComponent && columnDefinition?.cellRendererParams?.getURL ? columnDefinition.cellRendererParams.getURL(value) : null;
55870
55899
  const startEditing = React76.useCallback(
55871
55900
  () => api.startEditingCell({
55872
55901
  rowIndex: node.rowIndex,
@@ -55874,34 +55903,54 @@ var DataTableCellRenderer = ({
55874
55903
  }),
55875
55904
  [column2, node]
55876
55905
  );
55877
- return /* @__PURE__ */ React76__default.default.createElement(React76__default.default.Fragment, null, shouldDisplayRowCheckbox(columnApi, column2, node) && /* @__PURE__ */ React76__default.default.createElement(coreReact.Box, { paddingLeft: "sm" }, /* @__PURE__ */ React76__default.default.createElement(RowCheckbox, { api, data, node })), columnDefinition.editable ? /* @__PURE__ */ React76__default.default.createElement(
55878
- PseudoInlineEditorWrapper,
55879
- {
55880
- showArrow: editorType === "select",
55881
- onClick: startEditing,
55882
- onClear: columnDefinition.cellEditorParams?.clearable && hasValue ? () => {
55883
- setValue?.(null);
55884
- } : void 0,
55885
- showCalendar: editorType === "date",
55886
- rightAligned: colDef.type === "rightAligned",
55887
- hasValue,
55888
- alwaysShowEditors: columnDefinition.cellEditorParams?.alwaysShowPseudoEditors,
55889
- ...validationOutput
55890
- },
55891
- /* @__PURE__ */ React76__default.default.createElement(Component4, { ...componentParams })
55892
- ) : /* @__PURE__ */ React76__default.default.createElement(
55893
- NonEditorWrapper,
55906
+ return /* @__PURE__ */ React76__default.default.createElement(React76__default.default.Fragment, null, shouldDisplayRowCheckbox(columnApi, column2, node) && /* @__PURE__ */ React76__default.default.createElement(coreReact.Box, { paddingLeft: "sm" }, /* @__PURE__ */ React76__default.default.createElement(RowCheckbox, { api, data, node })), /* @__PURE__ */ React76__default.default.createElement(
55907
+ coreReact.Flex,
55894
55908
  {
55895
- rightAligned: colDef.type === "rightAligned",
55896
- ...validationOutput,
55897
- rowPinned: Boolean(componentParams.rowPinned),
55898
- isGroup: Boolean(componentParams.isGroup)
55909
+ gap: "5px",
55910
+ alignItems: "center",
55911
+ justifyContent: "center",
55912
+ style: { width: "100%" }
55899
55913
  },
55900
- /* @__PURE__ */ React76__default.default.createElement(
55901
- Component4,
55914
+ columnDefinition.editable ? /* @__PURE__ */ React76__default.default.createElement(
55915
+ PseudoInlineEditorWrapper,
55916
+ {
55917
+ showArrow: editorType === "select",
55918
+ onClick: startEditing,
55919
+ onClear: columnDefinition.cellEditorParams?.clearable && hasValue ? () => {
55920
+ setValue?.(null);
55921
+ } : void 0,
55922
+ showCalendar: editorType === "date",
55923
+ rightAligned: colDef.type === "rightAligned",
55924
+ hasValue,
55925
+ alwaysShowEditors: columnDefinition.cellEditorParams?.alwaysShowPseudoEditors,
55926
+ ...validationOutput
55927
+ },
55928
+ /* @__PURE__ */ React76__default.default.createElement(Component4, { ...componentParams })
55929
+ ) : /* @__PURE__ */ React76__default.default.createElement(
55930
+ NonEditorWrapper,
55931
+ {
55932
+ rightAligned: colDef.type === "rightAligned",
55933
+ ...validationOutput,
55934
+ rowPinned: Boolean(componentParams.rowPinned),
55935
+ isGroup: Boolean(componentParams.isGroup)
55936
+ },
55937
+ /* @__PURE__ */ React76__default.default.createElement(
55938
+ Component4,
55939
+ {
55940
+ ...componentParams,
55941
+ tableRef: columnDefinition.cellRendererParams.tableRef
55942
+ }
55943
+ )
55944
+ ),
55945
+ URL && /* @__PURE__ */ React76__default.default.createElement(
55946
+ coreIcons.ExternalLink,
55902
55947
  {
55903
- ...componentParams,
55904
- tableRef: columnDefinition.cellRendererParams.tableRef
55948
+ cursor: "pointer",
55949
+ size: "sm",
55950
+ onClick: (e) => {
55951
+ e.stopPropagation();
55952
+ window.open(URL, "_blank");
55953
+ }
55905
55954
  }
55906
55955
  )
55907
55956
  ));
@@ -56535,9 +56584,10 @@ var GenericHeaderRenderer = (props) => {
56535
56584
  props.api.addEventListener("columnRowGroupChanged", updateExpandedState);
56536
56585
  return () => {
56537
56586
  props.column.removeEventListener("sortChanged", onSortChanged);
56538
- props.api.removeEventListener(
56587
+ removeEventListenerFromGrid(
56539
56588
  "columnRowGroupChanged",
56540
- updateExpandedState
56589
+ updateExpandedState,
56590
+ props.api
56541
56591
  );
56542
56592
  };
56543
56593
  }, [props.column]);
@@ -57603,6 +57653,7 @@ var InternalTableContext = React76__default.default.createContext({
57603
57653
  getRowHeight: () => () => rowSize.md,
57604
57654
  grandTotalsLabelInnerRenderer: void 0,
57605
57655
  gridApi: void 0,
57656
+ localStoragePersistenceKey: void 0,
57606
57657
  onBulkEditUpdate: () => Promise.resolve(),
57607
57658
  onServerSideDataRequest: void 0,
57608
57659
  onTableConfigChange: () => {
@@ -57619,6 +57670,7 @@ var InternalTableContext = React76__default.default.createContext({
57619
57670
  setRowHeight: () => {
57620
57671
  },
57621
57672
  showExpandCollapseAllToggle: false,
57673
+ expandCollapseStateRef: null,
57622
57674
  tableRef: null,
57623
57675
  getColumnDefinition: () => void 0,
57624
57676
  setSelectedGroupIndex: () => {
@@ -61440,14 +61492,14 @@ var protection_default = protection;
61440
61492
  // ../../node_modules/@ag-grid-enterprise/excel-export/dist/esm/es6/excelExport/files/xml/styles/numberFormat.mjs
61441
61493
  var numberFormat = {
61442
61494
  getTemplate(styleProperties) {
61443
- const { format } = styleProperties.numberFormat;
61495
+ const { format: format2 } = styleProperties.numberFormat;
61444
61496
  return {
61445
61497
  name: "NumberFormat",
61446
61498
  properties: {
61447
61499
  prefixedAttributes: [{
61448
61500
  prefix: "ss:",
61449
61501
  map: {
61450
- Format: format
61502
+ Format: format2
61451
61503
  }
61452
61504
  }]
61453
61505
  }
@@ -63398,15 +63450,15 @@ var registerFill = (fill) => {
63398
63450
  }
63399
63451
  return pos;
63400
63452
  };
63401
- var registerNumberFmt = (format) => {
63402
- format = _.utf8_encode(format);
63403
- if (numberFormatMap[format]) {
63404
- return numberFormatMap[format];
63453
+ var registerNumberFmt = (format2) => {
63454
+ format2 = _.utf8_encode(format2);
63455
+ if (numberFormatMap[format2]) {
63456
+ return numberFormatMap[format2];
63405
63457
  }
63406
- let pos = registeredNumberFmts.findIndex((currentFormat) => currentFormat.formatCode === format);
63458
+ let pos = registeredNumberFmts.findIndex((currentFormat) => currentFormat.formatCode === format2);
63407
63459
  if (pos === -1) {
63408
63460
  pos = registeredNumberFmts.length + 164;
63409
- registeredNumberFmts.push({ formatCode: format, numFmtId: pos });
63461
+ registeredNumberFmts.push({ formatCode: format2, numFmtId: pos });
63410
63462
  } else {
63411
63463
  pos = registeredNumberFmts[pos].numFmtId;
63412
63464
  }
@@ -78033,6 +78085,61 @@ var buildDetailRowsConfig_ = (detailRowConfig, {
78033
78085
  };
78034
78086
  };
78035
78087
 
78088
+ // src/utils/expandRows.ts
78089
+ var getGroupRowState = (gridApi, groupDefaultExpanded = 0) => {
78090
+ const expandedRoutes = [];
78091
+ const collapsedRoutes = [];
78092
+ if (gridApi) {
78093
+ gridApi.forEachNode((node) => {
78094
+ const route = node.getRoute();
78095
+ if (route) {
78096
+ const routePath = route.join(",");
78097
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78098
+ if (node.level > defaultExpandLevel - 1) {
78099
+ if (node.expanded) {
78100
+ expandedRoutes.push(routePath);
78101
+ }
78102
+ } else if (!node.expanded) {
78103
+ collapsedRoutes.push(routePath);
78104
+ }
78105
+ }
78106
+ });
78107
+ }
78108
+ return { expandedRoutes, collapsedRoutes };
78109
+ };
78110
+ var setExpandCollapseRow = (gridApi, tableConfig, groupDefaultExpanded = 0) => {
78111
+ const expandedRoutes = tableConfig.groupRowState?.expandedRoutes ?? [];
78112
+ const collapsedRoutes = tableConfig.groupRowState?.collapsedRoutes ?? [];
78113
+ gridApi.forEachNode((node) => {
78114
+ const route = node.getRoute();
78115
+ if (route) {
78116
+ const routePath = route.join(",");
78117
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78118
+ if (node.level > defaultExpandLevel - 1) {
78119
+ if (expandedRoutes.includes(routePath)) {
78120
+ node.setExpanded(true);
78121
+ }
78122
+ } else if (collapsedRoutes.includes(routePath)) {
78123
+ node.setExpanded(false);
78124
+ }
78125
+ }
78126
+ });
78127
+ };
78128
+ var isRowOpenedByDefault = (node, tableConfig, groupDefaultExpanded = 0) => {
78129
+ const expandedRoutes = tableConfig?.groupRowState?.expandedRoutes ?? [];
78130
+ const collapsedRoutes = tableConfig?.groupRowState?.collapsedRoutes ?? [];
78131
+ const route = node.getRoute();
78132
+ if (!route) {
78133
+ return false;
78134
+ }
78135
+ const routePath = route.join(",");
78136
+ const defaultExpandLevel = groupDefaultExpanded === -1 ? Infinity : groupDefaultExpanded;
78137
+ if (node.level > defaultExpandLevel - 1) {
78138
+ return expandedRoutes.includes(routePath);
78139
+ } else
78140
+ return !collapsedRoutes.includes(routePath);
78141
+ };
78142
+
78036
78143
  // src/utils/getRootRowNode.ts
78037
78144
  function getRootRowNode(rowNode) {
78038
78145
  return rowNode.level > 0 && rowNode.parent ? getRootRowNode(rowNode.parent) : rowNode;
@@ -80471,44 +80578,73 @@ function generateHTMLString({
80471
80578
  if (exportedDocument.querySelector(".ag-header-container") && showTableHeaderOnEveryPage) {
80472
80579
  const tableHeaderStylesElement = exportedDocument.createElement("style");
80473
80580
  tableHeaderStylesElement.innerHTML = `
80581
+ /* Original header styles */
80474
80582
  .ag-header-container {
80475
80583
  height: ${TABLE_HEADER_HEIGHT}px;
80476
80584
  background: ${coreReact.colors.gray96};
80477
80585
  border-bottom: 1px solid #d6dadc;
80478
- break-before: page;
80586
+ }
80587
+ /* Cloned header styles */
80588
+ .paginated-header {
80589
+ height: ${TABLE_HEADER_HEIGHT}px;
80590
+ background: ${coreReact.colors.gray96};
80591
+ border-bottom: 1px solid #d6dadc;
80592
+ /* Ensure cloned headers start on a new page */
80593
+ page-break-before: always;
80479
80594
  }
80480
80595
  `;
80481
80596
  exportedDocument.head.appendChild(tableHeaderStylesElement);
80482
- const tableHeader = exportedDocument.querySelector(".ag-header-container").cloneNode(true);
80597
+ const tableHeaderElement = exportedDocument.querySelector(
80598
+ ".ag-header-container"
80599
+ );
80600
+ if (!tableHeaderElement) {
80601
+ return reject(new Error("Table header container not found."));
80602
+ }
80603
+ const tableHeader = tableHeaderElement.cloneNode(true);
80604
+ tableHeader.classList.add("paginated-header");
80483
80605
  const tableRowsContainer = exportedDocument.querySelector(
80484
80606
  ".ag-center-cols-container"
80485
80607
  );
80486
- const totalRows = tableRowsContainer.children.length;
80487
- const maxPageContentHeight = pageHeight - pageFormat.marginInPixels.top - pageFormat.marginInPixels.bottom;
80488
- let pageContentHeight = TABLE_HEADER_HEIGHT;
80489
- let currentPage = 1;
80490
- for (let index = 0; index < totalRows; index++) {
80491
- const getScaledRowHeight = (row3) => {
80492
- const scale = pageHeight / tableWidth;
80493
- let rowHeight2 = Number(row3.style.height.replace("px", ""));
80494
- if (scale < 1) {
80495
- rowHeight2 *= scale;
80608
+ if (!tableRowsContainer) {
80609
+ console.error("Table rows container not found.");
80610
+ return;
80611
+ }
80612
+ const allRows = Array.from(
80613
+ tableRowsContainer.children
80614
+ );
80615
+ tableRowsContainer.innerHTML = "";
80616
+ const maxPageContentHeight = pageHeight - (pageFormat.marginInPixels?.top ?? DEFAULT_PAGE_MARGIN) - (pageFormat.marginInPixels?.bottom ?? DEFAULT_PAGE_MARGIN) - TABLE_HEADER_HEIGHT;
80617
+ let currentPageContentHeight = 0;
80618
+ let rowsInCurrentPage = [];
80619
+ let isFirstPage = true;
80620
+ const appendPage = () => {
80621
+ if (rowsInCurrentPage.length > 0) {
80622
+ if (!isFirstPage) {
80623
+ tableRowsContainer.appendChild(tableHeader.cloneNode(true));
80624
+ } else {
80625
+ isFirstPage = false;
80496
80626
  }
80497
- return rowHeight2;
80498
- };
80499
- const row2 = tableRowsContainer.children[index + currentPage - 1];
80500
- const rowHeight = getScaledRowHeight(row2);
80501
- if (pageContentHeight + rowHeight >= maxPageContentHeight) {
80502
- tableRowsContainer.insertBefore(
80503
- tableHeader.cloneNode(true),
80504
- row2
80627
+ rowsInCurrentPage.forEach(
80628
+ (row2) => tableRowsContainer.appendChild(row2)
80505
80629
  );
80506
- currentPage += 1;
80507
- pageContentHeight = TABLE_HEADER_HEIGHT;
80508
- } else {
80509
- pageContentHeight += rowHeight;
80630
+ rowsInCurrentPage = [];
80631
+ currentPageContentHeight = 0;
80510
80632
  }
80511
- }
80633
+ };
80634
+ allRows.forEach((row2) => {
80635
+ let rowHeight = parseFloat(row2.style.height.replace("px", "")) || row2.offsetHeight;
80636
+ const scale = pageHeight / tableWidth;
80637
+ if (scale < 1) {
80638
+ rowHeight *= scale;
80639
+ }
80640
+ if (currentPageContentHeight + rowHeight > maxPageContentHeight) {
80641
+ appendPage();
80642
+ isFirstPage = false;
80643
+ }
80644
+ rowsInCurrentPage.push(row2);
80645
+ currentPageContentHeight += rowHeight;
80646
+ });
80647
+ appendPage();
80512
80648
  }
80513
80649
  resolve(exportedDocument.getElementsByTagName("html")[0].outerHTML);
80514
80650
  }, 2e3);
@@ -80554,6 +80690,7 @@ var useTableApi = ({
80554
80690
  columnApi,
80555
80691
  columnDefinitions,
80556
80692
  gridApi,
80693
+ groupDefaultExpanded,
80557
80694
  setLoadingStatus,
80558
80695
  wrapperRef
80559
80696
  }) => {
@@ -80745,10 +80882,33 @@ var useTableApi = ({
80745
80882
  const setSearchValue = React76__default.default.useCallback(
80746
80883
  (value) => {
80747
80884
  gridApi?.setQuickFilter(value);
80885
+ gridApi?.forEachNodeAfterFilterAndSort((node) => {
80886
+ if (node.id) {
80887
+ const currentNode = rowSelectionRef?.current.affectedRows[node.id];
80888
+ if (currentNode && currentNode.selectedState === rowSelectionState.selected) {
80889
+ node.setSelected(true, false, "checkboxSelected");
80890
+ }
80891
+ }
80892
+ });
80748
80893
  resetPagination();
80894
+ gridApi?.redrawRows();
80749
80895
  },
80750
- [gridApi]
80896
+ [gridApi, rowSelectionRef.current]
80751
80897
  );
80898
+ React76__default.default.useEffect(() => {
80899
+ function handleRowSelection(event) {
80900
+ if (event.node.displayed && event.node.id) {
80901
+ rowSelectionRef.current.affectedRows[event.node.id] = {
80902
+ node: event.node,
80903
+ selectedState: event.node.isSelected() ? rowSelectionState.selected : rowSelectionState.unselected
80904
+ };
80905
+ }
80906
+ }
80907
+ gridApi?.addEventListener && gridApi.addEventListener("rowSelected", handleRowSelection);
80908
+ return () => {
80909
+ removeEventListenerFromGrid("rowSelected", handleRowSelection, gridApi);
80910
+ };
80911
+ }, [gridApi]);
80752
80912
  const setLoading = React76__default.default.useCallback((loading, message = "") => {
80753
80913
  setLoadingStatus({
80754
80914
  loading,
@@ -80809,6 +80969,7 @@ var useTableApi = ({
80809
80969
  adjustRowDragIcon(gridApi, columnApi);
80810
80970
  });
80811
80971
  }
80972
+ setExpandCollapseRow(gridApi, config, groupDefaultExpanded);
80812
80973
  },
80813
80974
  [columnApi, gridApi, internalSetRowHeight, filterStorage.setSelectedFilters]
80814
80975
  );
@@ -80900,7 +81061,8 @@ var useTableApi = ({
80900
81061
  columnApi,
80901
81062
  rowHeight,
80902
81063
  filterStorage,
80903
- rowSelectionRef
81064
+ rowSelectionRef,
81065
+ groupDefaultExpanded
80904
81066
  }),
80905
81067
  [columnApi, gridApi, rowHeight, filterStorage]
80906
81068
  );
@@ -81168,7 +81330,6 @@ function buildPartialTableApi({
81168
81330
  focusField && gridApi?.setFocusedCell(rowIndex, focusField);
81169
81331
  };
81170
81332
  return {
81171
- getVisibleRowNodes,
81172
81333
  applyTransaction,
81173
81334
  applyServerSideTransaction,
81174
81335
  collapseAll,
@@ -81183,6 +81344,7 @@ function buildPartialTableApi({
81183
81344
  getSelectedRows: getSelectedRows2,
81184
81345
  getServerSideSelectionState,
81185
81346
  getTableConfiguration,
81347
+ getVisibleRowNodes,
81186
81348
  refreshCells,
81187
81349
  setPinnedBottomRowData,
81188
81350
  setRowData,
@@ -81300,6 +81462,12 @@ var DataTable = ({
81300
81462
  const [rowHeight, setRowHeight] = React76__default.default.useState(
81301
81463
  initialTableConfig?.rowHeight || rowSize.md
81302
81464
  );
81465
+ const expandCollapseStateRef = React76__default.default.useRef(
81466
+ initialTableConfig?.groupRowState || {
81467
+ expandedRoutes: [],
81468
+ collapsedRoutes: []
81469
+ }
81470
+ );
81303
81471
  const rowHeightRef = React76__default.default.useRef(
81304
81472
  initialTableConfig?.rowHeight || rowSize.md
81305
81473
  );
@@ -81345,12 +81513,14 @@ var DataTable = ({
81345
81513
  if (localStoragePersistenceKey) {
81346
81514
  webSdkStorage.storage.local.setItem(localStoragePersistenceKey, {
81347
81515
  ...config,
81516
+ groupRowState: expandCollapseStateRef.current,
81348
81517
  rowHeight: rowHeightRef.current,
81349
81518
  serverFilters: filterStorage.filtersState
81350
81519
  });
81351
81520
  }
81352
81521
  onTableConfigChange?.({
81353
81522
  ...config,
81523
+ groupRowState: expandCollapseStateRef.current,
81354
81524
  rowHeight: rowHeightRef.current,
81355
81525
  serverFilters: filterStorage.filtersState
81356
81526
  });
@@ -81459,6 +81629,7 @@ var DataTable = ({
81459
81629
  onServerSideDataRequest,
81460
81630
  onTableConfigChange: internalOnTableConfigChange,
81461
81631
  rowSelectionRef,
81632
+ expandCollapseStateRef,
81462
81633
  rowHeight,
81463
81634
  searchStorage,
81464
81635
  selectedGroupIndex,
@@ -81560,8 +81731,10 @@ var Table = (props) => {
81560
81731
  columnDefinitions: internalTableContext.columnDefinitions,
81561
81732
  gridApi,
81562
81733
  setLoadingStatus,
81563
- wrapperRef
81734
+ wrapperRef,
81735
+ groupDefaultExpanded: props.groupDefaultExpanded
81564
81736
  });
81737
+ const initialTableConfig = internalTableContext.initialTableConfig;
81565
81738
  React76__default.default.useImperativeHandle(internalTableContext.tableRef, () => tableApi, [
81566
81739
  tableApi
81567
81740
  ]);
@@ -82068,6 +82241,34 @@ var Table = (props) => {
82068
82241
  document.getElementsByClassName("ag-body-viewport")[0]?.clientWidth
82069
82242
  );
82070
82243
  }, [setViewportWidth]);
82244
+ const isClientSideGroupOpenByDefault = React76__default.default.useCallback(
82245
+ (params) => {
82246
+ const node = params.rowNode;
82247
+ if (!node) {
82248
+ return false;
82249
+ }
82250
+ return isRowOpenedByDefault(
82251
+ node,
82252
+ initialTableConfig,
82253
+ props.groupsAlwaysExpanded ? -1 : props.groupDefaultExpanded
82254
+ );
82255
+ },
82256
+ [initialTableConfig, props.groupDefaultExpanded]
82257
+ );
82258
+ const isServerSideGroupOpenByDefault = React76__default.default.useCallback(
82259
+ (params) => {
82260
+ const node = params.rowNode;
82261
+ if (!node) {
82262
+ return false;
82263
+ }
82264
+ return isRowOpenedByDefault(
82265
+ node,
82266
+ initialTableConfig,
82267
+ props.groupsAlwaysExpanded ? -1 : props.groupDefaultExpanded
82268
+ );
82269
+ },
82270
+ [initialTableConfig, props.groupDefaultExpanded]
82271
+ );
82071
82272
  const onGridReady = (params) => {
82072
82273
  internalTableContext.setGridApi(params.api);
82073
82274
  internalTableContext.setColumnApi(params.columnApi);
@@ -82094,13 +82295,26 @@ var Table = (props) => {
82094
82295
  };
82095
82296
  const internalRowGroupOpened = React76__default.default.useCallback(
82096
82297
  (event) => {
82298
+ if (internalTableContext.expandCollapseStateRef) {
82299
+ internalTableContext.expandCollapseStateRef.current = getGroupRowState(
82300
+ gridApi,
82301
+ props.groupDefaultExpanded
82302
+ );
82303
+ }
82304
+ internalTableContext.onTableConfigChange();
82097
82305
  props.onRowGroupOpened?.({
82098
82306
  expanded: event.expanded,
82099
82307
  node: serializeNode(event.node),
82100
82308
  rowIndex: event.rowIndex
82101
82309
  });
82102
82310
  },
82103
- [props.onRowGroupOpened]
82311
+ [
82312
+ props.onRowGroupOpened,
82313
+ internalTableContext.onTableConfigChange,
82314
+ tableApi?.getTableConfiguration(),
82315
+ internalTableContext.expandCollapseStateRef?.current,
82316
+ gridApi
82317
+ ]
82104
82318
  );
82105
82319
  const getGroupRowAgg = React76__default.default.useCallback(
82106
82320
  (params) => {
@@ -82252,6 +82466,8 @@ var Table = (props) => {
82252
82466
  alwaysAggregateAtRootLevel: !onSSDR,
82253
82467
  autoGroupColumnDef: decoratedAutoGroupColDef,
82254
82468
  cacheBlockSize: props.paginationPageSize || defaultPaginationPageSize,
82469
+ isGroupOpenByDefault: isClientSideGroupOpenByDefault,
82470
+ isServerSideGroupOpenByDefault,
82255
82471
  defaultColDef,
82256
82472
  enableGroupEdit: internalTableContext.enableGroupEditAndValidation,
82257
82473
  enableCellTextSelection: internalTableContext.enableCellTextSelection,