@gooddata/sdk-ui-pivot 11.43.0-alpha.2 → 11.43.0-alpha.4

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.
Files changed (33) hide show
  1. package/esm/index.d.ts +1 -1
  2. package/esm/index.d.ts.map +1 -1
  3. package/esm/next/context/ColumnDefsContext.d.ts.map +1 -1
  4. package/esm/next/context/ColumnDefsContext.js +3 -1
  5. package/esm/next/context/PivotTablePropsContext.d.ts +2 -1
  6. package/esm/next/context/PivotTablePropsContext.d.ts.map +1 -1
  7. package/esm/next/context/PivotTablePropsContext.js +1 -1
  8. package/esm/next/features/columns/applyAllFeaturesToColDef.d.ts +4 -1
  9. package/esm/next/features/columns/applyAllFeaturesToColDef.d.ts.map +1 -1
  10. package/esm/next/features/columns/applyAllFeaturesToColDef.js +5 -2
  11. package/esm/next/features/columns/applyConditionalFormattingToColDef.d.ts +14 -0
  12. package/esm/next/features/columns/applyConditionalFormattingToColDef.d.ts.map +1 -0
  13. package/esm/next/features/columns/applyConditionalFormattingToColDef.js +33 -0
  14. package/esm/next/features/data/dataViewToColDefs.d.ts +3 -1
  15. package/esm/next/features/data/dataViewToColDefs.d.ts.map +1 -1
  16. package/esm/next/features/data/dataViewToColDefs.js +9 -1
  17. package/esm/next/features/styling/cell.d.ts.map +1 -1
  18. package/esm/next/features/styling/cell.js +2 -4
  19. package/esm/next/features/styling/cellClassification.d.ts +18 -0
  20. package/esm/next/features/styling/cellClassification.d.ts.map +1 -0
  21. package/esm/next/features/styling/cellClassification.js +31 -0
  22. package/esm/next/features/styling/conditionalFormatting.d.ts +35 -0
  23. package/esm/next/features/styling/conditionalFormatting.d.ts.map +1 -0
  24. package/esm/next/features/styling/conditionalFormatting.js +212 -0
  25. package/esm/next/index.d.ts +1 -0
  26. package/esm/next/index.d.ts.map +1 -1
  27. package/esm/next/types/conditionalFormatting.d.ts +126 -0
  28. package/esm/next/types/conditionalFormatting.d.ts.map +1 -0
  29. package/esm/next/types/conditionalFormatting.js +2 -0
  30. package/esm/next/types/public.d.ts +6 -0
  31. package/esm/next/types/public.d.ts.map +1 -1
  32. package/esm/sdk-ui-pivot.d.ts +132 -0
  33. package/package.json +13 -13
package/esm/index.d.ts CHANGED
@@ -8,7 +8,7 @@
8
8
  */
9
9
  export { PivotTable, pivotTableMenuForCapabilities, getPivotTableDimensions } from "./PivotTable.js";
10
10
  export { CorePivotTable } from "./CorePivotTable.js";
11
- export { PivotTableNext, type IPivotTableNextProps, type PivotTableNextConfig, type PivotTableNextAccessibilityConfig, type PivotTableNextTranspositionConfig, type PivotTableNextTextWrappingConfig, type PivotTableNextColumnsSizingConfig, type PivotTableNextMenuConfig, type PivotTableNextFormattingConfig, type PivotTableNextExecutionCancellingConfig, type PivotTableNextLayoutConfig, type PivotTableNextGrandTotalsPositionConfig, type PivotTableNextCellSelectionConfig, type PivotTableNextAgGridLicenseConfig, type PivotTableNextPaginationConfig, type PivotTableNextExperimentalConfig, type ColumnResizedCallback as ColumnResizedCallbackNext, type IColumnSizing as IColumnSizingNext, type IMenu as IMenuNext, type IPagination, type ITextWrapping, type IColumnTextWrappingItem, type MeasureGroupDimension as MeasureGroupDimensionNext, type ColumnHeadersPosition as ColumnHeadersPositionNext, type GrandTotalsPosition as GrandTotalsPositionNext, type ColumnWidthItem as ColumnWidthItemNext, type DefaultColumnWidth as DefaultColumnWidthNext, type IAttributeColumnWidthItem as IAttributeColumnWidthItemNext, type IMeasureColumnWidthItem as IMeasureColumnWidthItemNext, type ISliceMeasureColumnWidthItem as ISliceMeasureColumnWidthItemNext, type IMixedValuesColumnWidthItem as IMixedValuesColumnWidthItemNext, type IAllMeasureColumnWidthItem as IAllMeasureColumnWidthItemNext, type IWeakMeasureColumnWidthItem as IWeakMeasureColumnWidthItemNext, type ColumnLocator as ColumnLocatorNext, type IAttributeColumnLocator as IAttributeColumnLocatorNext, type IMeasureColumnLocator as IMeasureColumnLocatorNext, type ITotalColumnLocator as ITotalColumnLocatorNext, type IAttributeColumnLocatorBody as IAttributeColumnLocatorBodyNext, type IMeasureColumnLocatorBody as IMeasureColumnLocatorBodyNext, type ITotalColumnLocatorBody as ITotalColumnLocatorBodyNext, type IAttributeColumnWidthItemBody as IAttributeColumnWidthItemBodyNext, type IMeasureColumnWidthItemBody as IMeasureColumnWidthItemBodyNext, type ISliceMeasureColumnWidthItemBody as ISliceMeasureColumnWidthItemBodyNext, type IMixedValuesColumnWidthItemBody as IMixedValuesColumnWidthItemBodyNext, type IAllMeasureColumnWidthItemBody as IAllMeasureColumnWidthItemBodyNext, type IWeakMeasureColumnWidthItemBody as IWeakMeasureColumnWidthItemBodyNext, type ColumnWidth as ColumnWidthNext, type IAbsoluteColumnWidth as IAbsoluteColumnWidthNext, type IAutoColumnWidth as IAutoColumnWidthNext, } from "./next/index.js";
11
+ export { PivotTableNext, type IPivotTableNextProps, type PivotTableNextConfig, type PivotTableNextAccessibilityConfig, type PivotTableNextTranspositionConfig, type PivotTableNextTextWrappingConfig, type PivotTableNextColumnsSizingConfig, type PivotTableNextMenuConfig, type PivotTableNextFormattingConfig, type PivotTableNextExecutionCancellingConfig, type PivotTableNextLayoutConfig, type PivotTableNextGrandTotalsPositionConfig, type PivotTableNextCellSelectionConfig, type PivotTableNextAgGridLicenseConfig, type PivotTableNextPaginationConfig, type PivotTableNextExperimentalConfig, type PivotTableNextConditionalFormattingConfig, type IConditionalFormatting, type IConditionalFormattingRule, type IConditionalFormattingCondition, type IConditionalFormattingFormat, type ConditionalFormattingTarget, type ConditionalFormattingOperator, type ConditionalFormattingTextOperator, type ConditionalFormattingValue, type ColumnResizedCallback as ColumnResizedCallbackNext, type IColumnSizing as IColumnSizingNext, type IMenu as IMenuNext, type IPagination, type ITextWrapping, type IColumnTextWrappingItem, type MeasureGroupDimension as MeasureGroupDimensionNext, type ColumnHeadersPosition as ColumnHeadersPositionNext, type GrandTotalsPosition as GrandTotalsPositionNext, type ColumnWidthItem as ColumnWidthItemNext, type DefaultColumnWidth as DefaultColumnWidthNext, type IAttributeColumnWidthItem as IAttributeColumnWidthItemNext, type IMeasureColumnWidthItem as IMeasureColumnWidthItemNext, type ISliceMeasureColumnWidthItem as ISliceMeasureColumnWidthItemNext, type IMixedValuesColumnWidthItem as IMixedValuesColumnWidthItemNext, type IAllMeasureColumnWidthItem as IAllMeasureColumnWidthItemNext, type IWeakMeasureColumnWidthItem as IWeakMeasureColumnWidthItemNext, type ColumnLocator as ColumnLocatorNext, type IAttributeColumnLocator as IAttributeColumnLocatorNext, type IMeasureColumnLocator as IMeasureColumnLocatorNext, type ITotalColumnLocator as ITotalColumnLocatorNext, type IAttributeColumnLocatorBody as IAttributeColumnLocatorBodyNext, type IMeasureColumnLocatorBody as IMeasureColumnLocatorBodyNext, type ITotalColumnLocatorBody as ITotalColumnLocatorBodyNext, type IAttributeColumnWidthItemBody as IAttributeColumnWidthItemBodyNext, type IMeasureColumnWidthItemBody as IMeasureColumnWidthItemBodyNext, type ISliceMeasureColumnWidthItemBody as ISliceMeasureColumnWidthItemBodyNext, type IMixedValuesColumnWidthItemBody as IMixedValuesColumnWidthItemBodyNext, type IAllMeasureColumnWidthItemBody as IAllMeasureColumnWidthItemBodyNext, type IWeakMeasureColumnWidthItemBody as IWeakMeasureColumnWidthItemBodyNext, type ColumnWidth as ColumnWidthNext, type IAbsoluteColumnWidth as IAbsoluteColumnWidthNext, type IAutoColumnWidth as IAutoColumnWidthNext, } from "./next/index.js";
12
12
  export type { IPivotTableBucketProps, IPivotTableBaseProps, IPivotTableProps, IPivotTableConfig, IColumnSizing, DefaultColumnWidth, ICorePivotTableProps, ColumnResizedCallback, IMenu, MeasureGroupDimension, ColumnHeadersPosition, GrandTotalsPosition, } from "./publicTypes.js";
