@gooddata/sdk-ui-catalog 11.55.0-alpha.2 → 11.55.0-alpha.3

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 (109) hide show
  1. package/esm/asCode/validateYaml.d.ts +3 -3
  2. package/esm/asCode/validateYaml.d.ts.map +1 -1
  3. package/esm/asCode/validateYaml.js +21 -5
  4. package/esm/computedAttribute/computedAttributeDescriptor.d.ts.map +1 -1
  5. package/esm/computedAttribute/computedAttributeDescriptor.js +4 -3
  6. package/esm/computedAttribute/computedAttributeMutationPort.d.ts +1 -1
  7. package/esm/computedAttribute/computedAttributeMutationPort.d.ts.map +1 -1
  8. package/esm/computedAttribute/computedAttributeMutationPort.js +2 -1
  9. package/esm/computedAttribute/computedAttributeSerialization.d.ts +6 -4
  10. package/esm/computedAttribute/computedAttributeSerialization.d.ts.map +1 -1
  11. package/esm/computedAttribute/computedAttributeSerialization.js +16 -8
  12. package/esm/computedAttribute/computedAttributeValidation.d.ts +1 -1
  13. package/esm/computedAttribute/computedAttributeValidation.d.ts.map +1 -1
  14. package/esm/computedAttribute/computedAttributeValidation.js +6 -1
  15. package/esm/localization/bundles/de-DE.localization-bundle.d.ts +20 -0
  16. package/esm/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
  17. package/esm/localization/bundles/de-DE.localization-bundle.js +20 -0
  18. package/esm/localization/bundles/en-AU.localization-bundle.d.ts +20 -0
  19. package/esm/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
  20. package/esm/localization/bundles/en-AU.localization-bundle.js +20 -0
  21. package/esm/localization/bundles/en-GB.localization-bundle.d.ts +20 -0
  22. package/esm/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
  23. package/esm/localization/bundles/en-GB.localization-bundle.js +20 -0
  24. package/esm/localization/bundles/en-US.localization-bundle.d.ts +8 -0
  25. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  26. package/esm/localization/bundles/en-US.localization-bundle.js +12 -4
  27. package/esm/localization/bundles/es-419.localization-bundle.d.ts +20 -0
  28. package/esm/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
  29. package/esm/localization/bundles/es-419.localization-bundle.js +20 -0
  30. package/esm/localization/bundles/es-ES.localization-bundle.d.ts +20 -0
  31. package/esm/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
  32. package/esm/localization/bundles/es-ES.localization-bundle.js +20 -0
  33. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts +20 -0
  34. package/esm/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
  35. package/esm/localization/bundles/fi-FI.localization-bundle.js +20 -0
  36. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts +20 -0
  37. package/esm/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
  38. package/esm/localization/bundles/fr-CA.localization-bundle.js +20 -0
  39. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts +20 -0
  40. package/esm/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
  41. package/esm/localization/bundles/fr-FR.localization-bundle.js +20 -0
  42. package/esm/localization/bundles/id-ID.localization-bundle.d.ts +20 -0
  43. package/esm/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
  44. package/esm/localization/bundles/id-ID.localization-bundle.js +20 -0
  45. package/esm/localization/bundles/it-IT.localization-bundle.d.ts +20 -0
  46. package/esm/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
  47. package/esm/localization/bundles/it-IT.localization-bundle.js +20 -0
  48. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts +20 -0
  49. package/esm/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
  50. package/esm/localization/bundles/ja-JP.localization-bundle.js +20 -0
  51. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts +20 -0
  52. package/esm/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
  53. package/esm/localization/bundles/ko-KR.localization-bundle.js +20 -0
  54. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts +20 -0
  55. package/esm/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
  56. package/esm/localization/bundles/nl-NL.localization-bundle.js +20 -0
  57. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts +20 -0
  58. package/esm/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
  59. package/esm/localization/bundles/pl-PL.localization-bundle.js +20 -0
  60. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts +20 -0
  61. package/esm/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
  62. package/esm/localization/bundles/pt-BR.localization-bundle.js +20 -0
  63. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts +20 -0
  64. package/esm/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
  65. package/esm/localization/bundles/pt-PT.localization-bundle.js +20 -0
  66. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts +20 -0
  67. package/esm/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
  68. package/esm/localization/bundles/ru-RU.localization-bundle.js +20 -0
  69. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts +20 -0
  70. package/esm/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
  71. package/esm/localization/bundles/sl-SI.localization-bundle.js +20 -0
  72. package/esm/localization/bundles/th-TH.localization-bundle.d.ts +20 -0
  73. package/esm/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
  74. package/esm/localization/bundles/th-TH.localization-bundle.js +20 -0
  75. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts +20 -0
  76. package/esm/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
  77. package/esm/localization/bundles/tr-TR.localization-bundle.js +20 -0
  78. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts +20 -0
  79. package/esm/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
  80. package/esm/localization/bundles/uk-UA.localization-bundle.js +20 -0
  81. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts +20 -0
  82. package/esm/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
  83. package/esm/localization/bundles/vi-VN.localization-bundle.js +20 -0
  84. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts +20 -0
  85. package/esm/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
  86. package/esm/localization/bundles/zh-HK.localization-bundle.js +21 -1
  87. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts +20 -0
  88. package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
  89. package/esm/localization/bundles/zh-Hans.localization-bundle.js +20 -0
  90. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts +20 -0
  91. package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
  92. package/esm/localization/bundles/zh-Hant.localization-bundle.js +20 -0
  93. package/esm/metric/metricValidation.js +1 -1
  94. package/esm/parameter/parameterDescriptor.d.ts.map +1 -1
  95. package/esm/parameter/parameterDescriptor.js +1 -0
  96. package/esm/parameter/parameterSerialization.d.ts +8 -0
  97. package/esm/parameter/parameterSerialization.d.ts.map +1 -1
  98. package/esm/parameter/parameterSerialization.js +11 -1
  99. package/esm/parameter/parameterValidation.d.ts +1 -1
  100. package/esm/parameter/parameterValidation.d.ts.map +1 -1
  101. package/esm/parameter/parameterValidation.js +6 -0
  102. package/package.json +16 -16
  103. package/styles/css/codeDialog.css +3 -0
  104. package/styles/css/codeDialog.css.map +1 -1
  105. package/styles/css/detail.css +3 -0
  106. package/styles/css/detail.css.map +1 -1
  107. package/styles/css/main.css +3 -0
  108. package/styles/css/main.css.map +1 -1
  109. package/styles/scss/codeDialog.scss +4 -0
