@boomerang-io/carbon-addons-boomerang-react 4.6.11-beta.22 → 4.6.11-beta.24
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/README.md +162 -162
- package/dist/cjs/components/AboutPlatform/AboutPlatform.js +50 -50
- package/dist/cjs/components/AdvantageSideNav/AdvantageSideNav.js +245 -211
- package/dist/cjs/components/AutoSuggest/AutoSuggest.js +101 -101
- package/dist/cjs/components/Avatar/Avatar.js +18 -18
- package/dist/cjs/components/CheckboxList/CheckboxList.js +34 -34
- package/dist/cjs/components/ComboBox/ComboBox.js +103 -103
- package/dist/cjs/components/ComboBoxMultiSelect/ComboBoxMultiSelect.js +32 -32
- package/dist/cjs/components/ComboBoxMultiSelect/MultiSelect.js +208 -208
- package/dist/cjs/components/ComposedModal/ComposedModal.js +80 -80
- package/dist/cjs/components/ConfirmModal/ConfirmModal.js +43 -43
- package/dist/cjs/components/Creatable/Creatable.js +137 -137
- package/dist/cjs/components/DataDrivenInput/DataDrivenInput.js +226 -226
- package/dist/cjs/components/DateInput/DateInput.js +35 -35
- package/dist/cjs/components/DecisionButtons/DecisionButtons.js +61 -61
- package/dist/cjs/components/DelayedRender/DelayedRender.js +17 -17
- package/dist/cjs/components/DynamicFormik/DynamicFormik.js +578 -578
- package/dist/cjs/components/Error403/Error403.js +13 -13
- package/dist/cjs/components/Error403/ForbiddenErrorBackground.js +113 -113
- package/dist/cjs/components/Error403/GraphicWrangler/GraphicWrangler.js +62 -62
- package/dist/cjs/components/Error404/Error404.js +13 -13
- package/dist/cjs/components/Error404/GraphicLoch/GraphicLoch.js +17 -17
- package/dist/cjs/components/Error404/NotFoundErrorBackground.js +129 -129
- package/dist/cjs/components/ErrorBoundary/ErrorBoundary.js +32 -32
- package/dist/cjs/components/ErrorDragon/ErrorDragon.js +13 -13
- package/dist/cjs/components/ErrorDragon/assets/ErrorGraphic.js +35 -35
- package/dist/cjs/components/ErrorFullPage/ErrorFullPage.js +10 -10
- package/dist/cjs/components/ErrorMessage/ErrorMessage.js +22 -22
- package/dist/cjs/components/ErrorPage/ErrorPage.js +11 -11
- package/dist/cjs/components/ErrorPageCore/ErrorPageCore.js +15 -15
- package/dist/cjs/components/ErrorPageCore/GenericErrorBackground.js +124 -124
- package/dist/cjs/components/FeatureHeader/FeatureHeader.js +29 -29
- package/dist/cjs/components/FeatureNavTab/FeatureNavTab.js +12 -12
- package/dist/cjs/components/FeatureNavTabs/FeatureNavTabs.js +12 -12
- package/dist/cjs/components/FeatureSideNav/FeatureSideNav.js +12 -12
- package/dist/cjs/components/FeatureSideNav/FeatureSideNavFooter.js +8 -8
- package/dist/cjs/components/FeatureSideNav/FeatureSideNavHeader.js +8 -8
- package/dist/cjs/components/FeatureSideNav/FeatureSideNavLinks.js +14 -14
- package/dist/cjs/components/FeatureSideNavLink/FeatureSideNavLink.js +12 -12
- package/dist/cjs/components/Feedback/Feedback.js +40 -40
- package/dist/cjs/components/FlowModal/FlowModal.js +141 -141
- package/dist/cjs/components/FlowModal/FlowModalForm.js +12 -12
- package/dist/cjs/components/Header/Header.js +179 -179
- package/dist/cjs/components/Header/HeaderAppSwitcher.js +94 -94
- package/dist/cjs/components/Header/HeaderMenu.js +7 -7
- package/dist/cjs/components/Header/HeaderMenuItem.js +52 -52
- package/dist/cjs/components/Header/HeaderTeamSwitcher.js +303 -303
- package/dist/cjs/components/Header/UserRequests.js +29 -29
- package/dist/cjs/components/ImageModal/ImageModal.js +17 -17
- package/dist/cjs/components/Loading/Loading.js +8 -8
- package/dist/cjs/components/MemberBar/MemberBar.js +20 -20
- package/dist/cjs/components/Modal/Modal.js +20 -20
- package/dist/cjs/components/ModalConfirmEdit/ModalConfirmArray.js +14 -14
- package/dist/cjs/components/ModalConfirmEdit/ModalConfirmDetails.js +11 -11
- package/dist/cjs/components/ModalConfirmEdit/ModalConfirmEdit.js +17 -17
- package/dist/cjs/components/ModalForm/ModalForm.js +9 -9
- package/dist/cjs/components/Notifications/NotificationsContainer.js +22 -22
- package/dist/cjs/components/Notifications/ToastNotification.js +21 -21
- package/dist/cjs/components/Notifications/notify.js +17 -17
- package/dist/cjs/components/PlatformBanner/PlatformBanner.js +8 -8
- package/dist/cjs/components/PlatformNotifications/PlatformNotification.js +17 -17
- package/dist/cjs/components/PlatformNotifications/PlatformNotificationsContainer.js +136 -136
- package/dist/cjs/components/Portal/Portal.js +14 -14
- package/dist/cjs/components/PrivacyRedirect/PrivacyRedirect.js +30 -30
- package/dist/cjs/components/PrivacyStatement/PrivacyStatement.js +90 -90
- package/dist/cjs/components/ProfileSettings/ProfileSettings.js +124 -124
- package/dist/cjs/components/ProtectedRoute/ProtectedRoute.js +13 -13
- package/dist/cjs/components/RadioGroup/RadioGroup.js +33 -33
- package/dist/cjs/components/RichTextArea/RichTextArea.js +142 -142
- package/dist/cjs/components/SignOut/SignOut.js +27 -27
- package/dist/cjs/components/SupportCenter/SupportCenter.js +65 -65
- package/dist/cjs/components/TextArea/TextArea.js +16 -16
- package/dist/cjs/components/TextInput/TextInput.js +13 -13
- package/dist/cjs/components/Toggle/Toggle.js +22 -22
- package/dist/cjs/components/TooltipHover/TooltipHover.js +39 -39
- package/dist/cjs/components/UIShell/UIShell.js +94 -94
- package/dist/cjs/config/servicesConfig.js +21 -21
- package/dist/cjs/constants/DataDrivenInputTypes.js +74 -74
- package/dist/cjs/constants/UserType.js +13 -13
- package/dist/cjs/hooks/useHeaderMenu.js +49 -49
- package/dist/cjs/hooks/usePortal.js +74 -74
- package/dist/cjs/hooks/useWindowSize.js +33 -33
- package/dist/cjs/internal/ListBox/ListBox.js +41 -41
- package/dist/cjs/internal/ListBox/ListBoxField.js +19 -19
- package/dist/cjs/internal/ListBox/ListBoxMenu.js +19 -19
- package/dist/cjs/internal/ListBox/ListBoxMenuIcon.js +31 -31
- package/dist/cjs/internal/ListBox/ListBoxMenuItem.js +38 -38
- package/dist/cjs/internal/ListBox/ListBoxSelection.js +64 -64
- package/dist/cjs/internal/ListBox/index.js +10 -10
- package/dist/cjs/internal/keyboard/keys.js +16 -16
- package/dist/cjs/internal/keyboard/match.js +67 -67
- package/dist/cjs/internal/settings.js +5 -5
- package/dist/cjs/tools/accessibility.js +13 -13
- package/dist/cjs/tools/createPropAdapter.js +44 -44
- package/dist/cjs/tools/isUrl.js +39 -39
- package/dist/cjs/tools/setupGetInstanceId.js +20 -20
- package/dist/cjs/tools/useSetState.js +12 -12
- package/dist/cjs/tools/yupAst/astGenerator.js +212 -212
- package/dist/cjs/tools/yupAst/customValidators.js +17 -17
- package/dist/esm/components/AboutPlatform/AboutPlatform.js +50 -50
- package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +246 -212
- package/dist/esm/components/AutoSuggest/AutoSuggest.js +101 -101
- package/dist/esm/components/Avatar/Avatar.js +18 -18
- package/dist/esm/components/CheckboxList/CheckboxList.js +34 -34
- package/dist/esm/components/ComboBox/ComboBox.js +103 -103
- package/dist/esm/components/ComboBoxMultiSelect/ComboBoxMultiSelect.js +32 -32
- package/dist/esm/components/ComboBoxMultiSelect/MultiSelect.js +208 -208
- package/dist/esm/components/ComposedModal/ComposedModal.js +80 -80
- package/dist/esm/components/ConfirmModal/ConfirmModal.js +43 -43
- package/dist/esm/components/Creatable/Creatable.js +137 -137
- package/dist/esm/components/DataDrivenInput/DataDrivenInput.js +226 -226
- package/dist/esm/components/DateInput/DateInput.js +35 -35
- package/dist/esm/components/DecisionButtons/DecisionButtons.js +61 -61
- package/dist/esm/components/DelayedRender/DelayedRender.js +17 -17
- package/dist/esm/components/DynamicFormik/DynamicFormik.js +578 -578
- package/dist/esm/components/Error403/Error403.js +13 -13
- package/dist/esm/components/Error403/ForbiddenErrorBackground.js +113 -113
- package/dist/esm/components/Error403/GraphicWrangler/GraphicWrangler.js +62 -62
- package/dist/esm/components/Error404/Error404.js +13 -13
- package/dist/esm/components/Error404/GraphicLoch/GraphicLoch.js +17 -17
- package/dist/esm/components/Error404/NotFoundErrorBackground.js +129 -129
- package/dist/esm/components/ErrorBoundary/ErrorBoundary.js +32 -32
- package/dist/esm/components/ErrorDragon/ErrorDragon.js +13 -13
- package/dist/esm/components/ErrorDragon/assets/ErrorGraphic.js +35 -35
- package/dist/esm/components/ErrorFullPage/ErrorFullPage.js +10 -10
- package/dist/esm/components/ErrorMessage/ErrorMessage.js +22 -22
- package/dist/esm/components/ErrorPage/ErrorPage.js +11 -11
- package/dist/esm/components/ErrorPageCore/ErrorPageCore.js +15 -15
- package/dist/esm/components/ErrorPageCore/GenericErrorBackground.js +124 -124
- package/dist/esm/components/FeatureHeader/FeatureHeader.js +29 -29
- package/dist/esm/components/FeatureNavTab/FeatureNavTab.js +12 -12
- package/dist/esm/components/FeatureNavTabs/FeatureNavTabs.js +12 -12
- package/dist/esm/components/FeatureSideNav/FeatureSideNav.js +12 -12
- package/dist/esm/components/FeatureSideNav/FeatureSideNavFooter.js +8 -8
- package/dist/esm/components/FeatureSideNav/FeatureSideNavHeader.js +8 -8
- package/dist/esm/components/FeatureSideNav/FeatureSideNavLinks.js +14 -14
- package/dist/esm/components/FeatureSideNavLink/FeatureSideNavLink.js +12 -12
- package/dist/esm/components/Feedback/Feedback.js +40 -40
- package/dist/esm/components/FlowModal/FlowModal.js +141 -141
- package/dist/esm/components/FlowModal/FlowModalForm.js +12 -12
- package/dist/esm/components/Header/Header.js +179 -179
- package/dist/esm/components/Header/HeaderAppSwitcher.js +94 -94
- package/dist/esm/components/Header/HeaderMenu.js +7 -7
- package/dist/esm/components/Header/HeaderMenuItem.js +52 -52
- package/dist/esm/components/Header/HeaderTeamSwitcher.js +303 -303
- package/dist/esm/components/Header/UserRequests.js +29 -29
- package/dist/esm/components/ImageModal/ImageModal.js +17 -17
- package/dist/esm/components/Loading/Loading.js +8 -8
- package/dist/esm/components/MemberBar/MemberBar.js +20 -20
- package/dist/esm/components/Modal/Modal.js +20 -20
- package/dist/esm/components/ModalConfirmEdit/ModalConfirmArray.js +14 -14
- package/dist/esm/components/ModalConfirmEdit/ModalConfirmDetails.js +11 -11
- package/dist/esm/components/ModalConfirmEdit/ModalConfirmEdit.js +17 -17
- package/dist/esm/components/ModalForm/ModalForm.js +9 -9
- package/dist/esm/components/Notifications/NotificationsContainer.js +22 -22
- package/dist/esm/components/Notifications/ToastNotification.js +21 -21
- package/dist/esm/components/Notifications/notify.js +17 -17
- package/dist/esm/components/PlatformBanner/PlatformBanner.js +8 -8
- package/dist/esm/components/PlatformNotifications/PlatformNotification.js +17 -17
- package/dist/esm/components/PlatformNotifications/PlatformNotificationsContainer.js +136 -136
- package/dist/esm/components/Portal/Portal.js +14 -14
- package/dist/esm/components/PrivacyRedirect/PrivacyRedirect.js +30 -30
- package/dist/esm/components/PrivacyStatement/PrivacyStatement.js +90 -90
- package/dist/esm/components/ProfileSettings/ProfileSettings.js +124 -124
- package/dist/esm/components/ProtectedRoute/ProtectedRoute.js +13 -13
- package/dist/esm/components/RadioGroup/RadioGroup.js +33 -33
- package/dist/esm/components/RichTextArea/RichTextArea.js +142 -142
- package/dist/esm/components/SignOut/SignOut.js +27 -27
- package/dist/esm/components/SupportCenter/SupportCenter.js +65 -65
- package/dist/esm/components/TextArea/TextArea.js +16 -16
- package/dist/esm/components/TextInput/TextInput.js +13 -13
- package/dist/esm/components/Toggle/Toggle.js +22 -22
- package/dist/esm/components/TooltipHover/TooltipHover.js +39 -39
- package/dist/esm/components/UIShell/UIShell.js +94 -94
- package/dist/esm/config/servicesConfig.js +21 -21
- package/dist/esm/constants/DataDrivenInputTypes.js +74 -74
- package/dist/esm/constants/UserType.js +13 -13
- package/dist/esm/hooks/useHeaderMenu.js +49 -49
- package/dist/esm/hooks/usePortal.js +74 -74
- package/dist/esm/hooks/useWindowSize.js +33 -33
- package/dist/esm/internal/ListBox/ListBox.js +41 -41
- package/dist/esm/internal/ListBox/ListBoxField.js +19 -19
- package/dist/esm/internal/ListBox/ListBoxMenu.js +19 -19
- package/dist/esm/internal/ListBox/ListBoxMenuIcon.js +31 -31
- package/dist/esm/internal/ListBox/ListBoxMenuItem.js +38 -38
- package/dist/esm/internal/ListBox/ListBoxSelection.js +64 -64
- package/dist/esm/internal/ListBox/index.js +10 -10
- package/dist/esm/internal/keyboard/keys.js +16 -16
- package/dist/esm/internal/keyboard/match.js +67 -67
- package/dist/esm/internal/settings.js +5 -5
- package/dist/esm/tools/accessibility.js +13 -13
- package/dist/esm/tools/createPropAdapter.js +44 -44
- package/dist/esm/tools/isUrl.js +39 -39
- package/dist/esm/tools/setupGetInstanceId.js +20 -20
- package/dist/esm/tools/useSetState.js +12 -12
- package/dist/esm/tools/yupAst/astGenerator.js +212 -212
- package/dist/esm/tools/yupAst/customValidators.js +17 -17
- package/dist/types/index.d.ts +1335 -1420
- package/package.json +167 -167
- package/scss/components/AboutPlatform/_aboutPlatform.scss +139 -139
- package/scss/components/AdvantageSideNav/_advantageSideNav.scss +261 -261
- package/scss/components/AutoSuggest/_autoSuggest.scss +62 -62
- package/scss/components/Avatar/_avatar.scss +32 -32
- package/scss/components/CheckboxList/_checkboxList.scss +26 -26
- package/scss/components/ComboBox/_combobox.scss +23 -23
- package/scss/components/ComboBoxMultiSelect/_comboBoxMultiSelect.scss +53 -53
- package/scss/components/ConfirmModal/_confirmModal.scss +12 -12
- package/scss/components/Creatable/_creatable.scss +48 -48
- package/scss/components/DateInput/_dateInput.scss +36 -36
- package/scss/components/DecisionButtons/_decisionButtons.scss +132 -132
- package/scss/components/DynamicFormik/_dynamicFormik.scss +17 -17
- package/scss/components/ErrorBoundary/_errorBoundary.scss +12 -12
- package/scss/components/ErrorDragon/_errorDragon.scss +55 -55
- package/scss/components/ErrorMessage/_errorMessage.scss +43 -43
- package/scss/components/ErrorPage/_errorPage.scss +66 -66
- package/scss/components/ErrorPageCore/_errorPageCore.scss +73 -73
- package/scss/components/FeatureHeader/_featureHeader.scss +67 -67
- package/scss/components/FeatureNavTab/_featureNavTab.scss +27 -27
- package/scss/components/FeatureSideNav/_featureSideNav.scss +76 -76
- package/scss/components/FeatureSideNavLink/_featureSideNavLink.scss +49 -49
- package/scss/components/Feedback/_feedback.scss +46 -46
- package/scss/components/Header/_header.scss +179 -179
- package/scss/components/Header/_headerAppSwitcher.scss +117 -117
- package/scss/components/Header/_headerMenu.scss +30 -30
- package/scss/components/Header/_headerMenuItem.scss +65 -65
- package/scss/components/Header/_headerTeamSwitcher.scss +195 -195
- package/scss/components/Header/_userRequests.scss +36 -36
- package/scss/components/ImageModal/_imageModal.scss +51 -51
- package/scss/components/MemberBar/_memberBar.scss +99 -99
- package/scss/components/Modal/_modal.scss +163 -163
- package/scss/components/ModalConfirmEdit/_modalConfirmEdit.scss +113 -113
- package/scss/components/Notifications/_notifications.scss +57 -57
- package/scss/components/PlatformBanner/_platformBanner.scss +30 -30
- package/scss/components/PlatformNotifications/_platformNotifications.scss +230 -230
- package/scss/components/PrivacyRedirect/_privacyRedirect.scss +43 -43
- package/scss/components/PrivacyStatement/_privacyStatement.scss +137 -137
- package/scss/components/ProfileSettings/_profileSettings.scss +117 -117
- package/scss/components/ProtectedRoute/_protectedRoute.scss +32 -32
- package/scss/components/RadioGroup/_radioGroup.scss +46 -46
- package/scss/components/RichTextArea/_richTextArea.scss +82 -82
- package/scss/components/SignOut/_signOut.scss +51 -51
- package/scss/components/SupportCenter/_supportCenter.scss +16 -16
- package/scss/components/TextArea/_textArea.scss +19 -19
- package/scss/components/TextInput/_textInput.scss +26 -26
- package/scss/components/Toggle/_toggle.scss +80 -80
- package/scss/components/TooltipHover/_tooltip.scss +48 -48
- package/scss/global/_config.scss +14 -14
- package/scss/global/_tippy.scss +49 -49
- package/scss/global/index.scss +401 -401
- package/scss/global/themes/_boomerang.scss +184 -184
- package/scss/global/themes/_default.scss +79 -79
- package/scss/global/themes/_shell-tokens.scss +42 -42
- package/scss/global/utils/_animations.scss +15 -15
- package/scss/global/utils/_mixins.scss +67 -67
- package/scss/global/utils/index.scss +10 -10
|
@@ -10,130 +10,130 @@ import sortBy from 'lodash.sortby';
|
|
|
10
10
|
import { useQueryClient, useQuery, useMutation } from 'react-query';
|
|
11
11
|
import { prefix } from '../../internal/settings.js';
|
|
12
12
|
|
|
13
|
-
/*
|
|
14
|
-
IBM Confidential
|
|
15
|
-
694970X, 69497O0
|
|
16
|
-
© Copyright IBM Corp. 2022, 2024
|
|
17
|
-
*/
|
|
18
|
-
function determineIfConfigIsDifferent(teams, initialTeams) {
|
|
19
|
-
let isConfigDifferent = false;
|
|
20
|
-
for (let idx = 0; idx < teams?.length; idx++) {
|
|
21
|
-
if (teams[idx]?.visible !== initialTeams[idx]?.visible) {
|
|
22
|
-
isConfigDifferent = true;
|
|
23
|
-
break;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return isConfigDifferent;
|
|
27
|
-
}
|
|
28
|
-
function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal }) {
|
|
29
|
-
const queryClient = useQueryClient();
|
|
30
|
-
const [initialTeams, setInitialTeams] = useState([]);
|
|
31
|
-
const [teams, setTeams] = useState([]);
|
|
32
|
-
const userUrl = serviceUrl.getLaunchpadUser({ baseServicesUrl });
|
|
33
|
-
const profileUrl = serviceUrl.resourceUserProfile({ baseServicesUrl });
|
|
34
|
-
const { data: user, isLoading: userIsLoading, error: userError, } = useQuery({
|
|
35
|
-
queryKey: userUrl,
|
|
36
|
-
queryFn: resolver.query(userUrl),
|
|
37
|
-
});
|
|
38
|
-
const { mutateAsync: mutateUserProfile, isLoading: mutateUserProfileIsLoading, error: mutateUserProfileError, } = useMutation(resolver.patchUserProfile, {
|
|
39
|
-
onSuccess: () => {
|
|
40
|
-
queryClient.invalidateQueries(userUrl);
|
|
41
|
-
queryClient.invalidateQueries(profileUrl);
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
// Only disable when we have a user and we know that there aren' any lower level groups to manage
|
|
45
|
-
const disableModal = user && user?.lowerLevelGroups === undefined;
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
const teams = user?.lowerLevelGroups ?? [];
|
|
48
|
-
setInitialTeams(teams);
|
|
49
|
-
setTeams(teams);
|
|
50
|
-
}, [user]);
|
|
51
|
-
function handleClose() {
|
|
52
|
-
closeModal();
|
|
53
|
-
setTeams(initialTeams);
|
|
54
|
-
}
|
|
55
|
-
async function handleSubmit() {
|
|
56
|
-
const body = {
|
|
57
|
-
lowerLevelGroups: teams,
|
|
58
|
-
};
|
|
59
|
-
try {
|
|
60
|
-
await mutateUserProfile({ baseServicesUrl, body });
|
|
61
|
-
notify(React.createElement(ToastNotification, { subtitle: "Successfully updated user settings", title: "Update Settings", kind: "success" }), { containerId: `${prefix}--bmrg-header-notifications` });
|
|
62
|
-
closeModal();
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
// noop
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const visibleTeamCount = teams?.filter((team) => team?.visible)?.length ?? 0;
|
|
69
|
-
const allTeamsAreChecked = teams?.length === visibleTeamCount;
|
|
70
|
-
const someTeamsAreChecked = visibleTeamCount > 0 && !allTeamsAreChecked;
|
|
71
|
-
const isConfigDifferent = determineIfConfigIsDifferent(teams, initialTeams);
|
|
72
|
-
function batchChangeTeamVisibility() {
|
|
73
|
-
const updatedTeams = teams.map((team) => ({ ...team, visible: !allTeamsAreChecked }));
|
|
74
|
-
setTeams(updatedTeams);
|
|
75
|
-
}
|
|
76
|
-
function handleUpdateTeamVisibility(id, checked) {
|
|
77
|
-
const updatedTeams = [];
|
|
78
|
-
for (let team of teams) {
|
|
79
|
-
const newTeam = { ...team };
|
|
80
|
-
if (newTeam.id === id) {
|
|
81
|
-
newTeam.visible = checked;
|
|
82
|
-
}
|
|
83
|
-
updatedTeams.push(newTeam);
|
|
84
|
-
}
|
|
85
|
-
setTeams(updatedTeams);
|
|
86
|
-
}
|
|
87
|
-
if (disableModal) {
|
|
88
|
-
return (React.createElement("div", { className: `${prefix}--bmrg-profile-menu-user` },
|
|
89
|
-
React.createElement(Avatar, { size: "medium", src: src, userName: userName }),
|
|
90
|
-
React.createElement("p", { className: `${prefix}--bmrg-profile-menu-user__name` },
|
|
91
|
-
" ",
|
|
92
|
-
userName ? userName : "",
|
|
93
|
-
" ")));
|
|
94
|
-
}
|
|
95
|
-
return (React.createElement(ComposedModal, { "aria-label": "Profile Settings", className: `${prefix}--bmrg-profile-settings-container ${prefix}--bmrg-header-modal`, open: isOpen, onClose: handleClose, preventCloseOnClickOutside: true },
|
|
96
|
-
React.createElement(ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
|
|
97
|
-
React.createElement(ModalBody, { style: { maxHeight: "31.5rem" } },
|
|
98
|
-
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__title` }, "More user profile settings will be here eventually, but for now you can choose which Teams are shown in your sidebar in Launchpad."),
|
|
99
|
-
React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
|
|
100
|
-
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad sidebar and Catalog (useful for sensitive demos). You will not be able to access or view unchecked Teams from the sidebar, and cannot add items to them from Catalog."),
|
|
101
|
-
userIsLoading ? (React.createElement(StructuredListSkeleton, null)) : userError ? (React.createElement(Error, { style: { color: "#F2F4F8", padding: "1rem" } })) : teams?.length > 0 ? (React.createElement(StructuredListWrapper, { className: `${prefix}--bmrg-profile-settings-list` },
|
|
102
|
-
React.createElement(StructuredListHead, null,
|
|
103
|
-
React.createElement(StructuredListRow, { head: true },
|
|
104
|
-
React.createElement(StructuredListCell, { head: true },
|
|
105
|
-
React.createElement(Checkbox, { checked: allTeamsAreChecked, id: "team-name-batch-toggle", indeterminate: someTeamsAreChecked, labelText: "Team Name", onChange: batchChangeTeamVisibility })))),
|
|
106
|
-
React.createElement(StructuredListBody, null, sortBy(teams, "name").map(({ name, displayName, id, visible }) => (React.createElement(StructuredListRow, { key: id, className: !visible ? `${prefix}--bmrg-profile-settings-list__row--disabled` : "" },
|
|
107
|
-
React.createElement(StructuredListCell, null,
|
|
108
|
-
React.createElement(Checkbox, { checked: visible, id: id, labelText: Boolean(displayName) ? displayName : name, onChange: (_, { checked, id }) => {
|
|
109
|
-
return handleUpdateTeamVisibility(id, checked);
|
|
110
|
-
} })))))))) : (React.createElement("p", { style: { marginTop: "3rem", color: "#F2F4F8" } }, "No teams to configure. Join or create teams in Launchpad!"))),
|
|
111
|
-
React.createElement(ModalFooter, null,
|
|
112
|
-
mutateUserProfileError && (React.createElement("div", { style: {
|
|
113
|
-
position: "absolute",
|
|
114
|
-
top: "-5rem",
|
|
115
|
-
left: "2rem",
|
|
116
|
-
width: "90%",
|
|
117
|
-
} },
|
|
118
|
-
React.createElement(InlineNotification, { kind: "error", title: "Something's Wrong", subtitle: "Failed to update user profile" }))),
|
|
119
|
-
React.createElement(Button, { "data-modal-primary-focus": true, kind: "secondary", onClick: handleClose }, "Cancel"),
|
|
120
|
-
React.createElement(Button, { disabled: !isConfigDifferent || mutateUserProfileIsLoading, kind: "primary", type: "submit", onClick: (e) => {
|
|
121
|
-
e.preventDefault();
|
|
122
|
-
handleSubmit();
|
|
123
|
-
} }, mutateUserProfileError ? "Try Again" : mutateUserProfileIsLoading ? "Saving..." : "Save changes"))));
|
|
124
|
-
}
|
|
125
|
-
function ProfileSettingsMenuItem(props) {
|
|
126
|
-
const menuItemRef = React.useRef(null);
|
|
127
|
-
const [isOpen, setIsOpen] = React.useState(false);
|
|
128
|
-
const handleClose = () => {
|
|
129
|
-
setIsOpen(false);
|
|
130
|
-
setTimeout(() => {
|
|
131
|
-
menuItemRef.current?.focus();
|
|
132
|
-
}, 0);
|
|
133
|
-
};
|
|
134
|
-
return (React.createElement(React.Fragment, null,
|
|
135
|
-
React.createElement(HeaderMenuItem, { onClick: () => setIsOpen(!isOpen), ref: menuItemRef, src: props.src, type: "user", userName: props.userName }),
|
|
136
|
-
React.createElement(ProfileSettings, { isOpen: isOpen, closeModal: handleClose, ...props })));
|
|
13
|
+
/*
|
|
14
|
+
IBM Confidential
|
|
15
|
+
694970X, 69497O0
|
|
16
|
+
© Copyright IBM Corp. 2022, 2024
|
|
17
|
+
*/
|
|
18
|
+
function determineIfConfigIsDifferent(teams, initialTeams) {
|
|
19
|
+
let isConfigDifferent = false;
|
|
20
|
+
for (let idx = 0; idx < teams?.length; idx++) {
|
|
21
|
+
if (teams[idx]?.visible !== initialTeams[idx]?.visible) {
|
|
22
|
+
isConfigDifferent = true;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return isConfigDifferent;
|
|
27
|
+
}
|
|
28
|
+
function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal }) {
|
|
29
|
+
const queryClient = useQueryClient();
|
|
30
|
+
const [initialTeams, setInitialTeams] = useState([]);
|
|
31
|
+
const [teams, setTeams] = useState([]);
|
|
32
|
+
const userUrl = serviceUrl.getLaunchpadUser({ baseServicesUrl });
|
|
33
|
+
const profileUrl = serviceUrl.resourceUserProfile({ baseServicesUrl });
|
|
34
|
+
const { data: user, isLoading: userIsLoading, error: userError, } = useQuery({
|
|
35
|
+
queryKey: userUrl,
|
|
36
|
+
queryFn: resolver.query(userUrl),
|
|
37
|
+
});
|
|
38
|
+
const { mutateAsync: mutateUserProfile, isLoading: mutateUserProfileIsLoading, error: mutateUserProfileError, } = useMutation(resolver.patchUserProfile, {
|
|
39
|
+
onSuccess: () => {
|
|
40
|
+
queryClient.invalidateQueries(userUrl);
|
|
41
|
+
queryClient.invalidateQueries(profileUrl);
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
// Only disable when we have a user and we know that there aren' any lower level groups to manage
|
|
45
|
+
const disableModal = user && user?.lowerLevelGroups === undefined;
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
const teams = user?.lowerLevelGroups ?? [];
|
|
48
|
+
setInitialTeams(teams);
|
|
49
|
+
setTeams(teams);
|
|
50
|
+
}, [user]);
|
|
51
|
+
function handleClose() {
|
|
52
|
+
closeModal();
|
|
53
|
+
setTeams(initialTeams);
|
|
54
|
+
}
|
|
55
|
+
async function handleSubmit() {
|
|
56
|
+
const body = {
|
|
57
|
+
lowerLevelGroups: teams,
|
|
58
|
+
};
|
|
59
|
+
try {
|
|
60
|
+
await mutateUserProfile({ baseServicesUrl, body });
|
|
61
|
+
notify(React.createElement(ToastNotification, { subtitle: "Successfully updated user settings", title: "Update Settings", kind: "success" }), { containerId: `${prefix}--bmrg-header-notifications` });
|
|
62
|
+
closeModal();
|
|
63
|
+
}
|
|
64
|
+
catch (e) {
|
|
65
|
+
// noop
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const visibleTeamCount = teams?.filter((team) => team?.visible)?.length ?? 0;
|
|
69
|
+
const allTeamsAreChecked = teams?.length === visibleTeamCount;
|
|
70
|
+
const someTeamsAreChecked = visibleTeamCount > 0 && !allTeamsAreChecked;
|
|
71
|
+
const isConfigDifferent = determineIfConfigIsDifferent(teams, initialTeams);
|
|
72
|
+
function batchChangeTeamVisibility() {
|
|
73
|
+
const updatedTeams = teams.map((team) => ({ ...team, visible: !allTeamsAreChecked }));
|
|
74
|
+
setTeams(updatedTeams);
|
|
75
|
+
}
|
|
76
|
+
function handleUpdateTeamVisibility(id, checked) {
|
|
77
|
+
const updatedTeams = [];
|
|
78
|
+
for (let team of teams) {
|
|
79
|
+
const newTeam = { ...team };
|
|
80
|
+
if (newTeam.id === id) {
|
|
81
|
+
newTeam.visible = checked;
|
|
82
|
+
}
|
|
83
|
+
updatedTeams.push(newTeam);
|
|
84
|
+
}
|
|
85
|
+
setTeams(updatedTeams);
|
|
86
|
+
}
|
|
87
|
+
if (disableModal) {
|
|
88
|
+
return (React.createElement("div", { className: `${prefix}--bmrg-profile-menu-user` },
|
|
89
|
+
React.createElement(Avatar, { size: "medium", src: src, userName: userName }),
|
|
90
|
+
React.createElement("p", { className: `${prefix}--bmrg-profile-menu-user__name` },
|
|
91
|
+
" ",
|
|
92
|
+
userName ? userName : "",
|
|
93
|
+
" ")));
|
|
94
|
+
}
|
|
95
|
+
return (React.createElement(ComposedModal, { "aria-label": "Profile Settings", className: `${prefix}--bmrg-profile-settings-container ${prefix}--bmrg-header-modal`, open: isOpen, onClose: handleClose, preventCloseOnClickOutside: true },
|
|
96
|
+
React.createElement(ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
|
|
97
|
+
React.createElement(ModalBody, { style: { maxHeight: "31.5rem" } },
|
|
98
|
+
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__title` }, "More user profile settings will be here eventually, but for now you can choose which Teams are shown in your sidebar in Launchpad."),
|
|
99
|
+
React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
|
|
100
|
+
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad sidebar and Catalog (useful for sensitive demos). You will not be able to access or view unchecked Teams from the sidebar, and cannot add items to them from Catalog."),
|
|
101
|
+
userIsLoading ? (React.createElement(StructuredListSkeleton, null)) : userError ? (React.createElement(Error, { style: { color: "#F2F4F8", padding: "1rem" } })) : teams?.length > 0 ? (React.createElement(StructuredListWrapper, { className: `${prefix}--bmrg-profile-settings-list` },
|
|
102
|
+
React.createElement(StructuredListHead, null,
|
|
103
|
+
React.createElement(StructuredListRow, { head: true },
|
|
104
|
+
React.createElement(StructuredListCell, { head: true },
|
|
105
|
+
React.createElement(Checkbox, { checked: allTeamsAreChecked, id: "team-name-batch-toggle", indeterminate: someTeamsAreChecked, labelText: "Team Name", onChange: batchChangeTeamVisibility })))),
|
|
106
|
+
React.createElement(StructuredListBody, null, sortBy(teams, "name").map(({ name, displayName, id, visible }) => (React.createElement(StructuredListRow, { key: id, className: !visible ? `${prefix}--bmrg-profile-settings-list__row--disabled` : "" },
|
|
107
|
+
React.createElement(StructuredListCell, null,
|
|
108
|
+
React.createElement(Checkbox, { checked: visible, id: id, labelText: Boolean(displayName) ? displayName : name, onChange: (_, { checked, id }) => {
|
|
109
|
+
return handleUpdateTeamVisibility(id, checked);
|
|
110
|
+
} })))))))) : (React.createElement("p", { style: { marginTop: "3rem", color: "#F2F4F8" } }, "No teams to configure. Join or create teams in Launchpad!"))),
|
|
111
|
+
React.createElement(ModalFooter, null,
|
|
112
|
+
mutateUserProfileError && (React.createElement("div", { style: {
|
|
113
|
+
position: "absolute",
|
|
114
|
+
top: "-5rem",
|
|
115
|
+
left: "2rem",
|
|
116
|
+
width: "90%",
|
|
117
|
+
} },
|
|
118
|
+
React.createElement(InlineNotification, { kind: "error", title: "Something's Wrong", subtitle: "Failed to update user profile" }))),
|
|
119
|
+
React.createElement(Button, { "data-modal-primary-focus": true, kind: "secondary", onClick: handleClose }, "Cancel"),
|
|
120
|
+
React.createElement(Button, { disabled: !isConfigDifferent || mutateUserProfileIsLoading, kind: "primary", type: "submit", onClick: (e) => {
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
handleSubmit();
|
|
123
|
+
} }, mutateUserProfileError ? "Try Again" : mutateUserProfileIsLoading ? "Saving..." : "Save changes"))));
|
|
124
|
+
}
|
|
125
|
+
function ProfileSettingsMenuItem(props) {
|
|
126
|
+
const menuItemRef = React.useRef(null);
|
|
127
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
128
|
+
const handleClose = () => {
|
|
129
|
+
setIsOpen(false);
|
|
130
|
+
setTimeout(() => {
|
|
131
|
+
menuItemRef.current?.focus();
|
|
132
|
+
}, 0);
|
|
133
|
+
};
|
|
134
|
+
return (React.createElement(React.Fragment, null,
|
|
135
|
+
React.createElement(HeaderMenuItem, { onClick: () => setIsOpen(!isOpen), ref: menuItemRef, src: props.src, type: "user", userName: props.userName }),
|
|
136
|
+
React.createElement(ProfileSettings, { isOpen: isOpen, closeModal: handleClose, ...props })));
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
export { ProfileSettingsMenuItem, ProfileSettings as default };
|
|
@@ -2,19 +2,19 @@ import React from 'react';
|
|
|
2
2
|
import { Route } from 'react-router-dom';
|
|
3
3
|
import Error403 from '../Error403/Error403.js';
|
|
4
4
|
|
|
5
|
-
/*
|
|
6
|
-
IBM Confidential
|
|
7
|
-
694970X, 69497O0
|
|
8
|
-
© Copyright IBM Corp. 2022, 2024
|
|
9
|
-
*/
|
|
10
|
-
const checkAuth = (userRole, allowedUserRoles) => {
|
|
11
|
-
if (Array.isArray(userRole)) {
|
|
12
|
-
return userRole.some((role) => allowedUserRoles.some((allowedRole) => allowedRole === role));
|
|
13
|
-
}
|
|
14
|
-
return allowedUserRoles.some((allowedRole) => allowedRole === userRole);
|
|
15
|
-
};
|
|
16
|
-
function ProtectedRoute({ allowedUserRoles, component, message = "If you think you should be, contact your friendly neighborhood platform admin.", title = "Sorry mate, you are not allowed here.", userRole, ...rest }) {
|
|
17
|
-
return (React.createElement(Route, { ...rest }, checkAuth(userRole, allowedUserRoles) ? component : React.createElement(Error403, { message: message, title: title })));
|
|
5
|
+
/*
|
|
6
|
+
IBM Confidential
|
|
7
|
+
694970X, 69497O0
|
|
8
|
+
© Copyright IBM Corp. 2022, 2024
|
|
9
|
+
*/
|
|
10
|
+
const checkAuth = (userRole, allowedUserRoles) => {
|
|
11
|
+
if (Array.isArray(userRole)) {
|
|
12
|
+
return userRole.some((role) => allowedUserRoles.some((allowedRole) => allowedRole === role));
|
|
13
|
+
}
|
|
14
|
+
return allowedUserRoles.some((allowedRole) => allowedRole === userRole);
|
|
15
|
+
};
|
|
16
|
+
function ProtectedRoute({ allowedUserRoles, component, message = "If you think you should be, contact your friendly neighborhood platform admin.", title = "Sorry mate, you are not allowed here.", userRole, ...rest }) {
|
|
17
|
+
return (React.createElement(Route, { ...rest }, checkAuth(userRole, allowedUserRoles) ? component : React.createElement(Error403, { message: message, title: title })));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
export { ProtectedRoute as default };
|
|
@@ -4,39 +4,39 @@ import { Information } from '@carbon/react/icons';
|
|
|
4
4
|
import TooltipHover from '../TooltipHover/TooltipHover.js';
|
|
5
5
|
import { prefix } from '../../internal/settings.js';
|
|
6
6
|
|
|
7
|
-
/*
|
|
8
|
-
IBM Confidential
|
|
9
|
-
694970X, 69497O0
|
|
10
|
-
© Copyright IBM Corp. 2022, 2024
|
|
11
|
-
*/
|
|
12
|
-
function RadioGroupComponent({ defaultSelected, disabled, helperText, id, label, labelText, name, onChange, options, orientation, radioGroupProps, radioButtonProps, tooltipClassName = `${prefix}--bmrg-radio-group__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, value, columnHeight = "6rem", verticalWrapped = false, }) {
|
|
13
|
-
const labelValue = label || labelText;
|
|
14
|
-
const labelTextId = !labelValue ? undefined : `${id}-label`;
|
|
15
|
-
const isVertical = orientation === "vertical";
|
|
16
|
-
const hasVerticalHelperText = isVertical && helperText;
|
|
17
|
-
const hasHorizontalHelperText = !isVertical && helperText;
|
|
18
|
-
// add "title" attribute to radio buttons labels so they show a tooltip with the content
|
|
19
|
-
React.useEffect(() => {
|
|
20
|
-
if (Array.isArray(options)) {
|
|
21
|
-
options.forEach((option, index) => {
|
|
22
|
-
const inputElement = document.getElementById(option.value);
|
|
23
|
-
if (Boolean(inputElement) && inputElement !== null) {
|
|
24
|
-
inputElement.parentNode?.children[1]?.children[1]?.setAttribute("title", options[index].labelText);
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
return (
|
|
30
|
-
//Defined a css var --height to be used on the wrapped container to determine the number of radios displayed in each column
|
|
31
|
-
React.createElement("div", { key: id, className: `${prefix}--bmrg-radio-group`, style: { ["--height"]: columnHeight } },
|
|
32
|
-
labelValue && (React.createElement("div", { className: `${prefix}--bmrg-radio-group__title` },
|
|
33
|
-
React.createElement("div", { id: labelTextId, className: `${prefix}--label` }, labelValue),
|
|
34
|
-
tooltipContent && (React.createElement("div", { className: tooltipClassName },
|
|
35
|
-
React.createElement(TooltipHover, { ...tooltipProps, tooltipText: tooltipContent },
|
|
36
|
-
React.createElement(Information, { size: 16, fill: "currentColor" })))))),
|
|
37
|
-
hasVerticalHelperText && (React.createElement("div", { className: `${prefix}--form__helper-text`, style: { marginBottom: "0.375rem" } }, helperText)),
|
|
38
|
-
React.createElement(RadioButtonGroup, { className: isVertical && verticalWrapped ? `${prefix}--bmrg-radio-group__container` : undefined, defaultSelected: defaultSelected, disabled: disabled, name: name, onChange: onChange, orientation: orientation, valueSelected: value, ...radioGroupProps }, options.map((option) => (React.createElement(RadioButton, { disabled: option.disabled, id: option.value, key: option.value, labelText: option.labelText, value: option.value, ...radioButtonProps })))),
|
|
39
|
-
hasHorizontalHelperText && React.createElement("div", { className: `${prefix}--form__helper-text` }, helperText)));
|
|
7
|
+
/*
|
|
8
|
+
IBM Confidential
|
|
9
|
+
694970X, 69497O0
|
|
10
|
+
© Copyright IBM Corp. 2022, 2024
|
|
11
|
+
*/
|
|
12
|
+
function RadioGroupComponent({ defaultSelected, disabled, helperText, id, label, labelText, name, onChange, options, orientation, radioGroupProps, radioButtonProps, tooltipClassName = `${prefix}--bmrg-radio-group__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, value, columnHeight = "6rem", verticalWrapped = false, }) {
|
|
13
|
+
const labelValue = label || labelText;
|
|
14
|
+
const labelTextId = !labelValue ? undefined : `${id}-label`;
|
|
15
|
+
const isVertical = orientation === "vertical";
|
|
16
|
+
const hasVerticalHelperText = isVertical && helperText;
|
|
17
|
+
const hasHorizontalHelperText = !isVertical && helperText;
|
|
18
|
+
// add "title" attribute to radio buttons labels so they show a tooltip with the content
|
|
19
|
+
React.useEffect(() => {
|
|
20
|
+
if (Array.isArray(options)) {
|
|
21
|
+
options.forEach((option, index) => {
|
|
22
|
+
const inputElement = document.getElementById(option.value);
|
|
23
|
+
if (Boolean(inputElement) && inputElement !== null) {
|
|
24
|
+
inputElement.parentNode?.children[1]?.children[1]?.setAttribute("title", options[index].labelText);
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return (
|
|
30
|
+
//Defined a css var --height to be used on the wrapped container to determine the number of radios displayed in each column
|
|
31
|
+
React.createElement("div", { key: id, className: `${prefix}--bmrg-radio-group`, style: { ["--height"]: columnHeight } },
|
|
32
|
+
labelValue && (React.createElement("div", { className: `${prefix}--bmrg-radio-group__title` },
|
|
33
|
+
React.createElement("div", { id: labelTextId, className: `${prefix}--label` }, labelValue),
|
|
34
|
+
tooltipContent && (React.createElement("div", { className: tooltipClassName },
|
|
35
|
+
React.createElement(TooltipHover, { ...tooltipProps, tooltipText: tooltipContent },
|
|
36
|
+
React.createElement(Information, { size: 16, fill: "currentColor" })))))),
|
|
37
|
+
hasVerticalHelperText && (React.createElement("div", { className: `${prefix}--form__helper-text`, style: { marginBottom: "0.375rem" } }, helperText)),
|
|
38
|
+
React.createElement(RadioButtonGroup, { className: isVertical && verticalWrapped ? `${prefix}--bmrg-radio-group__container` : undefined, defaultSelected: defaultSelected, disabled: disabled, name: name, onChange: onChange, orientation: orientation, valueSelected: value, ...radioGroupProps }, options.map((option) => (React.createElement(RadioButton, { disabled: option.disabled, id: option.value, key: option.value, labelText: option.labelText, value: option.value, ...radioButtonProps })))),
|
|
39
|
+
hasHorizontalHelperText && React.createElement("div", { className: `${prefix}--form__helper-text` }, helperText)));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
export { RadioGroupComponent as default };
|