@gooddata/sdk-ui-catalog 11.56.0-alpha.6 → 11.56.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/asCode/aacParity.d.ts +40 -0
- package/esm/asCode/aacParity.d.ts.map +1 -0
- package/esm/asCode/aacParity.js +2 -0
- package/esm/catalogDetail/share/guards.d.ts +3 -3
- package/esm/catalogDetail/share/guards.d.ts.map +1 -1
- package/esm/catalogDetail/share/guards.js +8 -5
- package/esm/catalogDetail/share/types.d.ts +5 -4
- package/esm/catalogDetail/share/types.d.ts.map +1 -1
- package/esm/catalogDetail/share/useShareableLabels.d.ts +5 -5
- package/esm/catalogDetail/share/useShareableLabels.d.ts.map +1 -1
- package/esm/catalogDetail/share/useShareableLabels.js +4 -4
- package/esm/catalogItem/converter.d.ts.map +1 -1
- package/esm/catalogItem/converter.js +1 -0
- package/esm/catalogItem/permission.d.ts +3 -1
- package/esm/catalogItem/permission.d.ts.map +1 -1
- package/esm/catalogItem/permission.js +9 -2
- package/esm/catalogItem/query.d.ts +1 -1
- package/esm/catalogItem/query.d.ts.map +1 -1
- package/esm/catalogItem/query.js +8 -2
- package/esm/certification/gate.d.ts.map +1 -1
- package/esm/certification/gate.js +6 -1
- package/esm/computedAttribute/computedAttributeConverter.d.ts +7 -6
- package/esm/computedAttribute/computedAttributeConverter.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeConverter.js +38 -12
- package/esm/computedAttribute/computedAttributeCopy.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeCopy.js +2 -0
- package/esm/computedAttribute/computedAttributeDescriptor.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeDescriptor.js +7 -3
- package/esm/computedAttribute/computedAttributeMutationPort.d.ts +1 -1
- package/esm/computedAttribute/computedAttributeMutationPort.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeMutationPort.js +2 -1
- package/esm/computedAttribute/computedAttributeSchema.d.ts +54 -0
- package/esm/computedAttribute/computedAttributeSchema.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeSchema.js +41 -1
- package/esm/computedAttribute/computedAttributeSerialization.d.ts +2 -2
- package/esm/computedAttribute/computedAttributeSerialization.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeSerialization.js +24 -2
- package/esm/computedAttribute/computedAttributeValidation.d.ts +1 -1
- package/esm/computedAttribute/computedAttributeValidation.d.ts.map +1 -1
- package/esm/computedAttribute/computedAttributeValidation.js +14 -0
- package/esm/lineage/const.d.ts.map +1 -1
- package/esm/lineage/const.js +0 -1
- package/esm/lineage/gate.d.ts.map +1 -1
- package/esm/lineage/gate.js +1 -0
- package/esm/lineage/graph/createIcon.d.ts.map +1 -1
- package/esm/lineage/graph/createIcon.js +1 -0
- package/esm/localization/bundles/de-DE.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/de-DE.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/de-DE.localization-bundle.js +4 -0
- package/esm/localization/bundles/en-AU.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/en-AU.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/en-AU.localization-bundle.js +4 -0
- package/esm/localization/bundles/en-GB.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/en-GB.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/en-GB.localization-bundle.js +4 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts +16 -0
- package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/en-US.localization-bundle.js +16 -0
- package/esm/localization/bundles/es-419.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/es-419.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/es-419.localization-bundle.js +4 -0
- package/esm/localization/bundles/es-ES.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/es-ES.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/es-ES.localization-bundle.js +4 -0
- package/esm/localization/bundles/fi-FI.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/fi-FI.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/fi-FI.localization-bundle.js +4 -0
- package/esm/localization/bundles/fr-CA.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/fr-CA.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/fr-CA.localization-bundle.js +4 -0
- package/esm/localization/bundles/fr-FR.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/fr-FR.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/fr-FR.localization-bundle.js +4 -0
- package/esm/localization/bundles/id-ID.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/id-ID.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/id-ID.localization-bundle.js +4 -0
- package/esm/localization/bundles/it-IT.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/it-IT.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/it-IT.localization-bundle.js +4 -0
- package/esm/localization/bundles/ja-JP.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/ja-JP.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/ja-JP.localization-bundle.js +19 -15
- package/esm/localization/bundles/ko-KR.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/ko-KR.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/ko-KR.localization-bundle.js +4 -0
- package/esm/localization/bundles/nl-NL.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/nl-NL.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/nl-NL.localization-bundle.js +4 -0
- package/esm/localization/bundles/pl-PL.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/pl-PL.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/pl-PL.localization-bundle.js +4 -0
- package/esm/localization/bundles/pt-BR.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/pt-BR.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/pt-BR.localization-bundle.js +4 -0
- package/esm/localization/bundles/pt-PT.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/pt-PT.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/pt-PT.localization-bundle.js +4 -0
- package/esm/localization/bundles/ru-RU.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/ru-RU.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/ru-RU.localization-bundle.js +4 -0
- package/esm/localization/bundles/sl-SI.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/sl-SI.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/sl-SI.localization-bundle.js +4 -0
- package/esm/localization/bundles/th-TH.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/th-TH.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/th-TH.localization-bundle.js +4 -0
- package/esm/localization/bundles/tr-TR.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/tr-TR.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/tr-TR.localization-bundle.js +4 -0
- package/esm/localization/bundles/uk-UA.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/uk-UA.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/uk-UA.localization-bundle.js +4 -0
- package/esm/localization/bundles/vi-VN.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/vi-VN.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/vi-VN.localization-bundle.js +4 -0
- package/esm/localization/bundles/zh-HK.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/zh-HK.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/zh-HK.localization-bundle.js +4 -0
- package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/zh-Hans.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/zh-Hans.localization-bundle.js +4 -0
- package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts +4 -0
- package/esm/localization/bundles/zh-Hant.localization-bundle.d.ts.map +1 -1
- package/esm/localization/bundles/zh-Hant.localization-bundle.js +4 -0
- package/esm/metric/metricSchema.d.ts +4 -0
- package/esm/metric/metricSchema.d.ts.map +1 -1
- package/esm/parameter/parameterSchema.d.ts +22 -6
- package/esm/parameter/parameterSchema.d.ts.map +1 -1
- package/esm/parameter/parameterSchema.js +3 -1
- package/package.json +16 -16
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { v1 } from "@gooddata/sdk-code-schemas";
|
|
2
|
+
import type { ObjectTypes } from "../objectType/constants.js";
|
|
3
|
+
/**
|
|
4
|
+
* The analytics-as-code (AAC) document type each as-code editor mirrors, keyed by catalog object type.
|
|
5
|
+
* Register a type here when its editor gets a YAML schema; `AacSchemaParity` then knows what to
|
|
6
|
+
* compare that schema against.
|
|
7
|
+
*/
|
|
8
|
+
export type AacShapeByObjectType = {
|
|
9
|
+
[ObjectTypes.METRIC]: v1.Metric;
|
|
10
|
+
[ObjectTypes.PARAMETER]: v1.Parameter;
|
|
11
|
+
[ObjectTypes.COMPUTED_ATTRIBUTE]: v1.ComputedAttribute;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Compile-time parity between an as-code editor's zod shape and the AAC document type it mirrors.
|
|
15
|
+
*
|
|
16
|
+
* Resolves to `true` when the two agree, otherwise to an object naming what drifted: a key the AAC
|
|
17
|
+
* schema has but the editor does not (`aacKeysMissingInEditor`), a key the editor accepts that AAC
|
|
18
|
+
* does not know (`editorKeysUnknownToAac`), or, in the default `"shape"` mode, editor values that do
|
|
19
|
+
* not fit the AAC type. Pass `"keys"` for an editor that deliberately accepts values AAC cannot express
|
|
20
|
+
* yet, so only the key set is compared. Declare it once next to the schema through
|
|
21
|
+
* {@link AssertAacParity}, which turns a drift into a build error, for example
|
|
22
|
+
* `Type '{ aacKeysMissingInEditor: "sort_direction"; }' does not satisfy the constraint 'true'`.
|
|
23
|
+
*
|
|
24
|
+
* The AAC type comes from `@gooddata/sdk-code-schemas`, generated from the JSON Schema and gated by
|
|
25
|
+
* its `schema-check`, so a field added to `schemas/v1/src/*.json` reaches this guard through the
|
|
26
|
+
* regenerated type once the schemas package is rebuilt.
|
|
27
|
+
*/
|
|
28
|
+
export type AacSchemaParity<TObjectType extends keyof AacShapeByObjectType, TEditorShape, TMode extends "shape" | "keys" = "shape"> = [Exclude<keyof AacShapeByObjectType[TObjectType], keyof TEditorShape>] extends [never] ? [Exclude<keyof TEditorShape, keyof AacShapeByObjectType[TObjectType]>] extends [never] ? TMode extends "keys" ? true : TEditorShape extends Omit<AacShapeByObjectType[TObjectType], "id"> ? true : {
|
|
29
|
+
editorValuesDoNotFitAac: true;
|
|
30
|
+
} : {
|
|
31
|
+
editorKeysUnknownToAac: Exclude<keyof TEditorShape, keyof AacShapeByObjectType[TObjectType]>;
|
|
32
|
+
} : {
|
|
33
|
+
aacKeysMissingInEditor: Exclude<keyof AacShapeByObjectType[TObjectType], keyof TEditorShape>;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Fails the build unless the parity resolved to `true`:
|
|
37
|
+
* `export type MetricAacParity = AssertAacParity<AacSchemaParity<typeof ObjectTypes.METRIC, MetricSchema>>;`
|
|
38
|
+
*/
|
|
39
|
+
export type AssertAacParity<TParity extends true> = TParity;
|
|
40
|
+
//# sourceMappingURL=aacParity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aacParity.d.ts","sourceRoot":"","sources":["../../src/asCode/aacParity.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AAErD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC;IAChC,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACtC,CAAC,WAAW,CAAC,kBAAkB,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC;CAC1D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,eAAe,CACvB,WAAW,SAAS,MAAM,oBAAoB,EAC9C,YAAY,EACZ,KAAK,SAAS,OAAO,GAAG,MAAM,GAAG,OAAO,IACxC,CAAC,OAAO,CAAC,MAAM,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACpF,CAAC,OAAO,CAAC,MAAM,YAAY,EAAE,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAClF,KAAK,SAAS,MAAM,GAChB,IAAI,GACJ,YAAY,SAAS,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,GAChE,IAAI,GACJ;IAAE,uBAAuB,EAAE,IAAI,CAAA;CAAE,GACvC;IAAE,sBAAsB,EAAE,OAAO,CAAC,MAAM,YAAY,EAAE,MAAM,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAA;CAAE,GACpG;IAAE,sBAAsB,EAAE,OAAO,CAAC,MAAM,oBAAoB,CAAC,WAAW,CAAC,EAAE,MAAM,YAAY,CAAC,CAAA;CAAE,CAAC;AAEvG;;;GAGG;AACH,MAAM,MAAM,eAAe,CAAC,OAAO,SAAS,IAAI,IAAI,OAAO,CAAC"}
|
|
@@ -2,9 +2,9 @@ import type { IObjectPermissionsObject } from "@gooddata/sdk-backend-spi";
|
|
|
2
2
|
import type { ICatalogItem } from "../../catalogItem/types.js";
|
|
3
3
|
import type { ShareableCatalogItem } from "./types.js";
|
|
4
4
|
/**
|
|
5
|
-
* Catalog items the share dialog can target: attributes, facts and
|
|
6
|
-
* are not first-class catalog items; they appear inside the labels
|
|
7
|
-
* sharing an attribute.
|
|
5
|
+
* Catalog items the share dialog can target: attributes, facts, measures and computed
|
|
6
|
+
* attributes. Labels are not first-class catalog items; they appear inside the labels
|
|
7
|
+
* picker when sharing an attribute.
|
|
8
8
|
*/
|
|
9
9
|
export declare function isShareableCatalogItem(item: ICatalogItem): item is ShareableCatalogItem;
|
|
10
10
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/guards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"guards.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/guards.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAS1E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,IAAI,oBAAoB,CAOvF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,wBAAwB,CAKlF"}
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
2
|
import { idRef } from "@gooddata/sdk-model";
|
|
3
|
-
import { isCatalogItemAttribute, isCatalogItemFact, isCatalogItemMeasure } from "../../catalogItem/guards.js";
|
|
3
|
+
import { isCatalogItemAttribute, isCatalogItemComputedAttribute, isCatalogItemFact, isCatalogItemMeasure, } from "../../catalogItem/guards.js";
|
|
4
4
|
/**
|
|
5
|
-
* Catalog items the share dialog can target: attributes, facts and
|
|
6
|
-
* are not first-class catalog items; they appear inside the labels
|
|
7
|
-
* sharing an attribute.
|
|
5
|
+
* Catalog items the share dialog can target: attributes, facts, measures and computed
|
|
6
|
+
* attributes. Labels are not first-class catalog items; they appear inside the labels
|
|
7
|
+
* picker when sharing an attribute.
|
|
8
8
|
*/
|
|
9
9
|
export function isShareableCatalogItem(item) {
|
|
10
|
-
return isCatalogItemAttribute(item) ||
|
|
10
|
+
return (isCatalogItemAttribute(item) ||
|
|
11
|
+
isCatalogItemFact(item) ||
|
|
12
|
+
isCatalogItemMeasure(item) ||
|
|
13
|
+
isCatalogItemComputedAttribute(item));
|
|
11
14
|
}
|
|
12
15
|
/**
|
|
13
16
|
* Build the backend target descriptor from a shareable catalog item. The kind
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { ICatalogItemAttribute, ICatalogItemFact, ICatalogItemMeasure } from "../../catalogItem/types.js";
|
|
1
|
+
import type { ICatalogItemAttribute, ICatalogItemComputedAttribute, ICatalogItemFact, ICatalogItemMeasure } from "../../catalogItem/types.js";
|
|
2
2
|
/**
|
|
3
|
-
* Catalog items that can be shared: attributes, facts and
|
|
4
|
-
* sub-selected from inside an attribute share, not shared as standalone
|
|
3
|
+
* Catalog items that can be shared: attributes, facts, measures and computed attributes.
|
|
4
|
+
* Labels are sub-selected from inside an attribute share, not shared as standalone
|
|
5
|
+
* targets; a computed attribute has no labels at all.
|
|
5
6
|
*/
|
|
6
|
-
export type ShareableCatalogItem = ICatalogItemAttribute | ICatalogItemFact | ICatalogItemMeasure;
|
|
7
|
+
export type ShareableCatalogItem = ICatalogItemAttribute | ICatalogItemFact | ICatalogItemMeasure | ICatalogItemComputedAttribute;
|
|
7
8
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACtB,MAAM,4BAA4B,CAAC;AAEpC
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACR,qBAAqB,EACrB,6BAA6B,EAC7B,gBAAgB,EAChB,mBAAmB,EACtB,MAAM,4BAA4B,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAC1B,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,6BAA6B,CAAC"}
|
|
@@ -4,11 +4,11 @@ import type { ShareableCatalogItem } from "./types.js";
|
|
|
4
4
|
* @internal
|
|
5
5
|
*/
|
|
6
6
|
export interface IShareableLabels {
|
|
7
|
-
/** Display forms of the shareable attribute; empty for facts and
|
|
7
|
+
/** Display forms of the shareable attribute; empty for facts, measures and computed attributes. */
|
|
8
8
|
labels: IObjectShareLabel[];
|
|
9
9
|
/**
|
|
10
|
-
* True while an attribute's labels are still being fetched. Facts and
|
|
11
|
-
* skip the fetch and report `false`. Gates the dialog's Add action so a grantee
|
|
10
|
+
* True while an attribute's labels are still being fetched. Facts, measures and
|
|
11
|
+
* computed attributes skip the fetch and report `false`. Gates the dialog's Add action so a grantee
|
|
12
12
|
* can't be added before its labels are known.
|
|
13
13
|
*/
|
|
14
14
|
loading: boolean;
|
|
@@ -22,8 +22,8 @@ export interface IShareableLabels {
|
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
24
|
* Loads the labels (display forms) of a shareable attribute so the share dialog
|
|
25
|
-
* can scope a grantee's access per label. Facts
|
|
26
|
-
* returns an empty list and skips the fetch. The result feeds
|
|
25
|
+
* can scope a grantee's access per label. Facts, measures and computed attributes
|
|
26
|
+
* have no labels — returns an empty list and skips the fetch. The result feeds
|
|
27
27
|
* {@link ObjectShareDialog}'s `labels`.
|
|
28
28
|
*
|
|
29
29
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShareableLabels.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/useShareableLabels.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,
|
|
1
|
+
{"version":3,"file":"useShareableLabels.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/useShareableLabels.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAuB,MAAM,sBAAsB,CAAC;AAEnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,mGAAmG;IACnG,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,KAAK,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,gBAAgB,CA2C3F"}
|
|
@@ -5,8 +5,8 @@ import { useBackendStrict, useCancelablePromise, useWorkspaceStrict } from "@goo
|
|
|
5
5
|
import { sortShareableLabels } from "@gooddata/sdk-ui-ext";
|
|
6
6
|
/**
|
|
7
7
|
* Loads the labels (display forms) of a shareable attribute so the share dialog
|
|
8
|
-
* can scope a grantee's access per label. Facts
|
|
9
|
-
* returns an empty list and skips the fetch. The result feeds
|
|
8
|
+
* can scope a grantee's access per label. Facts, measures and computed attributes
|
|
9
|
+
* have no labels — returns an empty list and skips the fetch. The result feeds
|
|
10
10
|
* {@link ObjectShareDialog}'s `labels`.
|
|
11
11
|
*
|
|
12
12
|
* @internal
|
|
@@ -14,7 +14,7 @@ import { sortShareableLabels } from "@gooddata/sdk-ui-ext";
|
|
|
14
14
|
export function useShareableLabels(item) {
|
|
15
15
|
const backend = useBackendStrict();
|
|
16
16
|
const workspace = useWorkspaceStrict();
|
|
17
|
-
// Only attributes carry labels; facts and
|
|
17
|
+
// Only attributes carry labels; facts, measures and computed attributes do not.
|
|
18
18
|
const attributeRef = item?.type === "attribute" ? item.identifier : undefined;
|
|
19
19
|
const { result, status } = useCancelablePromise({
|
|
20
20
|
promise: attributeRef
|
|
@@ -35,7 +35,7 @@ export function useShareableLabels(item) {
|
|
|
35
35
|
isPrimary: df.isPrimary === true,
|
|
36
36
|
isDefault: df.isDefault === true,
|
|
37
37
|
}))), [result]);
|
|
38
|
-
// Facts and
|
|
38
|
+
// Facts, measures and computed attributes have no fetch, so they never "load". An attribute loads
|
|
39
39
|
// until its fetch settles (success or error).
|
|
40
40
|
const loading = attributeRef !== undefined && status !== "success" && status !== "error";
|
|
41
41
|
const error = attributeRef !== undefined && status === "error";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/catalogItem/converter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAEH,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,wBAAwB,EAC7B,KAAK,KAAK,EAUb,MAAM,qBAAqB,CAAC;AAK7B,OAAO,KAAK,EACR,YAAY,EACZ,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EAExB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,0BAA0B,CACtC,MAAM,EACA,QAAQ,GACR,gBAAgB,GAChB,sBAAsB,GACtB,wBAAwB,GACxB,gCAAgC,GAChC,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,SAAS,GAChB,YAAY,CA0Bd;AAED,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,UAAU,GAAG,gBAAgB,GACzC,qBAAqB,CAiBvB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,GAAG,mBAAmB,CAkBtF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,sBAAsB,GAAG,mBAAmB,CAwBhG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,CAgBpF;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,wBAAwB,GAAG,qBAAqB,CAiBxG;AAED,wBAAgB,qCAAqC,CACjD,iBAAiB,EAAE,gCAAgC,GACpD,6BAA6B,
|
|
1
|
+
{"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../../src/catalogItem/converter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAEH,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAE3B,KAAK,wBAAwB,EAC7B,KAAK,KAAK,EAUb,MAAM,qBAAqB,CAAC;AAK7B,OAAO,KAAK,EACR,YAAY,EACZ,qBAAqB,EACrB,6BAA6B,EAC7B,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EAExB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,0BAA0B,CACtC,MAAM,EACA,QAAQ,GACR,gBAAgB,GAChB,sBAAsB,GACtB,wBAAwB,GACxB,gCAAgC,GAChC,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,SAAS,GAChB,YAAY,CA0Bd;AAED,wBAAgB,6BAA6B,CACzC,SAAS,EAAE,UAAU,GAAG,gBAAgB,GACzC,qBAAqB,CAiBvB;AAED,wBAAgB,2BAA2B,CAAC,EAAE,OAAO,EAAE,EAAE,QAAQ,GAAG,mBAAmB,CAkBtF;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,sBAAsB,GAAG,mBAAmB,CAwBhG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,mBAAmB,GAAG,gBAAgB,CAgBpF;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,wBAAwB,GAAG,qBAAqB,CAiBxG;AAED,wBAAgB,qCAAqC,CACjD,iBAAiB,EAAE,gCAAgC,GACpD,6BAA6B,CAiB/B;AAED,wBAAgB,6BAA6B,CAAC,SAAS,EAAE,wBAAwB,GAAG,qBAAqB,CAgBxG;AAED,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,sBAAsB,GAAG,mBAAmB,CAehG;AAED,wBAAgB,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,IAAI,GAAG,MAAM,CAW1D;AAcD,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,+BAA+B,GAAG,YAAY,CAuBrG"}
|
|
@@ -130,6 +130,7 @@ export function convertComputedAttributeToCatalogItem(computedAttribute) {
|
|
|
130
130
|
type: "computedAttribute",
|
|
131
131
|
title: computedAttribute.title,
|
|
132
132
|
description: computedAttribute.description,
|
|
133
|
+
certification: convertCertification(computedAttribute.certification),
|
|
133
134
|
tags: computedAttribute.tags ?? [],
|
|
134
135
|
createdBy: getDisplayName(computedAttribute.createdBy),
|
|
135
136
|
createdAt: computedAttribute.created ? parseBackendDate(computedAttribute.created) : null,
|
|
@@ -5,7 +5,9 @@ export declare function canEditCatalogItem(workspacePermissions?: IWorkspacePerm
|
|
|
5
5
|
* Whether the user may share the item. Metrics are gated by the metric-permissions flag and then by
|
|
6
6
|
* their own SHARE, deliberately not derived from EDIT. Attributes and facts have no object-level
|
|
7
7
|
* permissions, so their column-level-permissions flag decides and the backend refuses the access
|
|
8
|
-
* list to anyone who may not manage them. The two flags are independent.
|
|
8
|
+
* list to anyone who may not manage them. The two flags are independent. A computed
|
|
9
|
+
* attribute follows the attribute rule and additionally needs the computed-attributes
|
|
10
|
+
* flag, which gates the whole entity in the catalog.
|
|
9
11
|
*/
|
|
10
12
|
export declare function canShareCatalogItem(workspacePermissions?: IWorkspacePermissions, item?: ICatalogItem | null, settings?: ISettings): boolean;
|
|
11
13
|
//# sourceMappingURL=permission.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/catalogItem/permission.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,SAAS,EACd,KAAK,qBAAqB,EAI7B,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"permission.d.ts","sourceRoot":"","sources":["../../src/catalogItem/permission.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,SAAS,EACd,KAAK,qBAAqB,EAI7B,MAAM,qBAAqB,CAAC;AAU7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,kBAAkB,CAC9B,oBAAoB,CAAC,EAAE,qBAAqB,EAC5C,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,SAAS,WAwCvB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAC/B,oBAAoB,CAAC,EAAE,qBAAqB,EAC5C,IAAI,CAAC,EAAE,YAAY,GAAG,IAAI,EAC1B,QAAQ,CAAC,EAAE,SAAS,WA0BvB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// (C) 2025-2026 GoodData Corporation
|
|
2
2
|
import { canEditMetric, canShareMetric, } from "@gooddata/sdk-model";
|
|
3
|
-
import {
|
|
3
|
+
import { COMPUTED_ATTRIBUTE_FEATURE_FLAG } from "../computedAttribute/gate.js";
|
|
4
|
+
import { isCatalogItemAttribute, isCatalogItemComputedAttribute, isCatalogItemFact, isCatalogItemMeasure, } from "./guards.js";
|
|
4
5
|
export function canEditCatalogItem(workspacePermissions, item, settings) {
|
|
5
6
|
// If the workspace permissions or the item is not provided, the user cannot update it.
|
|
6
7
|
if (!workspacePermissions || !item) {
|
|
@@ -35,7 +36,9 @@ export function canEditCatalogItem(workspacePermissions, item, settings) {
|
|
|
35
36
|
* Whether the user may share the item. Metrics are gated by the metric-permissions flag and then by
|
|
36
37
|
* their own SHARE, deliberately not derived from EDIT. Attributes and facts have no object-level
|
|
37
38
|
* permissions, so their column-level-permissions flag decides and the backend refuses the access
|
|
38
|
-
* list to anyone who may not manage them. The two flags are independent.
|
|
39
|
+
* list to anyone who may not manage them. The two flags are independent. A computed
|
|
40
|
+
* attribute follows the attribute rule and additionally needs the computed-attributes
|
|
41
|
+
* flag, which gates the whole entity in the catalog.
|
|
39
42
|
*/
|
|
40
43
|
export function canShareCatalogItem(workspacePermissions, item, settings) {
|
|
41
44
|
if (!workspacePermissions || !item) {
|
|
@@ -47,5 +50,9 @@ export function canShareCatalogItem(workspacePermissions, item, settings) {
|
|
|
47
50
|
if (isCatalogItemAttribute(item) || isCatalogItemFact(item)) {
|
|
48
51
|
return Boolean(settings?.enableColumnLevelPermissions);
|
|
49
52
|
}
|
|
53
|
+
if (isCatalogItemComputedAttribute(item)) {
|
|
54
|
+
return (Boolean(settings?.enableColumnLevelPermissions) &&
|
|
55
|
+
Boolean(settings?.[COMPUTED_ATTRIBUTE_FEATURE_FLAG]));
|
|
56
|
+
}
|
|
50
57
|
return false;
|
|
51
58
|
}
|
|
@@ -5,7 +5,7 @@ export declare function getDashboardsQuery({ backend, workspace, search, origin,
|
|
|
5
5
|
export declare function getInsightsQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, isHidden, certification, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IInsightsQuery;
|
|
6
6
|
export declare function getMetricsQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, isHidden, certification, pageSize, loadPermissions, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IMeasuresQuery;
|
|
7
7
|
export declare function getParametersQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IParametersQuery;
|
|
8
|
-
export declare function getComputedAttributesQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IComputedAttributesQuery;
|
|
8
|
+
export declare function getComputedAttributesQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, certification, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IComputedAttributesQuery;
|
|
9
9
|
export declare function getAttributesQuery({ backend, workspace, search, origin, id, excludeId, tags, excludeTags, isHidden, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IAttributesQuery;
|
|
10
10
|
export declare function getFactsQuery({ backend, workspace, search, origin, id, excludeId, tags, excludeTags, isHidden, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IFactsQuery;
|
|
11
11
|
export declare function getDateDatasetsQuery({ backend, workspace, search, origin, id, excludeId, tags, excludeTags, isHidden, pageSize, }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IDatasetsQuery;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/catalogItem/query.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACH,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,EACrC,KAAK,kCAAkC,EACvC,KAAK,MAAM,EAEd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EACR,YAAY,EAOZ,mBAAmB,EAEnB,wBAAwB,EAE3B,MAAM,YAAY,CAAC;AAIpB,wBAAgB,kBAAkB,CAAC,EAC/B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,EAAE,EACF,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,QAAoB,GACvB,EAAE,wBAAwB,wDAuB1B;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,EAAE,EACF,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,QAAoB,GACvB,EAAE,wBAAwB,sDAsB1B;AAED,wBAAgB,eAAe,CAAC,EAC5B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,EAAE,EACF,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,aAAa,EACb,QAAoB,EACpB,eAAuB,GAC1B,EAAE,wBAAwB,sDA0B1B;AAED,wBAAgB,kBAAkB,CAAC,EAC/B,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,EAAE,EACF,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,QAAoB,GACvB,EAAE,wBAAwB,wDAoB1B;AAED,wBAAgB,0BAA0B,CAAC,EACvC,OAAO,EACP,SAAS,EACT,MAAM,EACN,MAAM,EACN,EAAE,EACF,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,IAAI,EACJ,WAAW,EACX,QAAoB,GACvB,EAAE,wBAAwB,
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/catalogItem/query.ts"],"names":[],"mappings":"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"}
|
package/esm/catalogItem/query.js
CHANGED
|
@@ -95,14 +95,14 @@ export function getParametersQuery({ backend, workspace, search, origin, id, exc
|
|
|
95
95
|
})
|
|
96
96
|
.withMethod("POST");
|
|
97
97
|
}
|
|
98
|
-
export function getComputedAttributesQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, pageSize = PAGE_SIZE, }) {
|
|
98
|
+
export function getComputedAttributesQuery({ backend, workspace, search, origin, id, excludeId, createdBy, excludeCreatedBy, tags, excludeTags, certification, pageSize = PAGE_SIZE, }) {
|
|
99
99
|
return backend
|
|
100
100
|
.workspace(workspace)
|
|
101
101
|
.computedAttributes()
|
|
102
102
|
.getComputedAttributesQuery()
|
|
103
103
|
.withPage(0)
|
|
104
104
|
.withSize(pageSize)
|
|
105
|
-
.withInclude(["createdBy", "modifiedBy"])
|
|
105
|
+
.withInclude(["createdBy", "modifiedBy", "certifiedBy"])
|
|
106
106
|
.withSorting(["title,asc"])
|
|
107
107
|
.withOrigin(origin)
|
|
108
108
|
.withFilter({
|
|
@@ -113,6 +113,7 @@ export function getComputedAttributesQuery({ backend, workspace, search, origin,
|
|
|
113
113
|
excludeTags,
|
|
114
114
|
createdBy,
|
|
115
115
|
excludeCreatedBy,
|
|
116
|
+
certification,
|
|
116
117
|
})
|
|
117
118
|
.withMethod("POST");
|
|
118
119
|
}
|
|
@@ -352,6 +353,11 @@ export function updateCatalogItemCertification(backend, workspace, item) {
|
|
|
352
353
|
return backend.workspace(workspace).insights().setCertification(ref, item.certification);
|
|
353
354
|
case "measure":
|
|
354
355
|
return backend.workspace(workspace).measures().setCertification(ref, item.certification);
|
|
356
|
+
case "computedAttribute":
|
|
357
|
+
return backend
|
|
358
|
+
.workspace(workspace)
|
|
359
|
+
.computedAttributes()
|
|
360
|
+
.setCertification(ref, item.certification);
|
|
355
361
|
default:
|
|
356
362
|
throw new Error("Unsupported catalog item type for certification update.");
|
|
357
363
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/certification/gate.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD;;GAEG;AACH,wBAAgB,gCAAgC,IAAI,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,CAAC,EAAE,UAAU,GAAG,OAAO,CAM1E"}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// (C) 2026 GoodData Corporation
|
|
2
2
|
import { useFeatureFlag } from "../permission/PermissionsContext.js";
|
|
3
|
-
const SUPPORTED_CERTIFICATION_TYPES = [
|
|
3
|
+
const SUPPORTED_CERTIFICATION_TYPES = [
|
|
4
|
+
"analyticalDashboard",
|
|
5
|
+
"insight",
|
|
6
|
+
"measure",
|
|
7
|
+
"computedAttribute",
|
|
8
|
+
];
|
|
4
9
|
/**
|
|
5
10
|
* Catalog certification feature gate.
|
|
6
11
|
*/
|
|
@@ -15,9 +15,10 @@ export type ComputedAttributeYaml = Omit<v1.ComputedAttribute, "id"> & {
|
|
|
15
15
|
* Maps a computed attribute definition (or a loaded computed attribute, which is a superset) to the
|
|
16
16
|
* canonical AAC object for YAML serialization.
|
|
17
17
|
*
|
|
18
|
-
* Optional
|
|
19
|
-
* analytics-as-code tooling output
|
|
20
|
-
*
|
|
18
|
+
* Optional fields are omitted when unset so the rendered YAML stays terse, matching the
|
|
19
|
+
* analytics-as-code tooling output; a hidden computed attribute is expressed as
|
|
20
|
+
* `show_in_ai_results: false`. The `id` is omitted when the definition has none (e.g. seeding the
|
|
21
|
+
* create dialog from a duplicate) so the server derives a fresh one.
|
|
21
22
|
*/
|
|
22
23
|
export declare function definitionToComputedAttributeYaml(definition: IComputedAttributeMetadataObjectDefinition): ComputedAttributeYaml;
|
|
23
24
|
/**
|
|
@@ -28,9 +29,9 @@ export declare function computedAttributeYamlToDefinition(computedAttribute: Com
|
|
|
28
29
|
* The computed attribute's `reconcile`: layers the author's parsed YAML edits over the base
|
|
29
30
|
* definition — the loaded object on an edit, the copy source on a duplicate.
|
|
30
31
|
*
|
|
31
|
-
* The base carries
|
|
32
|
-
*
|
|
33
|
-
*
|
|
32
|
+
* The base carries what the YAML cannot express (identity and server-managed state), which survives
|
|
33
|
+
* because only the YAML-owned fields are overlaid on top. Identity stays YAML-authoritative: the
|
|
34
|
+
* parsed `id` wins, and its absence lets the server derive a fresh one, so the base's id is
|
|
34
35
|
* intentionally dropped first. (On an edit this is moot — validation pins the parsed id to the loaded
|
|
35
36
|
* object's — but on a duplicate it is what frees the copy from the source's identity.)
|
|
36
37
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computedAttributeConverter.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeConverter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF
|
|
1
|
+
{"version":3,"file":"computedAttributeConverter.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeConverter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAE5E;;;;;;GAMG;AACH,MAAM,MAAM,qBAAqB,GAAG,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC7C,UAAU,EAAE,0CAA0C,GACvD,qBAAqB,CAiBvB;AAED;;GAEG;AACH,wBAAgB,iCAAiC,CAC7C,iBAAiB,EAAE,uBAAuB,GAC3C,0CAA0C,CAqB5C;AA6CD;;;;;;;;;GASG;AACH,wBAAgB,oCAAoC,CAChD,IAAI,EAAE,0CAA0C,EAChD,MAAM,EAAE,0CAA0C,GACnD,0CAA0C,CAO5C"}
|
|
@@ -3,9 +3,10 @@
|
|
|
3
3
|
* Maps a computed attribute definition (or a loaded computed attribute, which is a superset) to the
|
|
4
4
|
* canonical AAC object for YAML serialization.
|
|
5
5
|
*
|
|
6
|
-
* Optional
|
|
7
|
-
* analytics-as-code tooling output
|
|
8
|
-
*
|
|
6
|
+
* Optional fields are omitted when unset so the rendered YAML stays terse, matching the
|
|
7
|
+
* analytics-as-code tooling output; a hidden computed attribute is expressed as
|
|
8
|
+
* `show_in_ai_results: false`. The `id` is omitted when the definition has none (e.g. seeding the
|
|
9
|
+
* create dialog from a duplicate) so the server derives a fresh one.
|
|
9
10
|
*/
|
|
10
11
|
export function definitionToComputedAttributeYaml(definition) {
|
|
11
12
|
return {
|
|
@@ -15,6 +16,13 @@ export function definitionToComputedAttributeYaml(definition) {
|
|
|
15
16
|
...(definition.description ? { description: definition.description } : {}),
|
|
16
17
|
...(definition.tags && definition.tags.length > 0 ? { tags: definition.tags } : {}),
|
|
17
18
|
maql: definition.expression,
|
|
19
|
+
...(definition.format ? { format: definition.format } : {}),
|
|
20
|
+
...(definition.metricType === undefined ? {} : { metric_type: definition.metricType }),
|
|
21
|
+
...(definition.dataType === undefined ? {} : { data_type: definition.dataType }),
|
|
22
|
+
...(definition.valueType === undefined ? {} : { value_type: definition.valueType }),
|
|
23
|
+
...(definition.isNullable === undefined ? {} : { is_nullable: definition.isNullable }),
|
|
24
|
+
...(definition.nullValue === undefined ? {} : { null_value_join_replacement: definition.nullValue }),
|
|
25
|
+
...(definition.isHidden === true ? { show_in_ai_results: false } : {}),
|
|
18
26
|
...(definition.locale ? { locale: definition.locale } : {}),
|
|
19
27
|
};
|
|
20
28
|
}
|
|
@@ -29,18 +37,29 @@ export function computedAttributeYamlToDefinition(computedAttribute) {
|
|
|
29
37
|
description: computedAttribute.description ?? "",
|
|
30
38
|
tags: computedAttribute.tags ?? [],
|
|
31
39
|
expression: computedAttribute.maql,
|
|
40
|
+
...(computedAttribute.format === undefined ? {} : { format: computedAttribute.format }),
|
|
41
|
+
...(computedAttribute.metric_type === undefined ? {} : { metricType: computedAttribute.metric_type }),
|
|
42
|
+
...(computedAttribute.data_type === undefined ? {} : { dataType: computedAttribute.data_type }),
|
|
43
|
+
...(computedAttribute.value_type === undefined ? {} : { valueType: computedAttribute.value_type }),
|
|
44
|
+
...(computedAttribute.is_nullable === undefined ? {} : { isNullable: computedAttribute.is_nullable }),
|
|
45
|
+
...(computedAttribute.null_value_join_replacement === undefined
|
|
46
|
+
? {}
|
|
47
|
+
: { nullValue: computedAttribute.null_value_join_replacement }),
|
|
48
|
+
...(computedAttribute.show_in_ai_results === undefined
|
|
49
|
+
? {}
|
|
50
|
+
: { isHidden: computedAttribute.show_in_ai_results === false }),
|
|
32
51
|
...(computedAttribute.locale === undefined ? {} : { locale: computedAttribute.locale }),
|
|
33
52
|
};
|
|
34
53
|
}
|
|
35
54
|
/**
|
|
36
55
|
* The fields the as-code computed attribute YAML owns, extracted from a parsed definition and
|
|
37
|
-
* normalized for persistence.
|
|
38
|
-
* `
|
|
39
|
-
*
|
|
56
|
+
* normalized for persistence. Only a loaded object's identity and server-managed state (`ref`, `uri`,
|
|
57
|
+
* `isLocked`, `dataSet`, `certification`, `displayForms`, audit fields) lie outside the YAML
|
|
58
|
+
* projection and are preserved by layering these fields over a base object rather than replacing it.
|
|
40
59
|
*
|
|
41
|
-
*
|
|
42
|
-
* overwrite the base so that
|
|
43
|
-
* omitted when undefined, the base's stale
|
|
60
|
+
* Every optional field is always returned (normalized to `undefined` when absent, `isHidden` to
|
|
61
|
+
* `false`), never omitted: it must overwrite the base so that removing a line drops the previously
|
|
62
|
+
* set value. Were a field omitted when undefined, the base's stale value would leak through the overlay.
|
|
44
63
|
*/
|
|
45
64
|
function pickComputedAttributeYamlFields(definition) {
|
|
46
65
|
return {
|
|
@@ -48,6 +67,13 @@ function pickComputedAttributeYamlFields(definition) {
|
|
|
48
67
|
description: definition.description ?? "",
|
|
49
68
|
tags: definition.tags ?? [],
|
|
50
69
|
expression: definition.expression,
|
|
70
|
+
format: definition.format,
|
|
71
|
+
metricType: definition.metricType,
|
|
72
|
+
dataType: definition.dataType,
|
|
73
|
+
valueType: definition.valueType,
|
|
74
|
+
isNullable: definition.isNullable,
|
|
75
|
+
nullValue: definition.nullValue,
|
|
76
|
+
isHidden: definition.isHidden ?? false,
|
|
51
77
|
locale: definition.locale,
|
|
52
78
|
};
|
|
53
79
|
}
|
|
@@ -55,9 +81,9 @@ function pickComputedAttributeYamlFields(definition) {
|
|
|
55
81
|
* The computed attribute's `reconcile`: layers the author's parsed YAML edits over the base
|
|
56
82
|
* definition — the loaded object on an edit, the copy source on a duplicate.
|
|
57
83
|
*
|
|
58
|
-
* The base carries
|
|
59
|
-
*
|
|
60
|
-
*
|
|
84
|
+
* The base carries what the YAML cannot express (identity and server-managed state), which survives
|
|
85
|
+
* because only the YAML-owned fields are overlaid on top. Identity stays YAML-authoritative: the
|
|
86
|
+
* parsed `id` wins, and its absence lets the server derive a fresh one, so the base's id is
|
|
61
87
|
* intentionally dropped first. (On an edit this is moot — validation pins the parsed id to the loaded
|
|
62
88
|
* object's — but on a duplicate it is what frees the copy from the source's identity.)
|
|
63
89
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"computedAttributeCopy.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeCopy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAItF,wBAAgB,6BAA6B,CACzC,iBAAiB,EAAE,0CAA0C,GAC9D,0CAA0C,
|
|
1
|
+
{"version":3,"file":"computedAttributeCopy.d.ts","sourceRoot":"","sources":["../../src/computedAttribute/computedAttributeCopy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,0CAA0C,EAAE,MAAM,qBAAqB,CAAC;AAItF,wBAAgB,6BAA6B,CACzC,iBAAiB,EAAE,0CAA0C,GAC9D,0CAA0C,CAmB5C"}
|
|
@@ -13,8 +13,10 @@ export function createCopiedComputedAttribute(computedAttribute) {
|
|
|
13
13
|
...(computedAttribute.format === undefined ? {} : { format: computedAttribute.format }),
|
|
14
14
|
...(computedAttribute.metricType === undefined ? {} : { metricType: computedAttribute.metricType }),
|
|
15
15
|
...(computedAttribute.dataType === undefined ? {} : { dataType: computedAttribute.dataType }),
|
|
16
|
+
...(computedAttribute.valueType === undefined ? {} : { valueType: computedAttribute.valueType }),
|
|
16
17
|
...(computedAttribute.isNullable === undefined ? {} : { isNullable: computedAttribute.isNullable }),
|
|
17
18
|
...(computedAttribute.nullValue === undefined ? {} : { nullValue: computedAttribute.nullValue }),
|
|
18
19
|
...(computedAttribute.locale === undefined ? {} : { locale: computedAttribute.locale }),
|
|
20
|
+
...(computedAttribute.isHidden === undefined ? {} : { isHidden: computedAttribute.isHidden }),
|
|
19
21
|
};
|
|
20
22
|
}
|
|
@@ -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;
|
|
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;AAuF7E;;GAEG;AACH,eAAO,MAAM,2BAA2B,gIAmCtC,CAAC"}
|
|
@@ -41,6 +41,10 @@ const errorMessages = defineMessages({
|
|
|
41
41
|
missingMaql: { id: "analyticsCatalog.computedAttribute.validation.missingMaql" },
|
|
42
42
|
invalidType: { id: "analyticsCatalog.computedAttribute.validation.invalidType" },
|
|
43
43
|
invalidTags: { id: "analyticsCatalog.computedAttribute.validation.invalidTags" },
|
|
44
|
+
invalidLocale: { id: "analyticsCatalog.computedAttribute.validation.invalidLocale" },
|
|
45
|
+
invalidDataType: { id: "analyticsCatalog.computedAttribute.validation.invalidDataType" },
|
|
46
|
+
invalidValueType: { id: "analyticsCatalog.computedAttribute.validation.invalidValueType" },
|
|
47
|
+
invalidMetricType: { id: "analyticsCatalog.computedAttribute.validation.invalidMetricType" },
|
|
44
48
|
});
|
|
45
49
|
function useComputedAttributeEditing() {
|
|
46
50
|
const intl = useIntl();
|
|
@@ -84,9 +88,9 @@ export const computedAttributeDescriptor = defineAsCodeDescriptor({
|
|
|
84
88
|
}),
|
|
85
89
|
// The catalog item carries no MAQL, so the full object is fetched for editing.
|
|
86
90
|
seed: { load: loadComputedAttribute, loadError: capabilityMessages.loadError },
|
|
87
|
-
// Refuses the deletion while a visualization, metric,
|
|
88
|
-
// and names those objects. The backend currently allows the
|
|
89
|
-
// dependents silently), so the catalog is the guard.
|
|
91
|
+
// Refuses the deletion while a visualization, metric, dashboard, or another computed
|
|
92
|
+
// attribute still references it, and names those objects. The backend currently allows the
|
|
93
|
+
// delete (it would break the dependents silently), so the catalog is the guard.
|
|
90
94
|
referenceCounted: {
|
|
91
95
|
load: listComputedAttributeReferences,
|
|
92
96
|
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, metrics, and
|
|
11
|
+
/** Titles of the insights, metrics, dashboards, and computed attributes 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,
|
|
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,uHAAuH;AACvH,wBAAsB,+BAA+B,CACjD,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,6BAA6B,GACpC,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;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, metrics, and
|
|
16
|
+
/** Titles of the insights, metrics, dashboards, and computed attributes referencing a computed attribute. @internal */
|
|
17
17
|
export async function listComputedAttributeReferences(backend, workspace, item) {
|
|
18
18
|
const referencing = await backend
|
|
19
19
|
.workspace(workspace)
|
|
@@ -23,6 +23,7 @@ export async function listComputedAttributeReferences(backend, workspace, item)
|
|
|
23
23
|
...(referencing.insights ?? []).map((insight) => insightTitle(insight)),
|
|
24
24
|
...(referencing.measures ?? []).map((measure) => measure.title),
|
|
25
25
|
...(referencing.analyticalDashboards ?? []).map((dashboard) => dashboard.title),
|
|
26
|
+
...(referencing.computedAttributes ?? []).map((computedAttribute) => computedAttribute.title),
|
|
26
27
|
];
|
|
27
28
|
}
|
|
28
29
|
/**
|