@@ -32,9 +32,9 @@ type ValidateYamlOptions<TData> = {
32
32
  fixedIdentifier?: string;
33
33
  };
34
34
  /**
35
- * Runs the steps every as-code YAML shares: reject empty input, parse (strict) YAML, validate against
36
- * the schema, and enforce identity immutability. The schema itself and the conversion of validated data
37
- * into a definition are the caller's.
35
+ * Runs the steps every as-code YAML shares: reject empty input, parse (strict) YAML, drop a blank
36
+ * identity, validate against the schema, and enforce identity immutability. The schema itself and the
37
+ * conversion of validated data into a definition are the caller's.
38
38
  */
39
39
  export declare function validateYaml<TData extends {
40
40
  id?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"validateYaml.d.ts","sourceRoot":"","sources":["../../src/asCode/validateYaml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,CAAC,MAAM,UAAU,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,IAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACzB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAA;CAAE,GACvD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,KAAK,eAAe,CAAC,KAAK,IAAI;IAC1B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;KAAE,CAAC;CAC3G,CAAC;AAEF,KAAK,mBAAmB,CAAC,KAAK,IAAI;IAC9B,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACtD,KAAK,EAAE,MAAM,EACb,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,GACxD,cAAc,CAAC,KAAK,CAAC,CAsBvB"}
1
+ {"version":3,"file":"validateYaml.d.ts","sourceRoot":"","sources":["../../src/asCode/validateYaml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,CAAC,MAAM,UAAU,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,cAAc,CAAC,KAAK,IAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACzB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,CAAA;CAAE,GACvD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAE9E,KAAK,eAAe,CAAC,KAAK,IAAI;IAC1B,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,KAAK,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAA;KAAE,CAAC;CAC3G,CAAC;AAEF,KAAK,mBAAmB,CAAC,KAAK,IAAI;IAC9B,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/B,qGAAqG;IACrG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,SAAS;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EACtD,KAAK,EAAE,MAAM,EACb,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,mBAAmB,CAAC,KAAK,CAAC,GACxD,cAAc,CAAC,KAAK,CAAC,CAuBvB"}
@@ -1,9 +1,9 @@
1
1
  // (C) 2026 GoodData Corporation
2
2
  import { parse as parseYaml } from "yaml";
3
3
  /**
4
- * Runs the steps every as-code YAML shares: reject empty input, parse (strict) YAML, validate against
5
- * the schema, and enforce identity immutability. The schema itself and the conversion of validated data
6
- * into a definition are the caller's.
4
+ * Runs the steps every as-code YAML shares: reject empty input, parse (strict) YAML, drop a blank
5
+ * identity, validate against the schema, and enforce identity immutability. The schema itself and the
6
+ * conversion of validated data into a definition are the caller's.
7
7
  */
8
8
  export function validateYaml(value, { schema, fixedIdentifier }) {
9
9
  if (value.trim() === "") {
@@ -16,12 +16,28 @@ export function validateYaml(value, { schema, fixedIdentifier }) {
16
16
  catch {
17
17
  return { ok: false, kind: "syntax" };
18
18
  }
19
- const result = schema.safeParse(parsed);
19
+ const document = withoutBlankIdentity(parsed);
20
+ const result = schema.safeParse(document);
20
21
  if (!result.success) {
21
- return { ok: false, kind: "schema", error: result.error, parsed };
22
+ return { ok: false, kind: "schema", error: result.error, parsed: document };
22
23
  }
23
24
  if (fixedIdentifier !== undefined && result.data.id !== fixedIdentifier) {
24
25
  return { ok: false, kind: "idImmutable" };
25
26
  }
26
27
  return { ok: true, data: result.data };
27
28
  }
29
+ /**
30
+ * Drops an `id` the author left blank, so the template can offer the key without forcing a value.
31
+ *
32
+ * The seeded template renders `id: ` for an object that has none yet; left untouched it parses to
33
+ * `null`, and a whitespace-only value to a blank string. Either means "no identity chosen" — the
34
+ * server derives one on create — so the key is removed rather than passed on as a value the schema
35
+ * would reject or the backend would take literally.
36
+ */
37
+ function withoutBlankIdentity(parsed) {
38
+ if (!parsed || typeof parsed !== "object" || !("id" in parsed)) {
39
+ return parsed;
40
+ }
41
+ const { id, ...rest } = parsed;
42
+ return id === null || (typeof id === "string" && id.trim() === "") ? rest : parsed;
43
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"computedAttributeDescriptor.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeDescriptor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAQtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAkF7E;;GAEG;AACH,eAAO,MAAM,2BAA2B,gIAmCtC,CAAC"}
1
+ {"version":3,"file":"computedAttributeDescriptor.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeDescriptor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAQtF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAmF7E;;GAEG;AACH,eAAO,MAAM,2BAA2B,gIAmCtC,CAAC"}
@@ -39,6 +39,7 @@ const errorMessages = defineMessages({
39
39
  invalidStructure: { id: "analyticsCatalog.computedAttribute.validation.invalidStructure" },
40
40
  idImmutable: { id: "analyticsCatalog.computedAttribute.dialog.edit.idImmutable" },
41
41
  missingMaql: { id: "analyticsCatalog.computedAttribute.validation.missingMaql" },
42
+ invalidType: { id: "analyticsCatalog.computedAttribute.validation.invalidType" },
42
43
  invalidTags: { id: "analyticsCatalog.computedAttribute.validation.invalidTags" },
43
44
  });
44
45
  function useComputedAttributeEditing() {
@@ -83,9 +84,9 @@ export const computedAttributeDescriptor = defineAsCodeDescriptor({
83
84
  }),
84
85
  // The catalog item carries no MAQL, so the full object is fetched for editing.
85
86
  seed: { load: loadComputedAttribute, loadError: capabilityMessages.loadError },
86
- // Refuses the deletion while a visualization still groups by it, and names those
87
- // visualizations. The backend currently allows the delete (it would break the insight
88
- // silently), so the catalog is the guard.
87
+ // Refuses the deletion while a visualization, metric, or dashboard still references it,
88
+ // and names those objects. The backend currently allows the delete (it would break the
89
+ // dependents silently), so the catalog is the guard.
89
90
  referenceCounted: {
90
91
  load: listComputedAttributeReferences,
91
92
  usageWarning: capabilityMessages.deleteUsageWarning,
@@ -8,7 +8,7 @@ import type { ICatalogItemComputedAttribute } from "../catalogItem/types.js";
8
8
  export type IComputedAttributeMutationPort = IAsCodeMutationPort<IComputedAttributeMetadataObjectDefinition, ICatalogItemComputedAttribute>;
9
9
  /** Fetches the full computed attribute for editing (the catalog item carries no MAQL). @internal */
10
10
  export declare function loadComputedAttribute(backend: IAnalyticalBackend, workspace: string, item: ICatalogItemComputedAttribute): Promise<IComputedAttributeMetadataObjectDefinition>;
11
- /** Titles of the insights and metrics referencing a computed attribute. @internal */
11
+ /** Titles of the insights, metrics, and dashboards referencing a computed attribute. @internal */
12
12
  export declare function listComputedAttributeReferences(backend: IAnalyticalBackend, workspace: string, item: ICatalogItemComputedAttribute): Promise<string[]>;
13
13
  /**
14
14
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"computedAttributeMutationPort.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeMutationPort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAEH,KAAK,0CAA0C,EAIlD,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC5D,0CAA0C,EAC1C,6BAA6B,CAChC,CAAC;AAYF,oGAAoG;AACpG,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,6BAA6B,GACpC,OAAO,CAAC,0CAA0C,CAAC,CAKrD;AAED,qFAAqF;AACrF,wBAAsB,+BAA+B,CACjD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,6BAA6B,GACpC,OAAO,CAAC,MAAM,EAAE,CAAC,CASnB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CAClD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAClB,8BAA8B,CAyBhC"}
1
+ {"version":3,"file":"computedAttributeMutationPort.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeMutationPort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAEH,KAAK,0CAA0C,EAIlD,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,yBAAyB,CAAC;AAE7E;;GAEG;AACH,MAAM,MAAM,8BAA8B,GAAG,mBAAmB,CAC5D,0CAA0C,EAC1C,6BAA6B,CAChC,CAAC;AAYF,oGAAoG;AACpG,wBAAgB,qBAAqB,CACjC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,6BAA6B,GACpC,OAAO,CAAC,0CAA0C,CAAC,CAKrD;AAED,kGAAkG;AAClG,wBAAsB,+BAA+B,CACjD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,6BAA6B,GACpC,OAAO,CAAC,MAAM,EAAE,CAAC,CAUnB;AAED;;GAEG;AACH,wBAAgB,sCAAsC,CAClD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAClB,8BAA8B,CAyBhC"}
@@ -13,7 +13,7 @@ export function loadComputedAttribute(backend, workspace, item) {
13
13
  .computedAttributes()
14
14
  .getComputedAttribute(idRef(item.identifier, "computedAttribute"));
15
15
  }
16
- /** Titles of the insights and metrics referencing a computed attribute. @internal */
16
+ /** Titles of the insights, metrics, and dashboards referencing a computed attribute. @internal */
17
17
  export async function listComputedAttributeReferences(backend, workspace, item) {
18
18
  const referencing = await backend
19
19
  .workspace(workspace)
@@ -22,6 +22,7 @@ export async function listComputedAttributeReferences(backend, workspace, item)
22
22
  return [
23
23
  ...(referencing.insights ?? []).map((insight) => insightTitle(insight)),
24
24
  ...(referencing.measures ?? []).map((measure) => measure.title),
25
+ ...(referencing.analyticalDashboards ?? []).map((dashboard) => dashboard.title),
25
26
  ];
26
27
  }
27
28
  /**
@@ -4,12 +4,14 @@ import type { ComputedAttributeYaml } from "./computedAttributeConverter.js";
4
4
  *
5
5
  * The document is a flat, gap-free list of lines in the order the design prescribes: `id`, `type`,
6
6
  * `title`, `description`, then `maql` last, so the expression the author came to write sits at the
7
- * bottom with the room below it. The `id` line is omitted when the computed attribute has none so
8
- * the server derives one on create.
7
+ * bottom with the room below it. The `id` line is always rendered, empty when the computed attribute
8
+ * has none, so an author who wants to choose the identity has the key waiting; left blank it is
9
+ * dropped on validation and the server derives one on create.
9
10
  *
10
11
  * `description` is always rendered, empty as `""`, so the field an author is likely to fill is
11
- * offered rather than hidden. An empty `maql` renders as a bare `maql:` (see `nullStr`), an
12
- * invitation to type rather than a quoted blank to delete.
12
+ * offered rather than hidden. An empty `maql` renders as `maql: ` (a trailing space after the
13
+ * colon) so the next character the author types is a YAML scalar, not `maql:SELECT` which is
14
+ * a syntax error; an empty `id` renders the same way for the same reason.
13
15
  */
14
16
  export declare function serializeComputedAttributeToYaml(computedAttribute: ComputedAttributeYaml): string;
15
17
  //# sourceMappingURL=computedAttributeSerialization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"computedAttributeSerialization.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeSerialization.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;;;;;;;;;GAWG;AACH,wBAAgB,gCAAgC,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,MAAM,CAkBjG"}
1
+ {"version":3,"file":"computedAttributeSerialization.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeSerialization.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gCAAgC,CAAC,iBAAiB,EAAE,qBAAqB,GAAG,MAAM,CAkBjG"}
@@ -5,17 +5,17 @@ import { Document } from "yaml";
5
5
  *
6
6
  * The document is a flat, gap-free list of lines in the order the design prescribes: `id`, `type`,
7
7
  * `title`, `description`, then `maql` last, so the expression the author came to write sits at the
8
- * bottom with the room below it. The `id` line is omitted when the computed attribute has none so
9
- * the server derives one on create.
8
+ * bottom with the room below it. The `id` line is always rendered, empty when the computed attribute
9
+ * has none, so an author who wants to choose the identity has the key waiting; left blank it is
10
+ * dropped on validation and the server derives one on create.
10
11
  *
11
12
  * `description` is always rendered, empty as `""`, so the field an author is likely to fill is
12
- * offered rather than hidden. An empty `maql` renders as a bare `maql:` (see `nullStr`), an
13
- * invitation to type rather than a quoted blank to delete.
13
+ * offered rather than hidden. An empty `maql` renders as `maql: ` (a trailing space after the
14
+ * colon) so the next character the author types is a YAML scalar, not `maql:SELECT` which is
15
+ * a syntax error; an empty `id` renders the same way for the same reason.
14
16
  */
15
17
  export function serializeComputedAttributeToYaml(computedAttribute) {
16
- const doc = new Document(computedAttribute.id === undefined
17
- ? { type: "computed_attribute" }
18
- : { id: computedAttribute.id, type: "computed_attribute" });
18
+ const doc = new Document({ id: computedAttribute.id ?? null, type: "computed_attribute" });
19
19
  doc.add(doc.createPair("title", computedAttribute.title ?? ""));
20
20
  doc.add(doc.createPair("description", computedAttribute.description ?? ""));
21
21
  if (computedAttribute.tags && computedAttribute.tags.length > 0) {
@@ -25,5 +25,13 @@ export function serializeComputedAttributeToYaml(computedAttribute) {
25
25
  doc.add(doc.createPair("locale", computedAttribute.locale));
26
26
  }
27
27
  doc.add(doc.createPair("maql", computedAttribute.maql ? computedAttribute.maql : null));
28
- return doc.toString({ lineWidth: 0, nullStr: "" }).trimEnd();
28
+ // An unset field is a null pair (`nullStr: ""` → `maql:`). Keep one space after the colon so the
29
+ // next character typed is a YAML scalar (`maql: SELECT …`), not `maql:SELECT` which is a syntax
30
+ // error. Do not `trimEnd` — that would strip the space.
31
+ const yaml = doc.toString({ lineWidth: 0, nullStr: "" }).replace(/\n+$/, "");
32
+ return withBlankLineSpace(withBlankLineSpace(yaml, "id"), "maql");
33
+ }
34
+ /** Restores the space `nullStr: ""` leaves out after a blank key's colon, wherever the line sits. */
35
+ function withBlankLineSpace(yaml, key) {
36
+ return yaml.replace(new RegExp(`^${key}:$`, "m"), `${key}: `);
29
37
  }
@@ -6,7 +6,7 @@ export type ComputedAttributeValidationResult = {
6
6
  isValid: false;
7
7
  errorCode: ComputedAttributeValidationErrorCode;
8
8
  };
9
- export type ComputedAttributeValidationErrorCode = "empty" | "syntax" | "invalidStructure" | "idImmutable" | "missingMaql" | "invalidTags";
9
+ export type ComputedAttributeValidationErrorCode = "empty" | "syntax" | "invalidStructure" | "idImmutable" | "missingMaql" | "invalidType" | "invalidTags";
10
10
  type ValidateComputedAttributeYamlOptions = {
11
11
  fixedIdentifier?: string;
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"computedAttributeValidation.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeValidation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAOtF,MAAM,MAAM,iCAAiC,GACvC;IACI,OAAO,EAAE,IAAI,CAAC;IACd,iBAAiB,EAAE,0CAA0C,CAAC;CACjE,GACD;IACI,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,oCAAoC,CAAC;CACnD,CAAC;AAER,MAAM,MAAM,oCAAoC,GAC1C,OAAO,GACP,QAAQ,GACR,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,aAAa,CAAC;AAEpB,KAAK,oCAAoC,GAAG;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oCAAyC,GACnD,iCAAiC,CAgBnC"}
1
+ {"version":3,"file":"computedAttributeValidation.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeValidation.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAOtF,MAAM,MAAM,iCAAiC,GACvC;IACI,OAAO,EAAE,IAAI,CAAC;IACd,iBAAiB,EAAE,0CAA0C,CAAC;CACjE,GACD;IACI,OAAO,EAAE,KAAK,CAAC;IACf,SAAS,EAAE,oCAAoC,CAAC;CACnD,CAAC;AAER,MAAM,MAAM,oCAAoC,GAC1C,OAAO,GACP,QAAQ,GACR,kBAAkB,GAClB,aAAa,GACb,aAAa,GACb,aAAa,GACb,aAAa,CAAC;AAEpB,KAAK,oCAAoC,GAAG;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,6BAA6B,CACzC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oCAAyC,GACnD,iCAAiC,CAgBnC"}
@@ -18,7 +18,7 @@ export function validateComputedAttributeYaml(value, options = {}) {
18
18
  };
19
19
  }
20
20
  function classifyComputedAttributeError(error, parsed) {
21
- // A blank `maql:` line parses to null - the seeded template's state - and counts as unwritten,
21
+ // A blank `maql:` / `maql: ` line parses to null - the seeded template's state - and counts as unwritten,
22
22
  // not as a value of the wrong type.
23
23
  const maqlProvided = typeof parsed === "object" &&
24
24
  parsed !== null &&
@@ -29,6 +29,11 @@ function classifyComputedAttributeError(error, parsed) {
29
29
  // A present-but-wrong-typed maql is a structural error, not a missing field.
30
30
  return maqlProvided ? "invalidStructure" : "missingMaql";
31
31
  }
32
+ // A mistyped `type` is easy to make and impossible to spot in a generic structure error,
33
+ // so it gets its own message naming the one value the field accepts.
34
+ if (path === "type") {
35
+ return "invalidType";
36
+ }
32
37
  if (path === "tags" || path.startsWith("tags.")) {
33
38
  return "invalidTags";
34
39
  }
@@ -17,6 +17,7 @@ export declare const de_DE: {
17
17
  "analyticsCatalog.objectType.fact.name": string;
18
18
  "analyticsCatalog.objectType.dateDataset.name": string;
19
19
  "analyticsCatalog.objectType.parameter.name": string;
20
+ "analyticsCatalog.objectType.computedAttribute.name": string;
20
21
  "analyticsCatalog.visualizationType.table.tooltip": string;
21
22
  "analyticsCatalog.visualizationType.area.tooltip": string;
22
23
  "analyticsCatalog.visualizationType.treemap.tooltip": string;
@@ -193,11 +194,30 @@ export declare const de_DE: {
193
194
  "analyticsCatalog.parameter.dialog.delete.submit": string;
194
195
  "analyticsCatalog.parameter.delete.success": string;
195
196
  "analyticsCatalog.parameter.delete.error": string;
197
+ "analyticsCatalog.computedAttribute.dialog.create.title": string;
198
+ "analyticsCatalog.computedAttribute.dialog.edit.title": string;
196
199
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": string;
200
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": string;
201
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": string;
202
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": string;
203
+ "analyticsCatalog.computedAttribute.dialog.help": string;
204
+ "analyticsCatalog.computedAttribute.dialog.submit.error": string;
205
+ "analyticsCatalog.computedAttribute.validation.empty": string;
197
206
  "analyticsCatalog.computedAttribute.validation.syntax": string;
207
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": string;
208
+ "analyticsCatalog.computedAttribute.validation.missingMaql": string;
198
209
  "analyticsCatalog.computedAttribute.validation.invalidTags": string;
210
+ "analyticsCatalog.computedAttribute.create.defaultTitle": string;
211
+ "analyticsCatalog.computedAttribute.create.success": string;
212
+ "analyticsCatalog.computedAttribute.update.success": string;
213
+ "analyticsCatalog.computedAttribute.load.error": string;
214
+ "analyticsCatalog.computedAttribute.dialog.delete.title": string;
199
215
  "analyticsCatalog.computedAttribute.dialog.delete.body": string;
216
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": string;
217
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": string;
200
218
  "analyticsCatalog.computedAttribute.dialog.delete.submit": string;
219
+ "analyticsCatalog.computedAttribute.delete.success": string;
220
+ "analyticsCatalog.computedAttribute.delete.error": string;
201
221
  "analyticsCatalog.metric.dialog.create.title": string;
202
222
  "analyticsCatalog.metric.dialog.edit.title": string;
203
223
  "analyticsCatalog.metric.dialog.sectionHeader": string;
@@ -1 +1 @@
1
- {"version":3,"file":"de-DE.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/de-DE.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsQjB,CAAC"}
1
+ {"version":3,"file":"de-DE.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/de-DE.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0RjB,CAAC"}
@@ -19,6 +19,7 @@ export const de_DE = {
19
19
  "analyticsCatalog.objectType.fact.name": "Fakt",
20
20
  "analyticsCatalog.objectType.dateDataset.name": "Datumsdatensatz",
21
21
  "analyticsCatalog.objectType.parameter.name": "Parameter",
22
+ "analyticsCatalog.objectType.computedAttribute.name": "Berechnetes Attribut",
22
23
  "analyticsCatalog.visualizationType.table.tooltip": "Tabelle",
23
24
  "analyticsCatalog.visualizationType.area.tooltip": "Flächendiagramm",
24
25
  "analyticsCatalog.visualizationType.treemap.tooltip": "Baumkarte-Diagramm",
@@ -195,11 +196,30 @@ export const de_DE = {
195
196
  "analyticsCatalog.parameter.dialog.delete.submit": "Löschen",
196
197
  "analyticsCatalog.parameter.delete.success": "Parameter gelöscht.",
197
198
  "analyticsCatalog.parameter.delete.error": "Parameter konnte nicht gelöscht werden.",
199
+ "analyticsCatalog.computedAttribute.dialog.create.title": "Berechnetes Attribut erstellen",
200
+ "analyticsCatalog.computedAttribute.dialog.edit.title": "Berechnetes Attribut bearbeiten",
198
201
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": "Als neu speichern",
202
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": "Die ID des berechneten Attributs kann beim Speichern eines vorhandenen berechneten Attributs nicht geändert werden. Verwenden Sie stattdessen „Als neu speichern“.",
203
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": "Definition des berechneten Attributs",
204
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": "Schreiben Sie einen MAQL-Ausdruck, der jeder Zeile mithilfe von CASE-WHEN-Verzweigungen über eine Metrik oder einen Fakt einen Wert zuweist.",
205
+ "analyticsCatalog.computedAttribute.dialog.help": "Wie erstelle ich ein berechnetes Attribut?",
206
+ "analyticsCatalog.computedAttribute.dialog.submit.error": "Das berechnete Attribut konnte nicht gespeichert werden.",
207
+ "analyticsCatalog.computedAttribute.validation.empty": "Die Definition des berechneten Attributs darf nicht leer sein.",
199
208
  "analyticsCatalog.computedAttribute.validation.syntax": "YAML-Syntaxfehler",
209
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": "Die Definition des berechneten Attributs hat eine ungültige Struktur.",
210
+ "analyticsCatalog.computedAttribute.validation.missingMaql": "Das berechnete Attribut muss einen MAQL-Ausdruck definieren.",
200
211
  "analyticsCatalog.computedAttribute.validation.invalidTags": "Tags müssen eine Liste von Textwerten sein.",
212
+ "analyticsCatalog.computedAttribute.create.defaultTitle": "Mein berechnetes Attribut",
213
+ "analyticsCatalog.computedAttribute.create.success": "Berechnetes Attribut erstellt.",
214
+ "analyticsCatalog.computedAttribute.update.success": "Berechnetes Attribut gespeichert.",
215
+ "analyticsCatalog.computedAttribute.load.error": "Das berechnete Attribut konnte nicht geladen werden.",
216
+ "analyticsCatalog.computedAttribute.dialog.delete.title": "Berechnetes Attribut löschen?",
201
217
  "analyticsCatalog.computedAttribute.dialog.delete.body": "Möchten Sie <b>{name}</b> wirklich löschen?",
218
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": "Dieses Attribut wird in <b>{count, plural, one {# Visualisierung} other {# Visualisierungen}}</b> verwendet",
219
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": "Das berechnete Attribut <b>{name}</b> kann nicht gelöscht werden, weil es in einigen Visualisierungen verwendet wird. Um dieses Attribut zu löschen, entfernen Sie es zuerst aus allen Visualisierungen.",
202
220
  "analyticsCatalog.computedAttribute.dialog.delete.submit": "Löschen",
221
+ "analyticsCatalog.computedAttribute.delete.success": "Berechnetes Attribut gelöscht.",
222
+ "analyticsCatalog.computedAttribute.delete.error": "Das berechnete Attribut konnte nicht gelöscht werden.",
203
223
  "analyticsCatalog.metric.dialog.create.title": "Metrik erstellen",
204
224
  "analyticsCatalog.metric.dialog.edit.title": "Metrik bearbeiten",
205
225
  "analyticsCatalog.metric.dialog.sectionHeader": "Metrikdefinition",
@@ -17,6 +17,7 @@ export declare const en_AU: {
17
17
  "analyticsCatalog.objectType.fact.name": string;
18
18
  "analyticsCatalog.objectType.dateDataset.name": string;
19
19
  "analyticsCatalog.objectType.parameter.name": string;
20
+ "analyticsCatalog.objectType.computedAttribute.name": string;
20
21
  "analyticsCatalog.visualizationType.table.tooltip": string;
21
22
  "analyticsCatalog.visualizationType.area.tooltip": string;
22
23
  "analyticsCatalog.visualizationType.treemap.tooltip": string;
@@ -193,11 +194,30 @@ export declare const en_AU: {
193
194
  "analyticsCatalog.parameter.dialog.delete.submit": string;
194
195
  "analyticsCatalog.parameter.delete.success": string;
195
196
  "analyticsCatalog.parameter.delete.error": string;
197
+ "analyticsCatalog.computedAttribute.dialog.create.title": string;
198
+ "analyticsCatalog.computedAttribute.dialog.edit.title": string;
196
199
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": string;
200
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": string;
201
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": string;
202
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": string;
203
+ "analyticsCatalog.computedAttribute.dialog.help": string;
204
+ "analyticsCatalog.computedAttribute.dialog.submit.error": string;
205
+ "analyticsCatalog.computedAttribute.validation.empty": string;
197
206
  "analyticsCatalog.computedAttribute.validation.syntax": string;
207
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": string;
208
+ "analyticsCatalog.computedAttribute.validation.missingMaql": string;
198
209
  "analyticsCatalog.computedAttribute.validation.invalidTags": string;
210
+ "analyticsCatalog.computedAttribute.create.defaultTitle": string;
211
+ "analyticsCatalog.computedAttribute.create.success": string;
212
+ "analyticsCatalog.computedAttribute.update.success": string;
213
+ "analyticsCatalog.computedAttribute.load.error": string;
214
+ "analyticsCatalog.computedAttribute.dialog.delete.title": string;
199
215
  "analyticsCatalog.computedAttribute.dialog.delete.body": string;
216
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": string;
217
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": string;
200
218
  "analyticsCatalog.computedAttribute.dialog.delete.submit": string;
219
+ "analyticsCatalog.computedAttribute.delete.success": string;
220
+ "analyticsCatalog.computedAttribute.delete.error": string;
201
221
  "analyticsCatalog.metric.dialog.create.title": string;
202
222
  "analyticsCatalog.metric.dialog.edit.title": string;
203
223
  "analyticsCatalog.metric.dialog.sectionHeader": string;
@@ -1 +1 @@
1
- {"version":3,"file":"en-AU.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-AU.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsQjB,CAAC"}
1
+ {"version":3,"file":"en-AU.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-AU.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0RjB,CAAC"}
@@ -19,6 +19,7 @@ export const en_AU = {
19
19
  "analyticsCatalog.objectType.fact.name": "Fact",
20
20
  "analyticsCatalog.objectType.dateDataset.name": "Date dataset",
21
21
  "analyticsCatalog.objectType.parameter.name": "Parameter",
22
+ "analyticsCatalog.objectType.computedAttribute.name": "Computed attribute",
22
23
  "analyticsCatalog.visualizationType.table.tooltip": "Table",
23
24
  "analyticsCatalog.visualizationType.area.tooltip": "Area chart",
24
25
  "analyticsCatalog.visualizationType.treemap.tooltip": "Treemap chart",
@@ -195,11 +196,30 @@ export const en_AU = {
195
196
  "analyticsCatalog.parameter.dialog.delete.submit": "Delete",
196
197
  "analyticsCatalog.parameter.delete.success": "Parameter deleted.",
197
198
  "analyticsCatalog.parameter.delete.error": "Parameter could not be deleted.",
199
+ "analyticsCatalog.computedAttribute.dialog.create.title": "Create computed attribute",
200
+ "analyticsCatalog.computedAttribute.dialog.edit.title": "Edit computed attribute",
198
201
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": "Save as new",
202
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": "Computed attribute id cannot be changed when saving an existing computed attribute. Use Save as new instead.",
203
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": "Computed attribute definition",
204
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": "Write a MAQL expression that assigns each row a value, using CASE WHEN branches over a metric or a fact.",
205
+ "analyticsCatalog.computedAttribute.dialog.help": "How to create a computed attribute?",
206
+ "analyticsCatalog.computedAttribute.dialog.submit.error": "Computed attribute could not be saved.",
207
+ "analyticsCatalog.computedAttribute.validation.empty": "Computed attribute definition cannot be empty.",
199
208
  "analyticsCatalog.computedAttribute.validation.syntax": "YAML syntax error",
209
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": "The computed attribute definition has an invalid structure.",
210
+ "analyticsCatalog.computedAttribute.validation.missingMaql": "The computed attribute must define a MAQL expression.",
200
211
  "analyticsCatalog.computedAttribute.validation.invalidTags": "Tags must be provided as a list of text values.",
212
+ "analyticsCatalog.computedAttribute.create.defaultTitle": "My computed attribute",
213
+ "analyticsCatalog.computedAttribute.create.success": "Computed attribute created.",
214
+ "analyticsCatalog.computedAttribute.update.success": "Computed attribute saved.",
215
+ "analyticsCatalog.computedAttribute.load.error": "The computed attribute could not be loaded.",
216
+ "analyticsCatalog.computedAttribute.dialog.delete.title": "Delete computed attribute?",
201
217
  "analyticsCatalog.computedAttribute.dialog.delete.body": "Are you sure you want to delete <b>{name}</b>?",
218
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": "This attribute is used in <b>{count, plural, one {# visualisation} other {# visualisations}}</b>",
219
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": "The computed attribute <b>{name}</b> cannot be deleted because it is used in some visualisations. To delete this attribute, remove it from all visualisations first.",
202
220
  "analyticsCatalog.computedAttribute.dialog.delete.submit": "Delete",
221
+ "analyticsCatalog.computedAttribute.delete.success": "Computed attribute deleted.",
222
+ "analyticsCatalog.computedAttribute.delete.error": "Computed attribute could not be deleted.",
203
223
  "analyticsCatalog.metric.dialog.create.title": "Create metric",
204
224
  "analyticsCatalog.metric.dialog.edit.title": "Edit metric",
205
225
  "analyticsCatalog.metric.dialog.sectionHeader": "Metric definition",
@@ -17,6 +17,7 @@ export declare const en_GB: {
17
17
  "analyticsCatalog.objectType.fact.name": string;
18
18
  "analyticsCatalog.objectType.dateDataset.name": string;
19
19
  "analyticsCatalog.objectType.parameter.name": string;
20
+ "analyticsCatalog.objectType.computedAttribute.name": string;
20
21
  "analyticsCatalog.visualizationType.table.tooltip": string;
21
22
  "analyticsCatalog.visualizationType.area.tooltip": string;
22
23
  "analyticsCatalog.visualizationType.treemap.tooltip": string;
@@ -193,11 +194,30 @@ export declare const en_GB: {
193
194
  "analyticsCatalog.parameter.dialog.delete.submit": string;
194
195
  "analyticsCatalog.parameter.delete.success": string;
195
196
  "analyticsCatalog.parameter.delete.error": string;
197
+ "analyticsCatalog.computedAttribute.dialog.create.title": string;
198
+ "analyticsCatalog.computedAttribute.dialog.edit.title": string;
196
199
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": string;
200
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": string;
201
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": string;
202
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": string;
203
+ "analyticsCatalog.computedAttribute.dialog.help": string;
204
+ "analyticsCatalog.computedAttribute.dialog.submit.error": string;
205
+ "analyticsCatalog.computedAttribute.validation.empty": string;
197
206
  "analyticsCatalog.computedAttribute.validation.syntax": string;
207
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": string;
208
+ "analyticsCatalog.computedAttribute.validation.missingMaql": string;
198
209
  "analyticsCatalog.computedAttribute.validation.invalidTags": string;
210
+ "analyticsCatalog.computedAttribute.create.defaultTitle": string;
211
+ "analyticsCatalog.computedAttribute.create.success": string;
212
+ "analyticsCatalog.computedAttribute.update.success": string;
213
+ "analyticsCatalog.computedAttribute.load.error": string;
214
+ "analyticsCatalog.computedAttribute.dialog.delete.title": string;
199
215
  "analyticsCatalog.computedAttribute.dialog.delete.body": string;
216
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": string;
217
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": string;
200
218
  "analyticsCatalog.computedAttribute.dialog.delete.submit": string;
219
+ "analyticsCatalog.computedAttribute.delete.success": string;
220
+ "analyticsCatalog.computedAttribute.delete.error": string;
201
221
  "analyticsCatalog.metric.dialog.create.title": string;
202
222
  "analyticsCatalog.metric.dialog.edit.title": string;
203
223
  "analyticsCatalog.metric.dialog.sectionHeader": string;
@@ -1 +1 @@
1
- {"version":3,"file":"en-GB.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-GB.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsQjB,CAAC"}
1
+ {"version":3,"file":"en-GB.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-GB.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0RjB,CAAC"}
@@ -19,6 +19,7 @@ export const en_GB = {
19
19
  "analyticsCatalog.objectType.fact.name": "Fact",
20
20
  "analyticsCatalog.objectType.dateDataset.name": "Date dataset",
21
21
  "analyticsCatalog.objectType.parameter.name": "Parameter",
22
+ "analyticsCatalog.objectType.computedAttribute.name": "Computed attribute",
22
23
  "analyticsCatalog.visualizationType.table.tooltip": "Table",
23
24
  "analyticsCatalog.visualizationType.area.tooltip": "Area chart",
24
25
  "analyticsCatalog.visualizationType.treemap.tooltip": "Treemap chart",
@@ -195,11 +196,30 @@ export const en_GB = {
195
196
  "analyticsCatalog.parameter.dialog.delete.submit": "Delete",
196
197
  "analyticsCatalog.parameter.delete.success": "Parameter deleted.",
197
198
  "analyticsCatalog.parameter.delete.error": "Parameter could not be deleted.",
199
+ "analyticsCatalog.computedAttribute.dialog.create.title": "Create computed attribute",
200
+ "analyticsCatalog.computedAttribute.dialog.edit.title": "Edit computed attribute",
198
201
  "analyticsCatalog.computedAttribute.dialog.edit.duplicate": "Save as new",
202
+ "analyticsCatalog.computedAttribute.dialog.edit.idImmutable": "Computed attribute id cannot be changed when saving an existing computed attribute. Use Save as new instead.",
203
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader": "Computed attribute definition",
204
+ "analyticsCatalog.computedAttribute.dialog.sectionHeader.tooltip": "Write a MAQL expression that assigns each row a value, using CASE WHEN branches over a metric or a fact.",
205
+ "analyticsCatalog.computedAttribute.dialog.help": "How to create a computed attribute?",
206
+ "analyticsCatalog.computedAttribute.dialog.submit.error": "Computed attribute could not be saved.",
207
+ "analyticsCatalog.computedAttribute.validation.empty": "Computed attribute definition cannot be empty.",
199
208
  "analyticsCatalog.computedAttribute.validation.syntax": "YAML syntax error",
209
+ "analyticsCatalog.computedAttribute.validation.invalidStructure": "The computed attribute definition has an invalid structure.",
210
+ "analyticsCatalog.computedAttribute.validation.missingMaql": "The computed attribute must define a MAQL expression.",
200
211
  "analyticsCatalog.computedAttribute.validation.invalidTags": "Tags must be provided as a list of text values.",
212
+ "analyticsCatalog.computedAttribute.create.defaultTitle": "My computed attribute",
213
+ "analyticsCatalog.computedAttribute.create.success": "Computed attribute created.",
214
+ "analyticsCatalog.computedAttribute.update.success": "Computed attribute saved.",
215
+ "analyticsCatalog.computedAttribute.load.error": "The computed attribute could not be loaded.",
216
+ "analyticsCatalog.computedAttribute.dialog.delete.title": "Delete computed attribute?",
201
217
  "analyticsCatalog.computedAttribute.dialog.delete.body": "Are you sure you want to delete <b>{name}</b>?",
218
+ "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": "This attribute is used in <b>{count, plural, one {# visualisation} other {# visualisations}}</b>",
219
+ "analyticsCatalog.computedAttribute.dialog.delete.blocked": "The computed attribute <b>{name}</b> cannot be deleted because it is used in some visualisations. To delete this attribute, remove it from all visualisations first.",
202
220
  "analyticsCatalog.computedAttribute.dialog.delete.submit": "Delete",
221
+ "analyticsCatalog.computedAttribute.delete.success": "Computed attribute deleted.",
222
+ "analyticsCatalog.computedAttribute.delete.error": "Computed attribute could not be deleted.",
203
223
  "analyticsCatalog.metric.dialog.create.title": "Create metric",
204
224
  "analyticsCatalog.metric.dialog.edit.title": "Edit metric",
205
225
  "analyticsCatalog.metric.dialog.sectionHeader": "Metric definition",
@@ -699,6 +699,10 @@ export declare const en_US: {
699
699
  text: string;
700
700
  crowdinContext: string;
701
701
  };
702
+ "analyticsCatalog.parameter.validation.invalidType": {
703
+ text: string;
704
+ crowdinContext: string;
705
+ };
702
706
  "analyticsCatalog.parameter.validation.unsupportedType": {
703
707
  text: string;
704
708
  crowdinContext: string;
@@ -827,6 +831,10 @@ export declare const en_US: {
827
831
  text: string;
828
832
  crowdinContext: string;
829
833
  };
834
+ "analyticsCatalog.computedAttribute.validation.invalidType": {
835
+ text: string;
836
+ crowdinContext: string;
837
+ };
830
838
  "analyticsCatalog.computedAttribute.validation.invalidTags": {
831
839
  text: string;
832
840
  crowdinContext: string;
@@ -1 +1 @@
1
- {"version":3,"file":"en-US.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-US.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqmCjB,CAAC"}
1
+ {"version":3,"file":"en-US.localization-bundle.d.ts","sourceRoot":"","sources":["../../../src/localization/bundles/en-US.localization-bundle.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6mCjB,CAAC"}
@@ -701,6 +701,10 @@ export const en_US = {
701
701
  "text": "Parameter definition must be a YAML object with a nested definition block.",
702
702
  "crowdinContext": "Error shown when the parameter YAML does not follow the expected object structure."
703
703
  },
704
+ "analyticsCatalog.parameter.validation.invalidType": {
705
+ "text": "The type must be parameter.",
706
+ "crowdinContext": "Validation error shown when the parameter YAML declares a type other than parameter at the top level. The second 'parameter' is a literal value and must not be translated."
707
+ },
704
708
  "analyticsCatalog.parameter.validation.unsupportedType": {
705
709
  "text": "Only {enabledTypes} parameters are supported.",
706
710
  "crowdinContext": "Error shown when the parameter YAML declares an unsupported parameter type. {enabledTypes} is a comma-separated list of the supported type names (e.g. 'NUMBER' or 'NUMBER and STRING')."
@@ -829,6 +833,10 @@ export const en_US = {
829
833
  "text": "The computed attribute must define a MAQL expression.",
830
834
  "crowdinContext": "Validation error shown when the computed attribute YAML is missing the maql field."
831
835
  },
836
+ "analyticsCatalog.computedAttribute.validation.invalidType": {
837
+ "text": "The type must be computed_attribute.",
838
+ "crowdinContext": "Validation error shown when the computed attribute YAML declares a type other than computed_attribute. computed_attribute is a literal value and must not be translated."
839
+ },
832
840
  "analyticsCatalog.computedAttribute.validation.invalidTags": {
833
841
  "text": "Tags must be a list of text values.",
834
842
  "crowdinContext": "Validation error shown when the computed attribute tags are not a list of strings."
@@ -858,12 +866,12 @@ export const en_US = {
858
866
  "crowdinContext": "Body text of the computed attribute delete confirmation dialog. {name} is the computed attribute title or fallback ID. <b>...</b> wraps the name in bold."
859
867
  },
860
868
  "analyticsCatalog.computedAttribute.dialog.delete.usageWarning": {
861
- "text": "This attribute is used in <b>{count, plural, one {# visualization} other {# visualizations}}</b>",
862
- "crowdinContext": "Warning banner in the computed attribute delete dialog when visualizations still reference it. {count} is the number of referencing visualizations, wrapped in <b>. Followed by a Show more toggle that lists their titles."
869
+ "text": "This attribute is used in <b>{count, plural, one {# object} other {# objects}}</b>",
870
+ "crowdinContext": "Warning banner in the computed attribute delete dialog when other objects still reference it. {count} is the number of referencing visualizations, metrics, and dashboards, wrapped in <b>. Followed by a Show more toggle that lists their titles."
863
871
  },
864
872
  "analyticsCatalog.computedAttribute.dialog.delete.blocked": {
865
- "text": "The computed attribute <b>{name}</b> cannot be deleted because it is used in some visualizations. To delete this attribute, remove it from all visualizations first.",
866
- "crowdinContext": "Body of the computed attribute delete dialog when visualizations still reference it, so deletion is refused. {name} is the computed attribute title or fallback ID. <b>...</b> wraps the name in bold."
873
+ "text": "The computed attribute <b>{name}</b> cannot be deleted because it is used in some visualizations, metrics, or dashboards. To delete this attribute, remove it from all of them first.",
874
+ "crowdinContext": "Body of the computed attribute delete dialog when visualizations, metrics, or dashboards still reference it, so deletion is refused. {name} is the computed attribute title or fallback ID. <b>...</b> wraps the name in bold."
867
875
  },
868
876
  "analyticsCatalog.computedAttribute.dialog.delete.submit": {
869
877
  "text": "Delete",