@gooddata/sdk-ui-ext 11.45.0-alpha.0 → 11.45.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 (80) hide show
  1. package/NOTICE +3 -3
  2. package/esm/insightPicker/InsightPickerCore.d.ts +1 -1
  3. package/esm/insightPicker/InsightPickerCore.d.ts.map +1 -1
  4. package/esm/insightPicker/InsightPickerCore.js +2 -2
  5. package/esm/insightPicker/InsightPickerRow.d.ts +1 -2
  6. package/esm/insightPicker/InsightPickerRow.d.ts.map +1 -1
  7. package/esm/insightPicker/InsightPickerRow.js +2 -2
  8. package/esm/insightPicker/types.d.ts +0 -1
  9. package/esm/insightPicker/types.d.ts.map +1 -1
  10. package/esm/internal/components/configurationPanels/ConfigurationPanelContent.d.ts.map +1 -1
  11. package/esm/internal/components/configurationPanels/ConfigurationPanelContent.js +4 -8
  12. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/AddDataSourceSelect.d.ts.map +1 -1
  13. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/AddDataSourceSelect.js +6 -1
  14. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/DataSourceItem.d.ts.map +1 -1
  15. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/DataSourceItem.js +10 -2
  16. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/locales.d.ts +3 -0
  17. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/locales.d.ts.map +1 -1
  18. package/esm/internal/components/dialogs/userManagementDialogs/DataSources/locales.js +2 -1
  19. package/esm/internal/components/dialogs/userManagementDialogs/Details/EditUserDetails.d.ts +1 -1
  20. package/esm/internal/components/dialogs/userManagementDialogs/Details/EditUserDetails.d.ts.map +1 -1
  21. package/esm/internal/components/dialogs/userManagementDialogs/Details/detailsHooks.d.ts +1 -1
  22. package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.d.ts.map +1 -1
  23. package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.js +11 -4
  24. package/esm/internal/components/dialogs/userManagementDialogs/UserGroupEditDialog.d.ts.map +1 -1
  25. package/esm/internal/components/dialogs/userManagementDialogs/UserGroupEditDialog.js +8 -3
  26. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddSingleWorkspaceSelect.d.ts.map +1 -1
  27. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddSingleWorkspaceSelect.js +7 -2
  28. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspaceSelect.d.ts.map +1 -1
  29. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspaceSelect.js +5 -1
  30. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissionsWorkspaceItem.d.ts.map +1 -1
  31. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissionsWorkspaceItem.js +9 -2
  32. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/InheritedIcon.d.ts +12 -0
  33. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/InheritedIcon.d.ts.map +1 -0
  34. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/InheritedIcon.js +12 -0
  35. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/locales.d.ts +6 -0
  36. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/locales.d.ts.map +1 -1
  37. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/locales.js +3 -1
  38. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts +10 -2
  39. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts.map +1 -1
  40. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.js +15 -11
  41. package/esm/internal/components/dialogs/userManagementDialogs/hooks/usePermissions.d.ts +10 -3
  42. package/esm/internal/components/dialogs/userManagementDialogs/hooks/usePermissions.d.ts.map +1 -1
  43. package/esm/internal/components/dialogs/userManagementDialogs/hooks/usePermissions.js +59 -34
  44. package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts +3 -0
  45. package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts.map +1 -1
  46. package/esm/internal/components/dialogs/userManagementDialogs/locales.js +1 -0
  47. package/esm/internal/components/dialogs/userManagementDialogs/types.d.ts +20 -1
  48. package/esm/internal/components/dialogs/userManagementDialogs/types.d.ts.map +1 -1
  49. package/esm/internal/components/dialogs/userManagementDialogs/types.js +1 -1
  50. package/esm/internal/components/dialogs/userManagementDialogs/utils.d.ts +2 -0
  51. package/esm/internal/components/dialogs/userManagementDialogs/utils.d.ts.map +1 -1
  52. package/esm/internal/components/dialogs/userManagementDialogs/utils.js +40 -1
  53. package/esm/internal/components/pluggableVisualizations/baseChart/PluggableBaseChart.d.ts.map +1 -1
  54. package/esm/internal/components/pluggableVisualizations/baseChart/PluggableBaseChart.js +1 -1
  55. package/esm/internal/interfaces/Visualization.d.ts +1 -1
  56. package/esm/internal/interfaces/Visualization.d.ts.map +1 -1
  57. package/esm/internal/translations/en-US.localization-bundle.d.ts +24 -0
  58. package/esm/internal/translations/en-US.localization-bundle.d.ts.map +1 -1
  59. package/esm/internal/translations/en-US.localization-bundle.js +24 -0
  60. package/esm/internal/utils/bucketHelper.d.ts.map +1 -1
  61. package/esm/internal/utils/bucketHelper.js +10 -3
  62. package/esm/sdk-ui-ext.d.ts +55 -5
  63. package/esm/share/ObjectShareDialog.d.ts.map +1 -1
  64. package/esm/share/ObjectShareDialog.js +37 -5
  65. package/esm/share/messages.d.ts +18 -0
  66. package/esm/share/messages.d.ts.map +1 -1
  67. package/esm/share/messages.js +6 -0
  68. package/esm/share/objectShareController.types.d.ts +45 -5
  69. package/esm/share/objectShareController.types.d.ts.map +1 -1
  70. package/esm/share/useAccessList.d.ts +14 -2
  71. package/esm/share/useAccessList.d.ts.map +1 -1
  72. package/esm/share/useAccessList.js +29 -6
  73. package/esm/share/useObjectShareController.d.ts.map +1 -1
  74. package/esm/share/useObjectShareController.js +200 -2
  75. package/package.json +21 -21
  76. package/styles/css/main.css +15 -0
  77. package/styles/css/main.css.map +1 -1
  78. package/styles/internal/css/user_management_dialogs.css +15 -0
  79. package/styles/internal/css/user_management_dialogs.css.map +1 -1
  80. package/styles/internal/scss/user_management_dialogs.scss +22 -0
package/NOTICE CHANGED
@@ -7,9 +7,9 @@
7
7
 
8
8
  The following 3rd-party software packages may be used by or distributed with gooddata-ui-sdk. Any information relevant to third-party vendors listed below are collected using common, reasonable means.
9
9
 
10
- Date generated: 2026-6-29
10
+ Date generated: 2026-7-1
11
11
 
12
- Revision ID: 36e57aac551d4aee214abdfa955bf5ad1bcc2007
12
+ Revision ID: 9473b8ff1342704ff1498f54591ef2ab4c6943f4
13
13
 
14
14
  ================================================================================
15
15
  ================================================================================
@@ -29272,4 +29272,4 @@ POSSIBILITY OF SUCH DAMAGE.
29272
29272
  --------------------------------------------------------------------------------
29273
29273
  --------------------------------------------------------------------------------
29274
29274
 
29275
- Report Generated by FOSSA on 2026-6-29
29275
+ Report Generated by FOSSA on 2026-7-1
@@ -1,3 +1,3 @@
1
1
  import { type IInsightPickerProps } from "./types.js";
