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

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,8 +1,8 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-pivot",
3
- "version": "11.65.0-alpha.0",
3
+ "version": "11.65.0-alpha.10",
4
4
  "description": "GoodData.UI SDK - Pivot Table",
5
- "license": "MIT",
5
+ "license": "LicenseRef-LICENSE",
6
6
  "author": "GoodData Corporation",
7
7
  "repository": {
8
8
  "type": "git",
@@ -15,7 +15,8 @@
15
15
  "esm/**/*.d.ts",
16
16
  "esm/**/*.map",
17
17
  "esm/**/*.svg",
18
- "styles"
18
+ "styles",
19
+ "NOTICE"
19
20
  ],
20
21
  "type": "module",
21
22
  "sideEffects": [
@@ -42,12 +43,12 @@
42
43
  "ts-invariant": "0.10.3",
43
44
  "tslib": "2.8.1",
44
45
  "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"
46
+ "@gooddata/sdk-backend-spi": "11.65.0-alpha.10",
47
+ "@gooddata/sdk-model": "11.65.0-alpha.10",
48
+ "@gooddata/sdk-ui": "11.65.0-alpha.10",
49
+ "@gooddata/sdk-ui-kit": "11.65.0-alpha.10",
50
+ "@gooddata/sdk-ui-theme-provider": "11.65.0-alpha.10",
51
+ "@gooddata/sdk-ui-vis-commons": "11.65.0-alpha.10"
51
52
  },
52
53
  "devDependencies": {
53
54
  "@microsoft/api-documenter": "7.30.16",
@@ -85,12 +86,12 @@
85
86
  "stylelint": "16.26.1",
86
87
  "typescript": "7.0.2",
87
88
  "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"
89
+ "@gooddata/eslint-config": "11.65.0-alpha.10",
90
+ "@gooddata/reference-workspace": "11.65.0-alpha.10",
91
+ "@gooddata/oxlint-config": "11.65.0-alpha.10",
92
+ "@gooddata/sdk-backend-base": "11.65.0-alpha.10",
93
+ "@gooddata/sdk-backend-mockingbird": "11.65.0-alpha.10",
94
+ "@gooddata/stylelint-config": "11.65.0-alpha.10"
94
95
  },
