@gooddata/sdk-ui-catalog 11.48.0-alpha.0 → 11.48.0-alpha.2

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 (123) hide show
  1. package/esm/AnalyticsCatalogDetail.d.ts.map +1 -1
  2. package/esm/AnalyticsCatalogDetail.js +3 -3
  3. package/esm/asCode/AsCodeCreateDialog.d.ts +17 -0
  4. package/esm/asCode/AsCodeCreateDialog.d.ts.map +1 -0
  5. package/esm/asCode/AsCodeCreateDialog.js +51 -0
  6. package/esm/asCode/AsCodeDeleteDialog.d.ts +17 -0
  7. package/esm/asCode/AsCodeDeleteDialog.d.ts.map +1 -0
  8. package/esm/asCode/AsCodeDeleteDialog.js +55 -0
  9. package/esm/asCode/AsCodeDetailActions.d.ts +27 -0
  10. package/esm/asCode/AsCodeDetailActions.d.ts.map +1 -0
  11. package/esm/asCode/AsCodeDetailActions.js +66 -0
  12. package/esm/asCode/AsCodeDialog.d.ts +24 -0
  13. package/esm/asCode/AsCodeDialog.d.ts.map +1 -0
  14. package/esm/asCode/AsCodeDialog.js +94 -0
  15. package/esm/asCode/AsCodeEditDialog.d.ts +18 -0
  16. package/esm/asCode/AsCodeEditDialog.d.ts.map +1 -0
  17. package/esm/asCode/AsCodeEditDialog.js +38 -0
  18. package/esm/asCode/AsCodeEditorBody.d.ts +16 -0
  19. package/esm/asCode/AsCodeEditorBody.d.ts.map +1 -0
  20. package/esm/asCode/AsCodeEditorBody.js +10 -0
  21. package/esm/asCode/AsCodeMutationContext.d.ts +24 -0
  22. package/esm/asCode/AsCodeMutationContext.d.ts.map +1 -0
  23. package/esm/asCode/AsCodeMutationContext.js +40 -0
  24. package/esm/asCode/copy.d.ts +18 -0
  25. package/esm/asCode/copy.d.ts.map +1 -0
  26. package/esm/asCode/copy.js +58 -0
  27. package/esm/asCode/descriptor.d.ts +160 -0
  28. package/esm/asCode/descriptor.d.ts.map +1 -0
  29. package/esm/asCode/descriptor.js +8 -0
  30. package/esm/asCode/gate.d.ts +7 -0
  31. package/esm/asCode/gate.d.ts.map +1 -0
  32. package/esm/asCode/gate.js +11 -0
  33. package/esm/asCode/useAsCodeBase.d.ts +18 -0
  34. package/esm/asCode/useAsCodeBase.d.ts.map +1 -0
  35. package/esm/asCode/useAsCodeBase.js +27 -0
  36. package/esm/asCode/validateYaml.d.ts +39 -0
  37. package/esm/asCode/validateYaml.d.ts.map +1 -0
  38. package/esm/asCode/validateYaml.js +28 -0
  39. package/esm/asCodeRegistry.d.ts +20 -0
  40. package/esm/asCodeRegistry.d.ts.map +1 -0
  41. package/esm/asCodeRegistry.js +36 -0
  42. package/esm/catalog/Catalog.d.ts.map +1 -1
  43. package/esm/catalog/Catalog.js +4 -4
  44. package/esm/catalogDetail/CatalogDetailActions.d.ts +4 -2
  45. package/esm/catalogDetail/CatalogDetailActions.d.ts.map +1 -1
  46. package/esm/catalogDetail/CatalogDetailActions.js +22 -78
  47. package/esm/catalogDetail/CatalogDetailContent.d.ts.map +1 -1
  48. package/esm/catalogDetail/CatalogDetailContent.js +1 -3
  49. package/esm/catalogItem/query.d.ts +4 -2
  50. package/esm/catalogItem/query.d.ts.map +1 -1
  51. package/esm/catalogItem/query.js +6 -6
  52. package/esm/header/CreateObjectButton.d.ts.map +1 -1
  53. package/esm/header/CreateObjectButton.js +29 -28
  54. package/esm/localization/bundles/en-US.localization-bundle.d.ts +16 -24
  55. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  56. package/esm/localization/bundles/en-US.localization-bundle.js +16 -24
  57. package/esm/metric/gate.d.ts +3 -4
  58. package/esm/metric/gate.d.ts.map +1 -1
  59. package/esm/metric/gate.js +5 -10
  60. package/esm/metric/metricCopy.d.ts +0 -1
  61. package/esm/metric/metricCopy.d.ts.map +1 -1
  62. package/esm/metric/metricCopy.js +3 -45
  63. package/esm/metric/metricDescriptor.d.ts +7 -0
  64. package/esm/metric/metricDescriptor.d.ts.map +1 -0
  65. package/esm/metric/metricDescriptor.js +74 -0
  66. package/esm/metric/metricMutationPort.d.ts +7 -10
  67. package/esm/metric/metricMutationPort.d.ts.map +1 -1
  68. package/esm/metric/metricMutationPort.js +15 -17
  69. package/esm/metric/metricValidation.d.ts.map +1 -1
  70. package/esm/metric/metricValidation.js +13 -32
  71. package/esm/metric/tests/metricMutationPort.test.utils.js +1 -1
  72. package/esm/parameter/gate.d.ts +3 -0
  73. package/esm/parameter/gate.d.ts.map +1 -1
  74. package/esm/parameter/gate.js +7 -5
  75. package/esm/parameter/parameterCopy.d.ts +0 -1
  76. package/esm/parameter/parameterCopy.d.ts.map +1 -1
  77. package/esm/parameter/parameterCopy.js +4 -41
  78. package/esm/parameter/parameterDescriptor.d.ts +7 -0
  79. package/esm/parameter/parameterDescriptor.d.ts.map +1 -0
  80. package/esm/parameter/parameterDescriptor.js +91 -0
  81. package/esm/parameter/parameterMutationPort.d.ts +5 -6
  82. package/esm/parameter/parameterMutationPort.d.ts.map +1 -1
  83. package/esm/parameter/parameterMutationPort.js +15 -2
  84. package/package.json +15 -15
  85. package/esm/metric/MetricCreateDialog.d.ts +0 -11
  86. package/esm/metric/MetricCreateDialog.d.ts.map +0 -1
  87. package/esm/metric/MetricCreateDialog.js +0 -55
  88. package/esm/metric/MetricDeleteDialog.d.ts +0 -9
  89. package/esm/metric/MetricDeleteDialog.d.ts.map +0 -1
  90. package/esm/metric/MetricDeleteDialog.js +0 -68
  91. package/esm/metric/MetricDetailActions.d.ts +0 -23
  92. package/esm/metric/MetricDetailActions.d.ts.map +0 -1
  93. package/esm/metric/MetricDetailActions.js +0 -101
  94. package/esm/metric/MetricDialog.d.ts +0 -14
  95. package/esm/metric/MetricDialog.d.ts.map +0 -1
  96. package/esm/metric/MetricDialog.js +0 -100
  97. package/esm/metric/MetricEditDialog.d.ts +0 -11
  98. package/esm/metric/MetricEditDialog.d.ts.map +0 -1
  99. package/esm/metric/MetricEditDialog.js +0 -51
  100. package/esm/metric/MetricMutationContext.d.ts +0 -16
  101. package/esm/metric/MetricMutationContext.d.ts.map +0 -1
  102. package/esm/metric/MetricMutationContext.js +0 -32
  103. package/esm/metric/MetricYamlEditor.d.ts +0 -8
  104. package/esm/metric/MetricYamlEditor.d.ts.map +0 -1
  105. package/esm/metric/MetricYamlEditor.js +0 -12
  106. package/esm/parameter/ParameterCreateDialog.d.ts +0 -9
  107. package/esm/parameter/ParameterCreateDialog.d.ts.map +0 -1
  108. package/esm/parameter/ParameterCreateDialog.js +0 -56
  109. package/esm/parameter/ParameterDeleteDialog.d.ts +0 -9
  110. package/esm/parameter/ParameterDeleteDialog.d.ts.map +0 -1
  111. package/esm/parameter/ParameterDeleteDialog.js +0 -39
  112. package/esm/parameter/ParameterDialog.d.ts +0 -13
  113. package/esm/parameter/ParameterDialog.d.ts.map +0 -1
  114. package/esm/parameter/ParameterDialog.js +0 -106
  115. package/esm/parameter/ParameterEditDialog.d.ts +0 -11
  116. package/esm/parameter/ParameterEditDialog.d.ts.map +0 -1
  117. package/esm/parameter/ParameterEditDialog.js +0 -35
  118. package/esm/parameter/ParameterMutationContext.d.ts +0 -16
  119. package/esm/parameter/ParameterMutationContext.d.ts.map +0 -1
  120. package/esm/parameter/ParameterMutationContext.js +0 -32
  121. package/esm/parameter/ParameterYamlEditor.d.ts +0 -10
  122. package/esm/parameter/ParameterYamlEditor.d.ts.map +0 -1
  123. package/esm/parameter/ParameterYamlEditor.js +0 -16