2
- export declare function InsightPickerCore({ backend: backendProp, workspace: workspaceProp, includeTags, excludeTags, author, enabledVisualizationClassesUrls, selectedInsightId, enableDescriptions, metadataTimeZone, searchQuery, onSearchChange, sortBy, sortDirection, onSortChange, authorFilter, onAuthorFilterChange, tagFilter, onTagFilterChange, enableSemanticSearch, maxHeight, width, onSelect, onDescriptionPanelOpen, onItemActivate, menuActions, renderMenu, renderItem: renderItemProp }: IInsightPickerProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function InsightPickerCore({ backend: backendProp, workspace: workspaceProp, includeTags, excludeTags, author, enabledVisualizationClassesUrls, selectedInsightId, metadataTimeZone, searchQuery, onSearchChange, sortBy, sortDirection, onSortChange, authorFilter, onAuthorFilterChange, tagFilter, onTagFilterChange, enableSemanticSearch, maxHeight, width, onSelect, onDescriptionPanelOpen, onItemActivate, menuActions, renderMenu, renderItem: renderItemProp }: IInsightPickerProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=InsightPickerCore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InsightPickerCore.d.ts","sourceRoot":"","sources":["../../src/insightPicker/InsightPickerCore.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAO/E,wBAAgB,iBAAiB,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,WAAW,EACX,WAAW,EACX,MAAM,EACN,+BAAoC,EACpC,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,oBAA2B,EAC3B,SAAe,EACf,KAAW,EACX,QAAQ,EACR,sBAAsB,EACtB,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EAAE,cAAc,EAC7B,EAAE,mBAAmB,2CAgOrB"}
1
+ {"version":3,"file":"InsightPickerCore.d.ts","sourceRoot":"","sources":["../../src/insightPicker/InsightPickerCore.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAA2B,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAO/E,wBAAgB,iBAAiB,CAAC,EAC9B,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,aAAa,EACxB,WAAW,EACX,WAAW,EACX,MAAM,EACN,+BAAoC,EACpC,iBAAiB,EACjB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,MAAM,EACN,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,oBAA2B,EAC3B,SAAe,EACf,KAAW,EACX,QAAQ,EACR,sBAAsB,EACtB,cAAc,EACd,WAAW,EACX,UAAU,EACV,UAAU,EAAE,cAAc,EAC7B,EAAE,mBAAmB,2CA+NrB"}
@@ -13,7 +13,7 @@ import { useInsightPickerFilters } from "./useInsightPickerFilters.js";
13
13
  import { useInsightPickerHybridSearch } from "./useInsightPickerHybridSearch.js";
14
14
  // These tab identifiers are internal keys for useInsightPagedList state — not i18n IDs.
15
15
  const tabsIds = { my: "my", all: "all" };
16
- export function InsightPickerCore({ backend: backendProp, workspace: workspaceProp, includeTags, excludeTags, author, enabledVisualizationClassesUrls = [], selectedInsightId, enableDescriptions, metadataTimeZone, searchQuery, onSearchChange, sortBy, sortDirection, onSortChange, authorFilter, onAuthorFilterChange, tagFilter, onTagFilterChange, enableSemanticSearch = true, maxHeight = 350, width = 700, onSelect, onDescriptionPanelOpen, onItemActivate, menuActions, renderMenu, renderItem: renderItemProp, }) {
16
+ export function InsightPickerCore({ backend: backendProp, workspace: workspaceProp, includeTags, excludeTags, author, enabledVisualizationClassesUrls = [], selectedInsightId, metadataTimeZone, searchQuery, onSearchChange, sortBy, sortDirection, onSortChange, authorFilter, onAuthorFilterChange, tagFilter, onTagFilterChange, enableSemanticSearch = true, maxHeight = 350, width = 700, onSelect, onDescriptionPanelOpen, onItemActivate, menuActions, renderMenu, renderItem: renderItemProp, }) {
17
17
  const intl = useIntl();
18
18
  const backend = useBackendStrict(backendProp);
19
19
  const workspace = useWorkspaceStrict(workspaceProp);
@@ -111,6 +111,6 @@ export function InsightPickerCore({ backend: backendProp, workspace: workspacePr
111
111
  sourceInsight,
112
112
  });
113
113
  }
114
- return (_jsx(InsightPickerRow, { entry: entry, type: type, width: itemWidth, isSelected: isSelected, hasMenu: hasMenu, enableDescriptions: enableDescriptions, metadataTimeZone: metadataTimeZone, menuActions: menuActions, renderMenu: renderMenu, onItemClick: handleItemClick, onDescriptionPanelOpen: onDescriptionPanelOpen }));
114
+ return (_jsx(InsightPickerRow, { entry: entry, type: type, width: itemWidth, isSelected: isSelected, hasMenu: hasMenu, metadataTimeZone: metadataTimeZone, menuActions: menuActions, renderMenu: renderMenu, onItemClick: handleItemClick, onDescriptionPanelOpen: onDescriptionPanelOpen }));
115
115
  }, renderNoData: ({ hasNoMatchingData }) => (_jsx(NoData, { notFoundLabel: intl.formatMessage(messages.noInsightsFound), noDataLabel: intl.formatMessage(messages.noInsights), hasNoMatchingData: hasNoMatchingData })) })] }));
116
116
  }
@@ -5,13 +5,12 @@ interface IInsightPickerRowProps {
5
5
  width: number;
6
6
  isSelected: boolean;
7
7
  hasMenu: boolean;
8
- enableDescriptions?: boolean;
9
8
  metadataTimeZone?: string;
10
9
  menuActions?: IInsightPickerProps["menuActions"];
11
10
  renderMenu?: IInsightPickerProps["renderMenu"];
12
11
  onItemClick: (entry: IInsightPickerItem) => void;
13
12
  onDescriptionPanelOpen?: (description: string) => void;
14
13
  }
