@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.
- package/esm/index.d.ts +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/next/context/ColumnDefsContext.d.ts.map +1 -1
- package/esm/next/context/ColumnDefsContext.js +3 -1
- package/esm/next/context/PivotTablePropsContext.d.ts +2 -1
- package/esm/next/context/PivotTablePropsContext.d.ts.map +1 -1
- package/esm/next/context/PivotTablePropsContext.js +1 -1
- package/esm/next/features/columns/applyAllFeaturesToColDef.d.ts +4 -1
- package/esm/next/features/columns/applyAllFeaturesToColDef.d.ts.map +1 -1
- package/esm/next/features/columns/applyAllFeaturesToColDef.js +5 -2
- package/esm/next/features/columns/applyConditionalFormattingToColDef.d.ts +14 -0
- package/esm/next/features/columns/applyConditionalFormattingToColDef.d.ts.map +1 -0
- package/esm/next/features/columns/applyConditionalFormattingToColDef.js +33 -0
- package/esm/next/features/data/dataViewToColDefs.d.ts +3 -1
- package/esm/next/features/data/dataViewToColDefs.d.ts.map +1 -1
- package/esm/next/features/data/dataViewToColDefs.js +9 -1
- package/esm/next/features/styling/cell.d.ts.map +1 -1
- package/esm/next/features/styling/cell.js +2 -4
- package/esm/next/features/styling/cellClassification.d.ts +18 -0
- package/esm/next/features/styling/cellClassification.d.ts.map +1 -0
- package/esm/next/features/styling/cellClassification.js +31 -0
- package/esm/next/features/styling/conditionalFormatting.d.ts +35 -0
- package/esm/next/features/styling/conditionalFormatting.d.ts.map +1 -0
- package/esm/next/features/styling/conditionalFormatting.js +212 -0
- package/esm/next/index.d.ts +1 -0
- package/esm/next/index.d.ts.map +1 -1
- package/esm/next/types/conditionalFormatting.d.ts +126 -0
- package/esm/next/types/conditionalFormatting.d.ts.map +1 -0
- package/esm/next/types/conditionalFormatting.js +2 -0
- package/esm/next/types/public.d.ts +6 -0
- package/esm/next/types/public.d.ts.map +1 -1
- package/esm/sdk-ui-pivot.d.ts +132 -0
- 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
|
package/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
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,
|
|
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;
|
|
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;
|
|
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-
|
|
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;
|
|
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;
|
|
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 =
|
|
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
|
+
}
|
package/esm/next/index.d.ts
CHANGED
|
@@ -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";
|
package/esm/next/index.d.ts.map
CHANGED
|
@@ -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"}
|
|
@@ -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
|
|
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"}
|
package/esm/sdk-ui-pivot.d.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
47
|
-
"@gooddata/sdk-model": "11.43.0-alpha.
|
|
48
|
-
"@gooddata/sdk-ui
|
|
49
|
-
"@gooddata/sdk-ui-
|
|
50
|
-
"@gooddata/sdk-ui": "11.43.0-alpha.
|
|
51
|
-
"@gooddata/sdk-ui-vis-commons": "11.43.0-alpha.
|
|
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/
|
|
94
|
-
"@gooddata/oxlint-config": "11.43.0-alpha.
|
|
95
|
-
"@gooddata/
|
|
96
|
-
"@gooddata/
|
|
97
|
-
"@gooddata/
|
|
98
|
-
"@gooddata/
|
|
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",
|