@gooddata/sdk-ui-catalog 11.43.0-alpha.1 → 11.43.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 (47) hide show
  1. package/esm/automation/testIds.d.ts +7 -0
  2. package/esm/automation/testIds.d.ts.map +1 -1
  3. package/esm/automation/testIds.js +7 -0
  4. package/esm/catalogDetail/CatalogDetailActions.d.ts +3 -1
  5. package/esm/catalogDetail/CatalogDetailActions.d.ts.map +1 -1
  6. package/esm/catalogDetail/CatalogDetailActions.js +11 -9
  7. package/esm/catalogDetail/CatalogDetailContent.d.ts.map +1 -1
  8. package/esm/catalogDetail/CatalogDetailContent.js +62 -23
  9. package/esm/catalogDetail/CatalogDetailHeader.d.ts +13 -1
  10. package/esm/catalogDetail/CatalogDetailHeader.d.ts.map +1 -1
  11. package/esm/catalogDetail/CatalogDetailHeader.js +44 -28
  12. package/esm/catalogDetail/CatalogDetailTabMetadata.d.ts +17 -1
  13. package/esm/catalogDetail/CatalogDetailTabMetadata.d.ts.map +1 -1
  14. package/esm/catalogDetail/CatalogDetailTabMetadata.js +8 -3
  15. package/esm/catalogDetail/share/CatalogDetailAccessRow.d.ts +19 -0
  16. package/esm/catalogDetail/share/CatalogDetailAccessRow.d.ts.map +1 -0
  17. package/esm/catalogDetail/share/CatalogDetailAccessRow.js +33 -0
  18. package/esm/catalogDetail/share/CatalogDetailLabels.d.ts +17 -0
  19. package/esm/catalogDetail/share/CatalogDetailLabels.d.ts.map +1 -0
  20. package/esm/catalogDetail/share/CatalogDetailLabels.js +36 -0
  21. package/esm/catalogDetail/share/ShareButton.d.ts +15 -0
  22. package/esm/catalogDetail/share/ShareButton.d.ts.map +1 -0
  23. package/esm/catalogDetail/share/ShareButton.js +16 -0
  24. package/esm/catalogDetail/share/guards.d.ts +15 -0
  25. package/esm/catalogDetail/share/guards.d.ts.map +1 -0
  26. package/esm/catalogDetail/share/guards.js +21 -0
  27. package/esm/catalogDetail/share/messages.d.ts +43 -0
  28. package/esm/catalogDetail/share/messages.d.ts.map +1 -0
  29. package/esm/catalogDetail/share/messages.js +24 -0
  30. package/esm/catalogDetail/share/types.d.ts +7 -0
  31. package/esm/catalogDetail/share/types.d.ts.map +1 -0
  32. package/esm/catalogDetail/share/types.js +2 -0
  33. package/esm/catalogDetail/share/useShareableLabels.d.ts +31 -0
  34. package/esm/catalogDetail/share/useShareableLabels.d.ts.map +1 -0
  35. package/esm/catalogDetail/share/useShareableLabels.js +37 -0
  36. package/esm/localization/bundles/en-US.localization-bundle.d.ts +44 -0
  37. package/esm/localization/bundles/en-US.localization-bundle.d.ts.map +1 -1
  38. package/esm/localization/bundles/en-US.localization-bundle.js +44 -0
  39. package/esm/localization/translations.d.ts +1 -1
  40. package/esm/localization/translations.d.ts.map +1 -1
  41. package/esm/localization/translations.js +7 -5
  42. package/package.json +14 -13
  43. package/styles/css/detail.css +67 -0
  44. package/styles/css/detail.css.map +1 -1
  45. package/styles/css/main.css +67 -0
  46. package/styles/css/main.css.map +1 -1
  47. package/styles/scss/detail.scss +86 -2
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { useIntl } from "react-intl";
4
+ import { UiButton } from "@gooddata/sdk-ui-kit";
5
+ import { catalogDetailActionShare } from "../../automation/testIds.js";
6
+ import { shareMessages } from "./messages.js";
7
+ /**
8
+ * Catalog detail header trigger for the share dialog. Rendered in the
9
+ * `CatalogDetailActions` slot, immediately before the primary "Open" button.
10
+ *
11
+ * @internal
12
+ */
13
+ export function ShareButton({ onClick, isDisabled }) {
14
+ const intl = useIntl();
15
+ return (_jsx(UiButton, { label: intl.formatMessage(shareMessages.shareButton), variant: "secondary", onClick: onClick, isDisabled: isDisabled, dataTestId: catalogDetailActionShare }));
16
+ }
@@ -0,0 +1,15 @@
1
+ import type { IObjectPermissionsObject } from "@gooddata/sdk-backend-spi";
2
+ import type { ICatalogItem } from "../../catalogItem/types.js";
3
+ import type { ShareableCatalogItem } from "./types.js";
4
+ /**
5
+ * Catalog items the share dialog can target: attributes and facts. Labels are
6
+ * not first-class catalog items; they appear inside the labels picker when
7
+ * sharing an attribute.
8
+ */
9
+ export declare function isShareableCatalogItem(item: ICatalogItem): item is ShareableCatalogItem;
10
+ /**
11
+ * Build the backend target descriptor from a shareable catalog item. The kind
12
+ * enum matches the catalog item's discriminator, so the mapping is direct.
13
+ */
14
+ export declare function toShareTarget(item: ShareableCatalogItem): IObjectPermissionsObject;
15
+ //# sourceMappingURL=guards.d.ts.map
@@ -0,0 +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;AAI1E,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,CAEvF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,oBAAoB,GAAG,wBAAwB,CAKlF"}
@@ -0,0 +1,21 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { idRef } from "@gooddata/sdk-model";
3
+ import { isCatalogItemAttribute, isCatalogItemFact } from "../../catalogItem/guards.js";
4
+ /**
5
+ * Catalog items the share dialog can target: attributes and facts. Labels are
6
+ * not first-class catalog items; they appear inside the labels picker when
7
+ * sharing an attribute.
8
+ */
9
+ export function isShareableCatalogItem(item) {
10
+ return isCatalogItemAttribute(item) || isCatalogItemFact(item);
11
+ }
12
+ /**
13
+ * Build the backend target descriptor from a shareable catalog item. The kind
14
+ * enum matches the catalog item's discriminator, so the mapping is direct.
15
+ */
16
+ export function toShareTarget(item) {
17
+ return {
18
+ kind: item.type,
19
+ ref: idRef(item.identifier, item.type),
20
+ };
21
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Strings owned by the catalog detail share launcher + inline access row.
3
+ * Dialog/confirm/toast strings are owned by `@gooddata/sdk-ui-ext` under the
4
+ * `objectShare.*` namespace.
5
+ */
6
+ export declare const shareMessages: {
7
+ shareButton: {
8
+ id: string;
9
+ };
10
+ accessRowLabel: {
11
+ id: string;
12
+ };
13
+ accessRowRestricted: {
14
+ id: string;
15
+ };
16
+ accessRowWorkspaceView: {
17
+ id: string;
18
+ };
19
+ accessRowWorkspaceShare: {
20
+ id: string;
21
+ };
22
+ accessRowSharedWith: {
23
+ id: string;
24
+ };
25
+ };
26
+ /**
27
+ * Strings for the labels summary + read-only labels popup in the detail header.
28
+ */
29
+ export declare const labelsMessages: {
30
+ more: {
31
+ id: string;
32
+ };
33
+ triggerAriaLabel: {
34
+ id: string;
35
+ };
36
+ popupTitle: {
37
+ id: string;
38
+ };
39
+ popupClose: {
40
+ id: string;
41
+ };
42
+ };
43
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/messages.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;CAOxB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;CAKzB,CAAC"}
@@ -0,0 +1,24 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { defineMessages } from "react-intl";
3
+ /**
4
+ * Strings owned by the catalog detail share launcher + inline access row.
5
+ * Dialog/confirm/toast strings are owned by `@gooddata/sdk-ui-ext` under the
6
+ * `objectShare.*` namespace.
7
+ */
8
+ export const shareMessages = defineMessages({
9
+ shareButton: { id: "analyticsCatalog.share.button" },
10
+ accessRowLabel: { id: "analyticsCatalog.share.access.row.label" },
11
+ accessRowRestricted: { id: "analyticsCatalog.share.access.row.restricted" },
12
+ accessRowWorkspaceView: { id: "analyticsCatalog.share.access.row.workspace.view" },
13
+ accessRowWorkspaceShare: { id: "analyticsCatalog.share.access.row.workspace.share" },
14
+ accessRowSharedWith: { id: "analyticsCatalog.share.access.row.sharedWith" },
15
+ });
16
+ /**
17
+ * Strings for the labels summary + read-only labels popup in the detail header.
18
+ */
19
+ export const labelsMessages = defineMessages({
20
+ more: { id: "analyticsCatalog.labels.more" },
21
+ triggerAriaLabel: { id: "analyticsCatalog.labels.trigger.ariaLabel" },
22
+ popupTitle: { id: "analyticsCatalog.labels.popup.title" },
23
+ popupClose: { id: "analyticsCatalog.labels.popup.close" },
24
+ });
@@ -0,0 +1,7 @@
1
+ import type { ICatalogItemAttribute, ICatalogItemFact } from "../../catalogItem/types.js";
2
+ /**
3
+ * Catalog items that can be shared: attributes and facts. Labels are sub-selected
4
+ * from inside an attribute share, not shared as standalone targets.
5
+ */
6
+ export type ShareableCatalogItem = ICatalogItemAttribute | ICatalogItemFact;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAE1F;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ // (C) 2026 GoodData Corporation
2
+ export {};
@@ -0,0 +1,31 @@
1
+ import type { IObjectShareLabel } from "@gooddata/sdk-ui-ext";
2
+ import type { ShareableCatalogItem } from "./types.js";
3
+ /**
4
+ * @internal
5
+ */
6
+ export interface IShareableLabels {
7
+ /** Display forms of the shareable attribute; empty for facts. */
8
+ labels: IObjectShareLabel[];
9
+ /**
10
+ * True while an attribute's labels are still being fetched. Facts skip the
11
+ * fetch and report `false`. Gates the dialog's Add action so a grantee can't
12
+ * be added before its labels are known.
13
+ */
14
+ loading: boolean;
15
+ /**
16
+ * True when the attribute's label fetch failed. Add stays disabled in this
17
+ * case too: a new grantee defaults to all labels, which can't be honored if
18
+ * the labels couldn't be loaded — otherwise the object would be granted with
19
+ * no label grants.
20
+ */
21
+ error: boolean;
22
+ }
23
+ /**
24
+ * Loads the labels (display forms) of a shareable attribute so the share dialog
25
+ * can scope a grantee's access per label. Facts have no labels — returns an empty
26
+ * list and skips the fetch. The result feeds {@link ObjectShareDialog}'s `labels`.
27
+ *
28
+ * @internal
29
+ */
30
+ export declare function useShareableLabels(item: ShareableCatalogItem | undefined): IShareableLabels;
31
+ //# sourceMappingURL=useShareableLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useShareableLabels.d.ts","sourceRoot":"","sources":["../../../src/catalogDetail/share/useShareableLabels.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC7B,iEAAiE;IACjE,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,KAAK,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,SAAS,GAAG,gBAAgB,CAsC3F"}
@@ -0,0 +1,37 @@
1
+ // (C) 2026 GoodData Corporation
2
+ import { useMemo } from "react";
3
+ import { objRefToString } from "@gooddata/sdk-model";
4
+ import { useBackendStrict, useCancelablePromise, useWorkspaceStrict } from "@gooddata/sdk-ui";
5
+ /**
6
+ * Loads the labels (display forms) of a shareable attribute so the share dialog
7
+ * can scope a grantee's access per label. Facts have no labels — returns an empty
8
+ * list and skips the fetch. The result feeds {@link ObjectShareDialog}'s `labels`.
9
+ *
10
+ * @internal
11
+ */
12
+ export function useShareableLabels(item) {
13
+ const backend = useBackendStrict();
14
+ const workspace = useWorkspaceStrict();
15
+ // Only attributes carry labels; facts do not.
16
+ const attributeRef = item?.type === "attribute" ? item.identifier : undefined;
17
+ const { result, status } = useCancelablePromise({
18
+ promise: attributeRef
19
+ ? () => backend
20
+ .workspace(workspace)
21
+ .attributes()
22
+ .getAttribute({ identifier: attributeRef, type: "attribute" })
23
+ : undefined,
24
+ }, [backend, workspace, attributeRef]);
25
+ const labels = useMemo(() => (result?.displayForms ?? []).map((df) => ({
26
+ ref: df.ref,
27
+ id: objRefToString(df.ref),
28
+ title: df.title,
29
+ isPrimary: df.isPrimary === true,
30
+ isDefault: df.isDefault === true,
31
+ })), [result]);
32
+ // A fact has no fetch, so it never "loads". An attribute loads until its
33
+ // fetch settles (success or error).
34
+ const loading = attributeRef !== undefined && status !== "success" && status !== "error";
35
+ const error = attributeRef !== undefined && status === "error";
36
+ return { labels, loading, error };
37
+ }
@@ -235,6 +235,10 @@ export declare const en_US: {
235
235
  text: string;
236
236
  crowdinContext: string;
237
237
  };
238
+ "analyticsCatalog.column.title.labels": {
239
+ text: string;
240
+ crowdinContext: string;
241
+ };
238
242
  "analyticsCatalog.column.title.createdBy": {
239
243
  text: string;
240
244
  crowdinContext: string;
@@ -767,5 +771,45 @@ export declare const en_US: {
767
771
  text: string;
768
772
  crowdinContext: string;
769
773
  };
774
+ "analyticsCatalog.share.button": {
775
+ text: string;
776
+ crowdinContext: string;
777
+ };
778
+ "analyticsCatalog.share.access.row.label": {
779
+ text: string;
780
+ crowdinContext: string;
781
+ };
782
+ "analyticsCatalog.share.access.row.restricted": {
783
+ text: string;
784
+ crowdinContext: string;
785
+ };
786
+ "analyticsCatalog.share.access.row.workspace.view": {
787
+ text: string;
788
+ crowdinContext: string;
789
+ };
790
+ "analyticsCatalog.share.access.row.workspace.share": {
791
+ text: string;
792
+ crowdinContext: string;
793
+ };
794
+ "analyticsCatalog.share.access.row.sharedWith": {
795
+ text: string;
796
+ crowdinContext: string;
797
+ };
798
+ "analyticsCatalog.labels.more": {
799
+ text: string;
800
+ crowdinContext: string;
801
+ };
802
+ "analyticsCatalog.labels.trigger.ariaLabel": {
803
+ text: string;
804
+ crowdinContext: string;
805
+ };
806
+ "analyticsCatalog.labels.popup.title": {
807
+ text: string;
808
+ crowdinContext: string;
809
+ };
810
+ "analyticsCatalog.labels.popup.close": {
811
+ text: string;
812
+ crowdinContext: string;
813
+ };
770
814
  };
771
815
  //# sourceMappingURL=en-US.localization-bundle.d.ts.map
@@ -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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiwBjB,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6yBjB,CAAC"}
@@ -237,6 +237,10 @@ export const en_US = {
237
237
  "text": "Dataset",
238
238
  "crowdinContext": "Title of the column containing the dataSet of the object."
239
239
  },
240
+ "analyticsCatalog.column.title.labels": {
241
+ "text": "Labels",
242
+ "crowdinContext": "Title of the header column listing the display-form labels of an attribute."
243
+ },
240
244
  "analyticsCatalog.column.title.createdBy": {
241
245
  "text": "Created by",
242
246
  "crowdinContext": "Title of the column containing the name of the creator of the object."
@@ -768,5 +772,45 @@ export const en_US = {
768
772
  "analyticsCatalog.parameter.delete.error": {
769
773
  "text": "Parameter could not be deleted.",
770
774
  "crowdinContext": "Error toast shown when parameter deletion fails."
775
+ },
776
+ "analyticsCatalog.share.button": {
777
+ "text": "Share",
778
+ "crowdinContext": "Button label opening the share dialog from the catalog detail page."
779
+ },
780
+ "analyticsCatalog.share.access.row.label": {
781
+ "text": "Access",
782
+ "crowdinContext": "Label for the row in the catalog detail metadata grid that shows the current sharing state of the object."
783
+ },
784
+ "analyticsCatalog.share.access.row.restricted": {
785
+ "text": "Restricted",
786
+ "crowdinContext": "State chip text shown when the object's access is restricted to explicitly listed grantees only."
787
+ },
788
+ "analyticsCatalog.share.access.row.workspace.view": {
789
+ "text": "All workspace users can view",
790
+ "crowdinContext": "State chip text shown when every workspace user has view access to the object."
791
+ },
792
+ "analyticsCatalog.share.access.row.workspace.share": {
793
+ "text": "All workspace users can share",
794
+ "crowdinContext": "State chip text shown when every workspace user has view+share access to the object."
795
+ },
796
+ "analyticsCatalog.share.access.row.sharedWith": {
797
+ "text": "Shared with {count, plural, one {# user or group} other {# users or groups}}",
798
+ "crowdinContext": "Clickable summary in the catalog detail Access row. Opens the share dialog. Placeholder is the count of named grantees (users and groups)."
799
+ },
800
+ "analyticsCatalog.labels.more": {
801
+ "text": "+{remaining} more",
802
+ "crowdinContext": "Count of additional labels beyond the primary one, shown as an underlined link after the primary label title in the catalog detail header (e.g. '+8 more'). Placeholder is the number of remaining labels."
803
+ },
804
+ "analyticsCatalog.labels.trigger.ariaLabel": {
805
+ "text": "Show all labels",
806
+ "crowdinContext": "Accessible name for the labels link in the catalog detail header that opens a popup listing all of the attribute's labels."
807
+ },
808
+ "analyticsCatalog.labels.popup.title": {
809
+ "text": "Labels",
810
+ "crowdinContext": "Title of the popup in the catalog detail header that lists all of an attribute's labels. Plain noun."
811
+ },
812
+ "analyticsCatalog.labels.popup.close": {
813
+ "text": "Close",
814
+ "crowdinContext": "Accessible name for the close (X) button of the labels popup in the catalog detail header."
771
815
  }
772
816
  };
@@ -1,4 +1,4 @@
1
- import { type ITranslations } from "@gooddata/sdk-ui";
1
+ import type { ITranslations } from "@gooddata/sdk-ui";
2
2
  /**
3
3
  * Resolves translation messages for the given locale.
4
4
  * Memoized to cache promises and prevent duplicate async imports.
@@ -1 +1 @@
1
- {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/localization/translations.ts"],"names":[],"mappings":"AAIA,OAAO,EAEH,KAAK,aAAa,EAErB,MAAM,kBAAkB,CAAC;AAoD1B;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAoC,CAAC;AAE5G,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,gBAAgB;;;;CAK5B,CAAC"}
1
+ {"version":3,"file":"translations.d.ts","sourceRoot":"","sources":["../../src/localization/translations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA0DtD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAoC,CAAC;AAE5G,eAAO,MAAM,gBAAgB,UAAU,CAAC;AACxC,eAAO,MAAM,gBAAgB;;;;CAK5B,CAAC"}
@@ -1,6 +1,8 @@
1
1
  // (C) 2024-2026 GoodData Corporation
2
2
  import { memoize, merge } from "lodash-es";
3
- import { DEFAULT_MESSAGES as DEFAULT_MESSAGES_SDK_UI, resolveMessages as resolveMessagesSdkUi, } from "@gooddata/sdk-ui";
3
+ // sdk-ui-ext bundles its own strings (e.g. the object-share dialog) on top of sdk-ui's,
4
+ // so resolving through ext gives us both layers in one merge.
5
+ import { DEFAULT_MESSAGES as DEFAULT_MESSAGES_SDK_UI_EXT, resolveMessages as resolveMessagesSdkUiExt, } from "@gooddata/sdk-ui-ext/internal";
4
6
  import { removeMetadata } from "@gooddata/util";
5
7
  import { en_US } from "./bundles/en-US.localization-bundle.js";
6
8
  const asyncCatalogTranslations = {
@@ -42,11 +44,11 @@ const asyncCatalogTranslations = {
42
44
  */
43
45
  const resolveMessagesInternal = async (locale) => {
44
46
  const catalogLoader = asyncCatalogTranslations[locale] || asyncCatalogTranslations["en-US"];
45
- const [catalogTranslations, sdkUiTranslations] = await Promise.all([
47
+ const [catalogTranslations, sdkUiExtTranslations] = await Promise.all([
46
48
  catalogLoader(),
47
- resolveMessagesSdkUi(locale),
49
+ resolveMessagesSdkUiExt(locale),
48
50
  ]);
49
- return merge({}, sdkUiTranslations, catalogTranslations);
51
+ return merge({}, sdkUiExtTranslations, catalogTranslations);
50
52
  };
51
53
  /**
52
54
  * Resolves translation messages for the given locale.
@@ -58,7 +60,7 @@ export const resolveMessages = memoize(resolveMessagesInternal);
58
60
  export const DEFAULT_LANGUAGE = "en-US";
59
61
  export const DEFAULT_MESSAGES = {
60
62
  [DEFAULT_LANGUAGE]: {
61
- ...DEFAULT_MESSAGES_SDK_UI[DEFAULT_LANGUAGE],
63
+ ...DEFAULT_MESSAGES_SDK_UI_EXT[DEFAULT_LANGUAGE],
62
64
  ...removeMetadata(en_US),
63
65
  },
64
66
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gooddata/sdk-ui-catalog",
3
- "version": "11.43.0-alpha.1",
3
+ "version": "11.43.0-alpha.2",
4
4
  "description": "GoodData SDK - Analytics Catalog",
5
5
  "license": "MIT",
6
6
  "author": "GoodData Corporation",
@@ -45,13 +45,14 @@
45
45
  "tslib": "2.8.1",
46
46
  "yaml": "2.8.3",
47
47
  "zod": "4.3.6",
48
- "@gooddata/sdk-backend-spi": "11.43.0-alpha.1",
49
- "@gooddata/sdk-model": "11.43.0-alpha.1",
50
- "@gooddata/sdk-ui": "11.43.0-alpha.1",
51
- "@gooddata/sdk-ui-kit": "11.43.0-alpha.1",
52
- "@gooddata/sdk-ui-semantic-search": "11.43.0-alpha.1",
53
- "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.1",
54
- "@gooddata/util": "11.43.0-alpha.1"
48
+ "@gooddata/sdk-backend-spi": "11.43.0-alpha.2",
49
+ "@gooddata/sdk-model": "11.43.0-alpha.2",
50
+ "@gooddata/sdk-ui": "11.43.0-alpha.2",
51
+ "@gooddata/sdk-ui-ext": "11.43.0-alpha.2",
52
+ "@gooddata/sdk-ui-kit": "11.43.0-alpha.2",
53
+ "@gooddata/sdk-ui-theme-provider": "11.43.0-alpha.2",
54
+ "@gooddata/sdk-ui-semantic-search": "11.43.0-alpha.2",
55
+ "@gooddata/util": "11.43.0-alpha.2"
55
56
  },
56
57
  "devDependencies": {
57
58
  "@microsoft/api-documenter": "^7.17.0",
@@ -91,11 +92,11 @@
91
92
  "typescript": "5.9.3",
92
93
  "vitest": "4.1.8",
93
94
  "vitest-dom": "0.1.1",
94
- "@gooddata/eslint-config": "11.43.0-alpha.1",
95
- "@gooddata/i18n-toolkit": "11.43.0-alpha.1",
96
- "@gooddata/oxlint-config": "11.43.0-alpha.1",
97
- "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.1",
98
- "@gooddata/stylelint-config": "11.43.0-alpha.1"
95
+ "@gooddata/eslint-config": "11.43.0-alpha.2",
96
+ "@gooddata/i18n-toolkit": "11.43.0-alpha.2",
97
+ "@gooddata/oxlint-config": "11.43.0-alpha.2",
98
+ "@gooddata/sdk-backend-mockingbird": "11.43.0-alpha.2",
99
+ "@gooddata/stylelint-config": "11.43.0-alpha.2"
99
100
  },
100
101
  "peerDependencies": {
101
102
  "react": "^18.0.0 || ^19.0.0",
@@ -151,10 +151,25 @@
151
151
  height: 100%;
152
152
  }
153
153
  .gd-analytics-catalog-detail__card {
154
+ gap: 10px;
155
+ display: flex;
156
+ flex-direction: column;
157
+ }
158
+ .gd-analytics-catalog-detail__card__top {
154
159
  gap: 20px;
155
160
  display: flex;
156
161
  flex-direction: row;
157
162
  }
163
+ .gd-analytics-catalog-detail__card__info {
164
+ display: flex;
165
+ gap: 20px;
166
+ }
167
+ .gd-analytics-catalog-detail__card__info__cell {
168
+ flex: 1 1 0;
169
+ min-width: 0;
170
+ display: flex;
171
+ flex-direction: column;
172
+ }
158
173
  .gd-analytics-catalog-detail__card__header {
159
174
  gap: 10px;
160
175
  flex-grow: 1;
@@ -249,6 +264,11 @@
249
264
  .gd-analytics-catalog-detail__detail-actions .gd-dropdown {
250
265
  display: flex;
251
266
  }
267
+ .gd-analytics-catalog-detail__header-actions {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 10px;
271
+ }
252
272
  .gd-analytics-catalog-detail__tab-content {
253
273
  display: grid;
254
274
  grid-template-columns: minmax(120px, auto) 1fr;
@@ -267,6 +287,53 @@
267
287
  .gd-analytics-catalog-detail__tab-content__cell {
268
288
  padding: 4px 0;
269
289
  }
290
+ .gd-analytics-catalog-detail__labels {
291
+ padding: 0;
292
+ border: none;
293
+ background: transparent;
294
+ color: inherit;
295
+ font: inherit;
296
+ cursor: pointer;
297
+ text-align: left;
298
+ }
299
+ .gd-analytics-catalog-detail__labels__more {
300
+ text-decoration: underline;
301
+ }
302
+ .gd-analytics-catalog-detail__labels:hover {
303
+ color: var(--gd-palette-primary-base);
304
+ }
305
+ .gd-analytics-catalog-detail__access-row {
306
+ display: flex;
307
+ flex-wrap: wrap;
308
+ align-items: center;
309
+ gap: 10px;
310
+ }
311
+ .gd-analytics-catalog-detail__access-row__chip {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ gap: 7px;
315
+ padding: 0;
316
+ background: transparent;
317
+ border: none;
318
+ color: var(--gd-palette-complementary-8);
319
+ font: inherit;
320
+ }
321
+ .gd-analytics-catalog-detail__access-row__chip-icon {
322
+ display: inline-flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ width: 26px;
326
+ height: 26px;
327
+ border-radius: 50%;
328
+ background: var(--gd-palette-complementary-2);
329
+ }
330
+ .gd-analytics-catalog-detail__access-row__shared-link {
331
+ cursor: pointer;
332
+ text-decoration: underline;
333
+ }
334
+ .gd-analytics-catalog-detail__access-row__shared-link:hover {
335
+ color: var(--gd-palette-primary-base);
336
+ }
270
337
  .gd-analytics-catalog-detail__granularities {
271
338
  margin: 0;
272
339
  padding: 0;
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/objectType.scss","../scss/parameter.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../scss/detail.scss"],"names":[],"mappings":"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","file":"detail.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../scss/objectType.scss","../scss/parameter.scss","../../node_modules/@gooddata/sdk-ui-kit/styles/scss/variables.scss","../scss/detail.scss"],"names":[],"mappings":"AAKI;EAEI;;AAGJ;EACI;;AAGJ;EACI;;AAGJ;EAEI;;AAGJ;EACI;;;ACrBR;EACI;EACA;EACA;EACA;EACA;;AAGA;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI,cC3BU;;AD+BlB;EACI;;AAGJ;EACI;EACA;EACA;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA,OC7GiB;ED8GjB;EACA;EACA;;AAEA;EACI;;;AE9GR;EACI,aDwFc;ECvFd,WAJgB;EAKhB,OAVI;EAWJ;;AAEA;EANJ;IAOQ;;;AAGJ;EAEI;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;AAIR;EACI;EACA;EACA;;AAGA;EACI;EACA;EACA;;AAIJ;EACI;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA,ODzCA;EC0CA,WAtEE;EAuEF,aAtES;EAuET;EACA;;AAEA;EACI;;AAOJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI,OD3EG;;AC8EP;EACI;EACA,OD7EJ;EC8EI;EACA;;AAGJ;EAEI;;AAGJ;EACI;EACA;EACA;EACA;;AAIR;EACI;;AAEA;EACI,ODnGJ;ECoGI,aAzHQ;EA0HR,WA3HC;EA4HD;EACA;EACA;;AAGJ;EACI,ODxGJ;ECyGI,WAjIA;EAkIA;EACA;EACA;EACA;EACA;;AAGJ;EACI,ODzHG;;AC4HP;EACI;EACA,OD3HJ;;AC+HJ;EACI;;AAEA;EACI;;AAKZ;EACI;EACA;;AAIR;EACI;EACA;EACA;;AAEA;EACI;;AAKR;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAMR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI;;AAKZ;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA,OD/PQ;ECgQR;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAKJ;EACI;;AAGJ;EACI;EACA;;AAKJ;EACI;;AAGJ;EACI,OD/RW;;ACkSf;EACI;EACA,ODjSI;;ACqSZ;EACI,ODlSQ;ECmSR;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;EACI,ODrTW;ECsTX;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;;AAEJ;EACI;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI,MD3XS;;AC6Xb;AAAA;EAEI,MD9XQ;;ACgYZ;AAAA;EAEI,MDhYO;;ACkYX;EACI;;AAEJ;EACI;;AAGJ;EACI,QDzXW;;;AC+XnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA,kBD5YS;EC6YT;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGI;EACI;EACA;;AAIR;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;EACA,kBD7bK;EC8bL;EACA;EACA,ODnbI;;ACqbJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI","file":"detail.css"}
@@ -467,10 +467,25 @@
467
467
  height: 100%;
468
468
  }
469
469
  .gd-analytics-catalog-detail__card {
470
+ gap: 10px;
471
+ display: flex;
472
+ flex-direction: column;
473
+ }
474
+ .gd-analytics-catalog-detail__card__top {
470
475
  gap: 20px;
471
476
  display: flex;
472
477
  flex-direction: row;
473
478
  }
479
+ .gd-analytics-catalog-detail__card__info {
480
+ display: flex;
481
+ gap: 20px;
482
+ }
483
+ .gd-analytics-catalog-detail__card__info__cell {
484
+ flex: 1 1 0;
485
+ min-width: 0;
486
+ display: flex;
487
+ flex-direction: column;
488
+ }
474
489
  .gd-analytics-catalog-detail__card__header {
475
490
  gap: 10px;
476
491
  flex-grow: 1;
@@ -565,6 +580,11 @@
565
580
  .gd-analytics-catalog-detail__detail-actions .gd-dropdown {
566
581
  display: flex;
567
582
  }
583
+ .gd-analytics-catalog-detail__header-actions {
584
+ display: flex;
585
+ align-items: center;
586
+ gap: 10px;
587
+ }
568
588
  .gd-analytics-catalog-detail__tab-content {
569
589
  display: grid;
570
590
  grid-template-columns: minmax(120px, auto) 1fr;
@@ -583,6 +603,53 @@
583
603
  .gd-analytics-catalog-detail__tab-content__cell {
584
604
  padding: 4px 0;
585
605
  }
606
+ .gd-analytics-catalog-detail__labels {
607
+ padding: 0;
608
+ border: none;
609
+ background: transparent;
610
+ color: inherit;
611
+ font: inherit;
612
+ cursor: pointer;
613
+ text-align: left;
614
+ }
615
+ .gd-analytics-catalog-detail__labels__more {
616
+ text-decoration: underline;
617
+ }
618
+ .gd-analytics-catalog-detail__labels:hover {
619
+ color: var(--gd-palette-primary-base);
620
+ }
621
+ .gd-analytics-catalog-detail__access-row {
622
+ display: flex;
623
+ flex-wrap: wrap;
624
+ align-items: center;
625
+ gap: 10px;
626
+ }
627
+ .gd-analytics-catalog-detail__access-row__chip {
628
+ display: inline-flex;
629
+ align-items: center;
630
+ gap: 7px;
631
+ padding: 0;
632
+ background: transparent;
633
+ border: none;
634
+ color: var(--gd-palette-complementary-8);
635
+ font: inherit;
636
+ }
637
+ .gd-analytics-catalog-detail__access-row__chip-icon {
638
+ display: inline-flex;
639
+ align-items: center;
640
+ justify-content: center;
641
+ width: 26px;
642
+ height: 26px;
643
+ border-radius: 50%;
644
+ background: var(--gd-palette-complementary-2);
645
+ }
646
+ .gd-analytics-catalog-detail__access-row__shared-link {
647
+ cursor: pointer;
648
+ text-decoration: underline;
649
+ }
650
+ .gd-analytics-catalog-detail__access-row__shared-link:hover {
651
+ color: var(--gd-palette-primary-base);
652
+ }
586
653
  .gd-analytics-catalog-detail__granularities {
587
654
  margin: 0;
588
655
  padding: 0;