@gooddata/sdk-ui-pivot 11.65.0-alpha.0 → 11.65.0-alpha.2

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.
@@ -68,6 +68,11 @@ export declare class TableFacade {
68
68
  private columnApi;
69
69
  private destroyed;
70
70
  private onPageLoadedCallback;
71
+ /**
72
+ * Gives element values of attributes with a number format their formatted name; applied to the
73
+ * initial data view and to every page loaded later so the table shows them consistently.
74
+ */
75
+ private readonly formatDataView;
71
76
  private onExecutionTransformedCallback;
72
77
  constructor(result: IExecutionResult, dataView: IDataView, tableMethods: TableDataCallbacks & TableConfigAccessors, props: Readonly<ICorePivotTableInternalProps>, getCurrentAbortController: () => AbortController | undefined);
73
78
  finishInitialization: (gridApi: GridApi, columnApi: GridApi) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"tableFacade.d.ts","sourceRoot":"","sources":["../../src/impl/tableFacade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tableFacade.d.ts","sourceRoot":"","sources":["../../src/impl/tableFacade.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  // (C) 2007-2026 GoodData Corporation
2
2
  import { invariant } from "ts-invariant";
3
3
  import { defFingerprint } from "@gooddata/sdk-model";
4
- import { DataViewFacade, createExportFunction, emptyHeaderTitleFromIntl, } from "@gooddata/sdk-ui";
4
+ import { DataViewFacade, createExportFunction, createNumberFormatter, emptyHeaderTitleFromIntl, formatAttributeHeaderValues, } from "@gooddata/sdk-ui";
5
5
  import { UIClick } from "../columnWidths.js";
6
6
  import { getHeaderHeight } from "./base/agApiWrapper.js";
7
7
  import { setColumnMaxWidth, setColumnMaxWidthIf } from "./base/agColumnWrapper.js";
@@ -78,12 +78,18 @@ export class TableFacade {
78
78
  columnApi;
79
79
  destroyed = false;
80
80
  onPageLoadedCallback;
81
+ /**
82
+ * Gives element values of attributes with a number format their formatted name; applied to the
83
+ * initial data view and to every page loaded later so the table shows them consistently.
84
+ */
85
+ formatDataView;
81
86
  onExecutionTransformedCallback;
82
87
  constructor(result, dataView, tableMethods, props, getCurrentAbortController) {
83
88
  this.getCurrentAbortController = getCurrentAbortController;
84
89
  this.intl = props.intl;
85
90
  this.currentResult = result;
86
- this.visibleData = DataViewFacade.for(dataView);
91
+ this.formatDataView = (view) => formatAttributeHeaderValues(view, createNumberFormatter(props.config?.separators));
92
+ this.visibleData = DataViewFacade.for(this.formatDataView(dataView));
87
93
  this.currentFingerprint = defFingerprint(this.currentResult.definition);
88
94
  this.tableDescriptor = TableDescriptor.for(this.visibleData, emptyHeaderTitleFromIntl(props.intl), props.config, props.intl);
89
95
  this.autoResizedColumns = {};
@@ -176,7 +182,7 @@ export class TableFacade {
176
182
  onPageLoaded: this.onPageLoaded,
177
183
  onExecutionTransformed: this.onExecutionTransformed,
178
184
  onTransformedExecutionFailed: this.onTransformedExecutionFailed,
179
- dataViewTransform: (v) => v,
185
+ dataViewTransform: this.formatDataView,
180
186
  }, this.visibleData, this.gridApiGuard, this.intl, this.getCurrentAbortController);
181
187
  };
182
188
  onExecutionTransformed = (newExecution) => {
@@ -1 +1 @@
1
- {"version":3,"file":"AttributeHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/AttributeHeader.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAMtF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,2CAwGzD"}
1
+ {"version":3,"file":"AttributeHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/AttributeHeader.tsx"],"names":[],"mappings":"AAcA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAMtF;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,kBAAkB,2CAgGzD"}
@@ -15,7 +15,6 @@ import { SortIndicator } from "./SortIndicator.js";
15
15
  */
16
16
  export function AttributeHeader(params) {
17
17
  const [isMenuOpen, setIsMenuOpen] = useState(false);
18
- const [isKeyboardTriggered, setIsKeyboardTriggered] = useState(false);
19
18
  const colDef = params.column.getColDef();
20
19
  const columnDefinition = colDef.context?.columnDefinition;
21
20
  // Checks if this is a transposed value column under a pivot group
@@ -36,17 +35,11 @@ export function AttributeHeader(params) {
36
35
  }, { measureIdentifiers: [], pivotAttributeDescriptors: [] }, params);
37
36
  useHeaderSpaceKey(params, handleHeaderClick);
38
37
  useHeaderMenuKeyboard(params, () => {
39
- setIsKeyboardTriggered(true);
40
38
  setIsMenuOpen(true);
41
39
  }, hasMenuItems);
42
40
  useHeaderCellAriaLabel(params.eGridHeader, headerCellAriaLabel);
43
41
  return (_jsx(HeaderKeyboardHint, { eGridHeader: params.eGridHeader, enabled: isFirstDisplayedColumn(params), canSort: allowSorting, canOpenMenu: hasMenuItems, children: _jsxs("div", { className: e("header-cell", {
44
42
  "is-menu-open": isMenuOpen,
45
43
  drillable: isDrillable,
46
- }), ...getPivotHeaderTestIdProps({ drillable: isDrillable }), children: [_jsxs("div", { className: "gd-header-content", "aria-hidden": "true", children: [_jsx("span", { className: "gd-header-text", ...getPivotHeaderTextTestIdProps(), children: params.displayName }), !!colDef.sortable && sortDirection ? (_jsx(SortIndicator, { sortDirection: sortDirection, sortIndex: sortIndex })) : null] }), !!colDef.sortable || !!isDrillable ? (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })) : null, hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: (opened) => {
47
- setIsMenuOpen(opened);
48
- if (!opened) {
49
- setIsKeyboardTriggered(false);
50
- }
51
- }, isKeyboardTriggered: isKeyboardTriggered })) : null] }) }));
44
+ }), ...getPivotHeaderTestIdProps({ drillable: isDrillable }), children: [_jsxs("div", { className: "gd-header-content", "aria-hidden": "true", children: [_jsx("span", { className: "gd-header-text", ...getPivotHeaderTextTestIdProps(), children: params.displayName }), !!colDef.sortable && sortDirection ? (_jsx(SortIndicator, { sortDirection: sortDirection, sortIndex: sortIndex })) : null] }), !!colDef.sortable || !!isDrillable ? (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })) : null, hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: setIsMenuOpen })) : null] }) }));
52
45
  }
