@gooddata/sdk-ui-ext 11.64.0-alpha.1 → 11.64.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/NOTICE +4 -64198
  2. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.d.ts +3 -1
  3. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.d.ts.map +1 -1
  4. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.js +2 -2
  5. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts +3 -1
  6. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts.map +1 -1
  7. package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.js +42 -7
  8. package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.d.ts +8 -1
  9. package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.d.ts.map +1 -1
  10. package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.js +46 -2
  11. package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.d.ts.map +1 -1
  12. package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.js +9 -3
  13. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.d.ts.map +1 -1
  14. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.js +6 -4
  15. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.d.ts +2 -1
  16. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.d.ts.map +1 -1
  17. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.js +3 -3
  18. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.d.ts +5 -5
  19. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.d.ts.map +1 -1
  20. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.js +13 -12
  21. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts +2 -1
  22. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts.map +1 -1
  23. package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.js +5 -2
  24. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts +9 -1
  25. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts.map +1 -1
  26. package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.js +36 -0
  27. package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts +15 -0
  28. package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts.map +1 -1
  29. package/esm/internal/components/dialogs/userManagementDialogs/locales.js +9 -0
  30. package/package.json +21 -21
  31. package/styles/css/main.css +9 -0
  32. package/styles/css/main.css.map +1 -1
  33. package/styles/internal/css/user_management_dialogs.css +9 -0
  34. package/styles/internal/css/user_management_dialogs.css.map +1 -1
  35. package/styles/internal/scss/user_management_dialogs.scss +10 -0
@@ -11,8 +11,10 @@ export interface IDetailsViewProps {
11
11
  languages?: IUserLocalizationSettings;
12
12
  isLanguagesError?: boolean;
13
13
  statistics?: ILocalizationStatistics;
14
+ workspaceStatistics?: ILocalizationStatistics[];
15
+ organizationLanguages?: IUserLocalizationSettings;
14
16
  onChange?: (user: IUser, isAdmin: boolean) => void;
15
17
  onLanguagesChange?: (languages: IUserLocalizationSettings) => void;
16
18
  }
17
- export declare function UserDetailsView({ user, isAdmin, isBootstrapUser, mode, isSystemAccountFilteringEnabled, isLocalizationEnabled, languages, isLanguagesError, statistics, onChange, onLanguagesChange, }: IDetailsViewProps): import("react/jsx-runtime").JSX.Element | null;
19
+ export declare function UserDetailsView({ user, isAdmin, isBootstrapUser, mode, isSystemAccountFilteringEnabled, isLocalizationEnabled, languages, isLanguagesError, statistics, workspaceStatistics, organizationLanguages, onChange, onLanguagesChange, }: IDetailsViewProps): import("react/jsx-runtime").JSX.Element | null;
18
20
  //# sourceMappingURL=UserDetailsView.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserDetailsView.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAKjD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtE;AAED,wBAAgB,eAAe,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,eAAe,EACf,IAAI,EACJ,+BAAuC,EACvC,qBAA6B,EAC7B,SAAS,EACT,gBAAwB,EACxB,UAAU,EACV,QAAQ,EACR,iBAAiB,GACpB,EAAE,iBAAiB,kDAiHnB"}
1
+ {"version":3,"file":"UserDetailsView.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,uBAAuB,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACzG,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAKjD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAO5C,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,IAAI,EAAE,QAAQ,CAAC;IACf,+BAA+B,CAAC,EAAE,OAAO,CAAC;IAC1C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAChD,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;CACtE;AAED,wBAAgB,eAAe,CAAC,EAC5B,IAAI,EACJ,OAAO,EACP,eAAe,EACf,IAAI,EACJ,+BAAuC,EACvC,qBAA6B,EAC7B,SAAS,EACT,gBAAwB,EACxB,UAAU,EACV,mBAAmB,EACnB,qBAAqB,EACrB,QAAQ,EACR,iBAAiB,GACpB,EAAE,iBAAiB,kDAmHnB"}
@@ -10,7 +10,7 @@ import { QuestionMarkIcon } from "../Workspace/WorkspaceItem/QuestionMarkIcon.js
10
10
  import { DetailRow } from "./DetailRow.js";
11
11
  import { OrganizationMemberDropdown } from "./OrganizationMemberDropdown.js";
12
12
  import { UserLanguagesSection } from "./UserLanguagesSection.js";
13
- export function UserDetailsView({ user, isAdmin, isBootstrapUser, mode, isSystemAccountFilteringEnabled = false, isLocalizationEnabled = false, languages, isLanguagesError = false, statistics, onChange, onLanguagesChange, }) {
13
+ export function UserDetailsView({ user, isAdmin, isBootstrapUser, mode, isSystemAccountFilteringEnabled = false, isLocalizationEnabled = false, languages, isLanguagesError = false, statistics, workspaceStatistics, organizationLanguages, onChange, onLanguagesChange, }) {
14
14
  const intl = useIntl();
15
15
  const trackEvent = useTelemetry();
16
16
  const systemAccountCheckboxId = useId();
@@ -37,5 +37,5 @@ export function UserDetailsView({ user, isAdmin, isBootstrapUser, mode, isSystem
37
37
  }), children: [_jsxs("div", { className: "gd-user-management-dialog-detail-label gd-user-management-dialog-detail-label-with-icon", children: [_jsx("label", { htmlFor: systemAccountCheckboxId, children: intl.formatMessage(messages.userSystemAccount) }), _jsx(QuestionMarkIcon, { bubbleTextId: messages.userSystemAccountTooltip.id })] }), _jsx("div", { children: _jsx(Checkbox, { id: systemAccountCheckboxId, value: isSystemAccountDisplayed, disabled: isSystemAccountDisabled, onChange: (value) => {
38
38
  onChange?.({ ...user, systemAccount: value }, isAdmin);
39
39
  trackEvent(value ? "user-marked-system-account" : "user-unmarked-system-account");
40
- } }) })] })) : null, isLocalizationEnabled ? null : idRow, isLocalizationEnabled ? (_jsx(UserLanguagesSection, { languages: languages, isError: isLanguagesError, mode: mode, statistics: statistics, onChange: onLanguagesChange })) : null] }));
40
+ } }) })] })) : null, isLocalizationEnabled ? null : idRow, isLocalizationEnabled ? (_jsx(UserLanguagesSection, { languages: languages, isError: isLanguagesError, mode: mode, statistics: statistics, workspaceStatistics: workspaceStatistics, organizationLanguages: organizationLanguages, onChange: onLanguagesChange })) : null] }));
41
41
  }
@@ -5,7 +5,9 @@ export interface IUserLanguagesSectionProps {
5
5
  isError: boolean;
6
6
  mode: ListMode;
7
7
  statistics?: ILocalizationStatistics;
8
+ workspaceStatistics?: ILocalizationStatistics[];
9
+ organizationLanguages?: IUserLocalizationSettings;
8
10
  onChange?: (languages: IUserLocalizationSettings) => void;
9
11
  }
10
- export declare function UserLanguagesSection({ languages, isError, mode, statistics, onChange, }: IUserLanguagesSectionProps): import("react/jsx-runtime").JSX.Element;
12
+ export declare function UserLanguagesSection({ languages, isError, mode, statistics, workspaceStatistics, organizationLanguages, onChange, }: IUserLanguagesSectionProps): import("react/jsx-runtime").JSX.Element;
11
13
  //# sourceMappingURL=UserLanguagesSection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserLanguagesSection.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.tsx"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAEjC,MAAM,2BAA2B,CAAC;AAInC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoB5C,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;CAC7D;AAED,wBAAgB,oBAAoB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,QAAQ,GACX,EAAE,0BAA0B,2CAqD5B"}
1
+ {"version":3,"file":"UserLanguagesSection.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.tsx"],"names":[],"mappings":"AAOA,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAEjC,MAAM,2BAA2B,CAAC;AAWnC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AA8D5C,MAAM,WAAW,0BAA0B;IACvC,SAAS,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,mBAAmB,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAChD,qBAAqB,CAAC,EAAE,yBAAyB,CAAC;IAClD,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,KAAK,IAAI,CAAC;CAC7D;AAED,wBAAgB,oBAAoB,CAAC,EACjC,SAAS,EACT,OAAO,EACP,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,qBAAqB,EACrB,QAAQ,GACX,EAAE,0BAA0B,2CAyE5B"}
@@ -3,10 +3,10 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
3
3
  import { Fragment, useId } from "react";