13
13
  export { type IWeakMeasureColumnWidthItem, type IWeakMeasureColumnWidthItemBody, type ColumnWidthItem, type ColumnWidth, type IAttributeColumnWidthItem, type IAttributeColumnWidthItemBody, type IMeasureColumnWidthItem, type IMeasureColumnWidthItemBody, type ISliceMeasureColumnWidthItem, type ISliceMeasureColumnWidthItemBody, type IMixedValuesColumnWidthItem, type IMixedValuesColumnWidthItemBody, type IAbsoluteColumnWidth, type IAllMeasureColumnWidthItem, type IAllMeasureColumnWidthItemBody, type IAutoColumnWidth, type ColumnLocator, type IAttributeColumnLocator, type IAttributeColumnLocatorBody, type ITotalColumnLocator, type ITotalColumnLocatorBody, type IMeasureColumnLocator, type IMeasureColumnLocatorBody, isWeakMeasureColumnWidthItem, isAttributeColumnWidthItem, isMeasureColumnWidthItem, isSliceMeasureColumnWidthItem, isMixedValuesColumnWidthItem, isAbsoluteColumnWidth, isAllMeasureColumnWidthItem, isMeasureColumnLocator, isAttributeColumnLocator, isTotalColumnLocator, newAttributeColumnLocator, newWidthForAllColumnsForMeasure, newWidthForAllMeasureColumns, newWidthForAttributeColumn, newWidthForSelectedColumns, setNewWidthForSelectedColumns, newTotalColumnLocator, } from "./columnWidths.js";
14
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,OAAO,EAAE,UAAU,EAAE,6BAA6B,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AACrG,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,EACH,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,gCAAgC,EACrC,KAAK,iCAAiC,EACtC,KAAK,wBAAwB,EAC7B,KAAK,8BAA8B,EACnC,KAAK,uCAAuC,EAC5C,KAAK,0BAA0B,EAC/B,KAAK,uCAAuC,EAC5C,KAAK,iCAAiC,EACtC,KAAK,iCAAiC,EACtC,KAAK,8BAA8B,EACnC,KAAK,gCAAgC,EACrC,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,KAAK,IAAI,SAAS,EACvB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,mBAAmB,IAAI,uBAAuB,EACnD,KAAK,eAAe,IAAI,mBAAmB,EAC3C,KAAK,kBAAkB,IAAI,sBAAsB,EACjD,KAAK,yBAAyB,IAAI,6BAA6B,EAC/D,KAAK,uBAAuB,IAAI,2BAA2B,EAC3D,KAAK,4BAA4B,IAAI,gCAAgC,EACrE,KAAK,2BAA2B,IAAI,+BAA+B,EACnE,KAAK,0BAA0B,IAAI,8BAA8B,EACjE,KAAK,2BAA2B,IAAI,+BAA+B,EACnE,KAAK,aAAa,IAAI,iBAAiB,EACvC,KAAK,uBAAuB,IAAI,2BAA2B,EAC3D,KAAK,qBAAqB,IAAI,yBAAyB,EACvD,KAAK,mBAAmB,IAAI,uBAAuB,EACnD,KAAK,2BAA2B,IAAI,+BAA+B,EACnE,KAAK,yBAAyB,IAAI,6BAA6B,EAC/D,KAAK,uBAAuB,IAAI,2BAA2B,EAC3D,KAAK,6BAA6B,IAAI,iCAAiC,EACvE,KAAK,2BAA2B,IAAI,+BAA+B,EACnE,KAAK,gCAAgC,IAAI,oCAAoC,EAC7E,KAAK,+BAA+B,IAAI,mCAAmC,EAC3E,KAAK,8BAA8B,IAAI,kCAAkC,EACzE,KAAK,+BAA+B,IAAI,mCAAmC,EAC3E,KAAK,WAAW,IAAI,eAAe,EACnC,KAAK,oBAAoB,IAAI,wBAAwB,EACrD,KAAK,gBAAgB,IAAI,oBAAoB,GAChD,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACR,sBAAsB,EACtB,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,KAAK,EACL,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACH,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,4BAA4B,EAC5B,0BAA0B,EAC1B,wBAAwB,EACxB,6BAA6B,EAC7B,4BAA4B,EAC5B,qBAAqB,EACrB,2BAA2B,EAC3B,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,0BAA0B,EAC1B,6BAA6B,EAC7B,qBAAqB,GACxB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnDefsContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/ColumnDefsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,OAAO,CAAC;AAM3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAM1E,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI/D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAoCvE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAQlD"}
1
+ {"version":3,"file":"ColumnDefsContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/ColumnDefsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAsC,MAAM,OAAO,CAAC;AAM3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAM1E,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAI/D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAuCvE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,kBAAkB,CAQlD"}
@@ -16,7 +16,7 @@ export function ColumnDefsProvider({ children }) {
16
16
  const initialExecutionData = useInitialExecution();
17
17
  const props = usePivotTableProps();
18
18
  const { config } = props;
19
- const { columnHeadersPosition, columnSizing: { columnWidths: initialColumnWidths }, textWrapping, separators, } = config;
19
+ const { columnHeadersPosition, columnSizing: { columnWidths: initialColumnWidths }, textWrapping, separators, conditionalFormatting, } = config;
20
20
  const { initialDataView } = initialExecutionData;
21
21
  const columnWidths = useInitialProp(initialColumnWidths);
22
22
  const drillableItemsRef = useDrillableItemsRef();
@@ -29,6 +29,7 @@ export function ColumnDefsProvider({ children }) {
29
29
  textWrapping,
30
30
  intl,
31
31
  separators,
32
+ conditionalFormatting,
32
33
  });
33
34
  }, [
34
35
  initialDataView,
@@ -38,6 +39,7 @@ export function ColumnDefsProvider({ children }) {
38
39
  intl,
39
40
  drillableItemsRef,
40
41
  separators,
42
+ conditionalFormatting,
41
43
  ]);
42
44
  return _jsx(ColumnDefsContext.Provider, { value: columnDefs, children: children });
43
45
  }
@@ -1,5 +1,6 @@
1
1
  import { type ReactNode } from "react";
2
2
  import { type IExecutionConfig } from "@gooddata/sdk-model";
3
+ import { type PivotTableNextConditionalFormattingConfig } from "../types/conditionalFormatting.js";
3
4
  import { type ICorePivotTableNextProps } from "../types/internal.js";
4
5
  import { type IMenu } from "../types/menu.js";
5
6
  import { type PivotTableNextConfig } from "../types/public.js";
@@ -16,7 +17,7 @@ type ColumnSizingWithDefaults = WithRequired<IColumnSizing, ColumnSizingDefaults
16
17
  type MenuDefaults = "aggregations" | "aggregationsSubMenu" | "aggregationsSubMenuForRows" | "aggregationTypes";
17
18
  type MenuWithDefaults = WithRequired<IMenu, MenuDefaults>;
18
19
  type ConfigDefaults = "measureGroupDimension" | "columnHeadersPosition" | "columnSizing" | "textWrapping" | "menu";
