@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.
Files changed (39) hide show
  1. package/NOTICE +59 -9
  2. package/esm/index.d.ts +3 -0
  3. package/esm/index.d.ts.map +1 -1
  4. package/esm/index.js +2 -0
  5. package/esm/insightView/InsightRenderer.d.ts +6 -3
  6. package/esm/insightView/InsightRenderer.d.ts.map +1 -1
  7. package/esm/insightView/InsightRenderer.js +142 -165
  8. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts +3 -1
  9. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.d.ts.map +1 -1
  10. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionEditor.js +20 -6
  11. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts +11 -1
  12. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.d.ts.map +1 -1
  13. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingDialog.js +25 -10
  14. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.d.ts.map +1 -1
  15. package/esm/internal/components/configurationControls/conditionalFormatting/ConditionalFormattingSection.js +64 -5
  16. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts +3 -1
  17. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.d.ts.map +1 -1
  18. package/esm/internal/components/configurationControls/conditionalFormatting/ReorderList.js +2 -2
  19. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts +46 -8
  20. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.d.ts.map +1 -1
  21. package/esm/internal/components/configurationControls/conditionalFormatting/conditionalFormattingModel.js +94 -16
  22. package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.d.ts +2 -0
  23. package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.d.ts.map +1 -1
  24. package/esm/internal/components/configurationControls/conditionalFormatting/useCfDateFilterOptions.js +2 -0
  25. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.d.ts.map +1 -1
  26. package/esm/internal/components/pluggableVisualizations/pivotTableNext/PluggablePivotTableNext.js +8 -2
  27. package/esm/internal/translations/en-US.localization-bundle.d.ts +12 -0
  28. package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
  29. package/esm/internal/translations/en-US.localization-bundle.js +12 -0
  30. package/esm/locales.d.ts +9 -0
  31. package/esm/locales.d.ts.map +1 -1
  32. package/esm/locales.js +3 -0
  33. package/esm/sdk-ui-ext.d.ts +86 -0
  34. package/package.json +21 -21
  35. package/styles/css/main.css +59 -0
  36. package/styles/css/main.css.map +1 -1
  37. package/styles/internal/css/conditional_formatting.css +59 -0
  38. package/styles/internal/css/conditional_formatting.css.map +1 -1
  39. 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 rule opens editable
346
- * instead of dead-ended (disabled Save then covers the cleared values). A non-numeric measure literal
347
- * clears to empty; on a date target, operators/values outside the date set reset to an unpicked
348
- * "Is on" (id and format survive). The engine keeps evaluating the stored original until Save.
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
- if (rule.target.kind !== "measure") {
371
- return rule;
372
- }
438
+ const curatedOperators = operatorsForTarget(rule.target.kind, false);
373
439
  return {
374
440
  ...rule,
375
- conditions: rule.conditions.map((condition) => condition.value.kind === "literal" &&
376
- !isBlank(condition.value.value) &&
377
- Number.isNaN(Number(condition.value.value))
378
- ? { ...condition, value: { kind: "literal", value: "" } }
379
- : condition),
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;;;;;GAKG;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"}
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,CAO1B;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,CAmFN;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"}
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"}
@@ -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
- this.cfTargetData = { ...this.cfTargetData, titles: {} };
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6tFjB,CAAC"}
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
  };
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCxC,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"}
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" },
@@ -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.52.0",
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.52.0",
67
- "@gooddata/sdk-backend-spi": "11.52.0",
68
- "@gooddata/sdk-model": "11.52.0",
69
- "@gooddata/sdk-ui": "11.52.0",
70
- "@gooddata/sdk-embedding": "11.52.0",
71
- "@gooddata/sdk-ui-charts": "11.52.0",
72
- "@gooddata/sdk-ui-filters": "11.52.0",
73
- "@gooddata/sdk-ui-geo": "11.52.0",
74
- "@gooddata/sdk-ui-kit": "11.52.0",
75
- "@gooddata/sdk-ui-pivot": "11.52.0",
76
- "@gooddata/sdk-ui-vis-commons": "11.52.0",
77
- "@gooddata/sdk-ui-theme-provider": "11.52.0",
78
- "@gooddata/sdk-ui-semantic-search": "11.52.0",
79
- "@gooddata/util": "11.52.0"
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/i18n-toolkit": "11.52.0",
128
- "@gooddata/eslint-config": "11.52.0",
129
- "@gooddata/oxlint-config": "11.52.0",
130
- "@gooddata/reference-workspace": "11.52.0",
131
- "@gooddata/sdk-backend-mockingbird": "11.52.0",
132
- "@gooddata/stylelint-config": "11.52.0"
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",