4
4
  import cx from "classnames";
5
5
  import { useIntl } from "react-intl";
6
- import { DropdownButton, Message, UiDropdown, UiListbox } from "@gooddata/sdk-ui-kit";
6
+ import { DropdownButton, Message, UiDropdown, UiListbox, } from "@gooddata/sdk-ui-kit";
7
7
  import { messages } from "../locales.js";
8
8
  import { QuestionMarkIcon } from "../Workspace/WorkspaceItem/QuestionMarkIcon.js";
9
- import { USER_LANGUAGE_SETTINGS, languageName, languageNotice, languageOptions } from "./userLanguages.js";
9
+ import { USER_LANGUAGE_SETTINGS, languageName, languageNotice, languageOptions, } from "./userLanguages.js";
10
10
  const NOT_SET_ID = "not-set";
11
11
  const LIST_MAX_HEIGHT = 250;
12
12
  const LABELS = {
@@ -19,20 +19,55 @@ const NOT_SET_TOOLTIPS = {
19
19
  METADATA_LOCALE: messages.userMetadataLanguageNotSetTooltip,
20
20
  DATA_LOCALE: messages.userDataLanguageNotSetTooltip,
21
21
  };
22
- export function UserLanguagesSection({ languages, isError, mode, statistics, onChange, }) {
22
+ const NOTICE_TYPES = {
23
+ notSupported: "error",
24
+ noTranslation: "warning",
25
+ noTranslationIn: "warning",
26
+ translationAvailable: "progress",
27
+ };
28
+ const NOTICE_LIVE_ROLES = {
29
+ notSupported: undefined,
30
+ noTranslation: "alert",
31
+ noTranslationIn: "alert",
32
+ translationAvailable: "status",
33
+ };
34
+ const LIVE_ROLES = ["alert", "status"];
35
+ function noticeMessage(setting, notice) {
36
+ const isData = setting === "DATA_LOCALE";
37
+ switch (notice.type) {
38
+ case "notSupported":
39
+ return messages.userLanguageNotSupported;
40
+ case "noTranslation":
41
+ return isData
42
+ ? messages.userDataLanguageNoTranslation
43
+ : messages.userMetadataLanguageNoTranslation;
44
+ case "noTranslationIn":
45
+ return messages.userLanguageNoTranslationIn;
46
+ case "translationAvailable":
47
+ return isData
48
+ ? messages.userDataLanguageTranslationAvailable
49
+ : messages.userMetadataLanguageTranslationAvailable;
50
+ }
51
+ }
52
+ export function UserLanguagesSection({ languages, isError, mode, statistics, workspaceStatistics, organizationLanguages, onChange, }) {
23
53
  const intl = useIntl();
24
54
  const idPrefix = useId();
25
55
  const change = (type, value) => {
26
56
  onChange?.({ ...languages, [type]: value });
27
57
  };
28
58
  return (_jsxs(_Fragment, { children: [_jsx("div", { className: "gd-user-management-dialog-detail-section-title", children: intl.formatMessage(messages.userLanguagesTitle) }), isError ? (_jsx("div", { className: "gd-user-management-dialog-detail-value-empty s-user-languages-error", children: intl.formatMessage(messages.userLanguagesLoadError) })) : (USER_LANGUAGE_SETTINGS.map((type) => {
29
- const notice = mode === "VIEW" && languages ? languageNotice(type, languages) : undefined;
30
- return (_jsxs(Fragment, { children: [_jsxs("div", { className: cx("gd-user-management-dialog-detail-row", `s-user-language-${type}`), children: [_jsx("div", { id: `${idPrefix}-${type}-label`, className: "gd-user-management-dialog-detail-label", children: intl.formatMessage(LABELS[type]) }), mode === "VIEW" ? (_jsx(LanguageValue, { type: type, code: languages?.[type] })) : (_jsx(LanguageDropdown, { type: type, labelId: `${idPrefix}-${type}-label`, code: languages?.[type], statistics: statistics, onSelect: (value) => change(type, value) }))] }), notice ? _jsx(LanguageNotSupportedMessage, { type: type }) : null] }, type));
59
+ const notice = mode === "VIEW" && languages
60
+ ? languageNotice(type, languages, workspaceStatistics, organizationLanguages)
61
+ : undefined;
62
+ return (_jsxs(Fragment, { children: [_jsxs("div", { className: cx("gd-user-management-dialog-detail-row", `s-user-language-${type}`), children: [_jsx("div", { id: `${idPrefix}-${type}-label`, className: "gd-user-management-dialog-detail-label", children: intl.formatMessage(LABELS[type]) }), mode === "VIEW" ? (_jsx(LanguageValue, { type: type, code: languages?.[type] })) : (_jsx(LanguageDropdown, { type: type, labelId: `${idPrefix}-${type}-label`, code: languages?.[type], statistics: statistics, onSelect: (value) => change(type, value) }))] }), notice && !NOTICE_LIVE_ROLES[notice.type] ? (_jsx("div", { className: "gd-user-management-dialog-detail-notice-region", children: _jsx(LanguageNoticeMessage, { type: type, notice: notice }) })) : null, mode === "VIEW" && type !== "LOCALE"
63
+ ? LIVE_ROLES.map((role) => (_jsx("div", { role: role, className: "gd-user-management-dialog-detail-notice-region", children: notice && NOTICE_LIVE_ROLES[notice.type] === role ? (_jsx(LanguageNoticeMessage, { type: type, notice: notice })) : null }, role)))
64
+ : null] }, type));
31
65
  }))] }));
32
66
  }
33
- function LanguageNotSupportedMessage({ type }) {
67
+ function LanguageNoticeMessage({ type, notice }) {
34
68
  const intl = useIntl();
35
- return (_jsx(Message, { type: "error", className: cx("gd-user-management-dialog-detail-notice", `s-user-language-notice-${type}`), children: intl.formatMessage(messages.userLanguageNotSupported, {
69
+ return (_jsx(Message, { type: NOTICE_TYPES[notice.type], className: cx("gd-user-management-dialog-detail-notice", `s-user-language-notice-${type}`), children: intl.formatMessage(noticeMessage(type, notice), {
70
+ count: notice.type === "noTranslationIn" ? notice.count : 0,
36
71
  b: (chunks) => _jsx("b", { children: chunks }),
37
72
  }) }));
38
73
  }
@@ -2,10 +2,17 @@ import { type ILocalizationStatistics, type IUserLocalizationSettings, type Loca
2
2
  export declare const USER_LANGUAGE_SETTINGS: LocalizationSettingType[];
3
3
  export type LanguageNotice = {
4
4
  type: "notSupported";
5
+ } | {
6
+ type: "noTranslation";
7
+ } | {
8
+ type: "noTranslationIn";
9
+ count: number;
10
+ } | {
11
+ type: "translationAvailable";
5
12
  };
6
13
  export declare function languageName(code: string, uiLocale: string): string;
7
14
  export declare function isInterfaceLanguage(code: string): boolean;
8
15
  export declare function languageOptions(setting: LocalizationSettingType, current: string | undefined, uiLocale: string, statistics?: ILocalizationStatistics): string[];
9
- export declare function languageNotice(setting: LocalizationSettingType, languages: IUserLocalizationSettings): LanguageNotice | undefined;
16
+ export declare function languageNotice(setting: LocalizationSettingType, languages: IUserLocalizationSettings, workspaceStatistics?: ILocalizationStatistics[], organizationLanguages?: IUserLocalizationSettings): LanguageNotice | undefined;
10
17
  export declare function changedLanguageSettings(original: IUserLocalizationSettings, updated: IUserLocalizationSettings): Array<[LocalizationSettingType, string | undefined]>;
11
18
  //# sourceMappingURL=userLanguages.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"userLanguages.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/userLanguages.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC/B,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,sBAAsB,EAAE,uBAAuB,EAAiD,CAAC;AAS9G,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,CAAC;AAsBtD,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,eAAe,CAC3B,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,uBAAuB,GACrC,MAAM,EAAE,CAQV;AAED,wBAAgB,cAAc,CAC1B,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,yBAAyB,GACrC,cAAc,GAAG,SAAS,CAG5B;AAED,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,yBAAyB,GACnC,KAAK,CAAC,CAAC,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAKtD"}
1
+ {"version":3,"file":"userLanguages.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Details/userLanguages.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC/B,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,sBAAsB,EAAE,uBAAuB,EAAiD,CAAC;AAS9G,MAAM,MAAM,cAAc,GACpB;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,sBAAsB,CAAA;CAAE,CAAC;AAsBvC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,eAAe,CAC3B,OAAO,EAAE,uBAAuB,EAChC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,QAAQ,EAAE,MAAM,EAChB,UAAU,CAAC,EAAE,uBAAuB,GACrC,MAAM,EAAE,CAQV;AA4BD,wBAAgB,cAAc,CAC1B,OAAO,EAAE,uBAAuB,EAChC,SAAS,EAAE,yBAAyB,EACpC,mBAAmB,GAAE,uBAAuB,EAAO,EACnD,qBAAqB,GAAE,yBAA8B,GACtD,cAAc,GAAG,SAAS,CAgC5B;AAED,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,yBAAyB,EACnC,OAAO,EAAE,yBAAyB,GACnC,KAAK,CAAC,CAAC,uBAAuB,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAKtD"}
@@ -38,9 +38,53 @@ export function languageOptions(setting, current, uiLocale, statistics) {
38
38
  const codes = new Set(current ? [...available, current] : available);
39
39
  return [...codes].sort((a, b) => languageName(a, uiLocale).localeCompare(languageName(b, uiLocale), uiLocale));
40
40
  }
41
- export function languageNotice(setting, languages) {
41
+ function isEnglish(code) {
42
+ return code.split("-")[0].toLowerCase() === "en";
43
+ }
44
+ function canonicalLocale(code) {
45
+ try {
46
+ return Intl.getCanonicalLocales(code)[0] ?? code;
47
+ }
48
+ catch {
49
+ return code;
50
+ }
51
+ }
52
+ function isSameLocale(a, b) {
53
+ return a !== undefined && canonicalLocale(a) === canonicalLocale(b);
54
+ }
55
+ function translatedWorkspaceCount(workspaceStatistics, kind, code) {
56
+ return workspaceStatistics.filter((statistics) => statistics[kind].locales.some(({ locale }) => isSameLocale(locale, code))).length;
57
+ }
58
+ export function languageNotice(setting, languages, workspaceStatistics = [], organizationLanguages = {}) {
42
59
  const code = languages[setting];
43
- return setting === "LOCALE" && code && !isInterfaceLanguage(code) ? { type: "notSupported" } : undefined;
60
+ const kind = TRANSLATION_KINDS[setting];
61
+ if (!kind) {
62
+ return code && !isInterfaceLanguage(code) ? { type: "notSupported" } : undefined;
63
+ }
64
+ const workspaceCount = workspaceStatistics.length;
65
+ if (workspaceCount === 0) {
66
+ return undefined;
67
+ }
68
+ if (code) {
69
+ if (isEnglish(code)) {
70
+ return undefined;
71
+ }
72
+ const missing = workspaceCount - translatedWorkspaceCount(workspaceStatistics, kind, code);
73
+ if (missing === workspaceCount) {
74
+ return { type: "noTranslation" };
75
+ }
76
+ return missing > 0 ? { type: "noTranslationIn", count: missing } : undefined;
77
+ }
78
+ const interfaceCode = languages.LOCALE;
79
+ if (!interfaceCode ||
80
+ isEnglish(interfaceCode) ||
81
+ !isInterfaceLanguage(interfaceCode) ||
82
+ isSameLocale(organizationLanguages[setting], interfaceCode)) {
83
+ return undefined;
84
+ }
85
+ return translatedWorkspaceCount(workspaceStatistics, kind, interfaceCode) > 0
86
+ ? { type: "translationAvailable" }
87
+ : undefined;
44
88
  }
45
89
  export function changedLanguageSettings(original, updated) {
46
90
  return USER_LANGUAGE_SETTINGS.filter((type) => original[type] !== updated[type]).map((type) => [
@@ -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;AA4B7D,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,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B;AAyTD;;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;AA6B7D,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,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,WAAW,CAAC,EAAE,SAAS,CAAC;CAC3B;AAqUD;;GAEG;AACH,eAAO,MAAM,cAAc;;;CAAyC,CAAC"}
@@ -10,7 +10,7 @@ import { AddDataSource } from "./DataSources/AddDataSource.js";
10
10
  import { DataSourceList } from "./DataSources/DataSourceList.js";
11
11
  import { EditUserDetails } from "./Details/EditUserDetails.js";
12
12
  import { UserDetailsView } from "./Details/UserDetailsView.js";
13
- import { useDeleteDialog, useDeleteUser, useLanguageStatistics, useOrganizationDetails, useUser, useUserDialogMode, useUserDialogTabs, useUserGroups, useUserLanguages, } from "./dialogHooks.js";
13
+ import { useDeleteDialog, useDeleteUser, useLanguageNoticeData, useLanguageStatistics, useOrganizationDetails, useUser, useUserDialogMode, useUserDialogTabs, useUserGroups, useUserLanguages, } from "./dialogHooks.js";
14
14
  import { ErrorDialog } from "./ErrorDialog.js";
15
15
  import { usePermissions } from "./hooks/usePermissions.js";
16
16
  import { messages, userDialogTabsMessages } from "./locales.js";
@@ -23,7 +23,7 @@ import { ViewDialog } from "./ViewDialog.js";
23
23
  import { AddWorkspace } from "./Workspace/AddWorkspace.js";
24
24
  import { WorkspaceList } from "./Workspace/WorkspaceList.js";
25
25
  const alignPoints = [{ align: "cc cc" }];
26
- function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, onClose, initialView = "VIEW", changeUserMembership = false, renderDataSourceIcon, isSystemAccountFilteringEnabled = false, areMetricPermissionsEnabled = false, isCreateVisualizationWorkspacePermissionEnabled = false, areComputedAttributesEnabled = false, areVisualizationPermissionsEnabled = false, isLocalizationEnabled = false, selectedTab = undefined, }) {
26
+ function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, onClose, initialView = "VIEW", changeUserMembership = false, renderDataSourceIcon, isSystemAccountFilteringEnabled = false, areMetricPermissionsEnabled = false, isCreateVisualizationWorkspacePermissionEnabled = false, areComputedAttributesEnabled = false, areVisualizationPermissionsEnabled = false, isLocalizationEnabled = false, selectedTab, }) {
27
27
  const intl = useIntl();
28
28
  const { dialogMode, setDialogMode } = useUserDialogMode(initialView);
29
29
  const { user, isCurrentlyAdmin, onUserDetailsChanged, setIsAdmin, error, isLoading: userIsLoading, } = useUser(userId, organizationId, isAdmin, onSuccess);
@@ -40,6 +40,12 @@ function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, o
40
40
  onMembershipChanged: reloadPermissions,
41
41
  });
42
42
  const { tabs, selectedTabId, setSelectedTabId } = useUserDialogTabs(grantedWorkspaces, grantedUserGroups, grantedDataSources, isCurrentlyAdmin, selectedTab);
43
+ const isDetailsShown = dialogMode === "VIEW" && selectedTabId.id === userDialogTabsMessages.details.id;
44
+ const [hasShownDetails, setHasShownDetails] = useState(isDetailsShown);
45
+ if (isDetailsShown && !hasShownDetails) {
46
+ setHasShownDetails(true);
47
+ }
48
+ const languageNoticeData = useLanguageNoticeData(organizationId, grantedWorkspaces, isLocalizationEnabled && hasShownDetails);
43
49
  const { isConfirmDeleteOpened, onOpenDeleteDialog, onCloseDeleteDialog, dialogOverlayClassNames, dialogWrapperClassNames, } = useDeleteDialog();
44
50
  const { deleteUser, isDeleteUserProcessing } = useDeleteUser(userId, organizationId, onSuccess, onClose);
45
51
  const { editButtonText, editButtonMode, editButtonIconClassName } = useMemo(() => {
@@ -94,7 +100,7 @@ function UserEditDialogComponent({ userId, organizationId, isAdmin, onSuccess, o
94
100
  };
95
101
  return (_jsxs(OrganizationIdProvider, { organizationId: organizationId, children: [isConfirmDeleteOpened ? (_jsx(DeleteConfirmDialog, { titleText: intl.formatMessage(messages.deleteUserConfirmTitle), bodyText: intl.formatMessage(messages.deleteUserConfirmBody), onConfirm: deleteUser, isProcessing: isDeleteUserProcessing, onCancel: onCloseDeleteDialog })) : null, _jsx(Overlay, { alignPoints: alignPoints, isModal: true, positionType: "fixed", className: dialogOverlayClassNames, resizeObserverThreshold: 0.2, children: _jsx("div", { className: dialogWrapperClassNames, children: isLoading ? (_jsxs(_Fragment, { children: [_jsx(LoadingComponent, { className: "gd-user-management-dialog-loading" }), _jsx(ErrorDialog, { dialogTitle: "", onClose: onClose })] })) : error ? (_jsx(ErrorDialog, { onClose: onClose, dialogTitle: intl.formatMessage(messages.userLoadingErrorTitle), children: _jsx(Message, { type: "error", className: "gd-user-management-dialog-error", children: intl.formatMessage(isUnexpectedResponseError(error) && error.httpStatus === 404
96
102
  ? messages.userLoadingErrorNotExist
97
- : messages.userLoadingErrorUnknown) }) })) : (_jsxs(_Fragment, { children: [dialogMode === "VIEW" && (_jsxs(ViewDialog, { dialogTitle: extractUserName(user), isAdmin: isCurrentlyAdmin, isDeleteLinkEnabled: !isBootstrapUser(user), deleteLinkDisabledTooltipTextId: messages.deleteUserDisabledTooltip.id, deleteLinkText: intl.formatMessage(messages.deleteUserLink), onOpenDeleteDialog: onOpenDeleteDialog, onClose: onClose, onEdit: () => setDialogMode(editButtonMode), editButtonText: editButtonText, editButtonIconClassName: editButtonIconClassName, children: [isCurrentlyAdmin ? (_jsx("div", { className: "gd-message information gd-user-management-admin-alert s-admin-message", children: _jsx("div", { className: "gd-message-text", children: intl.formatMessage(messages.adminAlert) }) })) : null, _jsx(Tabs, { selectedTabId: selectedTabId.id, onTabSelect: setSelectedTabId, tabs: tabs, className: "gd-user-management-dialog-tabs s-user-management-tabs" }), selectedTabId.id === userDialogTabsMessages.workspaces.id && (_jsx(WorkspaceList, { workspaces: grantedWorkspaces, subjectType: "user", mode: "VIEW", onDelete: removeGrantedWorkspace, onChange: updateGrantedWorkspace, onClick: handleWorkspaceEdit })), selectedTabId.id === userDialogTabsMessages.userGroups.id && (_jsx(UserGroupsList, { userGroups: grantedUserGroups, mode: "VIEW", onDelete: removeGrantedUserGroup, isBootstrapUser: isBootstrapUser(user), bootstrapUserGroupId: bootstrapUserGroupId })), selectedTabId.id === userDialogTabsMessages.details.id && (_jsx(UserDetailsView, { user: user, isAdmin: isCurrentlyAdmin, isBootstrapUser: isBootstrapUser(user), mode: "VIEW", isSystemAccountFilteringEnabled: isSystemAccountFilteringEnabled, isLocalizationEnabled: isLocalizationEnabled, languages: languages, isLanguagesError: isLanguagesError })), selectedTabId.id === userDialogTabsMessages.dataSources.id && (_jsx(DataSourceList, { dataSources: grantedDataSources, subjectType: "user", mode: "VIEW", onDelete: removeGrantedDataSource, onChange: updateGrantedDataSource, renderDataSourceIcon: renderDataSourceIcon }))] })), dialogMode === "WORKSPACE" && (_jsx(AddWorkspace, { ids: [userId], subjectType: "user", grantedWorkspaces: grantedWorkspaces, enableBackButton: !isOpenedInEditMode, onSubmit: handleWorkspaceChanged, onCancel: isOpenedInEditMode ? onClose : handleWorkspaceCancel, onClose: onClose, editWorkspace: workspaceToEdit, areMetricPermissionsEnabled: areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled: isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled: areComputedAttributesEnabled, areVisualizationPermissionsEnabled: areVisualizationPermissionsEnabled })), dialogMode === "USER_GROUPS" && (_jsx(AddUserGroup, { userIds: [userId], grantedUserGroups: grantedUserGroups, enableBackButton: !isOpenedInEditMode, onSubmit: onUserGroupsChanged, onCancel: isOpenedInEditMode ? onClose : () => setDialogMode("VIEW"), onClose: onClose })), dialogMode === "DATA_SOURCES" && (_jsx(AddDataSource, { ids: [userId], subjectType: "user", grantedDataSources: grantedDataSources, enableBackButton: !isOpenedInEditMode, onSubmit: onDataSourcesChanged, onCancel: isOpenedInEditMode ? onClose : () => setDialogMode("VIEW"), onClose: onClose, renderDataSourceIcon: renderDataSourceIcon })), dialogMode === "DETAIL" && (_jsx(EditUserDetails, { user: user, isAdmin: isCurrentlyAdmin, isBootstrapUser: isBootstrapUser(user), enableBackButton: !isOpenedInEditMode, changeUserMembership: changeUserMembership, isSystemAccountFilteringEnabled: isSystemAccountFilteringEnabled, isLocalizationEnabled: isLocalizationEnabled, languages: languages, isLanguagesError: isLanguagesError, statistics: statistics, onLanguagesSaveFailed: reloadLanguages, onSubmit: (updatedUser, isUpdatedAdmin, updatedLanguages) => {
103
+ : messages.userLoadingErrorUnknown) }) })) : (_jsxs(_Fragment, { children: [dialogMode === "VIEW" && (_jsxs(ViewDialog, { dialogTitle: extractUserName(user), isAdmin: isCurrentlyAdmin, isDeleteLinkEnabled: !isBootstrapUser(user), deleteLinkDisabledTooltipTextId: messages.deleteUserDisabledTooltip.id, deleteLinkText: intl.formatMessage(messages.deleteUserLink), onOpenDeleteDialog: onOpenDeleteDialog, onClose: onClose, onEdit: () => setDialogMode(editButtonMode), editButtonText: editButtonText, editButtonIconClassName: editButtonIconClassName, children: [isCurrentlyAdmin ? (_jsx("div", { className: "gd-message information gd-user-management-admin-alert s-admin-message", children: _jsx("div", { className: "gd-message-text", children: intl.formatMessage(messages.adminAlert) }) })) : null, _jsx(Tabs, { selectedTabId: selectedTabId.id, onTabSelect: setSelectedTabId, tabs: tabs, className: "gd-user-management-dialog-tabs s-user-management-tabs" }), selectedTabId.id === userDialogTabsMessages.workspaces.id && (_jsx(WorkspaceList, { workspaces: grantedWorkspaces, subjectType: "user", mode: "VIEW", onDelete: removeGrantedWorkspace, onChange: updateGrantedWorkspace, onClick: handleWorkspaceEdit })), selectedTabId.id === userDialogTabsMessages.userGroups.id && (_jsx(UserGroupsList, { userGroups: grantedUserGroups, mode: "VIEW", onDelete: removeGrantedUserGroup, isBootstrapUser: isBootstrapUser(user), bootstrapUserGroupId: bootstrapUserGroupId })), selectedTabId.id === userDialogTabsMessages.details.id && (_jsx(UserDetailsView, { user: user, isAdmin: isCurrentlyAdmin, isBootstrapUser: isBootstrapUser(user), mode: "VIEW", isSystemAccountFilteringEnabled: isSystemAccountFilteringEnabled, isLocalizationEnabled: isLocalizationEnabled, languages: languages, isLanguagesError: isLanguagesError, workspaceStatistics: languageNoticeData?.workspaceStatistics, organizationLanguages: languageNoticeData?.organizationLanguages })), selectedTabId.id === userDialogTabsMessages.dataSources.id && (_jsx(DataSourceList, { dataSources: grantedDataSources, subjectType: "user", mode: "VIEW", onDelete: removeGrantedDataSource, onChange: updateGrantedDataSource, renderDataSourceIcon: renderDataSourceIcon }))] })), dialogMode === "WORKSPACE" && (_jsx(AddWorkspace, { ids: [userId], subjectType: "user", grantedWorkspaces: grantedWorkspaces, enableBackButton: !isOpenedInEditMode, onSubmit: handleWorkspaceChanged, onCancel: isOpenedInEditMode ? onClose : handleWorkspaceCancel, onClose: onClose, editWorkspace: workspaceToEdit, areMetricPermissionsEnabled: areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled: isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled: areComputedAttributesEnabled, areVisualizationPermissionsEnabled: areVisualizationPermissionsEnabled })), dialogMode === "USER_GROUPS" && (_jsx(AddUserGroup, { userIds: [userId], grantedUserGroups: grantedUserGroups, enableBackButton: !isOpenedInEditMode, onSubmit: onUserGroupsChanged, onCancel: isOpenedInEditMode ? onClose : () => setDialogMode("VIEW"), onClose: onClose })), dialogMode === "DATA_SOURCES" && (_jsx(AddDataSource, { ids: [userId], subjectType: "user", grantedDataSources: grantedDataSources, enableBackButton: !isOpenedInEditMode, onSubmit: onDataSourcesChanged, onCancel: isOpenedInEditMode ? onClose : () => setDialogMode("VIEW"), onClose: onClose, renderDataSourceIcon: renderDataSourceIcon })), dialogMode === "DETAIL" && (_jsx(EditUserDetails, { user: user, isAdmin: isCurrentlyAdmin, isBootstrapUser: isBootstrapUser(user), enableBackButton: !isOpenedInEditMode, changeUserMembership: changeUserMembership, isSystemAccountFilteringEnabled: isSystemAccountFilteringEnabled, isLocalizationEnabled: isLocalizationEnabled, languages: languages, isLanguagesError: isLanguagesError, statistics: statistics, onLanguagesSaveFailed: reloadLanguages, onSubmit: (updatedUser, isUpdatedAdmin, updatedLanguages) => {
98
104
  setLanguages(updatedLanguages);
99
105
  onUserDetailsChanged(updatedUser, isUpdatedAdmin);
100
106
  }, onCancel: isOpenedInEditMode ? onClose : () => setDialogMode("VIEW"), onClose: onClose, removeAdminGroup: removeAdminGroup }))] })) }) })] }));
@@ -1 +1 @@
1
- {"version":3,"file":"AddWorkspace.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAUtF,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,WAAW,EAAE,0BAA0B,CAAC;IACxC,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACpD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAChD;AAED,wBAAgB,YAAY,CAAC,EACzB,GAAG,EACH,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,aAAa,EACb,2BAA2B,EAC3B,+CAA+C,EAC/C,4BAA4B,EAC5B,kCAAkC,GACrC,EAAE,kBAAkB,2CA0EpB"}
1
+ {"version":3,"file":"AddWorkspace.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.tsx"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAUtF,MAAM,WAAW,kBAAkB;IAC/B,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,WAAW,EAAE,0BAA0B,CAAC;IACxC,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IACnD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,IAAI,CAAC;IACpD,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAClC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAChD;AAED,wBAAgB,YAAY,CAAC,EACzB,GAAG,EACH,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,QAAQ,EACR,OAAO,EACP,aAAa,EACb,2BAA2B,EAC3B,+CAA+C,EAC/C,4BAA4B,EAC5B,kCAAkC,GACrC,EAAE,kBAAkB,2CAyFpB"}
@@ -10,10 +10,12 @@ import { GranularPermissions } from "./WorkspaceItem/GranularPermissions.js";
10
10
  import { areRedundantPermissionsPresent, haveWorkspacePermissionsChanged, } from "./WorkspaceItem/granularPermissionUtils.js";
11
11
  export function AddWorkspace({ ids, subjectType, grantedWorkspaces, enableBackButton, onSubmit, onCancel, onClose, editWorkspace, areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled, areVisualizationPermissionsEnabled, }) {
12
12
  const intl = useIntl();
13
- const { addedWorkspaces, isProcessing, onAdd, onChange, onOverwriteSelect } = useAddWorkspace(ids, subjectType, onSubmit, onCancel, editWorkspace);
13
+ const { addedWorkspaces, isProcessing, onAdd, onChange, onOverwriteSelect, analyzeIncludesManageVisualizations, } = useAddWorkspace(ids, subjectType, onSubmit, onCancel, editWorkspace, areVisualizationPermissionsEnabled);
14
14
  const isGranularPermissionsChanged = useMemo(() => {
15
- return editWorkspace ? haveWorkspacePermissionsChanged(addedWorkspaces[0], editWorkspace) : true;
16
- }, [addedWorkspaces, editWorkspace]);
15
+ return editWorkspace
16
+ ? haveWorkspacePermissionsChanged(addedWorkspaces[0], editWorkspace, analyzeIncludesManageVisualizations)
17
+ : true;
18
+ }, [addedWorkspaces, editWorkspace, analyzeIncludesManageVisualizations]);
17
19
  const showRedundancyWarningMessage = useMemo(() => {
18
20
  return editWorkspace ? areRedundantPermissionsPresent(editWorkspace.permissions) : false;
19
21
  }, [editWorkspace]);
@@ -25,5 +27,5 @@ export function AddWorkspace({ ids, subjectType, grantedWorkspaces, enableBackBu
25
27
  id: "userManagement.workspace.granularPermission.help",
26
28
  }), href: "https://www.gooddata.com/docs/cloud/manage-organization/manage-permissions/set-permissions-for-workspace/", iconClass: "gd-icon-circle-question" }) }));
27
29
  }, [intl]);
28
- return (_jsxs(ConfirmDialogBase, { className: "gd-share-dialog gd-share-dialog-add-workspace s-user-management-add-workspace", displayCloseButton: true, isPositive: true, isSubmitDisabled: addedWorkspaces.length === 0 || isProcessing || !isGranularPermissionsChanged, showProgressIndicator: isProcessing, headline: intl.formatMessage(editWorkspace ? messages.editWorkspaceDialogTitle : messages.addWorkspaceDialogTitle), cancelButtonText: intl.formatMessage(messages.addWorkspaceDialogCloseButton), submitButtonText: intl.formatMessage(messages.addWorkspaceDialogSaveButton), onCancel: onCancel, onSubmit: onAdd, onClose: onClose, headerLeftButtonRenderer: enableBackButton ? backButtonRenderer : undefined, footerLeftRenderer: leftFooterRenderer, children: [_jsx(AddSingleWorkspaceSelect, { addedWorkspace: addedWorkspaces[0], grantedWorkspaces: grantedWorkspaces, onSelectWorkspace: onOverwriteSelect, mode: editWorkspace ? "VIEW" : "EDIT" }), _jsx(GranularPermissions, { workspace: addedWorkspaces[0], savedPermissions: editWorkspace?.permissions, onChange: onChange, showRedundancyWarningMessage: showRedundancyWarningMessage, areMetricPermissionsEnabled: areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled: isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled: areComputedAttributesEnabled, areVisualizationPermissionsEnabled: areVisualizationPermissionsEnabled })] }));
30
+ return (_jsxs(ConfirmDialogBase, { className: "gd-share-dialog gd-share-dialog-add-workspace s-user-management-add-workspace", displayCloseButton: true, isPositive: true, isSubmitDisabled: addedWorkspaces.length === 0 || isProcessing || !isGranularPermissionsChanged, showProgressIndicator: isProcessing, headline: intl.formatMessage(editWorkspace ? messages.editWorkspaceDialogTitle : messages.addWorkspaceDialogTitle), cancelButtonText: intl.formatMessage(messages.addWorkspaceDialogCloseButton), submitButtonText: intl.formatMessage(messages.addWorkspaceDialogSaveButton), onCancel: onCancel, onSubmit: onAdd, onClose: onClose, headerLeftButtonRenderer: enableBackButton ? backButtonRenderer : undefined, footerLeftRenderer: leftFooterRenderer, children: [_jsx(AddSingleWorkspaceSelect, { addedWorkspace: addedWorkspaces[0], grantedWorkspaces: grantedWorkspaces, onSelectWorkspace: onOverwriteSelect, mode: editWorkspace ? "VIEW" : "EDIT" }), _jsx(GranularPermissions, { workspace: addedWorkspaces[0], savedPermissions: editWorkspace?.permissions, onChange: onChange, showRedundancyWarningMessage: showRedundancyWarningMessage, areMetricPermissionsEnabled: areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled: isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled: areComputedAttributesEnabled, areVisualizationPermissionsEnabled: areVisualizationPermissionsEnabled, analyzeIncludesManageVisualizations: analyzeIncludesManageVisualizations })] }));
29
31
  }
@@ -8,7 +8,8 @@ interface IGranularPermissionsProps {
8
8
  isCreateVisualizationWorkspacePermissionEnabled?: boolean;
9
9
  areComputedAttributesEnabled?: boolean;
10
10
  areVisualizationPermissionsEnabled?: boolean;
11
+ analyzeIncludesManageVisualizations?: boolean;
11
12
  }
12
- export declare function GranularPermissions({ workspace, savedPermissions, onChange, showRedundancyWarningMessage, areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled, areVisualizationPermissionsEnabled, }: IGranularPermissionsProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare function GranularPermissions({ workspace, savedPermissions, onChange, showRedundancyWarningMessage, areMetricPermissionsEnabled, isCreateVisualizationWorkspacePermissionEnabled, areComputedAttributesEnabled, areVisualizationPermissionsEnabled, analyzeIncludesManageVisualizations, }: IGranularPermissionsProps): import("react/jsx-runtime").JSX.Element;
13
14
  export {};
14
15
  //# sourceMappingURL=GranularPermissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GranularPermissions.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.tsx"],"names":[],"mappings":"AAQA,OAAO,EACH,KAAK,iBAAiB,EAGtB,KAAK,oBAAoB,EAC5B,MAAM,gBAAgB,CAAC;AA2BxB,UAAU,yBAAyB;IAC/B,SAAS,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,4BAA4B,EAAE,OAAO,CAAC;IACtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;CAChD;AAED,wBAAgB,mBAAmB,CAAC,EAChC,SAAS,EACT,gBAAqB,EACrB,QAAQ,EACR,4BAA4B,EAC5B,2BAAmC,EACnC,+CAAuD,EACvD,4BAAoC,EACpC,kCAA0C,GAC7C,EAAE,yBAAyB,2CA6I3B"}
1
+ {"version":3,"file":"GranularPermissions.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.tsx"],"names":[],"mappings":"AAQA,OAAO,EACH,KAAK,iBAAiB,EAGtB,KAAK,oBAAoB,EAC5B,MAAM,gBAAgB,CAAC;AA2BxB,UAAU,yBAAyB;IAC/B,SAAS,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACzC,gBAAgB,CAAC,EAAE,oBAAoB,CAAC;IACxC,QAAQ,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,4BAA4B,EAAE,OAAO,CAAC;IACtC,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,+CAA+C,CAAC,EAAE,OAAO,CAAC;IAC1D,4BAA4B,CAAC,EAAE,OAAO,CAAC;IACvC,kCAAkC,CAAC,EAAE,OAAO,CAAC;IAC7C,mCAAmC,CAAC,EAAE,OAAO,CAAC;CACjD;AAED,wBAAgB,mBAAmB,CAAC,EAChC,SAAS,EACT,gBAAqB,EACrB,QAAQ,EACR,4BAA4B,EAC5B,2BAAmC,EACnC,+CAAuD,EACvD,4BAAoC,EACpC,kCAA0C,EAC1C,mCAA2C,GAC9C,EAAE,yBAAyB,2CAiJ3B"}
@@ -17,14 +17,14 @@ const granularPermissions = [
17
17
  { id: "MANAGE_VISUALIZATIONS", enabled: true },
18
18
  { id: "CREATE_FILTER_VIEW", enabled: true },
19
19
  ];
20
- export function GranularPermissions({ workspace, savedPermissions = [], onChange, showRedundancyWarningMessage, areMetricPermissionsEnabled = false, isCreateVisualizationWorkspacePermissionEnabled = false, areComputedAttributesEnabled = false, areVisualizationPermissionsEnabled = false, }) {
20
+ export function GranularPermissions({ workspace, savedPermissions = [], onChange, showRedundancyWarningMessage, areMetricPermissionsEnabled = false, isCreateVisualizationWorkspacePermissionEnabled = false, areComputedAttributesEnabled = false, areVisualizationPermissionsEnabled = false, analyzeIncludesManageVisualizations = false, }) {
21
21
  const intl = useIntl();
22
22
  if (!workspace) {
23
23
  return (_jsx("div", { className: "gd-granular-permissions-empty", children: _jsx(FormattedMessage, { id: "userManagement.workspace.granularPermission.noWorkspace" }) }));
24
24
  }
25
25
  const { permissions: selectedPermissions, isHierarchical } = workspace;
26
26
  const selectedWorkspacePermission = getWorkspacePermission(selectedPermissions);
27
- const selectedGranularPermissions = getGranularPermissions(selectedPermissions);
27
+ const selectedGranularPermissions = getGranularPermissions(selectedPermissions, analyzeIncludesManageVisualizations);
28
28
  const chosenGranularPermissions = selectedPermissions.filter((p) => !workspacePermissions.includes(p));
29
29
  const granularItems = granularPermissions.filter(({ id }) => (id !== "CREATE_METRIC" || areMetricPermissionsEnabled) &&
30
30
  (id !== "CREATE_VISUALIZATION" || isCreateVisualizationWorkspacePermissionEnabled) &&
@@ -60,7 +60,7 @@ export function GranularPermissions({ workspace, savedPermissions = [], onChange
60
60
  }) }), _jsx("div", { className: "gd-granular-permissions__workspace-access-description", children: _jsx(FormattedMessage, { id: getWorkspaceAccessPermissionDescription(selectedWorkspacePermission).id }) }), _jsx(DialogListHeader, { title: intl.formatMessage({
61
61
  id: "userManagement.workspace.granularPermission.additionalAccess.title",
62
62
  }) }), _jsx("div", { className: "gd-granular-permissions__additional-access-wrapper", children: granularItems.map((granularPermission) => {
63
- return (_jsx(AdditionalAccessPermissionItem, { item: granularPermission, checked: selectedGranularPermissions.includes(granularPermission.id), indefinite: isExportPermissionIndefinite(granularPermission.id, selectedGranularPermissions), disabled: isPermissionDisabled(granularPermission.id, selectedWorkspacePermission, selectedGranularPermissions), onChange: () => handleGranularPermissionChange(granularPermission.id) }, granularPermission.id));
63
+ return (_jsx(AdditionalAccessPermissionItem, { item: granularPermission, checked: selectedGranularPermissions.includes(granularPermission.id), indefinite: isExportPermissionIndefinite(granularPermission.id, selectedGranularPermissions), disabled: isPermissionDisabled(granularPermission.id, selectedWorkspacePermission, selectedGranularPermissions, analyzeIncludesManageVisualizations), onChange: () => handleGranularPermissionChange(granularPermission.id) }, granularPermission.id));
64
64
  }) }), showRedundancyWarningMessage ? (_jsx(Message, { type: "warning", className: "gd-granular-permissions__warning", children: _jsx(FormattedMessage, { id: "userManagement.workspace.granularPermission.warning", values: {
65
65
  b: (chunks) => _jsx("strong", { children: chunks }),
66
66
  } }) })) : null] }));
@@ -8,7 +8,7 @@ export declare const exportPermissions: WorkspacePermissions;
8
8
  *
9
9
  * Returns the list of these granular permissions.
10
10
  */
11
- export declare const getImplicitGranularPermissions: (workspacePermission: WorkspacePermission) => WorkspacePermissions;
11
+ export declare const getImplicitGranularPermissions: (workspacePermission: WorkspacePermission, analyzeIncludesManageVisualizations?: boolean) => WorkspacePermissions;
12
12
  /**
13
13
  * Returns hierarchically strongest permission from the list.
14
14
  */
@@ -16,7 +16,7 @@ export declare const getWorkspacePermission: (permissions: WorkspacePermissions)
16
16
  /**
17
17
  * Returns all granular permissions from a list, inluding implicit ones.
18
18
  */
19
- export declare const getGranularPermissions: (permissions: WorkspacePermissions) => WorkspacePermissions;
19
+ export declare const getGranularPermissions: (permissions: WorkspacePermissions, analyzeIncludesManageVisualizations?: boolean) => WorkspacePermissions;
20
20
  /**
21
21
  * Export permission is a granular permission that has subpermissions,
22
22
  * so sanitization on UI is needed when selecting and deselecting occurs.
@@ -36,19 +36,19 @@ export declare const isExportPermissionIndefinite: (permission: WorkspacePermiss
36
36
  *
37
37
  * Returns whether a permission is disabled.
38
38
  */
39
- export declare const isPermissionDisabled: (permission: WorkspacePermission, selectedWorkspacePermission: WorkspacePermission, selectedGranularPermissions: WorkspacePermissions) => boolean;
39
+ export declare const isPermissionDisabled: (permission: WorkspacePermission, selectedWorkspacePermission: WorkspacePermission, selectedGranularPermissions: WorkspacePermissions, analyzeIncludesManageVisualizations?: boolean) => boolean;
40
40
  /**
41
41
  * Before persisting permissions, we want to remove implicit permissions as they are not needed on BE.
42
42
  *
43
43
  * Returns the list of permissions without implicit ones.
44
44
  */
45
- export declare const removeRedundantPermissions: (permissions: WorkspacePermissions) => WorkspacePermissions;
45
+ export declare const removeRedundantPermissions: (permissions: WorkspacePermissions, analyzeIncludesManageVisualizations?: boolean) => WorkspacePermissions;
46
46
  /**
47
47
  * Returns whether two workspaces differ in hierarchy or permissions.
48
48
  *
49
49
  * Remark: compares what a save would store, so implicit permissions do not count.
50
50
  */
51
- export declare const haveWorkspacePermissionsChanged: (workspace1: IGrantedWorkspace, workspace2: IGrantedWorkspace) => boolean;
51
+ export declare const haveWorkspacePermissionsChanged: (workspace1: IGrantedWorkspace, workspace2: IGrantedWorkspace, analyzeIncludesManageVisualizations?: boolean) => boolean;
52
52
  /**
53
53
  * Returns human-readable title of effective permissions for UI description.
54
54
  */
@@ -1 +1 @@
1
- {"version":3,"file":"granularPermissionUtils.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI7G,eAAO,MAAM,oBAAoB,EAAE,oBAAoD,CAAC;AAExF,eAAO,MAAM,iBAAiB,EAAE,oBAA0D,CAAC;AAW3F;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,wBAClB,mBAAmB,KACzC,oBAqBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,gBAAiB,oBAAoB,KAAG,mBAQ1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,gBAAiB,oBAAoB,KAAG,oBAY1E,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,sBACf,mBAAmB,eACzB,oBAAoB,WACxB,OAAO,KACjB,oBA2BF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eACzB,mBAAmB,+BACF,oBAAoB,YAOpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,eACjB,mBAAmB,+BACF,mBAAmB,+BACnB,oBAAoB,YASpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,gBAAiB,oBAAoB,KAAG,oBAoB9E,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,eAC5B,iBAAiB,cACjB,iBAAiB,YAahC,CAAC;AAsCF;;GAEG;AACH,eAAO,MAAM,gCAAgC,gBAC5B,oBAAoB,QAC3B,SAAS,KAChB,MAmBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,gBAAiB,oBAAoB,KAAG,OAGlF,CAAC"}
1
+ {"version":3,"file":"granularPermissionUtils.d.ts","sourceRoot":"","sources":["../../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAI7G,eAAO,MAAM,oBAAoB,EAAE,oBAAoD,CAAC;AAExF,eAAO,MAAM,iBAAiB,EAAE,oBAA0D,CAAC;AAW3F;;;;;GAKG;AACH,eAAO,MAAM,8BAA8B,wBAClB,mBAAmB,oDAEzC,oBAuBF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,gBAAiB,oBAAoB,KAAG,mBAQ1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,gBAClB,oBAAoB,oDAElC,oBAeF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,sBACf,mBAAmB,eACzB,oBAAoB,WACxB,OAAO,KACjB,oBA2BF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,eACzB,mBAAmB,+BACF,oBAAoB,YAOpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,eACjB,mBAAmB,+BACF,mBAAmB,+BACnB,oBAAoB,2DAUpD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,gBACtB,oBAAoB,oDAElC,oBAmBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,+BAA+B,eAC5B,iBAAiB,cACjB,iBAAiB,2DAchC,CAAC;AAsCF;;GAEG;AACH,eAAO,MAAM,gCAAgC,gBAC5B,oBAAoB,QAC3B,SAAS,KAChB,MAmBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,gBAAiB,oBAAoB,KAAG,OAGlF,CAAC"}
@@ -16,12 +16,14 @@ const includedBy = (permissions) => permissions.flatMap((p) => includedPermissio
16
16
  *
17
17
  * Returns the list of these granular permissions.
18
18
  */
19
- export const getImplicitGranularPermissions = (workspacePermission) => {
19
+ export const getImplicitGranularPermissions = (workspacePermission, analyzeIncludesManageVisualizations = false) => {
20
20
  switch (workspacePermission) {
21
21
  case "VIEW":
22
22
  return [];
23
23
  case "ANALYZE":
24
- return ["CREATE_VISUALIZATION", "CREATE_FILTER_VIEW"];
24
+ return analyzeIncludesManageVisualizations
25
+ ? ["CREATE_VISUALIZATION", "CREATE_FILTER_VIEW", "MANAGE_VISUALIZATIONS"]
26
+ : ["CREATE_VISUALIZATION", "CREATE_FILTER_VIEW"];
25
27
  case "MANAGE":
26
28
  return [
27
29
  "EXPORT",
@@ -55,9 +57,9 @@ export const getWorkspacePermission = (permissions) => {
55
57
  /**
56
58
  * Returns all granular permissions from a list, inluding implicit ones.
57
59
  */
58
- export const getGranularPermissions = (permissions) => {
60
+ export const getGranularPermissions = (permissions, analyzeIncludesManageVisualizations = false) => {
59
61
  const workspacePermission = getWorkspacePermission(permissions);
60
- const implicitGranularPermissions = getImplicitGranularPermissions(workspacePermission);
62
+ const implicitGranularPermissions = getImplicitGranularPermissions(workspacePermission, analyzeIncludesManageVisualizations);
61
63
  const onlyGranularPermissions = permissions.filter((p) => !workspacePermissions.includes(p));
62
64
  return [
63
65
  ...new Set([
@@ -113,10 +115,10 @@ export const isExportPermissionIndefinite = (permission, selectedGranularPermiss
113
115
  *
114
116
  * Returns whether a permission is disabled.
115
117
  */
116
- export const isPermissionDisabled = (permission, selectedWorkspacePermission, selectedGranularPermissions) => {
118
+ export const isPermissionDisabled = (permission, selectedWorkspacePermission, selectedGranularPermissions, analyzeIncludesManageVisualizations = false) => {
117
119
  const isManageWithNoAi = selectedWorkspacePermission === "MANAGE" && permission !== "USE_AI_ASSISTANT";
118
120
  const isAnalyzeWithImpliedPermission = selectedWorkspacePermission === "ANALYZE" &&
119
- (permission === "CREATE_FILTER_VIEW" || permission === "CREATE_VISUALIZATION");
121
+ getImplicitGranularPermissions("ANALYZE", analyzeIncludesManageVisualizations).includes(permission);
120
122
  const isIncluded = includedBy(selectedGranularPermissions).includes(permission);
121
123
  return isManageWithNoAi || isAnalyzeWithImpliedPermission || isIncluded;
122
124
  };
@@ -125,7 +127,7 @@ export const isPermissionDisabled = (permission, selectedWorkspacePermission, se
125
127
  *
126
128
  * Returns the list of permissions without implicit ones.
127
129
  */
128
- export const removeRedundantPermissions = (permissions) => {
130
+ export const removeRedundantPermissions = (permissions, analyzeIncludesManageVisualizations = false) => {
129
131
  let sanitizedPermissions;
130
132
  if (permissions.includes("MANAGE")) {
131
133
  sanitizedPermissions = ["MANAGE"];
@@ -136,9 +138,8 @@ export const removeRedundantPermissions = (permissions) => {
136
138
  }
137
139
  sanitizedPermissions = [...permissions];
138
140
  if (permissions.includes("ANALYZE")) {
139
- sanitizedPermissions = sanitizedPermissions.filter((p) => p !== "VIEW");
140
- sanitizedPermissions = sanitizedPermissions.filter((p) => p !== "CREATE_FILTER_VIEW");
141
- sanitizedPermissions = sanitizedPermissions.filter((p) => p !== "CREATE_VISUALIZATION");
141
+ const implicit = getImplicitGranularPermissions("ANALYZE", analyzeIncludesManageVisualizations);
142
+ sanitizedPermissions = sanitizedPermissions.filter((p) => p !== "VIEW" && !implicit.includes(p));
142
143
  }
143
144
  const included = includedBy(permissions);
144
145
  return sanitizedPermissions.filter((p) => !included.includes(p));
@@ -148,12 +149,12 @@ export const removeRedundantPermissions = (permissions) => {
148
149
  *
149
150
  * Remark: compares what a save would store, so implicit permissions do not count.
150
151
  */
151
- export const haveWorkspacePermissionsChanged = (workspace1, workspace2) => {
152
+ export const haveWorkspacePermissionsChanged = (workspace1, workspace2, analyzeIncludesManageVisualizations = false) => {
152
153
  if (workspace1 === undefined || workspace2 === undefined) {
153
154
  return false;
154
155
  }
155
156
  return (workspace1.isHierarchical !== workspace2.isHierarchical ||
156
- !isEqual(removeRedundantPermissions(workspace1.permissions).sort(), removeRedundantPermissions(workspace2.permissions).sort()));
157
+ !isEqual(removeRedundantPermissions(workspace1.permissions, analyzeIncludesManageVisualizations).sort(), removeRedundantPermissions(workspace2.permissions, analyzeIncludesManageVisualizations).sort()));
157
158
  };
158
159
  /**
159
160
  * Returns reordered permissions with MANAGE, ANALYZE, or VIEW at the first position in this order.
@@ -1,6 +1,6 @@
1
1
  import { type IWorkspaceDescriptor } from "@gooddata/sdk-backend-spi";
2
2
  import { type IGrantedWorkspace, type WorkspacePermissionSubject } from "../types.js";
3
- export declare const useAddWorkspace: (ids: string[], subjectType: WorkspacePermissionSubject, onSubmit: (workspaces: IGrantedWorkspace[]) => void, onCancel: () => void, editWorkspace?: IGrantedWorkspace) => {
3
+ export declare const useAddWorkspace: (ids: string[], subjectType: WorkspacePermissionSubject, onSubmit: (workspaces: IGrantedWorkspace[]) => void, onCancel: () => void, editWorkspace?: IGrantedWorkspace, areVisualizationPermissionsEnabled?: boolean) => {
4
4
  addedWorkspaces: IGrantedWorkspace[];
5
5
  onDelete: (workspace: IGrantedWorkspace) => void;
6
6
  onChange: (workspace: IGrantedWorkspace) => void;
@@ -8,5 +8,6 @@ export declare const useAddWorkspace: (ids: string[], subjectType: WorkspacePerm
8
8
  onOverwriteSelect: ({ id, title }: IWorkspaceDescriptor) => void;
9
9
  onAdd: () => void;
10
10
  isProcessing: boolean;
11
+ analyzeIncludesManageVisualizations: boolean;
11
12
  };
12
13
  //# sourceMappingURL=useAddWorkspace.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAddWorkspace.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAOtE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAKtF,eAAO,MAAM,eAAe,QACnB,MAAM,EAAE,eACA,0BAA0B,YAC7B,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,IAAI,YACzC,MAAM,IAAI,kBACJ,iBAAiB;;0BAWJ,iBAAiB;0BAIjB,iBAAiB;8BA4Db,oBAAoB;uCAIX,oBAAoB;;;CAajE,CAAC"}
1
+ {"version":3,"file":"useAddWorkspace.d.ts","sourceRoot":"","sources":["../../../../../../src/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAQtE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAKtF,eAAO,MAAM,eAAe,QACnB,MAAM,EAAE,eACA,0BAA0B,YAC7B,CAAC,UAAU,EAAE,iBAAiB,EAAE,KAAK,IAAI,YACzC,MAAM,IAAI,kBACJ,iBAAiB;;0BAiBJ,iBAAiB;0BAIjB,iBAAiB;8BA4Db,oBAAoB;uCAIX,oBAAoB;;;;CAcjE,CAAC"}
@@ -2,18 +2,20 @@
2
2
  import { useState } from "react";
3
3
  import { useBackendStrict } from "@gooddata/sdk-ui";
4
4
  import { useToastMessage } from "@gooddata/sdk-ui-kit";
5
+ import { useAnalyzeIncludesManageVisualizations } from "../dialogHooks.js";
5
6
  import { messages } from "../locales.js";
6
7
  import { useOrganizationId } from "../OrganizationIdContext.js";
7
8
  import { useTelemetry } from "../TelemetryContext.js";
8
9
  import { grantedWorkspaceAsPermissionAssignment, sortByName } from "../utils.js";
9
10
  import { removeRedundantPermissions } from "./WorkspaceItem/granularPermissionUtils.js";
10
- export const useAddWorkspace = (ids, subjectType, onSubmit, onCancel, editWorkspace) => {
11
+ export const useAddWorkspace = (ids, subjectType, onSubmit, onCancel, editWorkspace, areVisualizationPermissionsEnabled = false) => {
11
12
  const { addSuccess, addError } = useToastMessage();
12
13
  const backend = useBackendStrict();
13
14
  const organizationId = useOrganizationId();
14
15
  const [addedWorkspaces, setAddedWorkspaces] = useState(editWorkspace ? [editWorkspace] : []);
15
16
  const [isProcessing, setIsProcessing] = useState(false);
16
17
  const trackEvent = useTelemetry();
18
+ const analyzeIncludesManageVisualizations = useAnalyzeIncludesManageVisualizations(addedWorkspaces[0]?.id, areVisualizationPermissionsEnabled);
17
19
  const onDelete = (workspace) => {
18
20
  setAddedWorkspaces(addedWorkspaces.filter((item) => item.id !== workspace.id));
19
21
  };
@@ -27,7 +29,7 @@ export const useAddWorkspace = (ids, subjectType, onSubmit, onCancel, editWorksp
27
29
  // revokes also use and which must name the stored redundant levels.
28
30
  const savedWorkspaces = addedWorkspaces.map((w) => ({
29
31
  ...w,
30
- permissions: removeRedundantPermissions(w.permissions),
32
+ permissions: removeRedundantPermissions(w.permissions, analyzeIncludesManageVisualizations),
31
33
  }));
32
34
  backend
33
35
  .organization(organizationId)
@@ -81,6 +83,7 @@ export const useAddWorkspace = (ids, subjectType, onSubmit, onCancel, editWorksp
81
83
  onOverwriteSelect,
82
84
  onAdd,
83
85
  isProcessing,
86
+ analyzeIncludesManageVisualizations,
84
87
  };
85
88
  };
86
89
  const getInitialWorkspaceTemplate = (id, title) => ({
@@ -1,3 +1,4 @@
1
+ import { type ILocalizationStatistics, type IUserLocalizationSettings } from "@gooddata/sdk-backend-spi";
1
2
  import { type IUser, type IUserGroup } from "@gooddata/sdk-model";
2
3
  import { type ITab } from "@gooddata/sdk-ui-kit";
3
4
  import { type IGrantedDataSource, type IGrantedUserGroup, type IGrantedWorkspace, type IUserMember, type UserEditDialogMode, type UserGroupEditDialogMode, type UserTabId } from "./types.js";
@@ -17,9 +18,16 @@ export declare const useUserLanguages: (userId: string, organizationId: string,
17
18
  isError: boolean;
18
19
  };
19
20
  export declare const useLanguageStatistics: (organizationId: string, isEnabled: boolean) => {
20
- statistics: import("@gooddata/sdk-backend-spi").ILocalizationStatistics | undefined;
21
+ statistics: ILocalizationStatistics | undefined;
21
22
  isLoading: boolean;
22
23
  };
24
+ export declare const useAnalyzeIncludesManageVisualizations: (workspaceId: string | undefined, isEnabled: boolean) => boolean;
25
+ export interface ILanguageNoticeData {
26
+ workspaceStatistics: ILocalizationStatistics[];
27
+ organizationLanguages: IUserLocalizationSettings;
28
+ }
29
+ export declare const LANGUAGE_NOTICE_WORKSPACE_LIMIT = 50;
30
+ export declare const useLanguageNoticeData: (organizationId: string, grantedWorkspaces: IGrantedWorkspace[] | undefined, isEnabled: boolean) => ILanguageNoticeData | undefined;
23
31
  export declare const useUserGroup: (userGroupId: string, organizationId: string, onSuccess: () => void) => {
24
32
  userGroup: IUserGroup | undefined;
25
33
  onUserGroupDetailsChanged: (userGroup: IUserGroup) => void;