19
- type ConfigWithDefaults = WithRequired<PivotTableNextConfig, ConfigDefaults> & {
20
+ type ConfigWithDefaults = WithRequired<PivotTableNextConfig, ConfigDefaults> & PivotTableNextConditionalFormattingConfig & {
20
21
  columnSizing: ColumnSizingWithDefaults;
21
22
  menu: MenuWithDefaults;
22
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"PivotTablePropsContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/PivotTablePropsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAgB5D,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,wBAAwB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEpD;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEnE,KAAK,oBAAoB,GAAG,cAAc,CAAC;AAE3C,KAAK,wBAAwB,GAAG,YAAY,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAElF,KAAK,YAAY,GACX,cAAc,GACd,qBAAqB,GACrB,4BAA4B,GAC5B,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAG,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAE1D,KAAK,cAAc,GACb,uBAAuB,GACvB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,MAAM,CAAC;AAEb,KAAK,kBAAkB,GAAG,YAAY,CAAC,oBAAoB,EAAE,cAAc,CAAC,GAAG;IAC3E,YAAY,EAAE,wBAAwB,CAAC;IACvC,IAAI,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEF,KAAK,iBAAiB,GAChB,MAAM,GACN,SAAS,GACT,UAAU,GACV,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,gBAAgB,CAAC;AAEvB,KAAK,qBAAqB,GAAG,YAAY,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;AAEvF,KAAK,2BAA2B,GAAG,qBAAqB,GAAG;IACvD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,2BAA2B,CAmCxG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,2BAA2B,CA4BhE"}
1
+ {"version":3,"file":"PivotTablePropsContext.d.ts","sourceRoot":"","sources":["../../../src/next/context/PivotTablePropsContext.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAA6B,MAAM,OAAO,CAAC;AAElE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAgB5D,OAAO,EAAE,KAAK,yCAAyC,EAAE,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,wBAAwB,GAAG;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,2CAEpD;AAED,KAAK,YAAY,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEnE,KAAK,oBAAoB,GAAG,cAAc,CAAC;AAE3C,KAAK,wBAAwB,GAAG,YAAY,CAAC,aAAa,EAAE,oBAAoB,CAAC,CAAC;AAElF,KAAK,YAAY,GACX,cAAc,GACd,qBAAqB,GACrB,4BAA4B,GAC5B,kBAAkB,CAAC;AAEzB,KAAK,gBAAgB,GAAG,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AAE1D,KAAK,cAAc,GACb,uBAAuB,GACvB,uBAAuB,GACvB,cAAc,GACd,cAAc,GACd,MAAM,CAAC;AAEb,KAAK,kBAAkB,GAAG,YAAY,CAAC,oBAAoB,EAAE,cAAc,CAAC,GACxE,yCAAyC,GAAG;IACxC,YAAY,EAAE,wBAAwB,CAAC;IACvC,IAAI,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAEN,KAAK,iBAAiB,GAChB,MAAM,GACN,SAAS,GACT,UAAU,GACV,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,gBAAgB,CAAC;AAEvB,KAAK,qBAAqB,GAAG,YAAY,CAAC,wBAAwB,EAAE,iBAAiB,CAAC,CAAC;AAEvF,KAAK,2BAA2B,GAAG,qBAAqB,GAAG;IACvD,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,gBAAgB,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,wBAAwB,GAAG,2BAA2B,CAmCxG;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,2BAA2B,CA4BhE"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- // (C) 2025 GoodData Corporation
2
+ // (C) 2025-2026 GoodData Corporation
3
3
  import { createContext, useContext } from "react";
4
4
  import { useDeepMemo } from "@gooddata/sdk-ui/internal";
5
5
  import { ACCESSIBILITY_AUTO_PAGE_SIZE, DEFAULT_TOTAL_FUNCTIONS, EMPTY_ATTRIBUTES, EMPTY_COLUMN_WIDTHS, EMPTY_DRILLS, EMPTY_FILTERS, EMPTY_METRICS, EMPTY_OBJECT, EMPTY_SORT_BY, EMPTY_TOTALS, PAGE_SIZE, } from "../constants/internal.js";
@@ -2,6 +2,7 @@ import { type RefObject } from "react";
2
2
  import { type ISortItem } from "@gooddata/sdk-model";
3
3
  import { type DataViewFacade, type ExplicitDrill } from "@gooddata/sdk-ui";
4
4
  import { type AgGridColumnDef } from "../../types/agGrid.js";
5
+ import { type ConditionalFormattingTriggerColIds, type IConditionalFormatting } from "../../types/conditionalFormatting.js";
5
6
  import { type ColumnWidthItem } from "../../types/resizing.js";
6
7
  import { type ITextWrapping } from "../../types/textWrapping.js";
7
8
  /**
@@ -9,11 +10,13 @@ import { type ITextWrapping } from "../../types/textWrapping.js";
9
10
  *
10
11
  * @internal
11
12
  */
12
- export declare const applyAllFeaturesToColDef: ({ columnWidths, sortBy, textWrapping, drillableItemsRef, dataViewFacade, }: {
13
+ export declare const applyAllFeaturesToColDef: ({ columnWidths, sortBy, textWrapping, drillableItemsRef, dataViewFacade, conditionalFormatting, conditionalFormattingTriggers, }: {
13
14
  columnWidths: ColumnWidthItem[];
14
15
  sortBy: ISortItem[];
15
16
  textWrapping: ITextWrapping;
16
17
  drillableItemsRef: RefObject<ExplicitDrill[]>;
17
18
  dataViewFacade?: DataViewFacade | undefined;
19
+ conditionalFormatting?: IConditionalFormatting | undefined;
20
+ conditionalFormattingTriggers: ConditionalFormattingTriggerColIds;
18
21
  }) => (colDef: AgGridColumnDef) => AgGridColumnDef;
19
22
  //# sourceMappingURL=applyAllFeaturesToColDef.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyAllFeaturesToColDef.d.ts","sourceRoot":"","sources":["../../../../src/next/features/columns/applyAllFeaturesToColDef.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;;;kDAqBhC,CAAC"}
1
+ {"version":3,"file":"applyAllFeaturesToColDef.d.ts","sourceRoot":"","sources":["../../../../src/next/features/columns/applyAllFeaturesToColDef.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACH,KAAK,kCAAkC,EACvC,KAAK,sBAAsB,EAC9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAQjE;;;;GAIG;AACH,eAAO,MAAM,wBAAwB;;;;;;;;kDA2BhC,CAAC"}
@@ -1,18 +1,21 @@
1
- // (C) 2024-2025 GoodData Corporation
1
+ // (C) 2024-2026 GoodData Corporation
2
2
  import { applyCellRenderingToColDef } from "../drilling/applyCellRenderingToColDef.js";
3
3
  import { applyColumnWidthsToColDef } from "../resizing/applyColumnWidthsToColDef.js";
4
4
  import { applySortByToColDef } from "../sorting/applySortByToColDef.js";
5
5
  import { applyTextWrappingToColDef } from "../textWrapping/applyTextWrappingToColDef.js";
6
+ import { applyConditionalFormattingToColDef } from "./applyConditionalFormattingToColDef.js";
6
7
  /**
7
8
  * Applies all features to ag-grid col def.
8
9
  *
9
10
  * @internal
10
11
  */
11
- export const applyAllFeaturesToColDef = ({ columnWidths, sortBy, textWrapping, drillableItemsRef, dataViewFacade, }) => (colDef) => {
12
+ export const applyAllFeaturesToColDef = ({ columnWidths, sortBy, textWrapping, drillableItemsRef, dataViewFacade, conditionalFormatting, conditionalFormattingTriggers, }) => (colDef) => {
12
13
  return [
13
14
  applyColumnWidthsToColDef(columnWidths),
14
15
  applySortByToColDef(sortBy),
15
16
  applyCellRenderingToColDef(drillableItemsRef, dataViewFacade),
16
17
  applyTextWrappingToColDef(textWrapping),
18
+ // Conditional formatting is applied last so its colors win over format-string colors.
19
+ applyConditionalFormattingToColDef(conditionalFormatting, conditionalFormattingTriggers),
17
20
  ].reduce((acc, fn) => fn(acc), colDef);
18
21
  };
@@ -0,0 +1,14 @@
1
+ import { type AgGridColumnDef } from "../../types/agGrid.js";
2
+ import { type ConditionalFormattingTriggerColIds, type IConditionalFormatting } from "../../types/conditionalFormatting.js";
3
+ /**
4
+ * Decorates a col def's `cellStyle` so conditional-formatting colors are merged on top of any
5
+ * existing (format-string-derived) styling — i.e. conditional formatting wins on conflict.
6
+ *
7
+ * Config-driven: a missing, disabled, or empty config is a no-op, so tables without conditional
8
+ * formatting are completely unaffected. Adding the wrapper to every column (incl. row-header
9
+ * attribute columns, which have no `cellStyle` of their own) is what enables whole-row scope.
10
+ *
11
+ * @internal
12
+ */
13
+ export declare const applyConditionalFormattingToColDef: (config: IConditionalFormatting | undefined, triggers: ConditionalFormattingTriggerColIds) => (colDef: AgGridColumnDef) => AgGridColumnDef;
14
+ //# sourceMappingURL=applyConditionalFormattingToColDef.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyConditionalFormattingToColDef.d.ts","sourceRoot":"","sources":["../../../../src/next/features/columns/applyConditionalFormattingToColDef.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EACH,KAAK,kCAAkC,EACvC,KAAK,sBAAsB,EAC9B,MAAM,sCAAsC,CAAC;AAI9C;;;;;;;;;GASG;AACH,eAAO,MAAM,kCAAkC,4IA6B1C,CAAC"}
@@ -0,0 +1,33 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { evaluateConditionalFormatting } from "../styling/conditionalFormatting.js";
3
+ /**
4
+ * Decorates a col def's `cellStyle` so conditional-formatting colors are merged on top of any
5
+ * existing (format-string-derived) styling — i.e. conditional formatting wins on conflict.
6
+ *
7
+ * Config-driven: a missing, disabled, or empty config is a no-op, so tables without conditional
8
+ * formatting are completely unaffected. Adding the wrapper to every column (incl. row-header
9
+ * attribute columns, which have no `cellStyle` of their own) is what enables whole-row scope.
10
+ *
11
+ * @internal
12
+ */
13
+ export const applyConditionalFormattingToColDef = (config, triggers) => (colDef) => {
14
+ if (!config || !config.enabled || config.rules.length === 0) {
15
+ return colDef;
16
+ }
17
+ const previous = colDef.cellStyle;
18
+ return {
19
+ ...colDef,
20
+ cellStyle: (params) => {
21
+ const base = typeof previous === "function" ? previous(params) : (previous ?? null);
22
+ const colId = params.colDef?.colId;
23
+ if (!params.data || !colId) {
24
+ return base;
25
+ }
26
+ const fragment = evaluateConditionalFormatting(config, triggers, params.data, colId);
27
+ if (!fragment) {
28
+ return base;
29
+ }
30
+ return { ...(base ?? {}), ...fragment };
31
+ },
32
+ };
33
+ };
@@ -3,6 +3,7 @@ import { type IntlShape } from "react-intl";
3
3
  import { type ISeparators } from "@gooddata/sdk-model";
4
4
  import { type DataViewFacade, type ExplicitDrill } from "@gooddata/sdk-ui";
5
5
  import { type AgGridColumnDef, type AgGridColumnGroupDef } from "../../types/agGrid.js";
6
+ import { type IConditionalFormatting } from "../../types/conditionalFormatting.js";
6
7
  import { type ITableColumnDefinitionByColId } from "../../types/internal.js";
7
8
  import { type ColumnWidthItem } from "../../types/resizing.js";
8
9
  import { type ITextWrapping } from "../../types/textWrapping.js";
@@ -12,7 +13,7 @@ import { type ColumnHeadersPosition } from "../../types/transposition.js";
12
13
  *
13
14
  * @internal
14
15
  */
15
- export declare function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidths, drillableItemsRef, textWrapping, intl, separators }: {
16
+ export declare function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidths, drillableItemsRef, textWrapping, intl, separators, conditionalFormatting }: {
16
17
  dataView: DataViewFacade;
17
18
  columnHeadersPosition: ColumnHeadersPosition;
18
19
  columnWidths: ColumnWidthItem[];
@@ -20,6 +21,7 @@ export declare function dataViewToColDefs({ dataView, columnHeadersPosition, col
20
21
  textWrapping: ITextWrapping;
21
22
  intl: IntlShape;
22
23
  separators?: ISeparators;
24
+ conditionalFormatting?: IConditionalFormatting;
23
25
  }): {
24
26
  columnDefinitionByColId: ITableColumnDefinitionByColId;
25
27
  columnDefs: (AgGridColumnDef | AgGridColumnGroupDef)[];
@@ -1 +1 @@
1
- {"version":3,"file":"dataViewToColDefs.d.ts","sourceRoot":"","sources":["../../../../src/next/features/data/dataViewToColDefs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAS1E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAC9B,QAAQ,EACR,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,IAAI,EACJ,UAAU,EACb,EAAE;IACC,QAAQ,EAAE,cAAc,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,iBAAiB,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9C,YAAY,EAAE,aAAa,CAAC;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,WAAW,CAAC;CAC5B,GAAG;IACA,uBAAuB,EAAE,6BAA6B,CAAC;IACvD,UAAU,EAAE,CAAC,eAAe,GAAG,oBAAoB,CAAC,EAAE,CAAC;IACvD,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;CACtB,CAkDA"}
1
+ {"version":3,"file":"dataViewToColDefs.d.ts","sourceRoot":"","sources":["../../../../src/next/features/data/dataViewToColDefs.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE3E,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACxF,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AACnF,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAU1E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAC9B,QAAQ,EACR,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,IAAI,EACJ,UAAU,EACV,qBAAqB,EACxB,EAAE;IACC,QAAQ,EAAE,cAAc,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,YAAY,EAAE,eAAe,EAAE,CAAC;IAChC,iBAAiB,EAAE,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;IAC9C,YAAY,EAAE,aAAa,CAAC;IAC5B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;CAClD,GAAG;IACA,uBAAuB,EAAE,6BAA6B,CAAC;IACvD,UAAU,EAAE,CAAC,eAAe,GAAG,oBAAoB,CAAC,EAAE,CAAC;IACvD,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;CACtB,CA8DA"}
@@ -3,6 +3,7 @@ import { applyAllFeaturesToColDef } from "../columns/applyAllFeaturesToColDef.js
3
3
  import { columnDefinitionToColId } from "../columns/colId.js";
4
4
  import { createColDef } from "../columns/createColDef.js";
5
5
  import { columnDefsToPivotGroups } from "../pivoting/columnDefsToPivotGroups.js";
6
+ import { resolveConditionalFormattingTriggers } from "../styling/conditionalFormatting.js";
6
7
  import { applyTextWrappingToGroupDef } from "../textWrapping/applyTextWrappingToGroupDef.js";
7
8
  import { getTableData } from "./valueFormatter.js";
8
9
  /**
@@ -10,7 +11,7 @@ import { getTableData } from "./valueFormatter.js";
10
11
  *
11
12
  * @internal
12
13
  */
13
- export function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidths, drillableItemsRef, textWrapping, intl, separators, }) {
14
+ export function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidths, drillableItemsRef, textWrapping, intl, separators, conditionalFormatting, }) {
14
15
  const sortBy = dataView.definition.sortBy;
15
16
  const tableData = getTableData(dataView, separators);
16
17
  const columnDefinitionByColId = {};
@@ -18,6 +19,11 @@ export function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidth
18
19
  const colId = columnDefinitionToColId(columnDefinition, columnHeadersPosition);
19
20
  columnDefinitionByColId[colId] = columnDefinition;
20
21
  });
22
+ // Resolve each rule's trigger column to a colId ONCE for this render pass, so the per-cell
23
+ // cellStyle path is O(rules) lookups instead of re-matching every column on every cell.
24
+ const conditionalFormattingTriggers = conditionalFormatting?.enabled
25
+ ? resolveConditionalFormattingTriggers(conditionalFormatting, tableData.columnDefinitions, columnHeadersPosition)
26
+ : [];
21
27
  const colDefs = tableData.columnDefinitions.map((columnDefinition) => {
22
28
  const colDef = createColDef(columnDefinition, columnHeadersPosition, intl, dataView);
23
29
  return applyAllFeaturesToColDef({
@@ -26,6 +32,8 @@ export function dataViewToColDefs({ dataView, columnHeadersPosition, columnWidth
26
32
  textWrapping,
27
33
  drillableItemsRef,
28
34
  dataViewFacade: dataView,
35
+ conditionalFormatting,
36
+ conditionalFormattingTriggers,
29
37
  })(colDef);
30
38
  });
31
39
  const columnDefsWithPivotGroups = columnDefsToPivotGroups(colDefs, columnHeadersPosition, intl);
@@ -1 +1 @@
1
- {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../../../src/next/features/styling/cell.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAKpG,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,aAAa,EAsBrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAM7D;;GAEG;AACH,KAAK,gBAAgB,GACf,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,GAC7C,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AA4ExD,eAAO,MAAM,YAAY,oIAmFxB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,uJA8D5B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,uJAuDtC,CAAC;AAuOF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAChC,IAAI,EACJ,MAAM,EACT,EAAE;IACC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B,GAAG,SAAS,GAAG,IAAI,CA+BnB"}
1
+ {"version":3,"file":"cell.d.ts","sourceRoot":"","sources":["../../../../src/next/features/styling/cell.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAKpG,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,aAAa,EAsBrB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7D;;GAEG;AACH,KAAK,gBAAgB,GACf,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,GAC7C,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;AA4ExD,eAAO,MAAM,YAAY,oIAmFxB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,uJA8D5B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,0BAA0B,uJAuDtC,CAAC;AAmOF;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAChC,IAAI,EACJ,MAAM,EACT,EAAE;IACC,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/B,GAAG,SAAS,GAAG,IAAI,CA+BnB"}
@@ -5,6 +5,7 @@ import { isGrandTotalColumnDefinition, isGrandTotalRowDefinition, isMeasureGroup
5
5
  import { extractAttributeUri, getAttributeColIds, parentsMatch } from "../columns/shared.js";
6
6
  import { isCellDrillable } from "../drilling/isDrillable.js";
7
7
  import { CELL_CLASSNAME, e } from "./bem.js";
8
+ import { isEmptyCell } from "./cellClassification.js";
8
9
  /**
9
10
  * Type guard to check if params is CellClassParams (has rowIndex directly)
10
11
  */
@@ -88,7 +89,7 @@ export const getCellTypes = (params, drillableItems, dv) => {
88
89
  const isRowSubtotal = colData.rowDefinition?.type === "subtotal";
89
90
  const isTotalHeader = isTotalHeaderValue(colData);
90
91
  const isSubtotalHeader = isSubtotalHeaderValue(colData);
91
- const isNull = isNullValue(colData);
92
+ const isNull = isEmptyCell(colData);
92
93
  const isGrouped = isAttributeGroupedCell(params, colId);
93
94
  const isSeparated = isGroupFirstRow(params) && !isGrouped;
94
95
  const isMetric = !isAttribute && !isTotalHeader;
@@ -326,9 +327,6 @@ const isColumnGrandTotal = (colData) => {
326
327
  const columnDefinition = colData.columnDefinition;
327
328
  return columnDefinition?.type === "grandTotal";
328
329
  };
329
- const isNullValue = (colData) => {
330
- return !isTableAttributeHeaderValue(colData) && colData.formattedValue === "";
331
- };
332
330
  /**
333
331
  * Extracts color information from formatted cell data.
334
332
  *
@@ -0,0 +1,18 @@
1
+ import { type ITableDataValue } from "@gooddata/sdk-ui";
2
+ /**
3
+ * True for any subtotal / grand-total / overall-total cell.
4
+ *
5
+ * Single source of truth for "is this a total cell". Two independent ways a cell can be a total:
6
+ * its own value/header type (which also covers subtotal/grand-total *columns*), or — the transposed
7
+ * case — a plain `type:"value"` cell sitting on a subtotal/grand-total *row*.
8
+ *
9
+ * @internal
10
+ */
11
+ export declare function isTotalCell(cellData: ITableDataValue): boolean;
12
+ /**
13
+ * True for an empty/null cell: a non-attribute cell whose value renders as an empty formatted string.
14
+ *
15
+ * @internal
16
+ */
17
+ export declare function isEmptyCell(cellData: ITableDataValue): boolean;
18
+ //# sourceMappingURL=cellClassification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cellClassification.d.ts","sourceRoot":"","sources":["../../../../src/next/features/styling/cellClassification.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,eAAe,EAUvB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAgB9D;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAE9D"}
@@ -0,0 +1,31 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { isGrandTotalRowDefinition, isSubtotalRowDefinition, isTableAttributeHeaderValue, isTableGrandTotalHeaderValue, isTableGrandTotalMeasureValue, isTableGrandTotalSubtotalMeasureValue, isTableOverallTotalMeasureValue, isTableSubtotalMeasureValue, isTableTotalHeaderValue, } from "@gooddata/sdk-ui";
3
+ /**
4
+ * True for any subtotal / grand-total / overall-total cell.
5
+ *
6
+ * Single source of truth for "is this a total cell". Two independent ways a cell can be a total:
7
+ * its own value/header type (which also covers subtotal/grand-total *columns*), or — the transposed
8
+ * case — a plain `type:"value"` cell sitting on a subtotal/grand-total *row*.
9
+ *
10
+ * @internal
11
+ */
12
+ export function isTotalCell(cellData) {
13
+ if (isTableSubtotalMeasureValue(cellData) ||
14
+ isTableGrandTotalMeasureValue(cellData) ||
15
+ isTableGrandTotalSubtotalMeasureValue(cellData) ||
16
+ isTableOverallTotalMeasureValue(cellData) ||
17
+ isTableTotalHeaderValue(cellData) ||
18
+ isTableGrandTotalHeaderValue(cellData)) {
19
+ return true;
20
+ }
21
+ return ("rowDefinition" in cellData &&
22
+ (isSubtotalRowDefinition(cellData.rowDefinition) || isGrandTotalRowDefinition(cellData.rowDefinition)));
23
+ }
24
+ /**
25
+ * True for an empty/null cell: a non-attribute cell whose value renders as an empty formatted string.
26
+ *
27
+ * @internal
28
+ */
29
+ export function isEmptyCell(cellData) {
30
+ return !isTableAttributeHeaderValue(cellData) && cellData.formattedValue === "";
31
+ }
@@ -0,0 +1,35 @@
1
+ import { type ITableColumnDefinition } from "@gooddata/sdk-ui";
2
+ import { type ConditionalFormattingTriggerColIds, type IConditionalFormatting } from "../../types/conditionalFormatting.js";
3
+ import { type AgGridRowData } from "../../types/internal.js";
4
+ import { type ColumnHeadersPosition } from "../../types/transposition.js";
5
+ /**
6
+ * The colors a matched cell/row receives — a subset of ag-grid CellStyle, merged on top of the
7
+ * format-string-derived styling by the caller.
8
+ *
9
+ * @internal
10
+ */
11
+ interface IConditionalFormattingStyle {
12
+ color?: string;
13
+ backgroundColor?: string;
14
+ }
15
+ /**
16
+ * Resolves each rule's target to the colIds of every column that may hold its value, once per render
17
+ * (column membership is fixed per render). Aligned to `config.rules` by index; see
18
+ * {@link ConditionalFormattingTriggerColIds}.
19
+ *
20
+ * @internal
21
+ */
22
+ export declare function resolveConditionalFormattingTriggers(config: IConditionalFormatting, columnDefinitions: readonly ITableColumnDefinition[], columnHeadersPosition: ColumnHeadersPosition): ConditionalFormattingTriggerColIds;
23
+ /**
24
+ * Evaluates the conditional-formatting config for one rendered cell; returns the style fragment to
25
+ * apply, or undefined if no rule matches.
26
+ *
27
+ * Precedence is strict first-match-wins, by rule order then condition order. The winning condition's
28
+ * scope decides what it paints: `row` the whole row, `cell` only the trigger cell. Total/subtotal
29
+ * rows are never evaluated.
30
+ *
31
+ * @internal
32
+ */
33
+ export declare function evaluateConditionalFormatting(config: IConditionalFormatting, triggerColIdsByRule: ConditionalFormattingTriggerColIds, rowData: AgGridRowData, currentColId: string): IConditionalFormattingStyle | undefined;
34
+ export {};
35
+ //# sourceMappingURL=conditionalFormatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionalFormatting.d.ts","sourceRoot":"","sources":["../../../../src/next/features/styling/conditionalFormatting.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,sBAAsB,EAO9B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAGH,KAAK,kCAAkC,EAEvC,KAAK,sBAAsB,EAG9B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAK1E;;;;;GAKG;AACH,UAAU,2BAA2B;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AA+CD;;;;;;GAMG;AACH,wBAAgB,oCAAoC,CAChD,MAAM,EAAE,sBAAsB,EAC9B,iBAAiB,EAAE,SAAS,sBAAsB,EAAE,EACpD,qBAAqB,EAAE,qBAAqB,GAC7C,kCAAkC,CAMpC;AA+ID;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CACzC,MAAM,EAAE,sBAAsB,EAC9B,mBAAmB,EAAE,kCAAkC,EACvD,OAAO,EAAE,aAAa,EACtB,YAAY,EAAE,MAAM,GACrB,2BAA2B,GAAG,SAAS,CAyCzC"}
@@ -0,0 +1,212 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { isAttributeColumnDefinition, isMeasureGroupValueColumnDefinition, isMeasureScope, isValueColumnDefinition, } from "@gooddata/sdk-ui";
3
+ import { columnDefinitionToColId } from "../columns/colId.js";
4
+ import { isTotalCell } from "./cellClassification.js";
5
+ // Reads BOTH column and row scope so the measure is found wherever transposition places it (mirrors
6
+ // `valueRow/value.ts`). This is what gates the shared transposed value column to its own measure's rows.
7
+ const cellHoldsMeasure = (cell, measureLocalId) => {
8
+ const matchesMeasure = (scope) => isMeasureScope(scope) && scope.descriptor.measureHeaderItem.localIdentifier === measureLocalId;
9
+ const columnScope = "columnDefinition" in cell && "columnScope" in cell.columnDefinition
10
+ ? cell.columnDefinition.columnScope
11
+ : undefined;
12
+ const rowScope = "rowDefinition" in cell && "rowScope" in cell.rowDefinition ? cell.rowDefinition.rowScope : undefined;
13
+ return Boolean(columnScope?.some(matchesMeasure)) || Boolean(rowScope?.some(matchesMeasure));
14
+ };
15
+ // The measure a value column names in its own scope, or `undefined` for the shared transposed column.
16
+ const columnMeasureLocalId = (columnDefinition) => {
17
+ if (!isValueColumnDefinition(columnDefinition)) {
18
+ return undefined;
19
+ }
20
+ return columnDefinition.columnScope.find(isMeasureScope)?.descriptor.measureHeaderItem.localIdentifier;
21
+ };
22
+ // Layout-agnostic membership test. Attribute → its row-header column. Measure → any value column
23
+ // naming that measure, or naming none (the shared transposed column, gated per row by cellHoldsMeasure).
24
+ const columnHoldsTarget = (columnDefinition, target) => {
25
+ if (target.kind === "attribute") {
26
+ return (isAttributeColumnDefinition(columnDefinition) &&
27
+ columnDefinition.attributeDescriptor.attributeHeader.localIdentifier ===
28
+ target.attributeIdentifier);
29
+ }
30
+ if (!isValueColumnDefinition(columnDefinition) &&
31
+ !isMeasureGroupValueColumnDefinition(columnDefinition)) {
32
+ return false;
33
+ }
34
+ const colMeasure = columnMeasureLocalId(columnDefinition);
35
+ return colMeasure === undefined || colMeasure === target.measureIdentifier;
36
+ };
37
+ /**
38
+ * Resolves each rule's target to the colIds of every column that may hold its value, once per render
39
+ * (column membership is fixed per render). Aligned to `config.rules` by index; see
40
+ * {@link ConditionalFormattingTriggerColIds}.
41
+ *
42
+ * @internal
43
+ */
44
+ export function resolveConditionalFormattingTriggers(config, columnDefinitions, columnHeadersPosition) {
45
+ return config.rules.map((rule) => columnDefinitions
46
+ .filter((columnDefinition) => columnHoldsTarget(columnDefinition, rule.target))
47
+ .map((columnDefinition) => columnDefinitionToColId(columnDefinition, columnHeadersPosition)));
48
+ }
49
+ const TEXT_OPERATORS = new Set([
50
+ "CONTAINS",
51
+ "NOT_CONTAINS",
52
+ "STARTS_WITH",
53
+ "NOT_STARTS_WITH",
54
+ "ENDS_WITH",
55
+ "NOT_ENDS_WITH",
56
+ ]);
57
+ const matchesNumeric = (operator, value, raw) => {
58
+ if (value.kind === "literalRange") {
59
+ // Non-finite bound matches nothing — else NOT_BETWEEN with a NaN bound would paint every cell.
60
+ if (!Number.isFinite(value.from) || !Number.isFinite(value.to)) {
61
+ return false;
62
+ }
63
+ // Normalize a backwards range (from > to) so it still means "between the two numbers".
64
+ const inRange = raw >= Math.min(value.from, value.to) && raw <= Math.max(value.from, value.to);
65
+ return operator === "BETWEEN" ? inRange : !inRange;
66
+ }
67
+ if (value.kind !== "literal") {
68
+ return false;
69
+ }
70
+ // Coerce numeric strings (persisted/AAC JSON can carry "5") so a measure rule isn't silently skipped.
71
+ const threshold = typeof value.value === "number" ? value.value : Number(value.value);
72
+ if (Number.isNaN(threshold)) {
73
+ return false;
74
+ }
75
+ switch (operator) {
76
+ case "EQUAL_TO":
77
+ return raw === threshold;
78
+ case "NOT_EQUAL_TO":
79
+ return raw !== threshold;
80
+ case "LESS_THAN":
81
+ return raw < threshold;
82
+ case "LESS_THAN_OR_EQUAL_TO":
83
+ return raw <= threshold;
84
+ case "GREATER_THAN":
85
+ return raw > threshold;
86
+ case "GREATER_THAN_OR_EQUAL_TO":
87
+ return raw >= threshold;
88
+ default:
89
+ return false;
90
+ }
91
+ };
92
+ const matchesText = (operator, value, raw) => {
93
+ if (value.kind !== "literal") {
94
+ return false;
95
+ }
96
+ const target = String(value.value).toLowerCase();
97
+ const text = raw.toLowerCase();
98
+ switch (operator) {
99
+ case "EQUAL_TO":
100
+ return text === target;
101
+ case "NOT_EQUAL_TO":
102
+ return text !== target;
103
+ case "CONTAINS":
104
+ return text.includes(target);
105
+ case "NOT_CONTAINS":
106
+ return !text.includes(target);
107
+ case "STARTS_WITH":
108
+ return text.startsWith(target);
109
+ case "NOT_STARTS_WITH":
110
+ return !text.startsWith(target);
111
+ case "ENDS_WITH":
112
+ return text.endsWith(target);
113
+ case "NOT_ENDS_WITH":
114
+ return !text.endsWith(target);
115
+ default:
116
+ return false;
117
+ }
118
+ };
119
+ /**
120
+ * Emptiness as conditional formatting means it — deliberately distinct from cell.ts's null-styling
121
+ * notion. Measure columns are empty only when the RAW value is null/undefined (so a genuine 0 that a
122
+ * "hide zeros" format renders as "" is NOT treated as empty); attribute columns are empty when the
123
+ * element has no displayed value. (cell.ts keeps its own formattedValue-based check for null styling.)
124
+ */
125
+ const isEmptyTriggerCell = (cell, targetKind) => {
126
+ if (targetKind === "attribute") {
127
+ return cell.formattedValue === null || cell.formattedValue === "";
128
+ }
129
+ if (!("value" in cell)) {
130
+ return true;
131
+ }
132
+ return cell.value === null || cell.value === undefined;
133
+ };
134
+ const conditionMatches = (condition, triggerCell, targetKind) => {
135
+ const empty = isEmptyTriggerCell(triggerCell, targetKind);
136
+ if (condition.operator === "IS_EMPTY") {
137
+ return empty;
138
+ }
139
+ if (condition.operator === "IS_NOT_EMPTY") {
140
+ return !empty;
141
+ }
142
+ // Every other operator never matches an empty cell.
143
+ if (empty) {
144
+ return false;
145
+ }
146
+ if (condition.operator === "ALL") {
147
+ return true;
148
+ }
149
+ const useText = targetKind === "attribute" || TEXT_OPERATORS.has(condition.operator);
150
+ if (useText) {
151
+ return matchesText(condition.operator, condition.value, triggerCell.formattedValue ?? "");
152
+ }
153
+ if (!("value" in triggerCell)) {
154
+ return false;
155
+ }
156
+ const raw = typeof triggerCell.value === "number" ? triggerCell.value : Number(triggerCell.value);
157
+ if (Number.isNaN(raw)) {
158
+ return false;
159
+ }
160
+ return matchesNumeric(condition.operator, condition.value, raw);
161
+ };
162
+ const toFragment = (format) => ({
163
+ ...(format.color ? { color: format.color } : {}),
164
+ ...(format.backgroundColor ? { backgroundColor: format.backgroundColor } : {}),
165
+ });
166
+ /**
167
+ * Evaluates the conditional-formatting config for one rendered cell; returns the style fragment to
168
+ * apply, or undefined if no rule matches.
169
+ *
170
+ * Precedence is strict first-match-wins, by rule order then condition order. The winning condition's
171
+ * scope decides what it paints: `row` the whole row, `cell` only the trigger cell. Total/subtotal
172
+ * rows are never evaluated.
173
+ *
174
+ * @internal
175
+ */
176
+ export function evaluateConditionalFormatting(config, triggerColIdsByRule, rowData, currentColId) {
177
+ if (!config.enabled) {
178
+ return undefined;
179
+ }
180
+ const currentCell = rowData.cellDataByColId[currentColId];
181
+ if (!currentCell || isTotalCell(currentCell)) {
182
+ return undefined;
183
+ }
184
+ for (let i = 0; i < config.rules.length; i++) {
185
+ const rule = config.rules[i];
186
+ for (const triggerColId of triggerColIdsByRule[i] ?? []) {
187
+ const triggerCell = rowData.cellDataByColId[triggerColId];
188
+ if (!triggerCell || isTotalCell(triggerCell)) {
189
+ continue;
190
+ }
191
+ // Gate the shared transposed value column to this row's measure (attributes are already pinned).
192
+ if (rule.target.kind === "measure" &&
193
+ !cellHoldsMeasure(triggerCell, rule.target.measureIdentifier)) {
194
+ continue;
195
+ }
196
+ for (const condition of rule.conditions) {
197
+ if (!conditionMatches(condition, triggerCell, rule.target.kind)) {
198
+ continue;
199
+ }
200
+ // First match wins the rule: row-scope paints any cell, cell-scope only the trigger cell.
201
+ if (condition.format.scope === "row") {
202
+ return toFragment(condition.format);
203
+ }
204
+ if (triggerColId === currentColId) {
205
+ return toFragment(condition.format);
206
+ }
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ return undefined;
212
+ }
@@ -11,6 +11,7 @@ export type { PivotTableNextAgGridLicenseConfig } from "./types/license.js";
11
11
  export type { PivotTableNextPaginationConfig, IPagination } from "./types/pagination.js";
12
12
  export type { PivotTableNextTranspositionConfig, MeasureGroupDimension, ColumnHeadersPosition, } from "./types/transposition.js";
13
13
  export type { PivotTableNextExperimentalConfig } from "./types/experimental.js";
14
+ export type { PivotTableNextConditionalFormattingConfig, IConditionalFormatting, IConditionalFormattingRule, IConditionalFormattingCondition, IConditionalFormattingFormat, ConditionalFormattingTarget, ConditionalFormattingOperator, ConditionalFormattingTextOperator, ConditionalFormattingValue, } from "./types/conditionalFormatting.js";
14
15
  export { CorePivotTableNext } from "./PivotTableNextPluggable.js";
15
16
  export type { ICorePivotTableNextProps } from "./types/internal.js";
16
17
  export { type ColumnLocator, type IAttributeColumnLocator, type IAttributeColumnLocatorBody, type IMeasureColumnLocator, type IMeasureColumnLocatorBody, type ITotalColumnLocator, type ITotalColumnLocatorBody, isAttributeColumnLocator, isMeasureColumnLocator, isTotalColumnLocator, newAttributeColumnLocator, newMeasureColumnLocator, newTotalColumnLocator, } from "./types/locators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACH,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAClB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACpF,YAAY,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,uCAAuC,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5E,YAAY,EACR,uCAAuC,EACvC,mBAAmB,GACtB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,8BAA8B,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EACR,iCAAiC,EACjC,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAGhF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,iCAAiC,EACtC,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,eAAe,EACpB,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACR,gCAAgC,EAChC,aAAa,EACb,uBAAuB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/next/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACH,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,eAAe,GAClB,MAAM,iCAAiC,CAAC;AAEzC,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACpF,YAAY,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,iCAAiC,EAAE,MAAM,0BAA0B,CAAC;AAClF,YAAY,EAAE,uCAAuC,EAAE,MAAM,gCAAgC,CAAC;AAC9F,YAAY,EAAE,8BAA8B,EAAE,MAAM,uBAAuB,CAAC;AAC5E,YAAY,EACR,uCAAuC,EACvC,mBAAmB,GACtB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AACpE,YAAY,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,YAAY,EAAE,8BAA8B,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EACR,iCAAiC,EACjC,qBAAqB,EACrB,qBAAqB,GACxB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAGhF,YAAY,EACR,yCAAyC,EACzC,sBAAsB,EACtB,0BAA0B,EAC1B,+BAA+B,EAC/B,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,EAC7B,iCAAiC,EACjC,0BAA0B,GAC7B,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EACH,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,EAC9B,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,wBAAwB,EACxB,sBAAsB,EACtB,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACH,KAAK,iCAAiC,EACtC,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC9B,KAAK,6BAA6B,EAClC,KAAK,gBAAgB,EACrB,KAAK,2BAA2B,EAChC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,KAAK,eAAe,EACpB,KAAK,4BAA4B,EACjC,KAAK,gCAAgC,EACrC,KAAK,2BAA2B,EAChC,KAAK,+BAA+B,EACpC,qBAAqB,EACrB,2BAA2B,EAC3B,0BAA0B,EAC1B,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,6BAA6B,EAC7B,+BAA+B,EAC/B,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,GAChC,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACR,gCAAgC,EAChC,aAAa,EACb,uBAAuB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,YAAY,EAAE,wBAAwB,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,126 @@
1
+ import { type ComparisonConditionOperator, type RangeConditionOperator } from "@gooddata/sdk-model";
2
+ /**
3
+ * Identifies the measure or attribute a conditional-formatting rule targets. Layout-neutral on
4
+ * purpose: the same target applies whether the item renders as a column or — when transposed — as a
5
+ * row, so the rule survives a transpose without re-pointing.
6
+ *
7
+ * @alpha
8
+ */
9
+ export type ConditionalFormattingTarget = {
10
+ kind: "attribute";
11
+ attributeIdentifier: string;
12
+ } | {
13
+ kind: "measure";
14
+ measureIdentifier: string;
15
+ };
16
+ /**
17
+ * Text and empty operators specific to conditional formatting. No existing SDK enum covers text
18
+ * matching (attribute filters are element-based IN/NOT_IN), so these are CF-specific.
19
+ *
20
+ * @alpha
21
+ */
22
+ export type ConditionalFormattingTextOperator = "CONTAINS" | "NOT_CONTAINS" | "STARTS_WITH" | "NOT_STARTS_WITH" | "ENDS_WITH" | "NOT_ENDS_WITH" | "IS_EMPTY" | "IS_NOT_EMPTY";
23
+ /**
24
+ * Every operator a condition may use. Numeric and range operators reuse the SDK
25
+ * measure-value-filter vocabulary (`ComparisonConditionOperator`, `RangeConditionOperator` from
26
+ * `@gooddata/sdk-model`); `"ALL"` always matches; text/empty operators are
27
+ * {@link ConditionalFormattingTextOperator}.
28
+ *
29
+ * @alpha
30
+ */
31
+ export type ConditionalFormattingOperator = "ALL" | ComparisonConditionOperator | RangeConditionOperator | ConditionalFormattingTextOperator;
32
+ /**
33
+ * The operand a condition compares against. Discriminated so range / no-operand / (future
34
+ * column-reference) shapes stay valid by construction.
35
+ *
36
+ * @alpha
37
+ */
38
+ export type ConditionalFormattingValue = {
39
+ kind: "none";
40
+ } | {
41
+ kind: "literal";
42
+ value: string | number;
43
+ } | {
44
+ kind: "literalRange";
45
+ from: number;
46
+ to: number;
47
+ };
48
+ /**
49
+ * The visual format applied to a matched cell or row.
50
+ *
51
+ * @alpha
52
+ */
53
+ export interface IConditionalFormattingFormat {
54
+ /**
55
+ * Text color (raw hex, e.g. "#FFFFFF").
56
+ */
57
+ color?: string;
58
+ /**
59
+ * Fill / background color (raw hex, e.g. "#E54D40").
60
+ */
61
+ backgroundColor?: string;
62
+ /**
63
+ * Whether the format applies to the matched cell only or the whole row.
64
+ */
65
+ scope: "cell" | "row";
66
+ }
67
+ /**
68
+ * A single condition: an operator + operand, and the format applied when it matches.
69
+ *
70
+ * @alpha
71
+ */
72
+ export interface IConditionalFormattingCondition {
73
+ id: string;
74
+ operator: ConditionalFormattingOperator;
75
+ value: ConditionalFormattingValue;
76
+ format: IConditionalFormattingFormat;
77
+ }
78
+ /**
79
+ * A rule targeting one measure or attribute with one or more stacked conditions. The first matching
80
+ * condition (top-down) wins.
81
+ *
82
+ * @alpha
83
+ */
84
+ export interface IConditionalFormattingRule {
85
+ id: string;
86
+ target: ConditionalFormattingTarget;
87
+ conditions: readonly IConditionalFormattingCondition[];
88
+ }
89
+ /**
90
+ * Conditional-formatting settings: an on/off toggle plus the ordered list of rules. Stored on the
91
+ * table config and (when persisted) on the insight's `properties.controls.conditionalFormatting`.
92
+ *
93
+ * @alpha
94
+ */
95
+ export interface IConditionalFormatting {
96
+ /**
97
+ * Model version of the persisted shape (mirrors the dashboard model-version convention). Absent
98
+ * is treated as `"1"`. Lets the persisted contract evolve for cross-stack readers (e.g. server
99
+ * XLSX export) without breaking older saved insights.
100
+ */
101
+ version?: string;
102
+ enabled: boolean;
103
+ rules: readonly IConditionalFormattingRule[];
104
+ }
105
+ /**
106
+ * Resolved trigger columns, aligned by index to {@link IConditionalFormatting.rules}: each rule maps
107
+ * to the colIds of every column that may hold its target's value. One colId for a non-pivoted target,
108
+ * several for a pivoted measure (one per pivot group), the shared value column for a transposed
109
+ * measure, and `[]` when the target is absent from the current layout. Computed once per render.
110
+ *
111
+ * @internal
112
+ */
113
+ export type ConditionalFormattingTriggerColIds = readonly (readonly string[])[];
114
+ /**
115
+ * Config slot intersected into {@link PivotTableNextConfig} so conditional formatting can be passed
116
+ * through the `config` prop (and read back from insight properties).
117
+ *
118
+ * @alpha
119
+ */
120
+ export type PivotTableNextConditionalFormattingConfig = {
121
+ /**
122
+ * Rules that color cells/rows based on their values. Absent = no conditional formatting.
123
+ */
124
+ conditionalFormatting?: IConditionalFormatting;
125
+ };
126
+ //# sourceMappingURL=conditionalFormatting.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conditionalFormatting.d.ts","sourceRoot":"","sources":["../../../src/next/types/conditionalFormatting.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,2BAA2B,EAAE,KAAK,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAEpG;;;;;;GAMG;AACH,MAAM,MAAM,2BAA2B,GACjC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD;;;;;GAKG;AACH,MAAM,MAAM,iCAAiC,GACvC,UAAU,GACV,cAAc,GACd,aAAa,GACb,iBAAiB,GACjB,WAAW,GACX,eAAe,GACf,UAAU,GACV,cAAc,CAAC;AAErB;;;;;;;GAOG;AACH,MAAM,MAAM,6BAA6B,GACnC,KAAK,GACL,2BAA2B,GAC3B,sBAAsB,GACtB,iCAAiC,CAAC;AAExC;;;;;GAKG;AACH,MAAM,MAAM,0BAA0B,GAChC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,WAAW,4BAA4B;IACzC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;CACzB;AAED;;;;GAIG;AACH,MAAM,WAAW,+BAA+B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,6BAA6B,CAAC;IACxC,KAAK,EAAE,0BAA0B,CAAC;IAClC,MAAM,EAAE,4BAA4B,CAAC;CACxC;AAED;;;;;GAKG;AACH,MAAM,WAAW,0BAA0B;IACvC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,2BAA2B,CAAC;IACpC,UAAU,EAAE,SAAS,+BAA+B,EAAE,CAAC;CAC1D;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,0BAA0B,EAAE,CAAC;CAChD;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kCAAkC,GAAG,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,MAAM,yCAAyC,GAAG;IACpD;;OAEG;IACH,qBAAqB,CAAC,EAAE,sBAAsB,CAAC;CAClD,CAAC"}
@@ -0,0 +1,2 @@
1
+ // (C) 2026 GoodData Corporation
2
+ export {};
@@ -17,6 +17,12 @@ import { type PivotTableNextTranspositionConfig } from "./transposition.js";
17
17
  /**
18
18
  * Configuration for the pivot table next.
19
19
  *
20
+ * @remarks
21
+ * `PivotTableNextConditionalFormattingConfig` is intentionally NOT folded into this intersection
22
+ * while conditional formatting is `@alpha`: a `@public` type cannot reference an `@alpha` one
23
+ * (api-extractor `ae-incompatible-release-tags`). Call sites intersect it explicitly until the
24
+ * feature graduates to `@public`, at which point it should be added here.
25
+ *
20
26
  * @public
21
27
  */
22
28
  export type PivotTableNextConfig = PivotTableNextTranspositionConfig & PivotTableNextTextWrappingConfig & PivotTableNextColumnsSizingConfig & PivotTableNextMenuConfig & PivotTableNextFormattingConfig & PivotTableNextExecutionCancellingConfig & PivotTableNextLayoutConfig & PivotTableNextGrandTotalsPositionConfig & PivotTableNextCellSelectionConfig & PivotTableNextAgGridLicenseConfig & PivotTableNextPaginationConfig & PivotTableNextAccessibilityConfig & PivotTableNextExperimentalConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/next/types/public.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACH,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,uCAAuC,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,uCAAuC,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iCAAiC,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAE5E;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,iCAAiC,GAChE,gCAAgC,GAChC,iCAAiC,GACjC,wBAAwB,GACxB,8BAA8B,GAC9B,uCAAuC,GACvC,0BAA0B,GAC1B,uCAAuC,GACvC,iCAAiC,GACjC,iCAAiC,GACjC,8BAA8B,GAC9B,iCAAiC,GACjC,gCAAgC,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB,EAAE,uBAAuB;IACtF;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,EAAE,6BAA6B,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAE7B;;OAEG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAE9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,6BAA6B,CAAC,EAAE,GAAG,CAAC;CACvC"}
1
+ {"version":3,"file":"public.d.ts","sourceRoot":"","sources":["../../../src/next/types/public.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACH,KAAK,gCAAgC,EACrC,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,6BAA6B,EAClC,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC5B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,KAAK,uCAAuC,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,uCAAuC,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,KAAK,wBAAwB,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,KAAK,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,qBAAqB,EAAE,KAAK,iCAAiC,EAAE,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,KAAK,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAE5E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,oBAAoB,GAAG,iCAAiC,GAChE,gCAAgC,GAChC,iCAAiC,GACjC,wBAAwB,GACxB,8BAA8B,GAC9B,uCAAuC,GACvC,0BAA0B,GAC1B,uCAAuC,GACvC,iCAAiC,GACjC,iCAAiC,GACjC,8BAA8B,GAC9B,iCAAiC,GACjC,gCAAgC,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB,EAAE,uBAAuB;IACtF;;OAEG;IACH,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,wBAAwB,CAAC;IAEnC;;OAEG;IACH,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAEhC;;OAEG;IACH,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAE5C;;OAEG;IACH,OAAO,CAAC,EAAE,6BAA6B,CAAC;IAExC;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAE9B;;OAEG;IACH,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAE7B;;OAEG;IACH,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAE9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,6BAA6B,CAAC,EAAE,GAAG,CAAC;CACvC"}
@@ -9,6 +9,7 @@
9
9
 
10
10
  import { AttributesMeasuresOrPlaceholders } from '@gooddata/sdk-ui';
11
11
  import { AttributesOrPlaceholders } from '@gooddata/sdk-ui';
12
+ import { ComparisonConditionOperator } from '@gooddata/sdk-model';
12
13
  import { ExplicitDrill } from '@gooddata/sdk-ui';
13
14
  import { IAnalyticalBackend } from '@gooddata/sdk-backend-spi';
14
15
  import { IAttribute } from '@gooddata/sdk-model';
@@ -25,6 +26,7 @@ import { IVisualizationCallbacks } from '@gooddata/sdk-ui';
25
26
  import { IVisualizationProps } from '@gooddata/sdk-ui';
26
27
  import { JSX } from 'react/jsx-runtime';
27
28
  import { NullableFiltersOrPlaceholders } from '@gooddata/sdk-ui';
29
+ import { RangeConditionOperator } from '@gooddata/sdk-model';
28
30
  import { SortsOrPlaceholders } from '@gooddata/sdk-ui';
29
31
  import { TotalsOrPlaceholders } from '@gooddata/sdk-ui';
30
32
  import { TotalType } from '@gooddata/sdk-model';
@@ -80,6 +82,56 @@ export declare type ColumnWidthItemNext = IAttributeColumnWidthItemNext | IMeasu
80
82
  */
81
83
  export declare type ColumnWidthNext = IAbsoluteColumnWidthNext | IAutoColumnWidthNext;
82
84
 
85
+ /**
86
+ * Every operator a condition may use. Numeric and range operators reuse the SDK
87
+ * measure-value-filter vocabulary (`ComparisonConditionOperator`, `RangeConditionOperator` from
88
+ * `@gooddata/sdk-model`); `"ALL"` always matches; text/empty operators are
89
+ * {@link ConditionalFormattingTextOperator}.
90
+ *
91
+ * @alpha
92
+ */
93
+ export declare type ConditionalFormattingOperator = "ALL" | ComparisonConditionOperator | RangeConditionOperator | ConditionalFormattingTextOperator;
94
+
95
+ /**
96
+ * Identifies the measure or attribute a conditional-formatting rule targets. Layout-neutral on
97
+ * purpose: the same target applies whether the item renders as a column or — when transposed — as a
98
+ * row, so the rule survives a transpose without re-pointing.
99
+ *
100
+ * @alpha
101
+ */
102
+ export declare type ConditionalFormattingTarget = {
103
+ kind: "attribute";
104
+ attributeIdentifier: string;
105
+ } | {
106
+ kind: "measure";
107
+ measureIdentifier: string;
108
+ };
109
+
110
+ /**
111
+ * Text and empty operators specific to conditional formatting. No existing SDK enum covers text
112
+ * matching (attribute filters are element-based IN/NOT_IN), so these are CF-specific.
113
+ *
114
+ * @alpha
115
+ */
116
+ export declare type ConditionalFormattingTextOperator = "CONTAINS" | "NOT_CONTAINS" | "STARTS_WITH" | "NOT_STARTS_WITH" | "ENDS_WITH" | "NOT_ENDS_WITH" | "IS_EMPTY" | "IS_NOT_EMPTY";
117
+
118
+ /**
119
+ * The operand a condition compares against. Discriminated so range / no-operand / (future
120
+ * column-reference) shapes stay valid by construction.
121
+ *
122
+ * @alpha
123
+ */
124
+ export declare type ConditionalFormattingValue = {
125
+ kind: "none";
126
+ } | {
127
+ kind: "literal";
128
+ value: string | number;
129
+ } | {
130
+ kind: "literalRange";
131
+ from: number;
132
+ to: number;
133
+ };
134
+
83
135
  /**
84
136
  * @internal
85
137
  */
@@ -359,6 +411,67 @@ export declare interface IColumnTextWrappingItem {
359
411
  matchType?: "column" | "pivotGroup";
360
412
  }
361
413
 
414
+ /**
415
+ * Conditional-formatting settings: an on/off toggle plus the ordered list of rules. Stored on the
416
+ * table config and (when persisted) on the insight's `properties.controls.conditionalFormatting`.
417
+ *
418
+ * @alpha
419
+ */
420
+ export declare interface IConditionalFormatting {
421
+ /**
422
+ * Model version of the persisted shape (mirrors the dashboard model-version convention). Absent
423
+ * is treated as `"1"`. Lets the persisted contract evolve for cross-stack readers (e.g. server
424
+ * XLSX export) without breaking older saved insights.
425
+ */
426
+ version?: string;
427
+ enabled: boolean;
428
+ rules: readonly IConditionalFormattingRule[];
429
+ }
430
+
431
+ /**
432
+ * A single condition: an operator + operand, and the format applied when it matches.
433
+ *
434
+ * @alpha
435
+ */
436
+ export declare interface IConditionalFormattingCondition {
437
+ id: string;
438
+ operator: ConditionalFormattingOperator;
439
+ value: ConditionalFormattingValue;
440
+ format: IConditionalFormattingFormat;
441
+ }
442
+
443
+ /**
444
+ * The visual format applied to a matched cell or row.
445
+ *
446
+ * @alpha
447
+ */
448
+ export declare interface IConditionalFormattingFormat {
449
+ /**
450
+ * Text color (raw hex, e.g. "#FFFFFF").
451
+ */
452
+ color?: string;
453
+ /**
454
+ * Fill / background color (raw hex, e.g. "#E54D40").
455
+ */
456
+ backgroundColor?: string;
457
+ /**
458
+ * Whether the format applies to the matched cell only or the whole row.
459
+ */
460
+ scope: "cell" | "row";
461
+ }
462
+
463
+ /**
464
+ * A rule targeting one measure or attribute with one or more stacked conditions. The first matching
465
+ * condition (top-down) wins.
466
+ *
467
+ * @alpha
468
+ */
469
+ export declare interface IConditionalFormattingRule {
470
+ id: string;
471
+ target: ConditionalFormattingTarget;
472
+ conditions: readonly IConditionalFormattingCondition[];
473
+ }
474
+
362
475
  /**
363
476
  * @internal
364
477
  */
@@ -1220,9 +1333,28 @@ export declare type PivotTableNextColumnsSizingConfig = {
1220
1333
  columnSizing?: IColumnSizingNext;
1221
1334
  };
1222
1335
 
1336
+ /**
1337
+ * Config slot intersected into {@link PivotTableNextConfig} so conditional formatting can be passed
1338
+ * through the `config` prop (and read back from insight properties).
1339
+ *
1340
+ * @alpha
1341
+ */
1342
+ export declare type PivotTableNextConditionalFormattingConfig = {
1343
+ /**
1344
+ * Rules that color cells/rows based on their values. Absent = no conditional formatting.
1345
+ */
1346
+ conditionalFormatting?: IConditionalFormatting;
1347
+ };
1348
+
1223
1349
  /**
1224
1350
  * Configuration for the pivot table next.
1225
1351
  *
1352
+ * @remarks
1353
+ * `PivotTableNextConditionalFormattingConfig` is intentionally NOT folded into this intersection
1354
+ * while conditional formatting is `@alpha`: a `@public` type cannot reference an `@alpha` one
1355
+ * (api-extractor `ae-incompatible-release-tags`). Call sites intersect it explicitly until the
1356
+ * feature graduates to `@public`, at which point it should be added here.
1357
+ *
1226
1358
  * @public
1227
1359
  */
1228
1360
  export declare type PivotTableNextConfig = PivotTableNextTranspositionConfig & PivotTableNextTextWrappingConfig & PivotTableNextColumnsSizingConfig & PivotTableNextMenuConfig & PivotTableNextFormattingConfig & PivotTableNextExecutionCancellingConfig & PivotTableNextLayoutConfig & PivotTableNextGrandTotalsPositionConfig & PivotTableNextCellSelectionConfig & PivotTableNextAgGridLicenseConfig & PivotTableNextPaginationConfig & PivotTableNextAccessibilityConfig & PivotTableNextExperimentalConfig;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-pivot",
3
- "version": "11.43.0-alpha.2",
3
+ "version": "11.43.0-alpha.4",
4
4
  "description": "GoodData.UI SDK - Pivot Table",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -43,12 +43,12 @@
43
43
  "ts-invariant": "0.10.3",
44
44
  "tslib": "2.8.1",
45
45
  "uuid": "11.1.1",
46
- "@gooddata/sdk-backend-spi": "11.43.0-alpha.2",
47
- "@gooddata/sdk-model": "11.43.0-alpha.2",
48
- "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.2",
49
- "@gooddata/sdk-ui-kit": "11.43.0-alpha.2",
50
- "@gooddata/sdk-ui": "11.43.0-alpha.2",
51
- "@gooddata/sdk-ui-vis-commons": "11.43.0-alpha.2"
46
+ "@gooddata/sdk-backend-spi": "11.43.0-alpha.4",
47
+ "@gooddata/sdk-model": "11.43.0-alpha.4",
48
+ "@gooddata/sdk-ui": "11.43.0-alpha.4",
49
+ "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.4",
50
+ "@gooddata/sdk-ui-kit": "11.43.0-alpha.4",
51
+ "@gooddata/sdk-ui-vis-commons": "11.43.0-alpha.4"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@microsoft/api-documenter": "^7.17.0",
@@ -90,12 +90,12 @@
90
90
  "typescript": "5.9.3",
91
91
  "vitest": "4.1.8",
92
92
  "vitest-dom": "0.1.1",
93
- "@gooddata/eslint-config": "11.43.0-alpha.2",
94
- "@gooddata/oxlint-config": "11.43.0-alpha.2",
95
- "@gooddata/sdk-backend-base": "11.43.0-alpha.2",
96
- "@gooddata/reference-workspace": "11.43.0-alpha.2",
97
- "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.2",
98
- "@gooddata/stylelint-config": "11.43.0-alpha.2"
93
+ "@gooddata/reference-workspace": "11.43.0-alpha.4",
94
+ "@gooddata/oxlint-config": "11.43.0-alpha.4",
95
+ "@gooddata/eslint-config": "11.43.0-alpha.4",
96
+ "@gooddata/sdk-backend-base": "11.43.0-alpha.4",
97
+ "@gooddata/stylelint-config": "11.43.0-alpha.4",
98
+ "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.4"
99
99
  },
100
100
  "peerDependencies": {
101
101
  "react": "^18.0.0 || ^19.0.0",