@@ -8,11 +8,6 @@ export interface IHeaderMenuProps {
8
8
  onSortingItemClick: (item: ISortingMenuItem) => void;
9
9
  isMenuOpened: boolean;
10
10
  onMenuOpenedChange: (opened: boolean) => void;
11
- /**
12
- * Whether the menu was opened via keyboard (Alt + Down Arrow).
13
- * When true, the menu will autofocus on open.
14
- */
15
- isKeyboardTriggered?: boolean;
16
11
  }
17
- export declare function HeaderMenu({ aggregationsItems, textWrappingItems, sortingItems, onAggregationsItemClick, onTextWrappingItemClick, onSortingItemClick, isMenuOpened, onMenuOpenedChange, isKeyboardTriggered, }: IHeaderMenuProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function HeaderMenu({ aggregationsItems, textWrappingItems, sortingItems, onAggregationsItemClick, onTextWrappingItemClick, onSortingItemClick, isMenuOpened, onMenuOpenedChange, }: IHeaderMenuProps): import("react/jsx-runtime").JSX.Element;
18
13
  //# sourceMappingURL=HeaderMenu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HeaderMenu.d.ts","sourceRoot":"","sources":["../../../../../src/next/components/Header/HeaderCell/HeaderMenu.tsx"],"names":[],"mappings":"AAkBA,OAAO,EACH,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC7B,MAAM,wBAAwB,CAAC;AAQhC,MAAM,WAAW,gBAAgB;IAC7B,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,uBAAuB,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAClE,uBAAuB,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/D,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9C;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CACjC;AAmBD,wBAAgB,UAAU,CAAC,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,mBAA2B,GAC9B,EAAE,gBAAgB,2CAsGlB"}
1
+ {"version":3,"file":"HeaderMenu.d.ts","sourceRoot":"","sources":["../../../../../src/next/components/Header/HeaderCell/HeaderMenu.tsx"],"names":[],"mappings":"AAkBA,OAAO,EACH,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC7B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC7B,MAAM,wBAAwB,CAAC;AAQhC,MAAM,WAAW,gBAAgB;IAC7B,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;IAC3C,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,uBAAuB,EAAE,CAAC,IAAI,EAAE,wBAAwB,KAAK,IAAI,CAAC;IAClE,uBAAuB,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/D,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACrD,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;CACjD;AAyBD,wBAAgB,UAAU,CAAC,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,GACrB,EAAE,gBAAgB,2CAsGlB"}
@@ -10,9 +10,14 @@ import { getPivotHeaderMenuButtonTestIdProps } from "../../../testing/dataTestId
10
10
  import { HeaderInteractiveItem, buildUiMenuItems, } from "./HeaderMenuComponents.js";
11
11
  function MenuToggler({ onClick }) {
12
12
  const intl = useIntl();
13
- return (_jsxs("button", { type: "button", className: e("header-cell-menu-button"), onClick: onClick, "aria-label": intl.formatMessage(messages["openHeaderMenuAria"]), ...getPivotHeaderMenuButtonTestIdProps(), children: [_jsx(UiIcon, { type: "ellipsisVertical" }), _jsx("span", { className: e("header-cell-menu-clickable-area") })] }));
13
+ return (_jsxs("button", { type: "button", className: e("header-cell-menu-button"), onClick: onClick, onKeyDownCapture: (event) => {
14
+ // Keep AG Grid's native header listener from sorting when activating this button.
15
+ if (event.key === "Enter" || event.key === " ") {
16
+ event.stopPropagation();
17
+ }
18
+ }, "aria-label": intl.formatMessage(messages["openHeaderMenuAria"]), ...getPivotHeaderMenuButtonTestIdProps(), children: [_jsx(UiIcon, { type: "ellipsisVertical" }), _jsx("span", { className: e("header-cell-menu-clickable-area") })] }));
14
19
  }
15
- export function HeaderMenu({ aggregationsItems, textWrappingItems, sortingItems, onAggregationsItemClick, onTextWrappingItemClick, onSortingItemClick, isMenuOpened, onMenuOpenedChange, isKeyboardTriggered = false, }) {
20
+ export function HeaderMenu({ aggregationsItems, textWrappingItems, sortingItems, onAggregationsItemClick, onTextWrappingItemClick, onSortingItemClick, isMenuOpened, onMenuOpenedChange, }) {
16
21
  const intl = useIntl();
17
22
  const toggleDropdownRef = useRef(null);
18
23
  const prevIsMenuOpenedRef = useRef(isMenuOpened);
@@ -59,7 +64,7 @@ export function HeaderMenu({ aggregationsItems, textWrappingItems, sortingItems,
59
64
  return (_jsx("div", { className: e("header-cell-menu-button-wrapper"), children: _jsx(Dropdown, { isOpen: isMenuOpened, onToggle: handleToggle, closeOnEscape: true, closeOnOutsideClick: true, closeOnParentScroll: true, overlayPositionType: "sameAsTarget", alignPoints: [
60
65
  { align: "bl tl", offset: { x: -10, y: 16 } },
61
66
  { align: "br tr", offset: { x: -10, y: 16 } },
62
- ], accessibilityConfig: { triggerRole: "button", popupRole: "dialog" }, overlayZIndex: overlayZIndex, autofocusOnOpen: isKeyboardTriggered, renderButton: ({ toggleDropdown }) => {
67
+ ], accessibilityConfig: { triggerRole: "button", popupRole: "dialog" }, overlayZIndex: overlayZIndex, autofocusOnOpen: true, renderButton: ({ toggleDropdown }) => {
63
68
  toggleDropdownRef.current = toggleDropdown;
64
69
  return _jsx(MenuToggler, { onClick: handleButtonClick });
65
70
  }, renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx(UiMenu, { items: uiMenuItems, onSelect: handleSelect, onClose: closeDropdown, shouldCloseOnSelect: false, containerBottomPadding: "small", ariaAttributes: {
@@ -1 +1 @@
1
- {"version":3,"file":"MeasureGroupHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/MeasureGroupHeader.tsx"],"names":[],"mappings":"AAYA,OAAO,EACH,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EAC1B,MAAM,uBAAuB,CAAC;AAW/B;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,2CAwGvF"}
1
+ {"version":3,"file":"MeasureGroupHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/MeasureGroupHeader.tsx"],"names":[],"mappings":"AAYA,OAAO,EACH,KAAK,wBAAwB,EAE7B,KAAK,kBAAkB,EAC1B,MAAM,uBAAuB,CAAC;AAW/B;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,kBAAkB,2CAgGvF"}
@@ -20,7 +20,6 @@ import { getColumnMeasureIdentifier, getPivotAttributeDescriptorsForMeasureGroup
20
20
  */
21
21
  export function MeasureGroupHeader(params) {
22
22
  const [isMenuOpen, setIsMenuOpen] = useState(false);
23
- const [isKeyboardTriggered, setIsKeyboardTriggered] = useState(false);
24
23
  const { isPivoted } = useColumnDefs();
25
24
  const { config } = usePivotTableProps();
26
25
  const { columnHeadersPosition } = config;
@@ -52,7 +51,6 @@ export function MeasureGroupHeader(params) {
52
51
  }, { measureIdentifiers: measureIdentifier ? [measureIdentifier] : [], pivotAttributeDescriptors }, isHeader ? params : null);
53
52
  const hasMenuItems = aggregationsItems.length > 0 || textWrappingItems.length > 0;
54
53
  useHeaderMenuKeyboard(isHeader ? params : { eGridHeader: undefined }, () => {
55
- setIsKeyboardTriggered(true);
56
54
  setIsMenuOpen(true);
57
55
  }, isHeader && hasMenuItems);
58
56
  useHeaderCellAriaLabel(isHeader ? params.eGridHeader : undefined, headerCellAriaLabel);
@@ -65,12 +63,7 @@ export function MeasureGroupHeader(params) {
65
63
  : (effectiveMeasure?.descriptor.measureHeaderItem.name ?? params.value);
66
64
  return (_jsx(HeaderKeyboardHint, { eGridHeader: isHeader ? params.eGridHeader : undefined, enabled: isHeader && isFirstDisplayedColumn(params), canOpenMenu: hasMenuItems, children: _jsxs("div", { className: e("header-cell", {
67
65
  "is-menu-open": isMenuOpen,
68
- }), children: [_jsx("div", { className: "gd-header-content", "aria-hidden": "true", children: _jsx("span", { className: "gd-header-text", children: displayName }) }), hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: (opened) => {
69
- setIsMenuOpen(opened);
70
- if (!opened) {
71
- setIsKeyboardTriggered(false);
72
- }
73
- }, isKeyboardTriggered: isKeyboardTriggered })) : null] }) }));
66
+ }), children: [_jsx("div", { className: "gd-header-content", "aria-hidden": "true", children: _jsx("span", { className: "gd-header-text", children: displayName }) }), hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: setIsMenuOpen })) : null] }) }));
74
67
  }