15
- export declare function InsightPickerRow({ entry, type, width, isSelected, hasMenu, enableDescriptions, metadataTimeZone, menuActions, renderMenu, onItemClick, onDescriptionPanelOpen }: IInsightPickerRowProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare function InsightPickerRow({ entry, type, width, isSelected, hasMenu, metadataTimeZone, menuActions, renderMenu, onItemClick, onDescriptionPanelOpen }: IInsightPickerRowProps): import("react/jsx-runtime").JSX.Element;
16
15
  export {};
17
16
  //# sourceMappingURL=InsightPickerRow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"InsightPickerRow.d.ts","sourceRoot":"","sources":["../../src/insightPicker/InsightPickerRow.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE/E,UAAU,sBAAsB;IAC5B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAU,EACV,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACzB,EAAE,sBAAsB,2CAwCxB"}
1
+ {"version":3,"file":"InsightPickerRow.d.ts","sourceRoot":"","sources":["../../src/insightPicker/InsightPickerRow.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE/E,UAAU,sBAAsB;IAC5B,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAC/C,WAAW,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,sBAAsB,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1D;AAED,wBAAgB,gBAAgB,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAU,EACV,OAAO,EACP,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,WAAW,EACX,sBAAsB,EACzB,EAAE,sBAAsB,2CAwCxB"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback } from "react";
4
4
  import { InsightListItem } from "@gooddata/sdk-ui-kit";
5
5
  import { InsightPickerMenu } from "./InsightPickerMenu.js";
6
- export function InsightPickerRow({ entry, type, width, isSelected, hasMenu, enableDescriptions, metadataTimeZone, menuActions, renderMenu, onItemClick, onDescriptionPanelOpen, }) {
6
+ export function InsightPickerRow({ entry, type, width, isSelected, hasMenu, metadataTimeZone, menuActions, renderMenu, onItemClick, onDescriptionPanelOpen, }) {
7
7
  const handleRowClick = useCallback((e) => {
8
8
  const target = e.target;
9
9
  if (target.closest('[data-id="menu-button"]')) {
@@ -14,5 +14,5 @@ export function InsightPickerRow({ entry, type, width, isSelected, hasMenu, enab
14
14
  return (_jsxs("div", { className: hasMenu
15
15
  ? "gd-ui-ext-insight-picker-row gd-ui-ext-insight-picker-row--with-menu"
16
16
  : "gd-ui-ext-insight-picker-row", onClick: handleRowClick, children: [
17
- _jsx(InsightListItem, { title: entry.title, description: entry.description?.trim(), showDescriptionPanel: enableDescriptions, type: type, width: hasMenu ? width - 36 : width, updated: entry.updated ?? entry.created, isLocked: entry.isLocked, isSelected: isSelected, onDescriptionPanelOpen: onDescriptionPanelOpen ? () => onDescriptionPanelOpen(entry.description ?? "") : undefined, metadataTimeZone: metadataTimeZone }), hasMenu ? (_jsx(InsightPickerMenu, { item: entry, menuActions: menuActions, renderMenu: renderMenu })) : null] }));
17
+ _jsx(InsightListItem, { title: entry.title, description: entry.description?.trim(), showDescriptionPanel: true, type: type, width: hasMenu ? width - 36 : width, updated: entry.updated ?? entry.created, isLocked: entry.isLocked, isSelected: isSelected, onDescriptionPanelOpen: onDescriptionPanelOpen ? () => onDescriptionPanelOpen(entry.description ?? "") : undefined, metadataTimeZone: metadataTimeZone }), hasMenu ? (_jsx(InsightPickerMenu, { item: entry, menuActions: menuActions, renderMenu: renderMenu })) : null] }));
18
18
  }
@@ -81,7 +81,6 @@ export interface IInsightPickerProps {
81
81
  author?: string;
82
82
  enabledVisualizationClassesUrls?: string[];
83
83
  selectedInsightId?: string;
84
- enableDescriptions?: boolean;
85
84
  metadataTimeZone?: string;
86
85
  enableSemanticSearch?: boolean;
87
86
  maxHeight?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/insightPicker/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/insightPicker/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigurationPanelContent.d.ts","sourceRoot":"","sources":["../../../../src/internal/components/configurationPanels/ConfigurationPanelContent.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,qBAAqB,EAG7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACH,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAChC,MAAM,mCAAmC,CAAC;AAoB3C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,+BAA+B,CAAC,WAAW,GAAG,GAAG;IAC9D,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2BAA2B,CAAC,EAAE,4BAA4B,CAAC;IAC3D;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,8BAAsB,yBAAyB,CAC3C,CAAC,SAAS,+BAA+B,GAAG,+BAA+B,CAC7E,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtB,OAAc,YAAY,EAAE,+BAA+B,CAgBzD;IAEF,SAAS,CAAC,uBAAuB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAExD,YAAY,KAAK,EAAE,CAAC,EAGnB;IAEe,MAAM,4CAQrB;IAED,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,SAAS,CAAC;IAEzD;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAG/D;IAED,SAAS,CAAC,kBAAkB,IAAI,SAAS,CAsBxC;IAED,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAYzC;IAED,SAAS,CAAC,yBAAyB,IAAI,SAAS,CA0C/C;IAED,SAAS,CAAC,qBAAqB,IAAI,SAAS,CAsB3C;IAED,SAAS,CAAC,sBAAsB,IAAI,SAAS,CAqC5C;IAED,SAAS,CAAC,0BAA0B,IAAI,SAAS,CAehD;IAED,SAAS,CAAC,qBAAqB,IAAI,SAAS,CAU3C;CACJ"}
1
+ {"version":3,"file":"ConfigurationPanelContent.d.ts","sourceRoot":"","sources":["../../../../src/internal/components/configurationPanels/ConfigurationPanelContent.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,qBAAqB,EAG7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,SAAS,EAAiB,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACH,KAAK,4BAA4B,EACjC,KAAK,eAAe,EACpB,KAAK,WAAW,EAChB,KAAK,wBAAwB,EAChC,MAAM,mCAAmC,CAAC;AAoB3C,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,MAAM,WAAW,+BAA+B,CAAC,WAAW,GAAG,GAAG;IAC9D,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,UAAU,CAAC,EAAE,WAAW,CAAC;IACzB,cAAc,CAAC,EAAE,eAAe,CAAC;IACjC,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,2BAA2B,CAAC,EAAE,4BAA4B,CAAC;IAC3D;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED,8BAAsB,yBAAyB,CAC3C,CAAC,SAAS,+BAA+B,GAAG,+BAA+B,CAC7E,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtB,OAAc,YAAY,EAAE,+BAA+B,CAgBzD;IAEF,SAAS,CAAC,uBAAuB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAExD,YAAY,KAAK,EAAE,CAAC,EAGnB;IAEe,MAAM,4CAQrB;IAED,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,SAAS,CAAC;IAEzD;;;OAGG;IACH,SAAS,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,WAAW,GAAG,OAAO,CAG/D;IAED,SAAS,CAAC,kBAAkB,IAAI,SAAS,CAsBxC;IAED,SAAS,CAAC,mBAAmB,IAAI,SAAS,CAYzC;IAED,SAAS,CAAC,yBAAyB,IAAI,SAAS,CAwC/C;IAED,SAAS,CAAC,qBAAqB,IAAI,SAAS,CAiB3C;IAED,SAAS,CAAC,sBAAsB,IAAI,SAAS,CAqC5C;IAED,SAAS,CAAC,0BAA0B,IAAI,SAAS,CAehD;IAED,SAAS,CAAC,qBAAqB,IAAI,SAAS,CAU3C;CACJ"}
@@ -63,16 +63,15 @@ export class ConfigurationPanelContent extends PureComponent {
63
63
  }
64
64
  renderInteractionsSection() {
65
65
  const { pushData, properties, propertiesMeta, panelConfig, configurationPanelRenderers, featureFlags, insight, } = this.props;
66
- const isAlertingEnabled = featureFlags?.enableAlerting;
67
- const isScheduledExportsEnabled = featureFlags?.enableScheduling;
68
66
  const showImplicitDrillToUrl = isInsightSupportedForImplicitDrillToUrl(insight);
69
67
  const supportsKeyDriveAnalysis = featureFlags?.enableChangeAnalysis;
70
68
  const insightSupportsScheduledExports = isInsightSupportedForScheduledExports(insight);
71
69
  const insightSupportsAlerts = isInsightSupportedForAlerts(insight);
72
- const supportsAlertsConfiguration = insightSupportsAlerts && isAlertingEnabled;
73
- const supportsScheduledExportsConfiguration = insightSupportsScheduledExports && isScheduledExportsEnabled;
70
+ const supportsAlertsConfiguration = insightSupportsAlerts;
71
+ const supportsScheduledExportsConfiguration = insightSupportsScheduledExports;
74
72
  const metrics = insight ? insightMeasures(insight) : [];
75
73
  return supportsAlertsConfiguration ||
74
+ supportsScheduledExportsConfiguration ||
76
75
  panelConfig?.supportsAttributeHierarchies ||
77
76
  showImplicitDrillToUrl ? (_jsx(InteractionsSection, { metrics: metrics, areControlsDisabledGetter: this.isControlDisabled, properties: properties, propertiesMeta: propertiesMeta, pushData: pushData, supportsAlertConfiguration: !!supportsAlertsConfiguration, supportsDrillDownConfiguration: panelConfig?.supportsAttributeHierarchies, supportsScheduledExportsConfiguration: !!supportsScheduledExportsConfiguration, InteractionsDetailRenderer: configurationPanelRenderers?.InteractionsDetailRenderer, showImplicitDrillToUrl: showImplicitDrillToUrl, supportsKeyDriveAnalysis: supportsKeyDriveAnalysis,
78
77
  // enableDrillToUrlByDefault is actually not a feature flag, but setting
@@ -80,10 +79,7 @@ export class ConfigurationPanelContent extends PureComponent {
80
79
  enableDrillToUrlByDefault: featureFlags?.enableDrillToUrlByDefault })) : null;
81
80
  }
82
81
  renderForecastSection() {
83
- const { pushData, properties, propertiesMeta, type, featureFlags, referencePoint, insight } = this.props;
84
- if (!featureFlags?.["enableSmartFunctions"]) {
85
- return null;
86
- }
82
+ const { pushData, properties, propertiesMeta, type, referencePoint, insight } = this.props;
87
83
  const { enabled, visible } = isForecastEnabled(referencePoint, insight, type);
88
84
  if (!visible) {
89
85
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"AddDataSourceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/AddDataSourceSelect.tsx"],"names":[],"mappings":"AAaA,OAAO,EACH,KAAK,yBAAyB,EAKjC,MAAM,aAAa,CAAC;AAerB,wBAAgB,mBAAmB,CAAC,EAChC,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACrB,EAAE,yBAAyB,2CAwF3B"}
1
+ {"version":3,"file":"AddDataSourceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/AddDataSourceSelect.tsx"],"names":[],"mappings":"AAaA,OAAO,EACH,KAAK,yBAAyB,EAKjC,MAAM,aAAa,CAAC;AAerB,wBAAgB,mBAAmB,CAAC,EAChC,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACrB,EAAE,yBAAyB,2CA6F3B"}
@@ -40,7 +40,12 @@ export function AddDataSourceSelect({ addedDataSources, grantedDataSources, onSe
40
40
  e.preventDefault();
41
41
  }
42
42
  }, []);
43
- const usedDataSources = useMemo(() => (grantedDataSources ? [...addedDataSources, ...grantedDataSources] : []), [addedDataSources, grantedDataSources]);
43
+ // Inherited data sources stay selectable so a direct grant can be added on top of inherited access;
44
+ // only data sources already granted directly are excluded from the picker.
45
+ const usedDataSources = useMemo(() => [
46
+ ...addedDataSources,
47
+ ...(grantedDataSources?.filter((dataSource) => !dataSource.isInherited) ?? []),
48
+ ], [addedDataSources, grantedDataSources]);
44
49
  const filterOption = (option) => {
45
50
  const dataSource = option.value;
46
51
  return !usedDataSources.some((usedDataSource) => {
@@ -1 +1 @@
1
- {"version":3,"file":"DataSourceItem.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/DataSourceItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAM1C,OAAO,EAAE,KAAK,2BAA2B,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAexF,UAAU,kCAAkC;IACxC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,2BAA2B,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;CAC3E;AAED,wBAAgB,cAAc,CAAC,EAC3B,UAAU,EACV,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACvB,EAAE,kCAAkC,2CAuBpC"}
1
+ {"version":3,"file":"DataSourceItem.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/DataSourceItem.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAO1C,OAAO,EAAE,KAAK,2BAA2B,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAiBxF,UAAU,kCAAkC;IACxC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,WAAW,EAAE,2BAA2B,CAAC;IACzC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjD,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;CAC3E;AAED,wBAAgB,cAAc,CAAC,EAC3B,UAAU,EACV,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACvB,EAAE,kCAAkC,2CAqCpC"}
@@ -1,6 +1,9 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import cx from "classnames";
3
+ import { useIntl } from "react-intl";
3
4
  import { IconDataSource } from "@gooddata/sdk-ui-kit";
5
+ import { InheritedIcon } from "../Workspace/WorkspaceItem/InheritedIcon.js";
6
+ import { dataSourcePermissionMessages } from "./locales.js";
4
7
  import { PermissionsDropdown } from "./PermissionsDropdown.js";
5
8
  import { usePermissionsDropdownState } from "./usePermissionsDropdownState.js";
6
9
  function DataSourceIcon() {
@@ -8,9 +11,14 @@ function DataSourceIcon() {
8
11
  }
9
12
  export function DataSourceItem({ dataSource, subjectType, onChange, onDelete, renderDataSourceIcon, }) {
10
13
  const { isDropdownOpen, toggleDropdown } = usePermissionsDropdownState();
14
+ const intl = useIntl();
15
+ // Data sources inherited via a user group cannot be revoked or edited at the subject level, so
16
+ // they are rendered read-only: no permission dropdown, just the level and a lock marker.
17
+ const isInherited = !!dataSource.isInherited;
11
18
  const itemClassName = cx("s-user-management-data-source-item", "gd-share-dialog-grantee-item", {
12
19
  "is-active": isDropdownOpen,
20
+ "is-inherited": isInherited,
13
21
  });
14
- return (_jsxs("div", { className: itemClassName, children: [
15
- _jsx(PermissionsDropdown, { dataSource: dataSource, subjectType: subjectType, isDropdownOpen: isDropdownOpen, toggleDropdown: toggleDropdown, onChange: onChange, onDelete: onDelete, className: "gd-grantee-granular-permission" }), _jsx("div", { className: "gd-grantee-content", children: _jsx("div", { className: "gd-grantee-content-label", children: dataSource.title }) }), renderDataSourceIcon ? renderDataSourceIcon(dataSource) : _jsx(DataSourceIcon, {})] }));
22
+ return (_jsxs("div", { className: itemClassName, children: [isInherited ? (_jsx(InheritedIcon, { tooltipMessage: intl.formatMessage(dataSourcePermissionMessages.inherited) })) : (_jsx(PermissionsDropdown, { dataSource: dataSource, subjectType: subjectType, isDropdownOpen: isDropdownOpen, toggleDropdown: toggleDropdown, onChange: onChange, onDelete: onDelete, className: "gd-grantee-granular-permission" })), _jsxs("div", { className: "gd-grantee-content", children: [
23
+ _jsx("div", { className: "gd-grantee-content-label", children: dataSource.title }), isInherited ? (_jsx("div", { className: "gd-grantee-content-label gd-grantee-content-email", children: intl.formatMessage(dataSourcePermissionMessages[dataSource.permission]) })) : null] }), renderDataSourceIcon ? renderDataSourceIcon(dataSource) : _jsx(DataSourceIcon, {})] }));
16
24
  }
@@ -8,5 +8,8 @@ export declare const dataSourcePermissionMessages: {
8
8
  remove: {
9
9
  id: string;
10
10
  };
11
+ inherited: {
12
+ id: string;
13
+ };
11
14
  };
12
15
  //# sourceMappingURL=locales.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/locales.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B;;;;;;;;;;CAIvC,CAAC"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/DataSources/locales.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;CAKvC,CAAC"}
@@ -1,7 +1,8 @@
1
- // (C) 2023-2024 GoodData Corporation
1
+ // (C) 2023-2026 GoodData Corporation
2
2
  import { defineMessages } from "react-intl";
3
3
  export const dataSourcePermissionMessages = defineMessages({
4
4
  MANAGE: { id: "userManagement.dataSources.permission.manage" },
5
5
  USE: { id: "userManagement.dataSources.permission.use" },
6
6
  remove: { id: "userManagement.dataSources.permission.remove" },
7
+ inherited: { id: "userManagement.dataSource.inherited" },
7
8
  });
@@ -9,7 +9,7 @@ export interface IEditUserDetailsProps {
9
9
  onSubmit: (user: IUser, isAdmin: boolean) => void;
10
10
  onCancel: () => void;
11
11
  onClose: () => void;
12
- removeAdminGroup: () => void;
12
+ removeAdminGroup: () => Promise<void>;
13
13
  }
14
14
  export declare function EditUserDetails({ user, isBootstrapUser, isAdmin, enableBackButton, changeUserMembership, isSystemAccountFilteringEnabled, onSubmit, onCancel, onClose, removeAdminGroup }: IEditUserDetailsProps): import("react/jsx-runtime").JSX.Element;
15
15
  //# sourceMappingURL=EditUserDetails.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"EditUserDetails.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/EditUserDetails.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AASjD,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,IAAI,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,EAC5B,IAAI,EACJ,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,gBAAgB,EACnB,EAAE,qBAAqB,2CAgDvB"}
1
+ {"version":3,"file":"EditUserDetails.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/EditUserDetails.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AASjD,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACzC;AAED,wBAAgB,eAAe,CAAC,EAC5B,IAAI,EACJ,eAAe,EACf,OAAO,EACP,gBAAgB,EAChB,oBAAoB,EACpB,+BAA+B,EAC/B,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,gBAAgB,EACnB,EAAE,qBAAqB,2CAgDvB"}
@@ -1,5 +1,5 @@
1
1
  import { type IUser, type IUserGroup } from "@gooddata/sdk-model";
2
- export declare const useUserDetails: (user: IUser | undefined, isAdmin: boolean, onSubmit: (user: IUser, isAdmin: boolean) => void, onCancel: () => void, removeAdminGroup: () => void, isSystemAccountFilteringEnabled?: boolean) => {
2
+ export declare const useUserDetails: (user: IUser | undefined, isAdmin: boolean, onSubmit: (user: IUser, isAdmin: boolean) => void, onCancel: () => void, removeAdminGroup: () => Promise<void>, isSystemAccountFilteringEnabled?: boolean) => {
3
3
  updatedUser: IUser | undefined;
4
4
  isUpdatedAdmin: boolean;
5
5
  onChange: (user: IUser, isAdmin: boolean) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"UserEditDialog.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/UserEditDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,OAAO,CAAC;AA0B7D,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACH,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACjB,MAAM,YAAY,CAAC;AAUpB;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;IACxE,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B;AA2QD;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAAyC,CAAC"}
1
+ {"version":3,"file":"UserEditDialog.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/UserEditDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,OAAO,CAAC;AA0B7D,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EACH,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACjB,MAAM,YAAY,CAAC;AAUpB;;GAEG;AACH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;IACxE,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B;AAmRD;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAAyC,CAAC"}
@@ -28,8 +28,15 @@ function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, o
28
28
  const { dialogMode, setDialogMode } = useUserDialogMode(initialView);
29
29
  const { user, isCurrentlyAdmin, onUserDetailsChanged, setIsAdmin, error, isLoading: userIsLoading, } = useUser(userId, organizationId, isAdmin, onSuccess);
30
30
  const { isBootstrapUser, bootstrapUserGroupId } = useOrganizationDetails(organizationId);
31
- const { grantedWorkspaces, onWorkspacesChanged, removeGrantedWorkspace, updateGrantedWorkspace, grantedDataSources, onDataSourcesChanged, removeGrantedDataSource, updateGrantedDataSource, } = usePermissions(userId, "user", organizationId, onSuccess);
32
- const { grantedUserGroups, onUserGroupsChanged, removeGrantedUserGroup, removeAdminGroup } = useUserGroups(userId, organizationId, bootstrapUserGroupId, onSuccess, setIsAdmin);
31
+ const { grantedWorkspaces, onWorkspacesChanged, removeGrantedWorkspace, updateGrantedWorkspace, grantedDataSources, onDataSourcesChanged, removeGrantedDataSource, updateGrantedDataSource, reloadPermissions, } = usePermissions({ id: userId, subjectType: "user", organizationId, onSuccess });
32
+ const { grantedUserGroups, onUserGroupsChanged, removeGrantedUserGroup, removeAdminGroup } = useUserGroups({
33
+ userId,
34
+ organizationId,
35
+ bootstrapUserGroupId: bootstrapUserGroupId,
36
+ onSuccess,
37
+ setIsAdmin,
38
+ onMembershipChanged: reloadPermissions,
39
+ });
33
40
  const { tabs, selectedTabId, setSelectedTabId } = useUserDialogTabs(grantedWorkspaces, grantedUserGroups, grantedDataSources, isCurrentlyAdmin, selectedTab);
34
41
  const { isConfirmDeleteOpened, onOpenDeleteDialog, onCloseDeleteDialog, dialogOverlayClassNames, dialogWrapperClassNames, } = useDeleteDialog();
35
42
  const { deleteUser, isDeleteUserProcessing } = useDeleteUser(userId, organizationId, onSuccess, onClose);
@@ -70,9 +77,9 @@ function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, o
70
77
  setWorkspaceToEdit(workspace);
71
78
  setDialogMode("WORKSPACE");
72
79
  };
73
- const handleWorkspaceChanged = (workspaces) => {
80
+ const handleWorkspaceChanged = () => {
74
81
  setWorkspaceToEdit(undefined);
75
- onWorkspacesChanged(workspaces);
82
+ onWorkspacesChanged();
76
83
  };
77
84
  const handleWorkspaceCancel = () => {
78
85
  setWorkspaceToEdit(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"UserGroupEditDialog.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/UserGroupEditDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,OAAO,CAAC;AA0B7D,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,KAAK,kBAAkB,EAA0B,KAAK,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAU3G;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;CAC3E;AAwQD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;CAA8C,CAAC"}
1
+ {"version":3,"file":"UserGroupEditDialog.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/UserGroupEditDialog.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAqB,MAAM,OAAO,CAAC;AA0B7D,OAAO,EAAE,KAAK,mBAAmB,EAAiB,MAAM,uBAAuB,CAAC;AAChF,OAAO,EAAE,KAAK,kBAAkB,EAA0B,KAAK,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAU3G;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IAClE,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,KAAK,YAAY,CAAC;CAC3E;AA6QD;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;CAA8C,CAAC"}
@@ -27,7 +27,12 @@ function UserGroupEditDialogComponent({ userGroupId, organizationId, isAdmin, on
27
27
  const intl = useIntl();
28
28
  const { dialogMode, setDialogMode } = useUserGroupDialogMode(initialView);
29
29
  const { userGroup, onUserGroupDetailsChanged, error, isLoading: userGroupIsLoading, } = useUserGroup(userGroupId, organizationId, onSuccess);
30
- const { grantedWorkspaces, onWorkspacesChanged, removeGrantedWorkspace, updateGrantedWorkspace, grantedDataSources, onDataSourcesChanged, removeGrantedDataSource, updateGrantedDataSource, } = usePermissions(userGroupId, "userGroup", organizationId, onSuccess);
30
+ const { grantedWorkspaces, onWorkspacesChanged, removeGrantedWorkspace, updateGrantedWorkspace, grantedDataSources, onDataSourcesChanged, removeGrantedDataSource, updateGrantedDataSource, } = usePermissions({
31
+ id: userGroupId,
32
+ subjectType: "userGroup",
33
+ organizationId,
34
+ onSuccess,
35
+ });
31
36
  const { grantedUsers, onUsersChanged, removeGrantedUsers } = useUsers(userGroupId, organizationId, onSuccess);
32
37
  const { tabs, selectedTabId, setSelectedTabId } = useUserGroupDialogTabs(grantedWorkspaces, grantedUsers, grantedDataSources, isAdmin);
33
38
  const { isConfirmDeleteOpened, onOpenDeleteDialog, onCloseDeleteDialog, dialogOverlayClassNames, dialogWrapperClassNames, } = useDeleteDialog();
@@ -67,9 +72,9 @@ function UserGroupEditDialogComponent({ userGroupId, organizationId, isAdmin, on
67
72
  setWorkspaceToEdit(workspace);
68
73
  setDialogMode("WORKSPACE");
69
74
  };
70
- const handleWorkspaceChanged = (workspaces) => {
75
+ const handleWorkspaceChanged = () => {
71
76
  setWorkspaceToEdit(undefined);
72
- onWorkspacesChanged(workspaces);
77
+ onWorkspacesChanged();
73
78
  };
74
79
  const handleWorkspaceCancel = () => {
75
80
  setWorkspaceToEdit(undefined);
@@ -1 +1 @@
1
- {"version":3,"file":"AddSingleWorkspaceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddSingleWorkspaceSelect.tsx"],"names":[],"mappings":"AAYA,OAAO,EACH,KAAK,8BAA8B,EAKtC,MAAM,aAAa,CAAC;AAgBrB,wBAAgB,wBAAwB,CAAC,EACrC,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,IAAa,EAChB,EAAE,8BAA8B,2CA0GhC"}
1
+ {"version":3,"file":"AddSingleWorkspaceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddSingleWorkspaceSelect.tsx"],"names":[],"mappings":"AAYA,OAAO,EACH,KAAK,8BAA8B,EAKtC,MAAM,aAAa,CAAC;AAgBrB,wBAAgB,wBAAwB,CAAC,EACrC,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,IAAa,EAChB,EAAE,8BAA8B,2CA4GhC"}
@@ -38,10 +38,15 @@ export function AddSingleWorkspaceSelect({ addedWorkspace, grantedWorkspaces, on
38
38
  e.preventDefault();
39
39
  }
40
40
  }, []);
41
- const usedWorkspace = useMemo(() => (addedWorkspace ? [addedWorkspace, ...(grantedWorkspaces ?? [])] : grantedWorkspaces), [addedWorkspace, grantedWorkspaces]);
41
+ // Inherited workspaces stay selectable so a direct grant can be added on top of inherited access;
42
+ // only workspaces already granted directly are excluded from the picker.
43
+ const usedWorkspace = useMemo(() => {
44
+ const directlyGranted = grantedWorkspaces?.filter((workspace) => !workspace.isInherited) ?? [];
45
+ return addedWorkspace ? [addedWorkspace, ...directlyGranted] : directlyGranted;
46
+ }, [addedWorkspace, grantedWorkspaces]);
42
47
  const filterOption = (option) => {
43
48
  const workspace = option.value;
44
- return !usedWorkspace?.some((usedWorkspace) => {
49
+ return !usedWorkspace.some((usedWorkspace) => {
45
50
  return usedWorkspace.id === workspace.id;
46
51
  });
47
52
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AddWorkspaceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspaceSelect.tsx"],"names":[],"mappings":"AAaA,OAAO,EACH,KAAK,wBAAwB,EAKhC,MAAM,aAAa,CAAC;AAerB,wBAAgB,kBAAkB,CAAC,EAC/B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACpB,EAAE,wBAAwB,2CAsF1B"}
1
+ {"version":3,"file":"AddWorkspaceSelect.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspaceSelect.tsx"],"names":[],"mappings":"AAaA,OAAO,EACH,KAAK,wBAAwB,EAKhC,MAAM,aAAa,CAAC;AAerB,wBAAgB,kBAAkB,CAAC,EAC/B,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACpB,EAAE,wBAAwB,2CA2F1B"}
@@ -40,7 +40,11 @@ export function AddWorkspaceSelect({ addedWorkspaces, grantedWorkspaces, onSelec
40
40
  e.preventDefault();
41
41
  }
42
42
  }, []);
43
- const usedWorkspace = useMemo(() => (grantedWorkspaces ? [...addedWorkspaces, ...grantedWorkspaces] : []), [addedWorkspaces, grantedWorkspaces]);
43
+ // Inherited workspaces stay selectable so a direct grant can be added on top of inherited access;
44
+ // only workspaces already granted directly are excluded from the picker.
45
+ const usedWorkspace = useMemo(() => grantedWorkspaces
46
+ ? [...addedWorkspaces, ...grantedWorkspaces.filter((workspace) => !workspace.isInherited)]
47
+ : [], [addedWorkspaces, grantedWorkspaces]);
44
48
  const filterOption = (option) => {
45
49
  const workspace = option.value;
46
50
  return !usedWorkspace.some((usedWorkspace) => {
@@ -1 +1 @@
1
- {"version":3,"file":"GranularPermissionsWorkspaceItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissionsWorkspaceItem.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAOxD,UAAU,sCAAsC;IAC5C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,gCAAgC,CAAC,EAC7C,SAAS,EACT,QAAQ,EACR,OAAO,EACV,EAAE,sCAAsC,2CAuBxC"}
1
+ {"version":3,"file":"GranularPermissionsWorkspaceItem.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissionsWorkspaceItem.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAQxD,UAAU,sCAAsC;IAC5C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,gCAAgC,CAAC,EAC7C,SAAS,EACT,QAAQ,EACR,OAAO,EACV,EAAE,sCAAsC,2CAwCxC"}
@@ -2,20 +2,27 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // (C) 2024-2026 GoodData Corporation
3
3
  import cx from "classnames";
4
4
  import { useIntl } from "react-intl";
5
+ import { WorkspaceAccessSourceValue } from "@gooddata/sdk-model";
5
6
  import { RemoveIcon } from "../../RemoveIcon.js";
6
7
  import { getHumanReadablePermissionsTitle } from "./granularPermissionUtils.js";
8
+ import { InheritedIcon } from "./InheritedIcon.js";
7
9
  import { workspaceGranularPermissionMessages } from "./locales.js";
8
10
  import { usePermissionsDropdownState } from "./usePermissionsDropdownState.js";
9
11
  import { WorkspaceIcon } from "./WorkspaceIcon.js";
10
12
  export function GranularPermissionsWorkspaceItem({ workspace, onDelete, onClick, }) {
11
13
  const { isDropdownOpen } = usePermissionsDropdownState();
12
14
  const intl = useIntl();
15
+ // Inherited workspaces (via a user group or a parent workspace) cannot be revoked or edited at
16
+ // the subject level, so they are rendered read-only: no remove icon, no click-to-edit, just a marker.
17
+ const isInherited = !!workspace.isInherited;
13
18
  const itemClassName = cx("s-user-management-workspace-item", "gd-share-dialog-grantee-item", {
14
19
  "is-active": isDropdownOpen,
20
+ "is-inherited": isInherited,
15
21
  });
16
22
  const subtitle = getHumanReadablePermissionsTitle(workspace.permissions, intl);
17
- return (_jsxs("div", { className: itemClassName, children: [
18
- _jsx(RemoveIcon, { tooltipMessage: intl.formatMessage(workspaceGranularPermissionMessages.remove), onClick: () => onDelete(workspace) }), _jsxs("div", { className: "gd-grantee-content", onClick: () => onClick?.(workspace), children: [
23
+ return (_jsxs("div", { className: itemClassName, children: [isInherited ? (_jsx(InheritedIcon, { tooltipMessage: intl.formatMessage(workspace.accessSource === WorkspaceAccessSourceValue.HIERARCHY
24
+ ? workspaceGranularPermissionMessages.inheritedFromHierarchy
25
+ : workspaceGranularPermissionMessages.inheritedFromGroup) })) : (_jsx(RemoveIcon, { tooltipMessage: intl.formatMessage(workspaceGranularPermissionMessages.remove), onClick: () => onDelete(workspace) })), _jsxs("div", { className: "gd-grantee-content", onClick: isInherited ? undefined : () => onClick?.(workspace), children: [
19
26
  _jsx("div", { className: "gd-grantee-content-label", children: workspace.title }), _jsx("div", { className: "gd-grantee-content-label gd-grantee-content-email", title: subtitle, children: subtitle })
20
27
  ] }), _jsx(WorkspaceIcon, {})
21
28
  ] }));
@@ -0,0 +1,12 @@
1
+ interface IInheritedIconProps {
2
+ tooltipMessage: string;
3
+ }
4
+ /**
5
+ * Marks a workspace row whose access is inherited - through a user group or a parent workspace's
6
+ * hierarchy permission - rather than assigned directly. It replaces the remove action (which does not
7
+ * apply to inherited access) with a non-interactive lock icon plus a tooltip explaining that the
8
+ * access is read-only and managed where it is granted.
9
+ */
10
+ export declare function InheritedIcon({ tooltipMessage }: IInheritedIconProps): import("react/jsx-runtime").JSX.Element;
11
+ export {};
12
+ //# sourceMappingURL=InheritedIcon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InheritedIcon.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/InheritedIcon.tsx"],"names":[],"mappings":"AAIA,UAAU,mBAAmB;IACzB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,cAAc,EAAE,EAAE,mBAAmB,2CAkBpE"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // (C) 2026 GoodData Corporation
3
+ import { UiIcon, UiTooltip } from "@gooddata/sdk-ui-kit";
4
+ /**
5
+ * Marks a workspace row whose access is inherited - through a user group or a parent workspace's
6
+ * hierarchy permission - rather than assigned directly. It replaces the remove action (which does not
7
+ * apply to inherited access) with a non-interactive lock icon plus a tooltip explaining that the
8
+ * access is read-only and managed where it is granted.
9
+ */
10
+ export function InheritedIcon({ tooltipMessage }) {
11
+ return (_jsx("div", { className: "gd-grantee-item-inherited s-user-management-workspace-inherited", children: _jsx(UiTooltip, { triggerBy: ["hover", "focus"], hoverOpenDelay: 0, hoverCloseDelay: 0, arrowPlacement: "left", optimalPlacement: true, anchor: _jsx("div", { "aria-label": tooltipMessage, children: _jsx(UiIcon, { type: "lock", size: 14, color: "currentColor", layout: "block" }) }), content: tooltipMessage }) }));
12
+ }
@@ -82,6 +82,12 @@ export declare const workspaceGranularPermissionMessages: {
82
82
  and: {
83
83
  id: string;
84
84
  };
85
+ inheritedFromGroup: {
86
+ id: string;
87
+ };
88
+ inheritedFromHierarchy: {
89
+ id: string;
90
+ };
85
91
  };
86
92
  export declare const granularTooltipMessages: {
87
93
  EXPORT: {
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/locales.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAErF,eAAO,MAAM,8BAA8B;;;;;;;CAGzC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;CAStC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;CAmB9B,CAAC;AAEF,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgB9C,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;CAOlC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;CAuBtC,CAAC;AAEF,eAAO,MAAM,gCAAgC;;CAQ5C,CAAC;AAEF,eAAO,MAAM,uCAAuC;;CAWnD,CAAC"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/locales.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAErF,eAAO,MAAM,8BAA8B;;;;;;;CAGzC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;CAStC,CAAC;AAEH,eAAO,MAAM,kBAAkB;;CAmB9B,CAAC;AAEF,eAAO,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkB9C,CAAC;AAEH,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;CAOlC,CAAC;AAEH,eAAO,MAAM,0BAA0B;;CAuBtC,CAAC;AAEF,eAAO,MAAM,gCAAgC;;CAQ5C,CAAC;AAEF,eAAO,MAAM,uCAAuC;;CAWnD,CAAC"}
@@ -1,4 +1,4 @@
1
- // (C) 2023-2025 GoodData Corporation
1
+ // (C) 2023-2026 GoodData Corporation
2
2
  import { defineMessages } from "react-intl";
3
3
  export const hierarchicalPermissionMessages = defineMessages({
4
4
  enabled: { id: "userManagement.workspace.hierarchicalPermission.yes" },
@@ -50,6 +50,8 @@ export const workspaceGranularPermissionMessages = defineMessages({
50
50
  hierarchyTooltip: { id: "userManagement.workspace.granularPermission.hierarchy.tooltip" },
51
51
  remove: { id: "userManagement.workspace.permission.remove" },
52
52
  and: { id: "userManagement.workspace.permission.and" },
53
+ inheritedFromGroup: { id: "userManagement.workspace.inherited.group" },
54
+ inheritedFromHierarchy: { id: "userManagement.workspace.inherited.hierarchy" },
53
55
  });
54
56
  export const granularTooltipMessages = defineMessages({
55
57
  EXPORT: { id: "userManagement.workspace.permission.export.tooltip" },
@@ -30,11 +30,19 @@ export declare const useDeleteDialog: () => {
30
30
  dialogOverlayClassNames: string;
31
31
  dialogWrapperClassNames: string;
32
32
  };
33
- export declare const useUserGroups: (userId: string, organizationId: string, bootstrapUserGroupId: string, onSuccess: () => void, setIsAdmin: (isAdmin: boolean) => void) => {
33
+ export interface IUseUserGroupsParams {
34
+ userId: string;
35
+ organizationId: string;
36
+ bootstrapUserGroupId: string;
37
+ onSuccess: () => void;
38
+ setIsAdmin: (isAdmin: boolean) => void;
39
+ onMembershipChanged: () => void;
40
+ }
41
+ export declare const useUserGroups: ({ userId, organizationId, bootstrapUserGroupId, onSuccess, setIsAdmin, onMembershipChanged, }: IUseUserGroupsParams) => {
34
42
  grantedUserGroups: IGrantedUserGroup[] | undefined;
35
43
  onUserGroupsChanged: (userGroups: IGrantedUserGroup[]) => void;
36
44
  removeGrantedUserGroup: (grantedUserGroup: IGrantedUserGroup) => void;
37
- removeAdminGroup: () => void;
45
+ removeAdminGroup: () => Promise<void>;
38
46
  };
39
47
  export declare const useUsers: (userGroupId: string, organizationId: string, onSuccess: () => void) => {
40
48
  grantedUsers: IUserMember[];
@@ -1 +1 @@
1
- {"version":3,"file":"dialogHooks.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/dialogHooks.ts"],"names":[],"mappings":"AAMA,OAAO,EAEH,KAAK,KAAK,EACV,KAAK,UAAU,EAGlB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,sBAAsB,CAAC;AAIlE,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACjB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,OAAO;;;;;;;CA4BnB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;CAuBxB,CAAC;AAEF,eAAO,MAAM,aAAa;;;CAkCzB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;CAkC9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;CAiB3B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;CAkFzB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;CAkDpB,CAAC;AAeF,eAAO,MAAM,iBAAiB;;;;;;;;CAwC7B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;CAmClC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;CAM7B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;CAMlC,CAAC;AAsBF,eAAO,MAAM,sBAAsB;;;;;CASlC,CAAC"}
1
+ {"version":3,"file":"dialogHooks.d.ts","sourceRoot":"","sources":["../../../../../src/internal/components/dialogs/userManagementDialogs/dialogHooks.ts"],"names":[],"mappings":"AAMA,OAAO,EAEH,KAAK,KAAK,EACV,KAAK,UAAU,EAGlB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,KAAK,IAAI,EAAmB,MAAM,sBAAsB,CAAC;AAIlE,OAAO,EACH,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,SAAS,EACjB,MAAM,YAAY,CAAC;AAGpB,eAAO,MAAM,OAAO;;;;;;;CA4BnB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;CAuBxB,CAAC;AAEF,eAAO,MAAM,aAAa;;;CAkCzB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;CAkC9B,CAAC;AAEF,eAAO,MAAM,eAAe;;;;;;CAiB3B,CAAC;AAEF,MAAM,WAAW,oBAAoB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAGvC,mBAAmB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED,eAAO,MAAM,aAAa;;;;;CAoFzB,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;CAkDpB,CAAC;AAeF,eAAO,MAAM,iBAAiB;;;;;;;;CAwC7B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;CAmClC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;CAM7B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;CAMlC,CAAC;AAsBF,eAAO,MAAM,sBAAsB;;;;;CASlC,CAAC"}
@@ -119,7 +119,7 @@ export const useDeleteDialog = () => {
119
119
  dialogWrapperClassNames,
120
120
  };
121
121
  };
122
- export const useUserGroups = (userId, organizationId, bootstrapUserGroupId, onSuccess, setIsAdmin) => {
122
+ export const useUserGroups = ({ userId, organizationId, bootstrapUserGroupId, onSuccess, setIsAdmin, onMembershipChanged, }) => {
123
123
  const { addSuccess, addError } = useToastMessage();
124
124
  const backend = useBackendStrict();
125
125
  const [grantedUserGroups, setGrantedUserGroups] = useState(undefined);
@@ -145,6 +145,7 @@ export const useUserGroups = (userId, organizationId, bootstrapUserGroupId, onSu
145
145
  addSuccess(messages.userGroupRemovedSuccess);
146
146
  setGrantedUserGroups(grantedUserGroups?.filter((item) => item.id !== grantedUserGroup.id));
147
147
  onSuccess();
148
+ onMembershipChanged();
148
149
  })
149
150
  .catch((error) => {
150
151
  console.error("Removal of user group failed", error);
@@ -152,18 +153,20 @@ export const useUserGroups = (userId, organizationId, bootstrapUserGroupId, onSu
152
153
  });
153
154
  };
154
155
  const hasBootstrapUserGroup = (userGroups) => userGroups?.some((group) => group.id === bootstrapUserGroupId);
155
- // removes admin group from the user if he is its member, update internal array of groups
156
+ // removes admin group from the user if he is its member, update internal array of groups.
157
+ // Returns the mutation promise so callers can await it and surface a failure instead of swallowing it.
156
158
  const removeAdminGroup = () => {
157
- if (hasBootstrapUserGroup(grantedUserGroups)) {
158
- void backend
159
- .organization(organizationId)
160
- .users()
161
- .removeUsersFromUserGroups([userId], [bootstrapUserGroupId])
162
- .then(() => setGrantedUserGroups(grantedUserGroups?.filter((item) => item.id !== bootstrapUserGroupId)));
163
- }
164
- else {
165
- void Promise.resolve();
159
+ if (!hasBootstrapUserGroup(grantedUserGroups)) {
160
+ return Promise.resolve();
166
161
  }
162
+ return backend
163
+ .organization(organizationId)
164
+ .users()
165
+ .removeUsersFromUserGroups([userId], [bootstrapUserGroupId])
166
+ .then(() => {
167
+ setGrantedUserGroups(grantedUserGroups?.filter((item) => item.id !== bootstrapUserGroupId));
168
+ onMembershipChanged();
169
+ });
167
170
  };
168
171
  // update internal array with user groups after applied changed in groups edit mode
169
172
  const onUserGroupsChanged = (userGroups) => {
@@ -174,6 +177,7 @@ export const useUserGroups = (userId, organizationId, bootstrapUserGroupId, onSu
174
177
  setIsAdmin(true);
175
178
  }
176
179
  onSuccess();
180
+ onMembershipChanged();
177
181
  };
178
182
  return {
179
183
  grantedUserGroups,