@@ -1 +1 @@
1
- {"version":3,"file":"CatalogDetailContent.d.ts","sourceRoot":"","sources":["../../src/catalogDetail/CatalogDetailContent.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,OAAO,CAAC;AAUtE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAIlF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAkBzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAAC;IACzD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5E;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5E;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD;;OAEG;IACH,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACjC,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EAC1B,EAAE,0BAA0B,2CAsN5B"}
1
+ {"version":3,"file":"CatalogDetailContent.d.ts","sourceRoot":"","sources":["../../src/catalogDetail/CatalogDetailContent.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAgC,MAAM,OAAO,CAAC;AAUtE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAGlF,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAkBzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACvC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;OAEG;IACH,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,eAAe,GAAG,YAAY,GAAG,IAAI,CAAC;IACzD;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5E;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5E;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,mBAAmB,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD;;OAEG;IACH,wBAAwB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,EACjC,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,uBAAuB,EAC1B,EAAE,0BAA0B,2CAoN5B"}
@@ -10,7 +10,6 @@ import { canEditCatalogItem } from "../catalogItem/permission.js";
10
10
  import {} from "../catalogItem/types.js";
11
11
  import { useIsCertificationAllowed } from "../certification/gate.js";
12
12
  import { useIsLineageEnabled } from "../lineage/gate.js";
13
- import { useIsCatalogMetricEditorEnabled } from "../metric/gate.js";
14
13
  import {} from "../objectType/types.js";
15
14
  import { usePermissionsState } from "../permission/PermissionsContext.js";
16
15
  import { useIsCatalogDescriptionGenerationEnabled, useIsCatalogQualityEnabled } from "../quality/gate.js";
@@ -62,7 +61,6 @@ export function CatalogDetailContent({ objectId, objectType, objectDefinition, o
62
61
  const enableMetricFormatOverrides = Boolean(settings?.["enableMetricFormatOverrides"]);
63
62
  const currencyFormatOverride = settings?.currencyFormatOverride ?? null;
64
63
  const isDescriptionGenerationEnabled = useIsCatalogDescriptionGenerationEnabled();
65
- const isMetricEditorEnabled = useIsCatalogMetricEditorEnabled();
66
64
  // Quality
67
65
  const { status: qualityStatus } = useQualityReportState();
68
66
  const isQualityEnabled = useIsCatalogQualityEnabled();
@@ -116,7 +114,7 @@ export function CatalogDetailContent({ objectId, objectType, objectDefinition, o
116
114
  _jsx(CatalogDetailStatus, { status: status, error: error, children: item ? (_jsxs("div", { className: cx("gd-analytics-catalog-detail__content", {
117
115
  lineage: selectedTabId === Tabs.LINEAGE,
118
116
  }), children: [
119
- _jsx(CatalogDetailHeader, { item: item, canEdit: canEdit, updateItemTitle: updateItemTitle, updateItemDescription: updateItemDescription, isDescriptionGenerationEnabled: isDescriptionGenerationEnabled, headerRef: headerRef, labels: shareableItem ? shareLabels.labels : undefined, labelsLoading: shareableItem ? shareLabels.loading : false, showInfoRow: enableColumnLevelPermissions, actions: _jsx(CatalogDetailActions, { item: item, canEdit: canEdit, isMetricEditorEnabled: isMetricEditorEnabled, onOpen: onOpenClick, onCatalogItemCreate: onCatalogItemCreate, onCatalogItemUpdate: applyItemUpdate, onCatalogItemDelete: applyItemDelete }) }), _jsx(UiTabs, { size: "large", tabs: tabs, onTabSelect: (tab) => setSelectedTabId(tab.id), selectedTabId: selectedTabId }), selectedTabId === Tabs.METADATA && (_jsx(CatalogDetailTabMetadata, { item: item, canEdit: canEdit,
117
+ _jsx(CatalogDetailHeader, { item: item, canEdit: canEdit, updateItemTitle: updateItemTitle, updateItemDescription: updateItemDescription, isDescriptionGenerationEnabled: isDescriptionGenerationEnabled, headerRef: headerRef, labels: shareableItem ? shareLabels.labels : undefined, labelsLoading: shareableItem ? shareLabels.loading : false, showInfoRow: enableColumnLevelPermissions, actions: _jsx(CatalogDetailActions, { item: item, canEdit: canEdit, onOpen: onOpenClick, onCatalogItemCreate: onCatalogItemCreate, onCatalogItemUpdate: applyItemUpdate, onCatalogItemDelete: applyItemDelete }) }), _jsx(UiTabs, { size: "large", tabs: tabs, onTabSelect: (tab) => setSelectedTabId(tab.id), selectedTabId: selectedTabId }), selectedTabId === Tabs.METADATA && (_jsx(CatalogDetailTabMetadata, { item: item, canEdit: canEdit,
120
118
  // With OLP off the dataset isn't relocated to the header,
121
119
  // so keep the Dataset row in the metadata tab.
122
120
  showDatasetRow: !enableColumnLevelPermissions, onTagClick: (tag) => {
@@ -1,7 +1,7 @@
1
1
  import type { AnalyticsCatalogGenerateDescriptionObjectType, IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
2
2
  import { type IMeasureMetadataObject, type IMeasureMetadataObjectDefinition, type IParameterMetadataObjectDefinition, type ObjRef } from "@gooddata/sdk-model";
3
3
  import type { ObjectType } from "../objectType/types.js";
4
- import type { ICatalogItem, ICatalogItemParameter, ICatalogItemQueryOptions } from "./types.js";
4
+ import type { ICatalogItem, ICatalogItemQueryOptions } from "./types.js";
5
5
  /**
6
6
  * Type guard for catalog object types supported by AI description generation.
7
7
  * @internal
@@ -16,7 +16,9 @@ export declare function getFactsQuery({ backend, workspace, search, origin, id,
16
16
  export declare function getDateDatasetsQuery({ backend, workspace, search, origin, id, excludeId, tags, excludeTags, isHidden, pageSize }: ICatalogItemQueryOptions): import("@gooddata/sdk-backend-spi").IDatasetsQuery;
17
17
  export declare function updateCatalogItem(backend: IAnalyticalBackend, workspace: string, item: ICatalogItem): Promise<import("@gooddata/sdk-model").IAttributeMetadataObject> | Promise<import("@gooddata/sdk-model").IDashboard<import("@gooddata/sdk-model").IDashboardWidget>> | Promise<import("@gooddata/sdk-model").IDataSetMetadataObject> | Promise<import("@gooddata/sdk-model").IFactMetadataObject> | Promise<import("@gooddata/sdk-model").IParameterMetadataObject> | Promise<import("@gooddata/sdk-model").IInsight> | Promise<IMeasureMetadataObject>;
18
18
  export declare function createParameterCatalogItem(backend: IAnalyticalBackend, workspace: string, parameter: IParameterMetadataObjectDefinition): Promise<import("@gooddata/sdk-model").IParameterMetadataObject>;
19
- export declare function updateParameterCatalogItem(backend: IAnalyticalBackend, workspace: string, item: ICatalogItemParameter): Promise<import("@gooddata/sdk-model").IParameterMetadataObject>;
19
+ export declare function updateParameterCatalogItem(backend: IAnalyticalBackend, workspace: string, definition: IParameterMetadataObjectDefinition & {
20
+ id: string;
21
+ }): Promise<import("@gooddata/sdk-model").IParameterMetadataObject>;
20
22
  export declare function deleteParameterCatalogItem(backend: IAnalyticalBackend, workspace: string, ref: ObjRef): Promise<void>;
21
23
  export declare function createMeasureCatalogItem(backend: IAnalyticalBackend, workspace: string, measure: IMeasureMetadataObjectDefinition): Promise<IMeasureMetadataObject>;
22
24
  export declare function updateMeasureCatalogItem(backend: IAnalyticalBackend, workspace: string, measure: IMeasureMetadataObject): Promise<IMeasureMetadataObject>;
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/catalogItem/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/catalogItem/query.ts"],"names":[],"mappings":"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"}
@@ -274,16 +274,16 @@ function updateParameterCatalogItemMeta(backend, workspace, item) {
274
274
  tags: item.tags,
275
275
  });
276
276
  }
277
- export function updateParameterCatalogItem(backend, workspace, item) {
277
+ export function updateParameterCatalogItem(backend, workspace, definition) {
278
278
  return backend
279
279
  .workspace(workspace)
280
280
  .parameters()
281
281
  .updateParameter({
282
- ...buildIdentity(item),
283
- title: item.title,
284
- description: item.description,
285
- tags: item.tags,
286
- definition: item.definition,
282
+ ...buildIdentity({ identifier: definition.id, type: "parameter" }),
283
+ title: definition.title,
284
+ description: definition.description,
285
+ tags: definition.tags,
286
+ definition: definition.definition,
287
287
  });
288
288
  }
289
289
  export function deleteParameterCatalogItem(backend, workspace, ref) {
@@ -1 +1 @@
1
- {"version":3,"file":"CreateObjectButton.d.ts","sourceRoot":"","sources":["../../src/header/CreateObjectButton.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAetE,KAAK,KAAK,GAAG;IACT,cAAc,EAAE,CAAC,UAAU,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,EAAE,KAAK,2CA0H5F"}
1
+ {"version":3,"file":"CreateObjectButton.d.ts","sourceRoot":"","sources":["../../src/header/CreateObjectButton.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AActE,KAAK,KAAK,GAAG;IACT,cAAc,EAAE,CAAC,UAAU,EAAE,uBAAuB,KAAK,IAAI,CAAC;IAC9D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,EAAE,KAAK,2CA2H5F"}
@@ -3,11 +3,11 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
3
3
  import { useCallback, useMemo, useState } from "react";
4
4
  import { useIntl } from "react-intl";
5
5
  import { Dropdown, SeparatorLine, UiButton, UiIcon, UiMenu, } from "@gooddata/sdk-ui-kit";
6
+ import { AsCodeCreateDialog } from "../asCode/AsCodeCreateDialog.js";
7
+ import { getAsCodeDescriptor } from "../asCodeRegistry.js";
6
8
  import { useCatalogFeedActions } from "../catalogItem/CatalogFeedContext.js";
7
- import { MetricCreateDialog } from "../metric/MetricCreateDialog.js";
8
9
  import { ObjectTypes } from "../objectType/constants.js";
9
10
  import { getObjectTypeLabel } from "../objectType/labels.js";
10
- import { ParameterCreateDialog } from "../parameter/ParameterCreateDialog.js";
11
11
  const icons = {
12
12
  [ObjectTypes.DASHBOARD]: "dashboard",
13
13
  [ObjectTypes.VISUALIZATION]: "visualization",
@@ -17,8 +17,20 @@ const icons = {
17
17
  export function CreateObjectButton({ onCreateObject, showParameter, showMetricEditor }) {
18
18
  const intl = useIntl();
19
19
  const { refetchObjectType } = useCatalogFeedActions();
20
- const [isParameterDialogOpen, setIsParameterDialogOpen] = useState(false);
21
- const [isMetricDialogOpen, setIsMetricDialogOpen] = useState(false);
20
+ // The type whose create dialog is open, or undefined when none is. One state for every as-code
21
+ // type, since they all open the same generic dialog.
22
+ const [openType, setOpenType] = useState(undefined);
23
+ // The types created inline in a catalog dialog (the rest redirect to a standalone editor).
24
+ const inCatalogTypes = useMemo(() => {
25
+ const types = new Set();
26
+ if (showMetricEditor) {
27
+ types.add(ObjectTypes.METRIC);
28
+ }
29
+ if (showParameter) {
30
+ types.add(ObjectTypes.PARAMETER);
31
+ }
32
+ return types;
33
+ }, [showMetricEditor, showParameter]);
22
34
  const items = useMemo(() => {
23
35
  const externalLinkIcon = _jsx(MenuItemIcon, { type: "externalLink" });
24
36
  const interactiveItem = (type, redirects) => ({
@@ -38,10 +50,7 @@ export function CreateObjectButton({ onCreateObject, showParameter, showMetricEd
38
50
  interactiveItem(ObjectTypes.VISUALIZATION, true),
39
51
  ...(showMetricEditor ? [] : [interactiveItem(ObjectTypes.METRIC, true)]),
40
52
  ];
41
- const inCatalogItems = [
42
- ...(showMetricEditor ? [interactiveItem(ObjectTypes.METRIC, false)] : []),
43
- ...(showParameter ? [interactiveItem(ObjectTypes.PARAMETER, false)] : []),
44
- ];
53
+ const inCatalogItems = [...inCatalogTypes].map((type) => interactiveItem(type, false));
45
54
  if (inCatalogItems.length === 0) {
46
55
  return redirectItems;
47
56
  }
@@ -50,30 +59,22 @@ export function CreateObjectButton({ onCreateObject, showParameter, showMetricEd
50
59
  { type: "static", data: _jsx(SeparatorLine, { pT: 5, pR: 10, pB: 4, pL: 10 }) },
51
60
  ...inCatalogItems,
52
61
  ];
53
- }, [intl, showParameter, showMetricEditor]);
62
+ }, [intl, inCatalogTypes, showMetricEditor]);
54
63
  const handleSelect = useCallback((item, _event) => {
55
- if (item.data === ObjectTypes.PARAMETER) {
56
- setIsParameterDialogOpen(true);
57
- }
58
- else if (item.data === ObjectTypes.METRIC && showMetricEditor) {
59
- setIsMetricDialogOpen(true);
64
+ if (inCatalogTypes.has(item.data)) {
65
+ setOpenType(item.data);
60
66
  }
61
67
  else {
62
68
  onCreateObject(item.data);
63
69
  }
64
- }, [onCreateObject, showMetricEditor]);
65
- const handleParameterDialogClose = useCallback(() => {
66
- setIsParameterDialogOpen(false);
67
- }, []);
68
- const handleParameterCreated = useCallback(() => {
69
- void refetchObjectType(ObjectTypes.PARAMETER);
70
- }, [refetchObjectType]);
71
- const handleMetricDialogClose = useCallback(() => {
72
- setIsMetricDialogOpen(false);
73
- }, []);
74
- const handleMetricCreated = useCallback(() => {
75
- void refetchObjectType(ObjectTypes.METRIC);
76
- }, [refetchObjectType]);
70
+ }, [inCatalogTypes, onCreateObject]);
71
+ const closeDialog = useCallback(() => setOpenType(undefined), []);
72
+ const handleCreated = useCallback(() => {
73
+ if (openType) {
74
+ void refetchObjectType(openType);
75
+ }
76
+ }, [openType, refetchObjectType]);
77
+ const openDescriptor = openType ? getAsCodeDescriptor(openType) : undefined;
77
78
  return (_jsxs(_Fragment, { children: [_jsx(Dropdown, { alignPoints: [{ align: "br tr" }], renderButton: ({ toggleDropdown, buttonRef, ariaAttributes, accessibilityConfig }) => (_jsx(UiButton, { ref: (element) => {
78
79
  buttonRef.current = element;
79
80
  }, label: intl.formatMessage({ id: "analyticsCatalog.create" }), onClick: toggleDropdown, variant: "primary", iconBefore: "plus", iconAfter: "navigateDown", accessibilityConfig: {
@@ -82,7 +83,7 @@ export function CreateObjectButton({ onCreateObject, showParameter, showMetricEd
82
83
  ariaHaspopup: ariaAttributes["aria-haspopup"],
83
84
  ariaControls: ariaAttributes["aria-controls"],
84
85
  iconAriaHidden: true,
85
- } })), renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx(UiMenu, { items: items, minWidth: 180, onClose: closeDropdown, onSelect: handleSelect, shouldCloseOnSelect: true, ariaAttributes: ariaAttributes, containerTopPadding: "small", containerBottomPadding: "small" })), closeOnEscape: true, autofocusOnOpen: true }), isParameterDialogOpen ? (_jsx(ParameterCreateDialog, { onClose: handleParameterDialogClose, onCreated: handleParameterCreated })) : null, isMetricDialogOpen ? (_jsx(MetricCreateDialog, { onClose: handleMetricDialogClose, onCreated: handleMetricCreated })) : null] }));
86
+ } })), renderBody: ({ closeDropdown, ariaAttributes }) => (_jsx(UiMenu, { items: items, minWidth: 180, onClose: closeDropdown, onSelect: handleSelect, shouldCloseOnSelect: true, ariaAttributes: ariaAttributes, containerTopPadding: "small", containerBottomPadding: "small" })), closeOnEscape: true, autofocusOnOpen: true }), openDescriptor ? (_jsx(AsCodeCreateDialog, { descriptor: openDescriptor, onClose: closeDialog, onCreated: handleCreated }, openDescriptor.objectType)) : null] }));
86
87
  }
87
88
  function MenuItemIcon({ type }) {
88
89
  return _jsx(UiIcon, { type: type, size: 14, color: "complementary-5" });
@@ -671,14 +671,6 @@ export declare const en_US: {
671
671
  text: string;
672
672
  crowdinContext: string;
673
673
  };
674
- "analyticsCatalog.parameter.dialog.create.submit": {
675
- text: string;
676
- crowdinContext: string;
677
- };
678
- "analyticsCatalog.parameter.dialog.edit.submit": {
679
- text: string;
680
- crowdinContext: string;
681
- };
682
674
  "analyticsCatalog.parameter.dialog.edit.duplicate": {
683
675
  text: string;
684
676
  crowdinContext: string;
@@ -687,10 +679,6 @@ export declare const en_US: {
687
679
  text: string;
688
680
  crowdinContext: string;
689
681
  };
690
- "analyticsCatalog.parameter.dialog.cancel": {
691
- text: string;
692
- crowdinContext: string;
693
- };
694
682
  "analyticsCatalog.parameter.dialog.help": {
695
683
  text: string;
696
684
  crowdinContext: string;
@@ -727,6 +715,10 @@ export declare const en_US: {
727
715
  text: string;
728
716
  crowdinContext: string;
729
717
  };
718
+ "analyticsCatalog.parameter.create.defaultTitle": {
719
+ text: string;
720
+ crowdinContext: string;
721
+ };
730
722
  "analyticsCatalog.parameter.create.success": {
731
723
  text: string;
732
724
  crowdinContext: string;
@@ -775,14 +767,6 @@ export declare const en_US: {
775
767
  text: string;
776
768
  crowdinContext: string;
777
769
  };
778
- "analyticsCatalog.metric.dialog.create.submit": {
779
- text: string;
780
- crowdinContext: string;
781
- };
782
- "analyticsCatalog.metric.dialog.edit.submit": {
783
- text: string;
784
- crowdinContext: string;
785
- };
786
770
  "analyticsCatalog.metric.actions.openInEditor": {
787
771
  text: string;
788
772
  crowdinContext: string;
@@ -795,10 +779,6 @@ export declare const en_US: {
795
779
  text: string;
796
780
  crowdinContext: string;
797
781
  };
798
- "analyticsCatalog.metric.dialog.cancel": {
799
- text: string;
800
- crowdinContext: string;
801
- };
802
782
  "analyticsCatalog.metric.dialog.help": {
803
783
  text: string;
804
784
  crowdinContext: string;
@@ -831,6 +811,18 @@ export declare const en_US: {
831
811
  text: string;
832
812
  crowdinContext: string;
833
813
  };
814
+ "analyticsCatalog.asCode.dialog.create.submit": {
815
+ text: string;
816
+ crowdinContext: string;
817
+ };
818
+ "analyticsCatalog.asCode.dialog.edit.submit": {
819
+ text: string;
820
+ crowdinContext: string;
821
+ };
822
+ "analyticsCatalog.asCode.dialog.cancel": {
823
+ text: string;
824
+ crowdinContext: string;
825
+ };
834
826
  "analyticsCatalog.metric.create.defaultTitle": {
835
827
  text: string;
836
828
  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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAi5BjB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAy4BjB,CAAC"}
@@ -673,14 +673,6 @@ export const en_US = {
673
673
  "text": "Create a YAML statement that defines a parameter.",
674
674
  "crowdinContext": "Tooltip shown for the help icon next to the parameter definition section header."
675
675
  },
676
- "analyticsCatalog.parameter.dialog.create.submit": {
677
- "text": "Create",
678
- "crowdinContext": "Label for the submit button in the create parameter dialog."
679
- },
680
- "analyticsCatalog.parameter.dialog.edit.submit": {
681
- "text": "Save",
682
- "crowdinContext": "Label for the submit button in the edit parameter dialog."
683
- },
684
676
  "analyticsCatalog.parameter.dialog.edit.duplicate": {
685
677
  "text": "Save as new",
686
678
  "crowdinContext": "Label for the duplicate action button in the edit parameter dialog."
@@ -689,10 +681,6 @@ export const en_US = {
689
681
  "text": "Parameter id cannot be changed when saving an existing parameter. Use Save as new instead.",
690
682
  "crowdinContext": "Error shown when the user tries to change the parameter id while saving an existing parameter."
691
683
  },
692
- "analyticsCatalog.parameter.dialog.cancel": {
693
- "text": "Cancel",
694
- "crowdinContext": "Label for the cancel button in the parameter dialog."
695
- },
696
684
  "analyticsCatalog.parameter.dialog.help": {
697
685
  "text": "How to create a parameter?",
698
686
  "crowdinContext": "Label for the help link in the parameter dialog footer."
@@ -729,6 +717,10 @@ export const en_US = {
729
717
  "text": "Tags must be a list of strings.",
730
718
  "crowdinContext": "Error shown when the parameter YAML contains invalid tags."
731
719
  },
720
+ "analyticsCatalog.parameter.create.defaultTitle": {
721
+ "text": "My Parameter",
722
+ "crowdinContext": "Default title seeded into the YAML editor when creating a new parameter from the Analytics Catalog."
723
+ },
732
724
  "analyticsCatalog.parameter.create.success": {
733
725
  "text": "Parameter created.",
734
726
  "crowdinContext": "Toast shown after a parameter is created successfully from the Analytics Catalog."
@@ -777,14 +769,6 @@ export const en_US = {
777
769
  "text": "Define the metric in YAML, including its MAQL expression and format.",
778
770
  "crowdinContext": "Tooltip explaining the as-code metric editor."
779
771
  },
780
- "analyticsCatalog.metric.dialog.create.submit": {
781
- "text": "Create",
782
- "crowdinContext": "Submit button of the create metric dialog."
783
- },
784
- "analyticsCatalog.metric.dialog.edit.submit": {
785
- "text": "Save",
786
- "crowdinContext": "Submit button of the edit metric dialog."
787
- },
788
772
  "analyticsCatalog.metric.actions.openInEditor": {
789
773
  "text": "Open in metric editor",
790
774
  "crowdinContext": "Detail-panel menu action that opens the metric in the standalone metric editor (as opposed to the inline as-code editor)."
@@ -797,10 +781,6 @@ export const en_US = {
797
781
  "text": "The metric id cannot be changed. Use Duplicate to create a metric with a different id.",
798
782
  "crowdinContext": "Validation error shown when the user changes the id while editing a metric."
799
783
  },
800
- "analyticsCatalog.metric.dialog.cancel": {
801
- "text": "Cancel",
802
- "crowdinContext": "Cancel button of the metric dialogs."
803
- },
804
784
  "analyticsCatalog.metric.dialog.help": {
805
785
  "text": "How to write a metric",
806
786
  "crowdinContext": "Help link in the metric as-code dialog."
@@ -833,6 +813,18 @@ export const en_US = {
833
813
  "text": "Error:",
834
814
  "crowdinContext": "Bold label prefixing the error message in the as-code editor dialogs (metrics, parameters)."
835
815
  },
816
+ "analyticsCatalog.asCode.dialog.create.submit": {
817
+ "text": "Create",
818
+ "crowdinContext": "Confirm button of the as-code editor dialog when creating a new object (metric, parameter)."
819
+ },
820
+ "analyticsCatalog.asCode.dialog.edit.submit": {
821
+ "text": "Save",
822
+ "crowdinContext": "Confirm button of the as-code editor dialog when editing an existing object (metric, parameter)."
823
+ },
824
+ "analyticsCatalog.asCode.dialog.cancel": {
825
+ "text": "Cancel",
826
+ "crowdinContext": "Cancel button of the as-code editor dialog (metrics, parameters)."
827
+ },
836
828
  "analyticsCatalog.metric.create.defaultTitle": {
837
829
  "text": "My metric",
838
830
  "crowdinContext": "Default placeholder title seeded into the new-metric as-code editor before the user types their own."
@@ -1,7 +1,6 @@
1
- /**
2
- * Catalog inline metric editor feature gate.
3
- */
4
- export declare function useIsCatalogMetricEditorEnabled(): boolean;
1
+ /** The flag gating the in-catalog metric editor. The single source of truth, referenced by both the
2
+ * gate below and `metricDescriptor.featureFlag`. */
3
+ export declare const METRIC_EDITOR_FEATURE_FLAG = "enableAnalyticalCatalogMetricEditor";
5
4
  /**
6
5
  * Whether the current user can create and edit metrics inline in the catalog.
7
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/metric/gate.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C"}
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/metric/gate.ts"],"names":[],"mappings":"AAIA;qDACqD;AACrD,eAAO,MAAM,0BAA0B,wCAAwC,CAAC;AAEhF;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C"}
@@ -1,16 +1,11 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { useFeatureFlag, useWorkspacePermission } from "../permission/PermissionsContext.js";
3
- /**
4
- * Catalog inline metric editor feature gate.
5
- */
6
- export function useIsCatalogMetricEditorEnabled() {
7
- return useFeatureFlag("enableAnalyticalCatalogMetricEditor");
8
- }
2
+ import { useCanManageAsCode } from "../asCode/gate.js";
3
+ /** The flag gating the in-catalog metric editor. The single source of truth, referenced by both the
4
+ * gate below and `metricDescriptor.featureFlag`. */
5
+ export const METRIC_EDITOR_FEATURE_FLAG = "enableAnalyticalCatalogMetricEditor";
9
6
  /**
10
7
  * Whether the current user can create and edit metrics inline in the catalog.
11
8
  */
12
9
  export function useCanManageMetric() {
13
- const isMetricEditorEnabled = useIsCatalogMetricEditorEnabled();
14
- const canManageProject = useWorkspacePermission("canManageProject");
15
- return isMetricEditorEnabled && canManageProject;
10
+ return useCanManageAsCode(METRIC_EDITOR_FEATURE_FLAG);
16
11
  }
@@ -1,4 +1,3 @@
1
1
  import type { IMeasureMetadataObjectDefinition } from "@gooddata/sdk-model";
2
2
  export declare function createCopiedMetric(metric: IMeasureMetadataObjectDefinition): IMeasureMetadataObjectDefinition;
3
- export declare function isDuplicateIdError(error: unknown): boolean;
4
3
  //# sourceMappingURL=metricCopy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"metricCopy.d.ts","sourceRoot":"","sources":["../../src/metric/metricCopy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAK5E,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,gCAAgC,GACzC,gCAAgC,CAkBlC;AAwCD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE1D"}
1
+ {"version":3,"file":"metricCopy.d.ts","sourceRoot":"","sources":["../../src/metric/metricCopy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAI5E,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,gCAAgC,GACzC,gCAAgC,CAelC"}
@@ -1,17 +1,12 @@
1
1
  // (C) 2026 GoodData Corporation
2
- import { isUnexpectedResponseError } from "@gooddata/sdk-backend-spi";
3
- const canonicalUuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
4
- const trailingCopySuffixRegex = /^(.*) \((\d+)\)$/;
2
+ import { deriveCopyIdentity } from "../asCode/copy.js";
5
3
  export function createCopiedMetric(metric) {
6
- const title = getCopiedTitle(metric.title);
7
- const id = shouldOmitCopiedId(metric.id) ? undefined : getCopiedId(title);
8
4
  // Whitelist only definition-owned fields; the source may be a loaded measure carrying
9
5
  // server-managed fields (uri, ref, timestamps, ...) that must not leak into the definition.
10
- // metricType and isHiddenFromKda are author-owned semantics, so they carry over to the copy.
6
+ // metricType, isHidden, and isHiddenFromKda are author-owned semantics, so they carry over.
11
7
  return {
12
8
  type: "measure",
13
- ...(id === undefined ? {} : { id }),
14
- ...(title === undefined ? {} : { title }),
9
+ ...deriveCopyIdentity(metric),
15
10
  description: metric.description,
16
11
  tags: metric.tags,
17
12
  expression: metric.expression,
@@ -21,40 +16,3 @@ export function createCopiedMetric(metric) {
21
16
  ...(metric.isHiddenFromKda === undefined ? {} : { isHiddenFromKda: metric.isHiddenFromKda }),
22
17
  };
23
18
  }
24
- function getCopiedTitle(title) {
25
- if (title === undefined) {
26
- return undefined;
27
- }
28
- if (title === "") {
29
- return "";
30
- }
31
- const match = title.match(trailingCopySuffixRegex);
32
- if (match) {
33
- const [, prefix, suffix] = match;
34
- return `${prefix} (${Number(suffix) + 1})`;
35
- }
36
- return `${title} (2)`;
37
- }
38
- // A UUID id was server-generated, so the copy omits its id and lets the server generate a fresh one.
39
- // A human-authored id (e.g. "revenue.total") is instead re-derived from the copied title to stay
40
- // readable; a resulting collision is handled by the create 409 retry-without-id.
41
- function shouldOmitCopiedId(id) {
42
- return id === undefined || isCanonicalUuid(id);
43
- }
44
- function getCopiedId(title) {
45
- if (!title) {
46
- return undefined;
47
- }
48
- const normalizedTitle = title
49
- .normalize("NFKD")
50
- .replace(/[\u0300-\u036f]/g, "")
51
- .replace(/\W/g, "_")
52
- .toLowerCase();
53
- return normalizedTitle || undefined;
54
- }
55
- function isCanonicalUuid(value) {
56
- return canonicalUuidRegex.test(value);
57
- }
58
- export function isDuplicateIdError(error) {
59
- return isUnexpectedResponseError(error) && error.httpStatus === 409;
60
- }
@@ -0,0 +1,7 @@
1
+ import type { IMeasureMetadataObjectDefinition } from "@gooddata/sdk-model";
2
+ import type { ICatalogItemMeasure } from "../catalogItem/types.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export declare const metricDescriptor: import("../asCode/descriptor.js").IAsCodeDescriptor<IMeasureMetadataObjectDefinition, ICatalogItemMeasure>;
7
+ //# sourceMappingURL=metricDescriptor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metricDescriptor.d.ts","sourceRoot":"","sources":["../../src/metric/metricDescriptor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,qBAAqB,CAAC;AAG5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAqEnE;;GAEG;AACH,eAAO,MAAM,gBAAgB,4GAe5B,CAAC"}
@@ -0,0 +1,74 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useMemo } from "react";
3
+ import { defineMessages, useIntl } from "react-intl";
4
+ import { defineAsCodeDescriptor } from "../asCode/descriptor.js";
5
+ import { ObjectTypes } from "../objectType/constants.js";
6
+ import { METRIC_EDITOR_FEATURE_FLAG } from "./gate.js";
7
+ import { metricCompletions } from "./metricCompletions.js";
8
+ import { definitionToMetricYaml, mergeCopiedMetricDefinition, metricYamlToDefinition, } from "./metricConverter.js";
9
+ import { createCopiedMetric } from "./metricCopy.js";
10
+ import { createMetricMutationAdapter } from "./metricMutationPort.js";
11
+ import { serializeMetricToYaml } from "./metricSerialization.js";
12
+ import { validateMetricYaml } from "./metricValidation.js";
13
+ const METRIC_DOCS_URL = "https://www.gooddata.ai/docs/cloud/api-and-sdk/vs-code-extension/structures/#metric";
14
+ const messages = defineMessages({
15
+ createTitle: { id: "analyticsCatalog.metric.dialog.create.title" },
16
+ editTitle: { id: "analyticsCatalog.metric.dialog.edit.title" },
17
+ duplicate: { id: "analyticsCatalog.metric.dialog.edit.duplicate" },
18
+ createDefaultTitle: { id: "analyticsCatalog.metric.create.defaultTitle" },
19
+ createSuccess: { id: "analyticsCatalog.metric.create.success" },
20
+ updateSuccess: { id: "analyticsCatalog.metric.update.success" },
21
+ sectionHeader: { id: "analyticsCatalog.metric.dialog.sectionHeader" },
22
+ sectionHeaderTooltip: { id: "analyticsCatalog.metric.dialog.sectionHeader.tooltip" },
23
+ help: { id: "analyticsCatalog.metric.dialog.help" },
24
+ submitError: { id: "analyticsCatalog.metric.dialog.submit.error" },
25
+ loadError: { id: "analyticsCatalog.metric.load.error" },
26
+ deleteTitle: { id: "analyticsCatalog.metric.dialog.delete.title" },
27
+ deleteBody: { id: "analyticsCatalog.metric.dialog.delete.body" },
28
+ deleteSubmit: { id: "analyticsCatalog.metric.dialog.delete.submit" },
29
+ deleteSuccess: { id: "analyticsCatalog.metric.delete.success" },
30
+ deleteError: { id: "analyticsCatalog.metric.delete.error" },
31
+ deleteUsageWarning: { id: "analyticsCatalog.metric.dialog.delete.usageWarning" },
32
+ });
33
+ const actionMessages = defineMessages({
34
+ openInEditor: { id: "analyticsCatalog.metric.actions.openInEditor" },
35
+ });
36
+ const errorMessages = defineMessages({
37
+ empty: { id: "analyticsCatalog.metric.validation.empty" },
38
+ syntax: { id: "analyticsCatalog.metric.validation.syntax" },
39
+ invalidStructure: { id: "analyticsCatalog.metric.validation.invalidStructure" },
40
+ idImmutable: { id: "analyticsCatalog.metric.dialog.edit.idImmutable" },
41
+ missingMaql: { id: "analyticsCatalog.metric.validation.missingMaql" },
42
+ invalidTags: { id: "analyticsCatalog.metric.validation.invalidTags" },
43
+ });
44
+ function useMetricEditing() {
45
+ const intl = useIntl();
46
+ return useMemo(() => ({
47
+ completionSource: metricCompletions,
48
+ syntaxErrorMessage: intl.formatMessage(errorMessages.syntax),
49
+ // The editor works in the YAML shape, a lossy projection of the measure definition.
50
+ serialize: (definition) => serializeMetricToYaml(definitionToMetricYaml(definition)),
51
+ validate: (value, options) => {
52
+ const result = validateMetricYaml(value, options);
53
+ return result.isValid
54
+ ? { isValid: true, definition: result.measure }
55
+ : { isValid: false, error: intl.formatMessage(errorMessages[result.errorCode]) };
56
+ },
57
+ }), [intl]);
58
+ }
59
+ /**
60
+ * @internal
61
+ */
62
+ export const metricDescriptor = defineAsCodeDescriptor({
63
+ objectType: ObjectTypes.METRIC,
64
+ docsUrl: METRIC_DOCS_URL,
65
+ featureFlag: METRIC_EDITOR_FEATURE_FLAG,
66
+ messages,
67
+ useEditing: useMetricEditing,
68
+ createMutationPort: createMetricMutationAdapter,
69
+ emptyDefinition: (defaultTitle) => metricYamlToDefinition({ type: "metric", title: defaultTitle, maql: "SELECT 1" }),
70
+ // No editSeed: the full measure is loaded via port.load (the item carries no MAQL).
71
+ toCopy: createCopiedMetric,
72
+ applyYamlEdits: mergeCopiedMetricDefinition,
73
+ openAction: actionMessages.openInEditor,
74
+ });
@@ -1,16 +1,13 @@
1
- import type { IAnalyticalBackend, IMeasureReferencing } from "@gooddata/sdk-backend-spi";
2
- import { type IMeasureMetadataObject, type IMeasureMetadataObjectDefinition } from "@gooddata/sdk-model";
3
- import type { ICatalogItemMeasure, ICatalogItemRef } from "../catalogItem/types.js";
1
+ import type { IAnalyticalBackend } from "@gooddata/sdk-backend-spi";
2
+ import { type IMeasureMetadataObjectDefinition } from "@gooddata/sdk-model";
3
+ import type { IAsCodeMutationPort } from "../asCode/descriptor.js";
4
+ import type { ICatalogItemMeasure } from "../catalogItem/types.js";
4
5
  /**
6
+ * A metric loads its full measure before editing (the catalog item carries no MAQL) and always
7
+ * supports the optional `load`/`getReferencingObjectsCount` capabilities — hence `Required`.
5
8
  * @internal
6
9
  */
7
- export interface IMetricMutationPort {
8
- create(definition: IMeasureMetadataObjectDefinition): Promise<ICatalogItemMeasure>;
9
- update(existing: IMeasureMetadataObject, definition: IMeasureMetadataObjectDefinition): Promise<ICatalogItemMeasure>;
10
- delete(ref: ICatalogItemRef): Promise<void>;
11
- load(ref: ICatalogItemRef): Promise<IMeasureMetadataObject>;
12
- getReferencingObjects(ref: ICatalogItemRef): Promise<IMeasureReferencing>;
13
- }
10
+ export type IMetricMutationPort = Required<IAsCodeMutationPort<IMeasureMetadataObjectDefinition, ICatalogItemMeasure>>;
14
11
  /**
15
12
  * @internal
16
13
  */
@@ -1 +1 @@
1
- {"version":3,"file":"metricMutationPort.d.ts","sourceRoot":"","sources":["../../src/metric/metricMutationPort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACzF,OAAO,EACH,KAAK,sBAAsB,EAC3B,KAAK,gCAAgC,EAExC,MAAM,qBAAqB,CAAC;AAU7B,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAIpF;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,MAAM,CAAC,UAAU,EAAE,gCAAgC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACnF,MAAM,CACF,QAAQ,EAAE,sBAAsB,EAChC,UAAU,EAAE,gCAAgC,GAC7C,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChC,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5D,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC7E;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAClB,mBAAmB,CA4BrB"}
1
+ {"version":3,"file":"metricMutationPort.d.ts","sourceRoot":"","sources":["../../src/metric/metricMutationPort.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,KAAK,gCAAgC,EAAkC,MAAM,qBAAqB,CAAC;AAE5G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AASnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAInE;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,CACtC,mBAAmB,CAAC,gCAAgC,EAAE,mBAAmB,CAAC,CAC7E,CAAC;AAEF;;GAEG;AACH,wBAAgB,2BAA2B,CACvC,OAAO,EAAE,kBAAkB,EAC3B,SAAS,EAAE,MAAM,GAClB,mBAAmB,CAoCrB"}