75
68
  // Distinguish between header params and cell params here
76
69
  function isHeaderParams(p) {
@@ -1 +1 @@
1
- {"version":3,"file":"MeasureHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/MeasureHeader.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAYtF;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,2CAiIvD"}
1
+ {"version":3,"file":"MeasureHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/MeasureHeader.tsx"],"names":[],"mappings":"AAoBA,OAAO,EAAwB,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAYtF;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,kBAAkB,2CAyHvD"}
@@ -21,7 +21,6 @@ import { getColumnMeasureIdentifier, getColumnScope, getPivotAttributeDescriptor
21
21
  */
22
22
  export function MeasureHeader(params) {
23
23
  const [isMenuOpen, setIsMenuOpen] = useState(false);
24
- const [isKeyboardTriggered, setIsKeyboardTriggered] = useState(false);
25
24
  const isTransposed = useIsTransposed();
26
25
  const { isPivoted } = useColumnDefs();
27
26
  const colDef = params.column.getColDef();
@@ -64,16 +63,10 @@ export function MeasureHeader(params) {
64
63
  }, params);
65
64
  useHeaderSpaceKey(params, handleTotalLabelClick ?? handleHeaderClick);
66
65
  useHeaderMenuKeyboard(params, () => {
67
- setIsKeyboardTriggered(true);
68
66
  setIsMenuOpen(true);
69
67
  }, hasMenuItems);
70
68
  useHeaderCellAriaLabel(params.eGridHeader, headerCellAriaLabel, params.displayName);
71
69
  return (_jsx(HeaderKeyboardHint, { eGridHeader: params.eGridHeader, enabled: isFirstDisplayedColumn(params), canSort: allowSorting, canOpenMenu: hasMenuItems, children: _jsxs("div", { className: e("header-cell", {
72
70
  "is-menu-open": isMenuOpen,
73
- }), onClick: handleTotalLabelClick, ...getPivotHeaderTestIdProps({ isTotal, isSubtotal }), children: [_jsxs("div", { className: "gd-header-content", "aria-hidden": "true", children: [_jsx("span", { className: "gd-header-text", ...getPivotHeaderTextTestIdProps(), children: customTotalLabel ?? params.displayName }), !!colDef.sortable && sortDirection ? (_jsx(SortIndicator, { sortDirection: sortDirection, sortIndex: sortIndex })) : null] }), !!colDef.sortable && (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })), hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: (opened) => {
74
- setIsMenuOpen(opened);
75
- if (!opened) {
76
- setIsKeyboardTriggered(false);
77
- }
78
- }, isKeyboardTriggered: isKeyboardTriggered })) : null] }) }));
71
+ }), onClick: handleTotalLabelClick, ...getPivotHeaderTestIdProps({ isTotal, isSubtotal }), children: [_jsxs("div", { className: "gd-header-content", "aria-hidden": "true", children: [_jsx("span", { className: "gd-header-text", ...getPivotHeaderTextTestIdProps(), children: customTotalLabel ?? params.displayName }), !!colDef.sortable && sortDirection ? (_jsx(SortIndicator, { sortDirection: sortDirection, sortIndex: sortIndex })) : null] }), !!colDef.sortable && (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })), hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: setIsMenuOpen })) : null] }) }));
79
72
  }