95
96
  "peerDependencies": {
96
97
  "react": "^18.0.0 || ^19.0.0",
@@ -11,7 +11,7 @@
11
11
  --gd-palette-complementary-4: #ccd8e2;
12
12
  --gd-palette-complementary-5: #b0beca;
13
13
  --gd-palette-complementary-6: #94a1ad;
14
- --gd-palette-complementary-7: #6d7680;
14
+ --gd-palette-complementary-7: #6a737d;
15
15
  --gd-palette-complementary-8: #464e56;
16
16
  --gd-palette-complementary-9: #000;
17
17
  --gd-button-borderRadius: 3px;
@@ -96,11 +96,11 @@
96
96
  --gd-modal-title-lineColor: var(--gd-palette-complementary-3, #dde4eb);
97
97
  --gd-toolbar-borderRadius: 4px;
98
98
  --gd-chart-axis-color: var(--gd-palette-complementary-4-from-theme, #ccd6eb);
99
- --gd-chart-axis-labelColor: var(--gd-palette-complementary-7, #6d7680);
99
+ --gd-chart-axis-labelColor: var(--gd-palette-complementary-7);
100
100
  --gd-chart-axis-valueColor: var(--gd-palette-complementary-6, #94a1ad);
101
101
  --gd-chart-backgroundColor: var(--gd-palette-complementary-0, #fff);
102
102
  --gd-chart-gridColor: var(--gd-palette-complementary-3-from-theme, #ebebeb);
103
- --gd-chart-legendValueColor: var(--gd-palette-complementary-7, #6d7680);
103
+ --gd-chart-legendValueColor: var(--gd-palette-complementary-7);
104
104
  --gd-chart-tooltip-backgroundColor: var(
105
105
  --gd-chart-tooltipBackgroundColor,
106
106
  var(--gd-palette-complementary-0-from-theme, rgba(255, 255, 255, 0.95))
@@ -120,7 +120,7 @@
120
120
  --gd-chart-dataLabel-backplateBorderColor: var(--gd-palette-complementary-3-from-theme, #dde4eb);
121
121
  --gd-chart-dataLabel-backplateBorderRadius: 2px;
122
122
  --gd-chart-axisColor: var(--gd-palette-complementary-4-from-theme, #ccd6eb);
123
- --gd-chart-axisLabelColor: var(--gd-palette-complementary-7, #6d7680);
123
+ --gd-chart-axisLabelColor: var(--gd-palette-complementary-7);
124
124
  --gd-chart-axisValueColor: var(--gd-palette-complementary-6, #94a1ad);
125
125
  --gd-chart-tooltipBackgroundColor: var(
126
126
  --gd-palette-complementary-0-from-theme,
@@ -142,7 +142,7 @@
142
142
  --gd-palette-complementary-7-from-theme,
143
143
  var(--gd-palette-complementary-8, #464e56)
144
144
  );
145
- --gd-table-hoverBackgroundColor: var(--gd-palette-complementary-1-from-theme, rgba(109, 118, 128, 0.1));
145
+ --gd-table-hoverBackgroundColor: var(--gd-palette-complementary-1-from-theme, rgba(106, 115, 125, 0.1));
146
146
  --gd-table-loadingIconColor: var(--gd-palette-complementary-6, #94a1ad);
147
147
  --gd-table-nullValueColor: var(--gd-palette-complementary-6, #94a1ad);
148
148
  --gd-table-subtotalBackgroundColor: var(
@@ -170,7 +170,7 @@
170
170
  --gd-dashboards-content-kpiWidget-dropShadow: var(--gd-dashboards-content-widget-dropShadow, none);
171
171
  --gd-dashboards-content-kpiWidget-kpi-primaryMeasureColor: var(
172
172
  --gd-palette-complementary-9-from-theme,
173
- #6d7680
173
+ #6a737d
174
174
  );
175
175
  --gd-dashboards-content-kpiWidget-kpi-secondaryInfoColor: var(--gd-palette-complementary-6, #94a1ad);
176
176
  --gd-dashboards-content-kpiWidget-title-color: var(
@@ -843,7 +843,7 @@
843
843
  .gd-list-actions-selection-size {
844
844
  box-sizing: border-box;
845
845
  margin: 1px 0 0 5px;
846
- color: var(--gd-palette-complementary-7, #6d7680);
846
+ color: var(--gd-palette-complementary-7);
847
847
  }
848
848
 
849
849
  .gd-list {
@@ -7969,7 +7969,7 @@ button.gd-list-item {
7969
7969
  --ag-modal-overlay-background-color: var(--gd-table-backgroundColor, var(--gd-palette-complementary-0, #fff));
7970
7970
  --ag-odd-row-background-color: transparent;
7971
7971
  --ag-secondary-foreground-color: var(--gd-table-valueColor, var(--gd-palette-complementary-8, #464e56));
7972
- --ag-row-hover-color: var(--gd-table-hoverBackgroundColor, var(--gd-palette-complementary-1-from-theme, rgba(109, 118, 128, 0.1)));
7972
+ --ag-row-hover-color: var(--gd-table-hoverBackgroundColor, var(--gd-palette-complementary-1-from-theme, rgba(106, 115, 125, 0.1)));
7973
7973
  --ag-cell-horizontal-border: none;
7974
7974
  --ag-header-background-color: var(--gd-table-backgroundColor, var(--gd-palette-complementary-0, #fff));
7975
7975
  --ag-header-foreground-color: var(--gd-table-headerLabelColor, var(--gd-palette-complementary-7-from-theme, var(--gd-palette-complementary-8, #464e56)));
@@ -6770,7 +6770,7 @@
6770
6770
  --ag-modal-overlay-background-color: var(--gd-table-backgroundColor, var(--gd-palette-complementary-0, #fff));
6771
6771
  --ag-odd-row-background-color: transparent;
6772
6772
  --ag-secondary-foreground-color: var(--gd-table-valueColor, var(--gd-palette-complementary-8, #464e56));
6773
- --ag-row-hover-color: var(--gd-table-hoverBackgroundColor, var(--gd-palette-complementary-1-from-theme, rgba(109, 118, 128, 0.1)));
6773
+ --ag-row-hover-color: var(--gd-table-hoverBackgroundColor, var(--gd-palette-complementary-1-from-theme, rgba(106, 115, 125, 0.1)));
6774
6774
  --ag-cell-horizontal-border: none;
6775
6775
  --ag-header-background-color: var(--gd-table-backgroundColor, var(--gd-palette-complementary-0, #fff));
6776
6776
  --ag-header-foreground-color: var(--gd-table-headerLabelColor, var(--gd-palette-complementary-7-from-theme, var(--gd-palette-complementary-8, #464e56)));