@gooddata/sdk-ui-ext 11.52.0 → 11.53.0-alpha.1
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/NOTICE +59 -9
- package/esm/index.d.ts +3 -0
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +2 -0
- package/esm/insightView/InsightRenderer.d.ts +6 -3
- package/esm/insightView/InsightRenderer.d.ts.map +1 -1
- package/esm/insightView/InsightRenderer.js +142 -165
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts +3 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.js +20 -6
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts +11 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.js +25 -10
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.js +64 -5
- package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts +3 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.js +2 -2
- package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts +46 -8
- package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.js +94 -16
- package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.d.ts +2 -0
- package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.d.ts.map +1 -1
- package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.js +2 -0
- package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.d.ts.map +1 -1
- package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.js +8 -2
- package/esm/internal/translations/en-US.localization-bundle.d.ts +12 -0
- package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/internal/translations/en-US.localization-bundle.js +12 -0
- package/esm/locales.d.ts +9 -0
- package/esm/locales.d.ts.map +1 -1
- package/esm/locales.js +3 -0
- package/esm/sdk-ui-ext.d.ts +86 -0
- package/package.json +21 -21
- package/styles/css/main.css +59 -0
- package/styles/css/main.css.map +1 -1
- package/styles/internal/css/conditional_formatting.css +59 -0
- package/styles/internal/css/conditional_formatting.css.map +1 -1
- package/styles/internal/scss/conditional_formatting.scss +78 -0
|
@@ -6,7 +6,7 @@ import { isDateConditionValue, normalizeDateConditionGranularity, resolveDateCon
|
|
|
6
6
|
import { CF_DEFAULT_COLOR } from "./conditionalFormattingColors.js";
|
|
7
7
|
// Cap suggestions so a high-cardinality attribute can't build a huge suggestion list.
|
|
8
8
|
const MAX_ELEMENT_SUGGESTIONS = 200;
|
|
9
|
-
const targetToValue = (target) => target.kind === "measure"
|
|
9
|
+
export const targetToValue = (target) => target.kind === "measure"
|
|
10
10
|
? `measure:${target.measureIdentifier}`
|
|
11
11
|
: `attribute:${target.attributeIdentifier}`;
|
|
12
12
|
/**
|
|
@@ -18,15 +18,19 @@ export function buildCfTargetData(dataView) {
|
|
|
18
18
|
const titles = {};
|
|
19
19
|
const formats = {};
|
|
20
20
|
const dates = {};
|
|
21
|
+
const semantic = {};
|
|
21
22
|
for (const measure of dataView.meta().measureDescriptors()) {
|
|
22
|
-
const { localIdentifier, name, format } = measure.measureHeaderItem;
|
|
23
|
+
const { localIdentifier, name, format, conditionalFormatting } = measure.measureHeaderItem;
|
|
23
24
|
titles[localIdentifier] = name;
|
|
24
25
|
if (format) {
|
|
25
26
|
formats[localIdentifier] = format;
|
|
26
27
|
}
|
|
28
|
+
if (conditionalFormatting) {
|
|
29
|
+
semantic[localIdentifier] = conditionalFormatting;
|
|
30
|
+
}
|
|
27
31
|
}
|
|
28
32
|
for (const attribute of dataView.meta().attributeDescriptors()) {
|
|
29
|
-
const { localIdentifier, formOf, granularity, format } = attribute.attributeHeader;
|
|
33
|
+
const { localIdentifier, formOf, granularity, format, conditionalFormatting } = attribute.attributeHeader;
|
|
30
34
|
titles[localIdentifier] = formOf.name;
|
|
31
35
|
// Eligible date attributes (resolvable granularity) get date conditions; the rest keep plain text.
|
|
32
36
|
const normalizedGranularity = normalizeDateConditionGranularity(granularity);
|
|
@@ -36,8 +40,11 @@ export function buildCfTargetData(dataView) {
|
|
|
36
40
|
...(format?.timezone ? { timezone: format.timezone } : {}),
|
|
37
41
|
};
|
|
38
42
|
}
|
|
43
|
+
if (conditionalFormatting) {
|
|
44
|
+
semantic[localIdentifier] = conditionalFormatting;
|
|
45
|
+
}
|
|
39
46
|
}
|
|
40
|
-
return { titles, formats, elements: buildElementsByLocalId(dataView), dates };
|
|
47
|
+
return { titles, formats, elements: buildElementsByLocalId(dataView), dates, semantic };
|
|
41
48
|
}
|
|
42
49
|
// Attribute header groups align by index with the dimension's attribute descriptors; the collected
|
|
43
50
|
// elements are only as complete as the loaded (paged) result.
|
|
@@ -109,6 +116,29 @@ export const findTargetOption = (options, target) => options.find((option) => op
|
|
|
109
116
|
/** Date-eligible target: the option carries execution-resolved date metadata. */
|
|
110
117
|
export const isDateTarget = (option) => option?.date !== undefined;
|
|
111
118
|
export const targetLocalId = (target) => target.kind === "measure" ? target.measureIdentifier : target.attributeIdentifier;
|
|
119
|
+
/**
|
|
120
|
+
* Whether `target` is already in Custom mode on this insight config — an insight rule targets it,
|
|
121
|
+
* or it's explicitly listed in `customTargets`. Mirrors the `customModeTargets` set built by
|
|
122
|
+
* sdk-ui-pivot's `resolvePerTargetConditionalFormatting` (semanticConditionalFormatting.ts); the two
|
|
123
|
+
* packages don't share this helper, so keep them in sync by hand if either changes. Honoring
|
|
124
|
+
* `customTargets` here matters even though this PR never writes it: if some other path already
|
|
125
|
+
* marked a target Custom, the semantic block must still hide it as Inherited would be wrong.
|
|
126
|
+
*/
|
|
127
|
+
export const isCustomTarget = (config, target) => {
|
|
128
|
+
const value = targetToValue(target);
|
|
129
|
+
return ((config?.rules ?? []).some((rule) => targetToValue(rule.target) === value) ||
|
|
130
|
+
(config?.customTargets ?? []).some((customTarget) => targetToValue(customTarget) === value));
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Synthesizes a read-only rule for the View dialog from an inherited semantic-layer condition set.
|
|
134
|
+
* The id mirrors the engine's own `semantic:<kind>:<localId>` convention (semanticConditionalFormatting.ts)
|
|
135
|
+
* for consistency only — it's never persisted or compared.
|
|
136
|
+
*/
|
|
137
|
+
export const semanticRuleFor = (option, semantic) => ({
|
|
138
|
+
id: `semantic:${option.target.kind}:${targetLocalId(option.target)}`,
|
|
139
|
+
target: option.target,
|
|
140
|
+
conditions: semantic.conditions,
|
|
141
|
+
});
|
|
112
142
|
// --- Operators -------------------------------------------------------------------------------
|
|
113
143
|
const NO_VALUE_OPERATORS = new Set([
|
|
114
144
|
"ALL",
|
|
@@ -214,6 +244,43 @@ export const valueEditorKind = (condition, kind, hasSuggestions, isDate) => {
|
|
|
214
244
|
return hasSuggestions && isEqualityOperator(condition.operator) ? "combobox" : "text";
|
|
215
245
|
}
|
|
216
246
|
};
|
|
247
|
+
/**
|
|
248
|
+
* Whether a stored value's shape is one `editorKind`'s control can represent. Editing always keeps
|
|
249
|
+
* this true (operator changes normalize the value's shape, and {@link sanitizeRuleForEditing} clears
|
|
250
|
+
* what it can't fix), but a read-only semantic-layer rule may pair an operator with a value shape the
|
|
251
|
+
* pivot editor never authors — e.g. a text operator stored against a date target.
|
|
252
|
+
*/
|
|
253
|
+
export const valueMatchesEditorKind = (editorKind, value) => {
|
|
254
|
+
switch (editorKind) {
|
|
255
|
+
case "none":
|
|
256
|
+
return value.kind === "none";
|
|
257
|
+
case "date":
|
|
258
|
+
return value.kind === "none" || value.kind === "absoluteDate" || value.kind === "relativeDate";
|
|
259
|
+
case "range":
|
|
260
|
+
return value.kind === "none" || value.kind === "literalRange";
|
|
261
|
+
case "number":
|
|
262
|
+
return (value.kind === "none" ||
|
|
263
|
+
(value.kind === "literal" && (isBlank(value.value) || Number.isFinite(Number(value.value)))));
|
|
264
|
+
case "combobox":
|
|
265
|
+
case "text":
|
|
266
|
+
return value.kind === "none" || value.kind === "literal";
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
/** A plain-text rendering of a stored value, for the read-only fallback when it doesn't fit its editor. */
|
|
270
|
+
export const rawValueText = (value) => {
|
|
271
|
+
switch (value.kind) {
|
|
272
|
+
case "none":
|
|
273
|
+
return "";
|
|
274
|
+
case "literal":
|
|
275
|
+
return String(value.value);
|
|
276
|
+
case "literalRange":
|
|
277
|
+
return `${value.from} – ${value.to}`;
|
|
278
|
+
case "absoluteDate":
|
|
279
|
+
return `${value.from} – ${value.to}`;
|
|
280
|
+
case "relativeDate":
|
|
281
|
+
return `${value.granularity} ${value.from} … ${value.to}`;
|
|
282
|
+
}
|
|
283
|
+
};
|
|
217
284
|
// --- Factories -------------------------------------------------------------------------------
|
|
218
285
|
/** Fresh empty operand of the right shape for the operator. */
|
|
219
286
|
export const emptyValueForOperator = (operator, isDate = false) => {
|
|
@@ -342,10 +409,11 @@ export const rawToDisplayNumber = (raw, percent) => percent ? denoise(raw * 100)
|
|
|
342
409
|
export const displayToRawNumber = (display, percent) => percent ? denoise(display / 100) : display;
|
|
343
410
|
const isBlank = (value) => String(value).trim() === "";
|
|
344
411
|
/**
|
|
345
|
-
* Coerces stored condition shapes the editor cannot represent so an AAC-authored
|
|
346
|
-
* instead of dead-ended (disabled Save then covers the cleared
|
|
347
|
-
*
|
|
348
|
-
*
|
|
412
|
+
* Coerces stored condition shapes the editor cannot represent so an AAC-authored (or inherited
|
|
413
|
+
* semantic-layer) rule opens editable instead of dead-ended (disabled Save then covers the cleared
|
|
414
|
+
* values). An operator outside the target's curated set resets to "Is on"/"Equal to" and its value
|
|
415
|
+
* shape follows; a non-numeric measure literal clears to empty. Id and format always survive. The
|
|
416
|
+
* engine keeps evaluating the stored original until Save.
|
|
349
417
|
*/
|
|
350
418
|
export const sanitizeRuleForEditing = (rule, isDate = false) => {
|
|
351
419
|
if (rule.target.kind === "attribute" && isDate) {
|
|
@@ -367,16 +435,26 @@ export const sanitizeRuleForEditing = (rule, isDate = false) => {
|
|
|
367
435
|
}),
|
|
368
436
|
};
|
|
369
437
|
}
|
|
370
|
-
|
|
371
|
-
return rule;
|
|
372
|
-
}
|
|
438
|
+
const curatedOperators = operatorsForTarget(rule.target.kind, false);
|
|
373
439
|
return {
|
|
374
440
|
...rule,
|
|
375
|
-
conditions: rule.conditions.map((condition) =>
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
?
|
|
379
|
-
|
|
441
|
+
conditions: rule.conditions.map((condition) => {
|
|
442
|
+
const operatorOk = curatedOperators.includes(condition.operator);
|
|
443
|
+
const operator = operatorOk ? condition.operator : "EQUAL_TO";
|
|
444
|
+
const value = operatorOk ? condition.value : valueForOperator(operator, condition.value, false);
|
|
445
|
+
const numericLiteralOk = rule.target.kind !== "measure" ||
|
|
446
|
+
value.kind !== "literal" ||
|
|
447
|
+
isBlank(value.value) ||
|
|
448
|
+
!Number.isNaN(Number(value.value));
|
|
449
|
+
if (operatorOk && numericLiteralOk) {
|
|
450
|
+
return condition;
|
|
451
|
+
}
|
|
452
|
+
return {
|
|
453
|
+
...condition,
|
|
454
|
+
operator,
|
|
455
|
+
value: numericLiteralOk ? value : { kind: "literal", value: "" },
|
|
456
|
+
};
|
|
457
|
+
}),
|
|
380
458
|
};
|
|
381
459
|
};
|
|
382
460
|
/**
|
|
@@ -5,6 +5,8 @@ import { type IDateFilterOptionsByType } from "@gooddata/sdk-ui-filters";
|
|
|
5
5
|
* dashboard date filter consumes. Undefined while loading (the picker degrades to its static form);
|
|
6
6
|
* falls back to platform defaults when backend/workspace is absent, the workspace has no custom
|
|
7
7
|
* config, the query fails, or the config yields nothing visible.
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
8
10
|
*/
|
|
9
11
|
export declare function useCfDateFilterOptions(backend: IAnalyticalBackend | undefined, workspace: string | undefined,
|
|
10
12
|
/** False = no consumer in sight (no date-eligible target) — skip the backend query entirely. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCfDateFilterOptions.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACH,KAAK,wBAAwB,EAIhC,MAAM,0BAA0B,CAAC;AAMlC
|
|
1
|
+
{"version":3,"file":"useCfDateFilterOptions.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EACH,KAAK,wBAAwB,EAIhC,MAAM,0BAA0B,CAAC;AAMlC;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAClC,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,SAAS,EAAE,MAAM,GAAG,SAAS;AAC7B,kGAAgG;AAChG,OAAO,EAAE,OAAO,GACjB,wBAAwB,GAAG,SAAS,CAkCtC"}
|
|
@@ -9,6 +9,8 @@ const FALLBACK_DATE_FILTER_OPTIONS = convertDateFilterConfigToDateFilterOptions(
|
|
|
9
9
|
* dashboard date filter consumes. Undefined while loading (the picker degrades to its static form);
|
|
10
10
|
* falls back to platform defaults when backend/workspace is absent, the workspace has no custom
|
|
11
11
|
* config, the query fails, or the config yields nothing visible.
|
|
12
|
+
*
|
|
13
|
+
* @internal
|
|
12
14
|
*/
|
|
13
15
|
export function useCfDateFilterOptions(backend, workspace,
|
|
14
16
|
/** False = no consumer in sight (no date-eligible target) — skip the backend query entirely. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluggablePivotTableNext.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.tsx"],"names":[],"mappings":"AAIA,OAAO,EAGH,KAAK,iBAAiB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAYjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIH,KAAK,wBAAwB,EAEhC,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAGH,KAAK,oBAAoB,EAE5B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAGhC,MAAM,sCAAsC,CAAC;AAoC9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAiBtF,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,wBAAwB,EACrC,QAAQ,EAAE,SAAS,GACpB,oBAAoB,CAoBtB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,8BAA8B;IACvE,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAuC;IAE1D,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAY,KAAK,EAAE,aAAa,EAqB/B;IAEM,OAAO,IAAI,IAAI,CAErB;IAEM,yBAAyB,CAC5B,cAAc,EAAE,eAAe,EAC/B,sBAAsB,CAAC,EAAE,eAAe,GACzC,OAAO,CAAC,uBAAuB,CAAC,CA8GlC;IAEe,8BAA8B,CAC1C,mBAAmB,EAAE,QAAQ,EAC7B,gBAAgB,EAAE,iBAAiB,EACnC,0BAA0B,EAAE,OAAO,GACpC,QAAQ,CAWV;IAED,OAAO,CAAC,kBAAkB;IAInB,YAAY,CACf,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,kBAAkB,EAC3B,gBAAgB,EAAE,iBAAiB,0DActC;IAED,SAAS,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,wBAAwB,GAAG,IAAI,CActF;IAKD,OAAO,CAAC,cAAc,CAIpB;IAIF,OAAO,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"PluggablePivotTableNext.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.tsx"],"names":[],"mappings":"AAIA,OAAO,EAGH,KAAK,iBAAiB,EACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,kBAAkB,EACvB,KAAK,SAAS,EAYjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAIH,KAAK,wBAAwB,EAEhC,MAAM,kBAAkB,CAAC;AAM1B,OAAO,EAGH,KAAK,oBAAoB,EAE5B,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAEH,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,wBAAwB,EAGhC,MAAM,sCAAsC,CAAC;AAoC9C,OAAO,EAAE,8BAA8B,EAAE,MAAM,sCAAsC,CAAC;AAiBtF,wBAAgB,0BAA0B,CACtC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,wBAAwB,EACrC,QAAQ,EAAE,SAAS,GACpB,oBAAoB,CAoBtB;AAED;;;;;GAKG;AACH,qBAAa,uBAAwB,SAAQ,8BAA8B;IACvE,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,mBAAmB,CAAuB;IAElD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,WAAW,CAAuC;IAE1D,OAAO,CAAC,YAAY,CAAqB;IAEzC,YAAY,KAAK,EAAE,aAAa,EAqB/B;IAEM,OAAO,IAAI,IAAI,CAErB;IAEM,yBAAyB,CAC5B,cAAc,EAAE,eAAe,EAC/B,sBAAsB,CAAC,EAAE,eAAe,GACzC,OAAO,CAAC,uBAAuB,CAAC,CA8GlC;IAEe,8BAA8B,CAC1C,mBAAmB,EAAE,QAAQ,EAC7B,gBAAgB,EAAE,iBAAiB,EACnC,0BAA0B,EAAE,OAAO,GACpC,QAAQ,CAWV;IAED,OAAO,CAAC,kBAAkB;IAInB,YAAY,CACf,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,kBAAkB,EAC3B,gBAAgB,EAAE,iBAAiB,0DActC;IAED,SAAS,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,wBAAwB,GAAG,IAAI,CActF;IAKD,OAAO,CAAC,cAAc,CAIpB;IAIF,OAAO,CAAC,oBAAoB,CAU1B;IAEF,OAAO,CAAC,yBAAyB,CAe/B;IAEF,UAAmB,wBAAwB,CACvC,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,kBAAkB,EAC3B,qBAAqB,EAAE,GAAG,GAC3B,IAAI,CASN;IAED,UAAmB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAOzE;IAED,SAAS,CAAC,mBAAmB,CACzB,OAAO,EAAE,SAAS,EAClB,OAAO,EAAE,kBAAkB,EAC3B,gBAAgB,EAAE,iBAAiB,GACpC,IAAI,CAsFN;IAED,SAAS,CAAC,wBAAwB,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,EAAE,SAAS,GAAG,IAAI,CA6BxF;IAED,SAAS,CAAC,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,CAAC,EAAE,GAAG,GAAG,UAAU,EAAE,CAElG;IAED,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,oBAAoB;IA8B5B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,cAAc;CAmCzB"}
|
package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.js
CHANGED
|
@@ -198,8 +198,11 @@ export class PluggablePivotTableNext extends AbstractPluggableVisualization {
|
|
|
198
198
|
handleLoadingChanged = (loadingState) => {
|
|
199
199
|
if (loadingState.isLoading) {
|
|
200
200
|
// Formats and element suggestions are deliberately kept: clearing them would flip an open
|
|
201
|
-
// percent rule's input from "40" to "0.4" and blank suggestions mid-edit.
|
|
202
|
-
|
|
201
|
+
// percent rule's input from "40" to "0.4" and blank suggestions mid-edit. Semantic-layer
|
|
202
|
+
// rules have no such open-edit session to protect (they're view-only in this panel), and a
|
|
203
|
+
// reused localId could otherwise show/open a DIFFERENT target's inherited rule until the
|
|
204
|
+
// next data view lands (or indefinitely on a failed execution) — clear them alongside titles.
|
|
205
|
+
this.cfTargetData = { ...this.cfTargetData, titles: {}, semantic: {} };
|
|
203
206
|
}
|
|
204
207
|
this.onLoadingChanged(loadingState);
|
|
205
208
|
};
|
|
@@ -288,6 +291,9 @@ export class PluggablePivotTableNext extends AbstractPluggableVisualization {
|
|
|
288
291
|
? (customVisualizationConfig?.conditionalFormatting ??
|
|
289
292
|
getConditionalFormattingFromProperties(insightProperties(insight)))
|
|
290
293
|
: undefined,
|
|
294
|
+
// The engine inherits from descriptors independently of `conditionalFormatting` above
|
|
295
|
+
// (even `undefined` still inherits) — it needs its own explicit gate behind the flag.
|
|
296
|
+
enableSemanticConditionalFormatting: enableConditionalFormatting,
|
|
291
297
|
};
|
|
292
298
|
// Only pass pageSize when pagination is enabled
|
|
293
299
|
const pageSize = getPageSizeFromProperties(insightProperties(insight));
|
|
@@ -2571,6 +2571,10 @@ export declare const en_US: {
|
|
|
2571
2571
|
text: string;
|
|
2572
2572
|
crowdinContext: string;
|
|
2573
2573
|
};
|
|
2574
|
+
"properties.conditionalFormatting.semanticLabel": {
|
|
2575
|
+
text: string;
|
|
2576
|
+
crowdinContext: string;
|
|
2577
|
+
};
|
|
2574
2578
|
"properties.conditionalFormatting.rule.invalid": {
|
|
2575
2579
|
text: string;
|
|
2576
2580
|
crowdinContext: string;
|
|
@@ -2587,6 +2591,10 @@ export declare const en_US: {
|
|
|
2587
2591
|
text: string;
|
|
2588
2592
|
crowdinContext: string;
|
|
2589
2593
|
};
|
|
2594
|
+
"properties.conditionalFormatting.rule.view": {
|
|
2595
|
+
text: string;
|
|
2596
|
+
crowdinContext: string;
|
|
2597
|
+
};
|
|
2590
2598
|
"properties.conditionalFormatting.dialog.addTitle": {
|
|
2591
2599
|
text: string;
|
|
2592
2600
|
crowdinContext: string;
|
|
@@ -2595,6 +2603,10 @@ export declare const en_US: {
|
|
|
2595
2603
|
text: string;
|
|
2596
2604
|
crowdinContext: string;
|
|
2597
2605
|
};
|
|
2606
|
+
"properties.conditionalFormatting.dialog.viewTitle": {
|
|
2607
|
+
text: string;
|
|
2608
|
+
crowdinContext: string;
|
|
2609
|
+
};
|
|
2598
2610
|
"properties.conditionalFormatting.dialog.target": {
|
|
2599
2611
|
text: string;
|
|
2600
2612
|
crowdinContext: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en-US.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/internal/translations/en-US.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"en-US.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/internal/translations/en-US.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyuFjB,CAAC"}
|
|
@@ -2573,6 +2573,10 @@ export const en_US = {
|
|
|
2573
2573
|
"text": "Add",
|
|
2574
2574
|
"crowdinContext": "Button (in the Rules subsection header) that opens the dialog to create a new conditional-formatting rule."
|
|
2575
2575
|
},
|
|
2576
|
+
"properties.conditionalFormatting.semanticLabel": {
|
|
2577
|
+
"text": "From semantic layer",
|
|
2578
|
+
"crowdinContext": "Uppercase subsection label above conditional-formatting rules inherited from the semantic layer (read-only in this view)."
|
|
2579
|
+
},
|
|
2576
2580
|
"properties.conditionalFormatting.rule.invalid": {
|
|
2577
2581
|
"text": "Column not found",
|
|
2578
2582
|
"crowdinContext": "Badge on a rule whose target column is no longer present on the insight."
|
|
@@ -2589,6 +2593,10 @@ export const en_US = {
|
|
|
2589
2593
|
"text": "Delete rule",
|
|
2590
2594
|
"crowdinContext": "Accessible label for the button that deletes a conditional-formatting rule."
|
|
2591
2595
|
},
|
|
2596
|
+
"properties.conditionalFormatting.rule.view": {
|
|
2597
|
+
"text": "View rule",
|
|
2598
|
+
"crowdinContext": "Accessible label and button text for viewing a read-only conditional-formatting rule inherited from the semantic layer."
|
|
2599
|
+
},
|
|
2592
2600
|
"properties.conditionalFormatting.dialog.addTitle": {
|
|
2593
2601
|
"text": "Add rule",
|
|
2594
2602
|
"crowdinContext": "Headline of the dialog when creating a new conditional-formatting rule."
|
|
@@ -2597,6 +2605,10 @@ export const en_US = {
|
|
|
2597
2605
|
"text": "Edit rule",
|
|
2598
2606
|
"crowdinContext": "Headline of the dialog when editing an existing conditional-formatting rule."
|
|
2599
2607
|
},
|
|
2608
|
+
"properties.conditionalFormatting.dialog.viewTitle": {
|
|
2609
|
+
"text": "View rule",
|
|
2610
|
+
"crowdinContext": "Headline of the dialog when viewing a read-only conditional-formatting rule inherited from the semantic layer."
|
|
2611
|
+
},
|
|
2600
2612
|
"properties.conditionalFormatting.dialog.target": {
|
|
2601
2613
|
"text": "When",
|
|
2602
2614
|
"crowdinContext": "Label above the dropdown selecting which measure or attribute a rule targets."
|
package/esm/locales.d.ts
CHANGED
|
@@ -1003,6 +1003,9 @@ export declare const conditionalFormattingMessages: {
|
|
|
1003
1003
|
addRule: {
|
|
1004
1004
|
id: string;
|
|
1005
1005
|
};
|
|
1006
|
+
semanticLabel: {
|
|
1007
|
+
id: string;
|
|
1008
|
+
};
|
|
1006
1009
|
ruleInvalid: {
|
|
1007
1010
|
id: string;
|
|
1008
1011
|
};
|
|
@@ -1015,12 +1018,18 @@ export declare const conditionalFormattingMessages: {
|
|
|
1015
1018
|
ruleDelete: {
|
|
1016
1019
|
id: string;
|
|
1017
1020
|
};
|
|
1021
|
+
ruleView: {
|
|
1022
|
+
id: string;
|
|
1023
|
+
};
|
|
1018
1024
|
dialogAddTitle: {
|
|
1019
1025
|
id: string;
|
|
1020
1026
|
};
|
|
1021
1027
|
dialogEditTitle: {
|
|
1022
1028
|
id: string;
|
|
1023
1029
|
};
|
|
1030
|
+
dialogViewTitle: {
|
|
1031
|
+
id: string;
|
|
1032
|
+
};
|
|
1024
1033
|
dialogTarget: {
|
|
1025
1034
|
id: string;
|
|
1026
1035
|
};
|
package/esm/locales.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAGjF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA2EnD,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAsBtD,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuQnB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH7B,CAAC;AAEH,eAAO,MAAM,6BAA6B
|
|
1
|
+
{"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../src/locales.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAkB,MAAM,YAAY,CAAC;AAEpE,OAAO,EAAE,KAAK,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AAGjF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA2EnD,CAAC;AAEH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAsBtD,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuQnB,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH7B,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCxC,CAAC;AAEH,eAAO,MAAM,qCAAqC,EAAE,MAAM,CAAC,6BAA6B,EAAE,iBAAiB,CAmBrG,CAAC;AAEP,wGAAsG;AACtG,eAAO,MAAM,yCAAyC,EAAE,OAAO,CAC3D,MAAM,CAAC,6BAA6B,EAAE,iBAAiB,CAAC,CAS1D,CAAC"}
|
package/esm/locales.js
CHANGED
|
@@ -485,12 +485,15 @@ export const conditionalFormattingMessages = defineMessages({
|
|
|
485
485
|
empty: { id: "properties.conditionalFormatting.empty" },
|
|
486
486
|
rulesLabel: { id: "properties.conditionalFormatting.rulesLabel" },
|
|
487
487
|
addRule: { id: "properties.conditionalFormatting.addRule" },
|
|
488
|
+
semanticLabel: { id: "properties.conditionalFormatting.semanticLabel" },
|
|
488
489
|
ruleInvalid: { id: "properties.conditionalFormatting.rule.invalid" },
|
|
489
490
|
ruleInvalidValue: { id: "properties.conditionalFormatting.rule.invalidValue" },
|
|
490
491
|
ruleEdit: { id: "properties.conditionalFormatting.rule.edit" },
|
|
491
492
|
ruleDelete: { id: "properties.conditionalFormatting.rule.delete" },
|
|
493
|
+
ruleView: { id: "properties.conditionalFormatting.rule.view" },
|
|
492
494
|
dialogAddTitle: { id: "properties.conditionalFormatting.dialog.addTitle" },
|
|
493
495
|
dialogEditTitle: { id: "properties.conditionalFormatting.dialog.editTitle" },
|
|
496
|
+
dialogViewTitle: { id: "properties.conditionalFormatting.dialog.viewTitle" },
|
|
494
497
|
dialogTarget: { id: "properties.conditionalFormatting.dialog.target" },
|
|
495
498
|
dialogSelectTarget: { id: "properties.conditionalFormatting.dialog.selectTarget" },
|
|
496
499
|
dialogCondition: { id: "properties.conditionalFormatting.dialog.condition" },
|
package/esm/sdk-ui-ext.d.ts
CHANGED
|
@@ -14,8 +14,10 @@ import type { AccessGranularPermission } from '@gooddata/sdk-model';
|
|
|
14
14
|
import { AutomationType } from '@gooddata/sdk-backend-spi';
|
|
15
15
|
import { ChartInlineVisualizationType } from '@gooddata/sdk-ui-charts';
|
|
16
16
|
import { ComponentType } from 'react';
|
|
17
|
+
import { ConditionalFormattingTarget } from '@gooddata/sdk-ui-pivot/next';
|
|
17
18
|
import { CopyCodeOriginType } from '@gooddata/sdk-ui-kit';
|
|
18
19
|
import { DataSourceAccessSource } from '@gooddata/sdk-model';
|
|
20
|
+
import { DateFilterGranularity } from '@gooddata/sdk-model';
|
|
19
21
|
import { Dispatch } from 'react';
|
|
20
22
|
import { EmbedType } from '@gooddata/sdk-ui-kit';
|
|
21
23
|
import { ExplicitDrill } from '@gooddata/sdk-ui';
|
|
@@ -29,7 +31,9 @@ import { IAutomationMetadataObject } from '@gooddata/sdk-model';
|
|
|
29
31
|
import { ICatalogAttributeHierarchy } from '@gooddata/sdk-model';
|
|
30
32
|
import { IChartConfig } from '@gooddata/sdk-ui-charts';
|
|
31
33
|
import { IColorPalette } from '@gooddata/sdk-model';
|
|
34
|
+
import { IConditionalFormattingRule } from '@gooddata/sdk-ui-pivot/next';
|
|
32
35
|
import { IDashboardUrlBuilder } from '@gooddata/sdk-ui';
|
|
36
|
+
import { IDateFilterOptionsByType } from '@gooddata/sdk-ui-filters';
|
|
33
37
|
import { IDrillEvent } from '@gooddata/sdk-ui';
|
|
34
38
|
import { IDrillEventIntersectionElement } from '@gooddata/sdk-ui';
|
|
35
39
|
import { IErrorProps } from '@gooddata/sdk-ui';
|
|
@@ -46,6 +50,7 @@ import { IntlShape } from 'react-intl';
|
|
|
46
50
|
import type { IObjectAccessList } from '@gooddata/sdk-model';
|
|
47
51
|
import type { IObjectPermissionsObject } from '@gooddata/sdk-backend-spi';
|
|
48
52
|
import { IPivotTableConfig } from '@gooddata/sdk-ui-pivot';
|
|
53
|
+
import { ISeparators } from '@gooddata/sdk-model';
|
|
49
54
|
import { ISettings } from '@gooddata/sdk-model';
|
|
50
55
|
import { ITab } from '@gooddata/sdk-ui-kit';
|
|
51
56
|
import { ITheme } from '@gooddata/sdk-model';
|
|
@@ -65,6 +70,7 @@ import { SetStateAction } from 'react';
|
|
|
65
70
|
import { UiAsyncTableVariant } from '@gooddata/sdk-ui-kit';
|
|
66
71
|
import { UiSkeleton } from '@gooddata/sdk-ui-kit';
|
|
67
72
|
import { UseCancelablePromiseStatus } from '@gooddata/sdk-ui';
|
|
73
|
+
import { WeekStart } from '@gooddata/sdk-model';
|
|
68
74
|
|
|
69
75
|
/**
|
|
70
76
|
* The access summary of a fetched access list — effective workspace access plus the
|
|
@@ -267,6 +273,11 @@ export declare const COMPARISON_OPERATORS: {
|
|
|
267
273
|
readonly COMPARISON_OPERATOR_GREATER_THAN_OR_EQUAL_TO: "GREATER_THAN_OR_EQUAL_TO";
|
|
268
274
|
};
|
|
269
275
|
|
|
276
|
+
/**
|
|
277
|
+
* @internal
|
|
278
|
+
*/
|
|
279
|
+
export declare function ConditionalFormattingDialog({ rule: initialRule, isNew, targetOptions, separators, dateFilterOptions, dateSettings, alignTo, readOnly, fixedTarget, onSave, onClose }: IConditionalFormattingDialogProps): JSX.Element;
|
|
280
|
+
|
|
270
281
|
/**
|
|
271
282
|
* @internal
|
|
272
283
|
*/
|
|
@@ -553,6 +564,51 @@ export declare interface IAutomationsProps {
|
|
|
553
564
|
editAutomation?: IEditAutomation;
|
|
554
565
|
}
|
|
555
566
|
|
|
567
|
+
/**
|
|
568
|
+
* Date-attribute metadata date conditions author and validate against. Present only for granularities
|
|
569
|
+
* the evaluation engine supports (linear; fiscal joins once its labeling convention is verified).
|
|
570
|
+
*
|
|
571
|
+
* @internal
|
|
572
|
+
*/
|
|
573
|
+
export declare interface ICfDateMeta {
|
|
574
|
+
granularity: DateFilterGranularity;
|
|
575
|
+
/** The column's timezone (descriptor `format.timezone`) — "today" resolves in it. */
|
|
576
|
+
timezone?: string;
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
/**
|
|
580
|
+
* Workspace date-display settings the date value picker honors (derived by the host from settings).
|
|
581
|
+
*
|
|
582
|
+
* @internal
|
|
583
|
+
*/
|
|
584
|
+
export declare interface ICfDateSettings {
|
|
585
|
+
dateFormat?: string;
|
|
586
|
+
weekStart?: WeekStart;
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
/**
|
|
590
|
+
* @internal
|
|
591
|
+
*/
|
|
592
|
+
export declare interface IConditionalFormattingDialogProps {
|
|
593
|
+
rule: IConditionalFormattingRule;
|
|
594
|
+
isNew: boolean;
|
|
595
|
+
targetOptions: ITargetOption[];
|
|
596
|
+
/** Workspace number separators; measure value inputs validate and format with them. */
|
|
597
|
+
separators?: ISeparators;
|
|
598
|
+
/** Workspace date-filter preset catalog; date value pickers offer it (undefined = static only). */
|
|
599
|
+
dateFilterOptions?: IDateFilterOptionsByType;
|
|
600
|
+
/** Workspace date-display settings (format, week start) for the date value pickers. */
|
|
601
|
+
dateSettings?: ICfDateSettings;
|
|
602
|
+
/** CSS selector of a small, stable element the popover anchors to. */
|
|
603
|
+
alignTo: string;
|
|
604
|
+
/** Renders the dialog non-interactively: no target picker, no editing, no Save button. */
|
|
605
|
+
readOnly?: boolean;
|
|
606
|
+
/** Renders a static "icon + title" header for the rule's target instead of the picker dropdown. */
|
|
607
|
+
fixedTarget?: boolean;
|
|
608
|
+
onSave: (rule: IConditionalFormattingRule) => void;
|
|
609
|
+
onClose: () => void;
|
|
610
|
+
}
|
|
611
|
+
|
|
556
612
|
/**
|
|
557
613
|
* @internal
|
|
558
614
|
*/
|
|
@@ -1635,6 +1691,24 @@ export declare interface ITabsIds {
|
|
|
1635
1691
|
all: string;
|
|
1636
1692
|
}
|
|
1637
1693
|
|
|
1694
|
+
/**
|
|
1695
|
+
* A selectable measure/attribute for the rule's "applies to" dropdown.
|
|
1696
|
+
*
|
|
1697
|
+
* @internal
|
|
1698
|
+
*/
|
|
1699
|
+
export declare interface ITargetOption {
|
|
1700
|
+
/** `measure:<localId>` | `attribute:<localId>` */
|
|
1701
|
+
value: string;
|
|
1702
|
+
title: string;
|
|
1703
|
+
target: ConditionalFormattingTarget;
|
|
1704
|
+
/** Percent-formatted measure: the value input edits display units (40), the rule stores raw (0.4). */
|
|
1705
|
+
isPercent?: boolean;
|
|
1706
|
+
/** Element suggestions from the current (paged) result — a convenience over free text, never a constraint. */
|
|
1707
|
+
elements?: readonly string[];
|
|
1708
|
+
/** Present iff the attribute is a date-condition-eligible date attribute; switches the condition set. */
|
|
1709
|
+
date?: ICfDateMeta;
|
|
1710
|
+
}
|
|
1711
|
+
|
|
1638
1712
|
/**
|
|
1639
1713
|
* Config for useInsightPagedList hook
|
|
1640
1714
|
* @internal
|
|
@@ -1895,6 +1969,18 @@ export declare type TelemetryEvent = "multiple-users-deleted" | "multiple-groups
|
|
|
1895
1969
|
*/
|
|
1896
1970
|
export declare type TrackEventCallback = (event: TelemetryEvent) => void;
|
|
1897
1971
|
|
|
1972
|
+
/**
|
|
1973
|
+
* The workspace date-filter preset catalog for date-condition value pickers — the same catalog the
|
|
1974
|
+
* dashboard date filter consumes. Undefined while loading (the picker degrades to its static form);
|
|
1975
|
+
* falls back to platform defaults when backend/workspace is absent, the workspace has no custom
|
|
1976
|
+
* config, the query fails, or the config yields nothing visible.
|
|
1977
|
+
*
|
|
1978
|
+
* @internal
|
|
1979
|
+
*/
|
|
1980
|
+
export declare function useCfDateFilterOptions(backend: IAnalyticalBackend | undefined, workspace: string | undefined,
|
|
1981
|
+
/** False = no consumer in sight (no date-eligible target) — skip the backend query entirely. */
|
|
1982
|
+
enabled: boolean): IDateFilterOptionsByType | undefined;
|
|
1983
|
+
|
|
1898
1984
|
/**
|
|
1899
1985
|
* Hook to fetch insights paged list
|
|
1900
1986
|
* @param backend - analytical backend
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-ui-ext",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.53.0-alpha.1",
|
|
4
4
|
"description": "GoodData.UI SDK - Extensions",
|
|
5
5
|
"license": "LicenseRef-LICENSE",
|
|
6
6
|
"author": "GoodData Corporation",
|
|
@@ -63,20 +63,20 @@
|
|
|
63
63
|
"ts-invariant": "0.10.3",
|
|
64
64
|
"tslib": "2.8.1",
|
|
65
65
|
"uuid": "11.1.1",
|
|
66
|
-
"@gooddata/sdk-backend-base": "11.
|
|
67
|
-
"@gooddata/sdk-backend-spi": "11.
|
|
68
|
-
"@gooddata/sdk-
|
|
69
|
-
"@gooddata/sdk-
|
|
70
|
-
"@gooddata/sdk-
|
|
71
|
-
"@gooddata/sdk-ui-charts": "11.
|
|
72
|
-
"@gooddata/sdk-ui-
|
|
73
|
-
"@gooddata/sdk-ui-
|
|
74
|
-
"@gooddata/sdk-ui-
|
|
75
|
-
"@gooddata/sdk-ui-pivot": "11.
|
|
76
|
-
"@gooddata/sdk-ui-vis-commons": "11.
|
|
77
|
-
"@gooddata/sdk-ui-theme-provider": "11.
|
|
78
|
-
"@gooddata/
|
|
79
|
-
"@gooddata/
|
|
66
|
+
"@gooddata/sdk-backend-base": "11.53.0-alpha.1",
|
|
67
|
+
"@gooddata/sdk-backend-spi": "11.53.0-alpha.1",
|
|
68
|
+
"@gooddata/sdk-embedding": "11.53.0-alpha.1",
|
|
69
|
+
"@gooddata/sdk-model": "11.53.0-alpha.1",
|
|
70
|
+
"@gooddata/sdk-ui": "11.53.0-alpha.1",
|
|
71
|
+
"@gooddata/sdk-ui-charts": "11.53.0-alpha.1",
|
|
72
|
+
"@gooddata/sdk-ui-geo": "11.53.0-alpha.1",
|
|
73
|
+
"@gooddata/sdk-ui-kit": "11.53.0-alpha.1",
|
|
74
|
+
"@gooddata/sdk-ui-semantic-search": "11.53.0-alpha.1",
|
|
75
|
+
"@gooddata/sdk-ui-pivot": "11.53.0-alpha.1",
|
|
76
|
+
"@gooddata/sdk-ui-vis-commons": "11.53.0-alpha.1",
|
|
77
|
+
"@gooddata/sdk-ui-theme-provider": "11.53.0-alpha.1",
|
|
78
|
+
"@gooddata/util": "11.53.0-alpha.1",
|
|
79
|
+
"@gooddata/sdk-ui-filters": "11.53.0-alpha.1"
|
|
80
80
|
},
|
|
81
81
|
"devDependencies": {
|
|
82
82
|
"@microsoft/api-documenter": "^7.17.0",
|
|
@@ -124,12 +124,12 @@
|
|
|
124
124
|
"typescript": "5.9.3",
|
|
125
125
|
"vitest": "4.1.8",
|
|
126
126
|
"vitest-dom": "0.1.1",
|
|
127
|
-
"@gooddata/
|
|
128
|
-
"@gooddata/
|
|
129
|
-
"@gooddata/
|
|
130
|
-
"@gooddata/
|
|
131
|
-
"@gooddata/
|
|
132
|
-
"@gooddata/
|
|
127
|
+
"@gooddata/eslint-config": "11.53.0-alpha.1",
|
|
128
|
+
"@gooddata/oxlint-config": "11.53.0-alpha.1",
|
|
129
|
+
"@gooddata/reference-workspace": "11.53.0-alpha.1",
|
|
130
|
+
"@gooddata/sdk-backend-mockingbird": "11.53.0-alpha.1",
|
|
131
|
+
"@gooddata/stylelint-config": "11.53.0-alpha.1",
|
|
132
|
+
"@gooddata/i18n-toolkit": "11.53.0-alpha.1"
|
|
133
133
|
},
|
|
134
134
|
"peerDependencies": {
|
|
135
135
|
"react": "^18.0.0 || ^19.0.0",
|