@@ -1 +1 @@
1
- {"version":3,"file":"PivotGroupHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/PivotGroupHeader.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAKhG,UAAU,qBAAsB,SAAQ,uBAAuB;IAC3D,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,qBAAqB,2CAuJ7D"}
1
+ {"version":3,"file":"PivotGroupHeader.d.ts","sourceRoot":"","sources":["../../../../src/next/components/Header/PivotGroupHeader.tsx"],"names":[],"mappings":"AAsBA,OAAO,EAA6B,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAKhG,UAAU,qBAAsB,SAAQ,uBAAuB;IAC3D,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,qBAAqB,2CA+I7D"}
@@ -19,7 +19,6 @@ import { getColumnScope, getPivotAttributeDescriptors, isValueColumnDef } from "
19
19
  */
20
20
  export function PivotGroupHeader(params) {
21
21
  const [isMenuOpen, setIsMenuOpen] = useState(false);
22
- const [isKeyboardTriggered, setIsKeyboardTriggered] = useState(false);
23
22
  const isTransposed = useIsTransposed();
24
23
  const colGroupDef = params.columnGroup.getColGroupDef();
25
24
  const columnDefinition = colGroupDef?.context?.columnDefinition;
@@ -79,7 +78,6 @@ export function PivotGroupHeader(params) {
79
78
  }, [isDrillable, handleHeaderDrill]);
