@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.
- package/NOTICE +4 -64198
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.d.ts +3 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.js +2 -2
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts +3 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.js +42 -7
- package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.d.ts +8 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.js +46 -2
- package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/UserEditDialog.js +9 -3
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.js +6 -4
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.d.ts +2 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/GranularPermissions.js +3 -3
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.d.ts +5 -5
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/WorkspaceItem/granularPermissionUtils.js +13 -12
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts +2 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.js +5 -2
- package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts +9 -1
- package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/dialogHooks.js +36 -0
- package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts +15 -0
- package/esm/internal/components/dialogs/userManagementDialogs/locales.d.ts.map +1 -1
- package/esm/internal/components/dialogs/userManagementDialogs/locales.js +9 -0
- package/package.json +21 -21
- package/styles/css/main.css +9 -0
- package/styles/css/main.css.map +1 -1
- package/styles/internal/css/user_management_dialogs.css +9 -0
- package/styles/internal/css/user_management_dialogs.css.map +1 -1
- 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
|
package/esm/internal/components/dialogs/userManagementDialogs/Details/UserDetailsView.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
}
|
package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts
CHANGED
|
@@ -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
|
package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/esm/internal/components/dialogs/userManagementDialogs/Details/UserLanguagesSection.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
30
|
-
|
|
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
|
|
67
|
+
function LanguageNoticeMessage({ type, notice }) {
|
|
34
68
|
const intl = useIntl();
|
|
35
|
-
return (_jsx(Message, { type:
|
|
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
|
package/esm/internal/components/dialogs/userManagementDialogs/Details/userLanguages.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
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
|
|
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 }))] })) }) })] }));
|
package/esm/internal/components/dialogs/userManagementDialogs/Workspace/AddWorkspace.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
|
16
|
-
|
|
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;
|
|
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,
|
|
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
|
|
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
|
-
(
|
|
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
|
-
|
|
140
|
-
sanitizedPermissions = sanitizedPermissions.filter((p) => p !== "
|
|
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.
|
package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts
CHANGED
|
@@ -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
|
package/esm/internal/components/dialogs/userManagementDialogs/Workspace/useAddWorkspace.d.ts.map
CHANGED
|
@@ -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;
|
|
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:
|
|
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;
|