80
79
  useHeaderSpaceKey(params, handleTotalLabelClick ?? handleHeaderClick);
81
80
  useHeaderMenuKeyboard(params, () => {
82
- setIsKeyboardTriggered(true);
83
81
  setIsMenuOpen(true);
84
82
  }, hasMenuItems);
85
83
  useHeaderCellAriaLabel(params.eGridHeader, headerCellAriaLabel, params.displayName);
@@ -90,10 +88,5 @@ export function PivotGroupHeader(params) {
90
88
  drillable: isDrillable,
91
89
  isTotal: isTotalHeader,
92
90
  isSubtotal: isSubtotalHeader,
93
- }), children: [_jsx("div", { className: "gd-header-content", "aria-hidden": "true", children: _jsx("span", { className: "gd-header-text", ...(ownsTotalLabel ? getPivotHeaderTextTestIdProps() : {}), children: visibleHeaderText }) }), isDrillable ? (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })) : null, hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: (opened) => {
94
- setIsMenuOpen(opened);
95
- if (!opened) {
96
- setIsKeyboardTriggered(false);
97
- }
98
- }, isKeyboardTriggered: isKeyboardTriggered })) : null] }));
91
+ }), children: [_jsx("div", { className: "gd-header-content", "aria-hidden": "true", children: _jsx("span", { className: "gd-header-text", ...(ownsTotalLabel ? getPivotHeaderTextTestIdProps() : {}), children: visibleHeaderText }) }), isDrillable ? (_jsx("div", { className: "gd-header-cell-clickable-area", "aria-hidden": "true", ...getPivotHeaderClickableAreaTestIdProps(), onClick: handleHeaderClick })) : null, hasMenuItems ? (_jsx(HeaderMenu, { aggregationsItems: aggregationsItems, textWrappingItems: textWrappingItems, sortingItems: sortingItems, onAggregationsItemClick: handleAggregationsItemClick, onTextWrappingItemClick: handleTextWrappingItemClick, onSortingItemClick: handleSortingItemClick, isMenuOpened: isMenuOpen, onMenuOpenedChange: setIsMenuOpen })) : null] }));
99
92
  }
@@ -1,5 +1,5 @@
1
1
  import { type ISeparators } from "@gooddata/sdk-model";
2
- import { type DataViewFacade, type ITableData } from "@gooddata/sdk-ui";
2
+ import { DataViewFacade, type ITableData } from "@gooddata/sdk-ui";
3
3
  /**
4
4
  * Returns table data from a DataViewFacade with consistent value formatting.
5
5
  *
@@ -7,6 +7,10 @@ import { type DataViewFacade, type ITableData } from "@gooddata/sdk-ui";
7
7
  * This ensures all access to table data uses the same formatter without HTML escaping.
8
8
  * The DataViewFacade caches dataAccessMethods, so all calls must use the same formatter.
9
9
  *
10
+ * Element values of attributes with a number format (numeric computed attributes) are formatted with the
11
+ * same formatter before the table data is built. This happens once per data view and separators; later
12
+ * calls for the same data view with the same separators return the cached table data.
13
+ *
10
14
  * @param dataView - The data view facade
11
15
  * @param separators - Number separators to use for formatting
12
16
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../../src/next/features/data/valueFormatter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,UAAU,EAAuB,MAAM,kBAAkB,CAAC;AAyB7F;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,UAAU,CAE3F"}
1
+ {"version":3,"file":"valueFormatter.d.ts","sourceRoot":"","sources":["../../../../src/next/features/data/valueFormatter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EACH,cAAc,EACd,KAAK,UAAU,EAGlB,MAAM,kBAAkB,CAAC;AAa1B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,WAAW,GAAG,UAAU,CAe3F"}
@@ -1,25 +1,13 @@
1
- // (C) 2025 GoodData Corporation
2
- import { ClientFormatterFacade } from "@gooddata/number-formatter";
1
+ // (C) 2025-2026 GoodData Corporation
2
+ import { DataViewFacade, createNumberFormatter, formatAttributeHeaderValues, } from "@gooddata/sdk-ui";
3
3
  /**
4
- * Formats a number value using the number-formatter.
4
+ * Data views with formatted attribute element values, by the data view they were made from, together with
5
+ * the separators they were formatted with. Reusing the formatted view reuses its facade together with the
6
+ * table data the facade caches.
5
7
  */
6
- function getFormattedNumber(value, format, separators) {
7
- const parsedNumber = ClientFormatterFacade.convertValue(value);
8
- return ClientFormatterFacade.formatValue(parsedNumber, format, separators);
9
- }
10
- /**
11
- * Creates a value formatter that formats measure values without HTML escaping.
12
- *
13
- * @remarks
14
- * This mirrors the old pivot table behavior.
15
- *
16
- * @param separators - number separators to use
17
- */
18
- function createValueFormatter(separators) {
19
- return (value, format) => {
20
- const { formattedValue } = getFormattedNumber(value, format, separators);
21
- return formattedValue;
22
- };
8
+ const formattedDataViews = new WeakMap();
9
+ function separatorsKey(separators) {
10
+ return JSON.stringify([separators?.thousand, separators?.decimal]);
23
11
  }
24
12
  /**
25
13
  * Returns table data from a DataViewFacade with consistent value formatting.
@@ -28,10 +16,25 @@ function createValueFormatter(separators) {
28
16
  * This ensures all access to table data uses the same formatter without HTML escaping.
29
17
  * The DataViewFacade caches dataAccessMethods, so all calls must use the same formatter.
30
18
  *
19
+ * Element values of attributes with a number format (numeric computed attributes) are formatted with the
20
+ * same formatter before the table data is built. This happens once per data view and separators; later
21
+ * calls for the same data view with the same separators return the cached table data.
22
+ *
31
23
  * @param dataView - The data view facade
32
24
  * @param separators - Number separators to use for formatting
33
25
  * @internal
34
26
  */
35
27
  export function getTableData(dataView, separators) {
36
- return dataView.data({ valueFormatter: createValueFormatter(separators) }).asTable();
28
+ const valueFormatter = createNumberFormatter(separators);
29
+ const sourceDataView = dataView.dataView;
30
+ const key = separatorsKey(separators);
31
+ let cached = formattedDataViews.get(sourceDataView);
32
+ if (cached?.separatorsKey !== key) {
33
+ cached = {
34
+ separatorsKey: key,
35
+ dataView: formatAttributeHeaderValues(sourceDataView, valueFormatter),
36
+ };
37
+ formattedDataViews.set(sourceDataView, cached);
38
+ }
39
+ return DataViewFacade.for(cached.dataView).data({ valueFormatter }).asTable();
37
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-pivot",
3
- "version": "11.65.0-alpha.0",
3
+ "version": "11.65.0-alpha.2",
4
4
  "description": "GoodData.UI SDK - Pivot Table",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -42,12 +42,12 @@
42
42
  "ts-invariant": "0.10.3",
43
43
  "tslib": "2.8.1",
44
44
  "uuid": "11.1.1",
45
- "@gooddata/sdk-backend-spi": "11.65.0-alpha.0",
46
- "@gooddata/sdk-ui": "11.65.0-alpha.0",
47
- "@gooddata/sdk-model": "11.65.0-alpha.0",
48
- "@gooddata/sdk-ui-kit": "11.65.0-alpha.0",
49
- "@gooddata/sdk-ui-theme-provider": "11.65.0-alpha.0",
50
- "@gooddata/sdk-ui-vis-commons": "11.65.0-alpha.0"
45
+ "@gooddata/sdk-model": "11.65.0-alpha.2",
46
+ "@gooddata/sdk-backend-spi": "11.65.0-alpha.2",
47
+ "@gooddata/sdk-ui": "11.65.0-alpha.2",
48
+ "@gooddata/sdk-ui-kit": "11.65.0-alpha.2",
49
+ "@gooddata/sdk-ui-theme-provider": "11.65.0-alpha.2",
50
+ "@gooddata/sdk-ui-vis-commons": "11.65.0-alpha.2"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@microsoft/api-documenter": "7.30.16",
@@ -85,12 +85,12 @@
85
85
  "stylelint": "16.26.1",
86
86
  "typescript": "7.0.2",
87
87
  "vitest": "5.0.4",
88
- "@gooddata/eslint-config": "11.65.0-alpha.0",
89
- "@gooddata/oxlint-config": "11.65.0-alpha.0",
90
- "@gooddata/reference-workspace": "11.65.0-alpha.0",
91
- "@gooddata/sdk-backend-base": "11.65.0-alpha.0",
92
- "@gooddata/sdk-backend-mockingbird": "11.65.0-alpha.0",
93
- "@gooddata/stylelint-config": "11.65.0-alpha.0"
88
+ "@gooddata/eslint-config": "11.65.0-alpha.2",
89
+ "@gooddata/oxlint-config": "11.65.0-alpha.2",
90
+ "@gooddata/stylelint-config": "11.65.0-alpha.2",
91
+ "@gooddata/sdk-backend-base": "11.65.0-alpha.2",
92
+ "@gooddata/reference-workspace": "11.65.0-alpha.2",
93
+ "@gooddata/sdk-backend-mockingbird": "11.65.0-alpha.2"
94
94
  },
95
95
  "peerDependencies": {
96
96
  "react": "^18.0.0 || ^19.0.0",