@boomerang-io/carbon-addons-boomerang-react 4.6.21-beta.9 → 4.6.22-beta.0
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/dist/cjs/components/AdvantageSideNav/AdvantageSideNav.js +29 -37
- package/dist/cjs/components/Creatable/Creatable.js +32 -3
- package/dist/cjs/components/DataDrivenInput/DataDrivenInput.js +11 -2
- package/dist/cjs/components/DynamicFormik/DynamicFormik.js +11 -1
- package/dist/cjs/components/Header/Header.js +3 -2
- package/dist/cjs/components/Header/HeaderTeamSwitcher.js +109 -81
- package/dist/cjs/components/ProfileSettings/ProfileSettings.js +22 -4
- package/dist/cjs/components/UIShell/UIShell.js +13 -5
- package/dist/cjs/constants/DataDrivenInputTypes.js +4 -0
- package/dist/cjs/constants/TeamTypes.js +15 -0
- package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +29 -37
- package/dist/esm/components/Creatable/Creatable.js +34 -5
- package/dist/esm/components/DataDrivenInput/DataDrivenInput.js +11 -2
- package/dist/esm/components/DynamicFormik/DynamicFormik.js +11 -1
- package/dist/esm/components/Header/Header.js +3 -2
- package/dist/esm/components/Header/HeaderTeamSwitcher.js +109 -81
- package/dist/esm/components/ProfileSettings/ProfileSettings.js +22 -4
- package/dist/esm/components/UIShell/UIShell.js +14 -6
- package/dist/esm/constants/DataDrivenInputTypes.js +4 -0
- package/dist/esm/constants/TeamTypes.js +13 -0
- package/dist/types/index.d.ts +7 -2
- package/package.json +7 -3
- package/scss/components/Creatable/_creatable.scss +31 -1
- package/scss/components/ProfileSettings/_profileSettings.scss +1 -1
|
@@ -7,6 +7,7 @@ import HeaderMenu$1 from './HeaderMenu.js';
|
|
|
7
7
|
import { resolver } from '../../config/servicesConfig.js';
|
|
8
8
|
import { prefix } from '../../internal/settings.js';
|
|
9
9
|
import { USER_PLATFORM_ROLE } from '../../constants/UserType.js';
|
|
10
|
+
import { TEAM_TYPES } from '../../constants/TeamTypes.js';
|
|
10
11
|
|
|
11
12
|
/*
|
|
12
13
|
IBM Confidential
|
|
@@ -43,6 +44,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
43
44
|
const showSelectTeamPurpose = navigationPlatform?.requireTeamPurpose;
|
|
44
45
|
const createTeamButtonText = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
|
|
45
46
|
const userTeamInstanceSwitcherDefault = user?.teamInstanceSwitcherDefault;
|
|
47
|
+
const hasUpdatedDefaultTeamRef = React.useRef(false);
|
|
46
48
|
const teamLink = ({ teamId }) => {
|
|
47
49
|
return `${navigationPlatform.baseEnvUrl}/launchpad/teams/${teamId}`;
|
|
48
50
|
};
|
|
@@ -81,7 +83,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
81
83
|
const userHasTeams = userHasPersonalTeam || userHasAccountTeams || userHasStandardTeams;
|
|
82
84
|
const handleSelectTeam = async ({ team }) => {
|
|
83
85
|
setSelectedTeam(team);
|
|
84
|
-
if (!userTeamInstanceSwitcherDefault
|
|
86
|
+
if (!userTeamInstanceSwitcherDefault &&
|
|
87
|
+
!hasUpdatedDefaultTeamRef.current) {
|
|
88
|
+
hasUpdatedDefaultTeamRef.current = true;
|
|
85
89
|
const body = {
|
|
86
90
|
teamInstanceSwitcherDefault: team.id,
|
|
87
91
|
};
|
|
@@ -89,6 +93,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
89
93
|
}
|
|
90
94
|
};
|
|
91
95
|
const handleNoTeamsToSelect = async () => {
|
|
96
|
+
if (hasUpdatedDefaultTeamRef.current)
|
|
97
|
+
return;
|
|
98
|
+
hasUpdatedDefaultTeamRef.current = true;
|
|
92
99
|
const body = {
|
|
93
100
|
teamInstanceSwitcherDefault: null,
|
|
94
101
|
};
|
|
@@ -138,6 +145,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
138
145
|
teamsQuery?.data?.personalTeam?.length === 0))) {
|
|
139
146
|
handleNoTeamsToSelect();
|
|
140
147
|
}
|
|
148
|
+
else if (userTeamInstanceSwitcherDefault === null) {
|
|
149
|
+
setSelectedTeam(null);
|
|
150
|
+
}
|
|
141
151
|
}, [
|
|
142
152
|
baseServicesUrl,
|
|
143
153
|
hasUserTeams,
|
|
@@ -214,33 +224,58 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
214
224
|
standardTeams = teamsQuery?.data?.standardTeams ?? [];
|
|
215
225
|
personalTeam = teamsQuery?.data?.personalTeam ?? [];
|
|
216
226
|
}
|
|
217
|
-
let
|
|
218
|
-
|
|
227
|
+
let newPersonalTeam = personalTeam.length > 0
|
|
228
|
+
? personalTeam.map((personalTeam) => ({
|
|
229
|
+
...personalTeam,
|
|
230
|
+
type: TEAM_TYPES.PERSONAL,
|
|
231
|
+
nameToDisplay: personalTeam.displayName ? personalTeam.displayName : personalTeam.name,
|
|
232
|
+
}))
|
|
233
|
+
: [];
|
|
234
|
+
let newAccountTeams = [];
|
|
235
|
+
let newStandardTeams = [];
|
|
219
236
|
if (accountTeams?.length > 0) {
|
|
220
|
-
|
|
237
|
+
newAccountTeams = accountTeams.map((team) => {
|
|
221
238
|
let newProjectTeams = [];
|
|
222
239
|
if (team.projectTeams && team.projectTeams.length > 0) {
|
|
223
|
-
newProjectTeams = team.projectTeams?.map((
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
240
|
+
newProjectTeams = team.projectTeams?.map((projectTeam) => {
|
|
241
|
+
return {
|
|
242
|
+
...projectTeam,
|
|
243
|
+
nameToDisplay: projectTeam.displayName ? projectTeam.displayName : projectTeam.name,
|
|
244
|
+
};
|
|
245
|
+
});
|
|
227
246
|
}
|
|
228
247
|
return {
|
|
229
248
|
...team,
|
|
230
249
|
nameToDisplay: team.displayName ? team.displayName : team.name,
|
|
250
|
+
type: TEAM_TYPES.ACCOUNT,
|
|
231
251
|
projectTeams: sortBy(newProjectTeams, ["nameToDisplay"]),
|
|
232
252
|
};
|
|
233
253
|
});
|
|
234
|
-
sortedAccountTeamsWithNamesToDisplay = sortBy(newAccountTeams, ["nameToDisplay"]);
|
|
235
254
|
}
|
|
236
255
|
if (standardTeams?.length > 0) {
|
|
237
|
-
|
|
256
|
+
newStandardTeams = standardTeams.map((team) => {
|
|
238
257
|
return {
|
|
239
258
|
...team,
|
|
259
|
+
type: TEAM_TYPES.STANDARD,
|
|
240
260
|
nameToDisplay: team.displayName ? team.displayName : team.name,
|
|
241
261
|
};
|
|
242
262
|
});
|
|
243
|
-
|
|
263
|
+
}
|
|
264
|
+
let allTeams = newPersonalTeam.concat(newAccountTeams, newStandardTeams);
|
|
265
|
+
const order = { [TEAM_TYPES.PERSONAL]: 1, [TEAM_TYPES.ACCOUNT]: 2, [TEAM_TYPES.STANDARD]: 3 };
|
|
266
|
+
allTeams = sortBy(allTeams, [(team) => order[team.type], "nameToDisplay"]);
|
|
267
|
+
if (selectedTeam) {
|
|
268
|
+
const selectedTeamIndex = allTeams.findIndex((team, index) => {
|
|
269
|
+
if (team.id === selectedTeam.id) {
|
|
270
|
+
return true;
|
|
271
|
+
}
|
|
272
|
+
else if (Array.isArray(team.projectTeams) && team.projectTeams?.length > 0) {
|
|
273
|
+
return team.projectTeams.some((projectTeam) => projectTeam.id === selectedTeam.id);
|
|
274
|
+
}
|
|
275
|
+
return false;
|
|
276
|
+
});
|
|
277
|
+
const [removedTeam] = allTeams.splice(selectedTeamIndex, 1);
|
|
278
|
+
allTeams.unshift(removedTeam);
|
|
244
279
|
}
|
|
245
280
|
let selectedTeamName = selectedTeam?.displayName
|
|
246
281
|
? selectedTeam.displayName
|
|
@@ -262,79 +297,72 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
|
|
|
262
297
|
React.createElement("div", { className: headerTeamSwitcherCreateTeamButtonClassname },
|
|
263
298
|
React.createElement("span", { className: headerTeamSwitcherCreateTeamButtonTextClassname }, createTeamButtonText),
|
|
264
299
|
React.createElement(AddAlt, { className: headerTeamSwitcherCreateTeamButtonIconClassname })))),
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const teamName = team.displayName ? team.displayName : team.name;
|
|
300
|
+
allTeams.map((team) => {
|
|
301
|
+
if (Boolean(team?.id)) {
|
|
268
302
|
const isTeamSelected = team.id === selectedTeam?.id;
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
+
if (team.type === TEAM_TYPES.ACCOUNT) {
|
|
304
|
+
const isSubmenuOpen = team.id === openAccountSubmenuId;
|
|
305
|
+
const projectTeams = team.projectTeams;
|
|
306
|
+
const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
|
|
307
|
+
let selectedProjectTeamIndex = -1;
|
|
308
|
+
if (existProjectTeams) {
|
|
309
|
+
selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
|
|
310
|
+
}
|
|
311
|
+
const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
|
|
312
|
+
const isMenuSelected = isTeamSelected || isProjectTeamSelected;
|
|
313
|
+
if (existProjectTeams && isProjectTeamSelected) {
|
|
314
|
+
const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
|
|
315
|
+
projectTeams.unshift(removedTeam);
|
|
316
|
+
}
|
|
317
|
+
return (React.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
|
|
318
|
+
React.createElement(HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
|
|
319
|
+
// eslint-disable-next-line no-script-url
|
|
320
|
+
href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-account-accordion" },
|
|
321
|
+
React.createElement("div", { className: headerDropdownMenuItemAccountClassname },
|
|
322
|
+
React.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
|
|
323
|
+
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
|
|
324
|
+
isMenuSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
|
|
325
|
+
React.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
|
|
326
|
+
React.createElement(GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
|
|
327
|
+
React.createElement(ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
|
|
328
|
+
React.createElement("div", { id: `${team.id}-account-submenu`, key: `${team.id}-account-submenu`, "aria-expanded": isSubmenuOpen, className: headerDropdownMenuItemAccountSubmenuClassname },
|
|
329
|
+
React.createElement(HeaderMenuItem, { key: `${team.id}-menu-item`, id: `${team.id}-account-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
|
|
330
|
+
handleTeamClick({ team, type: "account" });
|
|
331
|
+
}, "data-testid": "header-team-switcher-menu-account-accordion-item",
|
|
332
|
+
// eslint-disable-next-line no-script-url
|
|
333
|
+
href: "javascript:void(0)" },
|
|
334
|
+
React.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
|
|
335
|
+
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
|
|
336
|
+
isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
|
|
337
|
+
projectTeams && projectTeams.length > 0
|
|
338
|
+
? projectTeams.map((team) => {
|
|
339
|
+
const isTeamSelected = team.id === selectedTeam?.id;
|
|
340
|
+
return (React.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
|
|
341
|
+
React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
|
|
342
|
+
handleTeamClick({ team, type: "project" });
|
|
343
|
+
}, "data-testid": "header-team-switcher-menu-account-accordion-item",
|
|
344
|
+
// eslint-disable-next-line no-script-url
|
|
345
|
+
href: "javascript:void(0)" },
|
|
346
|
+
React.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
|
|
347
|
+
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
|
|
348
|
+
isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
|
|
349
|
+
})
|
|
350
|
+
: null)));
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
return (React.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
|
|
354
|
+
React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
|
|
355
|
+
handleTeamClick({ team, type: team.type ?? "" });
|
|
356
|
+
}, "data-testid": "header-team-switcher-menu-item",
|
|
303
357
|
// eslint-disable-next-line no-script-url
|
|
304
358
|
href: "javascript:void(0)" },
|
|
305
|
-
React.createElement("div", { className: headerDropdownMenuItemClassname
|
|
306
|
-
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname },
|
|
307
|
-
isTeamSelected ?
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
|
|
313
|
-
handleTeamClick({ team, type: "project" });
|
|
314
|
-
}, "data-testid": "header-team-switcher-menu-account-accordion-item",
|
|
315
|
-
// eslint-disable-next-line no-script-url
|
|
316
|
-
href: "javascript:void(0)" },
|
|
317
|
-
React.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
|
|
318
|
-
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
|
|
319
|
-
isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
|
|
320
|
-
})
|
|
321
|
-
: null)));
|
|
322
|
-
})
|
|
323
|
-
: null,
|
|
324
|
-
standardTeams.length > 0
|
|
325
|
-
? sortedStandardTeamsWithNamesToDisplay.map((team) => {
|
|
326
|
-
const isTeamSelected = team.id === selectedTeam?.id;
|
|
327
|
-
return (React.createElement("div", { key: team.id, id: `${team.id}-standard-menu-item` },
|
|
328
|
-
React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
|
|
329
|
-
handleTeamClick({ team, type: "standard" });
|
|
330
|
-
}, "data-testid": "header-team-switcher-menu-item",
|
|
331
|
-
// eslint-disable-next-line no-script-url
|
|
332
|
-
href: "javascript:void(0)" },
|
|
333
|
-
React.createElement("div", { className: headerDropdownMenuItemClassname },
|
|
334
|
-
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
|
|
335
|
-
isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
|
|
336
|
-
})
|
|
337
|
-
: null))));
|
|
359
|
+
React.createElement("div", { className: headerDropdownMenuItemClassname },
|
|
360
|
+
React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
|
|
361
|
+
isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
return null;
|
|
365
|
+
})))));
|
|
338
366
|
}
|
|
339
367
|
return null;
|
|
340
368
|
}
|
|
@@ -25,12 +25,13 @@ function determineIfConfigIsDifferent(teams, initialTeams) {
|
|
|
25
25
|
}
|
|
26
26
|
return isConfigDifferent;
|
|
27
27
|
}
|
|
28
|
-
function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal }) {
|
|
28
|
+
function ProfileSettings({ baseServicesUrl, refetchUser, refetchUserTeams, refetchNavigation, src, userName, isOpen, closeModal, }) {
|
|
29
29
|
const queryClient = useQueryClient();
|
|
30
30
|
const [initialTeams, setInitialTeams] = useState([]);
|
|
31
31
|
const [teams, setTeams] = useState([]);
|
|
32
32
|
const userUrl = serviceUrl.getLaunchpadUser({ baseServicesUrl });
|
|
33
33
|
const profileUrl = serviceUrl.resourceUserProfile({ baseServicesUrl });
|
|
34
|
+
const userTeamsUrl = serviceUrl.getUserTeamsServices({ baseServicesUrl });
|
|
34
35
|
const { data: user, isLoading: userIsLoading, error: userError, } = useQuery({
|
|
35
36
|
queryKey: userUrl,
|
|
36
37
|
queryFn: resolver.query(userUrl),
|
|
@@ -39,6 +40,22 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
39
40
|
onSuccess: () => {
|
|
40
41
|
queryClient.invalidateQueries(userUrl);
|
|
41
42
|
queryClient.invalidateQueries(profileUrl);
|
|
43
|
+
queryClient.invalidateQueries(userTeamsUrl);
|
|
44
|
+
if (refetchUser) {
|
|
45
|
+
setTimeout(() => {
|
|
46
|
+
refetchUser();
|
|
47
|
+
}, 1000);
|
|
48
|
+
}
|
|
49
|
+
if (refetchUserTeams) {
|
|
50
|
+
setTimeout(() => {
|
|
51
|
+
refetchUserTeams();
|
|
52
|
+
}, 1000);
|
|
53
|
+
}
|
|
54
|
+
if (refetchNavigation) {
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
refetchNavigation();
|
|
57
|
+
}, 1000);
|
|
58
|
+
}
|
|
42
59
|
},
|
|
43
60
|
});
|
|
44
61
|
// Only disable when we have a user and we know that there aren' any lower level groups to manage
|
|
@@ -54,6 +71,7 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
54
71
|
}
|
|
55
72
|
async function handleSubmit() {
|
|
56
73
|
const body = {
|
|
74
|
+
teamInstanceSwitcherDefault: null,
|
|
57
75
|
lowerLevelGroups: teams,
|
|
58
76
|
};
|
|
59
77
|
try {
|
|
@@ -95,9 +113,9 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
95
113
|
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
114
|
React.createElement(ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
|
|
97
115
|
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
|
|
99
|
-
React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad
|
|
100
|
-
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad
|
|
116
|
+
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 team switcher in Launchpad."),
|
|
117
|
+
React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad team switcher"),
|
|
118
|
+
React.createElement("p", { className: `${prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad team switcher and Catalog (useful for sensitive demos). You will not be able to access or view unchecked Teams from the team switcher, and cannot add items to them from Catalog."),
|
|
101
119
|
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
120
|
React.createElement(StructuredListHead, null,
|
|
103
121
|
React.createElement(StructuredListRow, { head: true },
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { QueryClientProvider } from 'react-query';
|
|
3
|
-
import { Email, Document, HelpDesk, CatalogPublish,
|
|
3
|
+
import { Email, Document, HelpDesk, CatalogPublish, Forum, ChatLaunch, Cognitive, Book } from '@carbon/react/icons';
|
|
4
4
|
import Header from '../Header/Header.js';
|
|
5
5
|
import HeaderMenuItem from '../Header/HeaderMenuItem.js';
|
|
6
6
|
import PrivacyRedirect from '../PrivacyRedirect/PrivacyRedirect.js';
|
|
@@ -18,11 +18,11 @@ IBM Confidential
|
|
|
18
18
|
694970X, 69497O0
|
|
19
19
|
© Copyright IBM Corp. 2022, 2024
|
|
20
20
|
*/
|
|
21
|
-
function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems = [], supportMenuItems = [], renderPrivacyRedirect = true, renderPrivacyStatement = true, rightPanel, handleShowTutorial, refetchUser, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }) {
|
|
21
|
+
function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, createJoinTeamTrigger, enableTeamSwitcher = true, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems = [], supportMenuItems = [], renderPrivacyRedirect = true, renderPrivacyStatement = true, rightPanel, handleShowTutorial, refetchUser, refetchUserTeams, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }) {
|
|
22
22
|
// Support base header .e.g for an error state
|
|
23
23
|
if (!config) {
|
|
24
24
|
return (React.createElement(QueryClientProvider, { client: queryClient },
|
|
25
|
-
React.createElement(Header, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, productName: productName || platformName || "", user: user })));
|
|
25
|
+
React.createElement(Header, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, enableTeamSwitcher: enableTeamSwitcher, productName: productName || platformName || "", user: user })));
|
|
26
26
|
}
|
|
27
27
|
const { features, navigation, platform, platformMessage } = config;
|
|
28
28
|
const names = getProductAndPlatformNames({ productName, platformName, platform });
|
|
@@ -63,8 +63,8 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
63
63
|
*/
|
|
64
64
|
const isPrivacyStatementDisabled = renderPrivacyStatement === false || features?.["consent.enabled"] === false;
|
|
65
65
|
return (React.createElement(QueryClientProvider, { client: queryClient },
|
|
66
|
-
React.createElement(Header, { analyticsHelpers: analyticsHelpers, baseEnvUrl: platform.baseEnvUrl, baseServicesUrl: platform.baseServicesUrl, carbonTheme: carbonTheme, createJoinTeamTrigger: createJoinTeamTrigger, enableAppSwitcher: isAppSwitcherEnabled, instanceSwitcherEnabled: instanceSwitcherEnabled, enableNotifications: isNotificationsEnabled, enableNotificationsCount: isNotificationsCountEnabled, leftPanel: leftPanel, navLinks: navigation, platform: platform, platformMessage: platformMessage, prefixName: names.platformName, productName: names.productName, rightPanel: rightPanel, requestSummary: user?.requestSummary, skipToContentProps: skipToContentProps, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, profileMenuItems: [
|
|
67
|
-
isUserEnabled && (React.createElement(ProfileSettingsMenuItem, { key: "profile-settings", baseServicesUrl: platform.baseServicesUrl, src: `${platform.baseServicesUrl}/users/image/${user?.email}`, userName: user?.displayName ?? user?.name })),
|
|
66
|
+
React.createElement(Header, { analyticsHelpers: analyticsHelpers, baseEnvUrl: platform.baseEnvUrl, baseServicesUrl: platform.baseServicesUrl, carbonTheme: carbonTheme, createJoinTeamTrigger: createJoinTeamTrigger, enableAppSwitcher: isAppSwitcherEnabled, instanceSwitcherEnabled: instanceSwitcherEnabled, enableNotifications: isNotificationsEnabled, enableNotificationsCount: isNotificationsCountEnabled, enableTeamSwitcher: enableTeamSwitcher, leftPanel: leftPanel, navLinks: navigation, platform: platform, platformMessage: platformMessage, prefixName: names.platformName, productName: names.productName, rightPanel: rightPanel, requestSummary: user?.requestSummary, skipToContentProps: skipToContentProps, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, profileMenuItems: [
|
|
67
|
+
isUserEnabled && (React.createElement(ProfileSettingsMenuItem, { key: "profile-settings", baseServicesUrl: platform.baseServicesUrl, src: `${platform.baseServicesUrl}/users/image/${user?.email}`, userName: user?.displayName ?? user?.name, refetchUser: refetchUser, refetchUserTeams: refetchUserTeams, refetchNavigation: refetchNavigation })),
|
|
68
68
|
isSendMailEnabled && (React.createElement(HeaderMenuItem, { key: "email-preferences", href: `${platform.baseEnvUrl}/launchpad/email-preferences`, icon: React.createElement(Email, null), kind: "internal", text: "Email Preferences", type: "link" })),
|
|
69
69
|
!isPrivacyStatementDisabled && (React.createElement(PrivacyStatementMenuItem, { key: "privacy-statement", baseServicesUrl: platform.baseServicesUrl, platformEmail: platform?.platformEmail })),
|
|
70
70
|
...profileMenuItems,
|
|
@@ -74,7 +74,15 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
74
74
|
isSupportEnabled &&
|
|
75
75
|
(supportFlagCheck || isPartnerUser ? (React.createElement(SupportCenterMenuItem, { key: "support-center", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, supportLink: supportLink, partnerEmailId: partnerEmailId, enablePartner: isPartnerUser, baseServicesUrl: platform.baseServicesUrl })) : (React.createElement(HeaderMenuItem, { key: "support-center", href: platform?.supportUrl, icon: React.createElement(HelpDesk, null), kind: "external", text: "Support Center", type: "link" }))),
|
|
76
76
|
React.createElement(HeaderMenuItem, { key: "release-notes", href: platform?.releaseNotesUrl, icon: React.createElement(CatalogPublish, null), "data-testid": "release-notes", kind: "app", text: "Release Notes", type: "link" }),
|
|
77
|
-
|
|
77
|
+
// <HeaderMenuItem
|
|
78
|
+
// key="legal-terms"
|
|
79
|
+
// href={platform?.legalTermsUrl as string}
|
|
80
|
+
// icon={<Policy />}
|
|
81
|
+
// data-testid="legal-terms"
|
|
82
|
+
// kind="app"
|
|
83
|
+
// text="Legal Terms"
|
|
84
|
+
// type="link"
|
|
85
|
+
// />,
|
|
78
86
|
React.createElement("span", { style: { borderBottom: "1px solid #b8c1c1" } }),
|
|
79
87
|
isCommunityEnabled && (React.createElement(HeaderMenuItem, { key: "community", href: platform?.communityUrl, icon: React.createElement(Forum, null), kind: "external", text: "Community", type: "link" })),
|
|
80
88
|
isFeedbackEnabled && (React.createElement(FeedbackMenuItem, { key: "feedback", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, sendIdeasUrl: sendIdeasUrl, sendBluePointsAwardUrl: sendBluePointsAwardUrl })),
|
|
@@ -9,8 +9,12 @@ const CHECKBOX_TYPES = {
|
|
|
9
9
|
const CREATABLE_TYPES = {
|
|
10
10
|
CREATABLE_SINGLE: "creatable-single",
|
|
11
11
|
CREATABLE_SINGLE_NON_DELETABLE: "creatable-single-non-deletable",
|
|
12
|
+
CREATABLE_SINGLE_REORDERABLE: "creatable-single-reorderable",
|
|
13
|
+
CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE: "creatable-single-reorderable-non-deletable",
|
|
12
14
|
CREATABLE_PAIR: "creatable-pair",
|
|
13
15
|
CREATABLE_PAIR_NON_DELETABLE: "creatable-pair-non-deletable",
|
|
16
|
+
CREATABLE_PAIR_REORDERABLE: "creatable-pair-reorderable",
|
|
17
|
+
CREATABLE_PAIR_REORDERABLE_NON_DELETABLE: "creatable-pair-reorderable-non-deletable",
|
|
14
18
|
};
|
|
15
19
|
const DATE_TYPES = {
|
|
16
20
|
DATE: "date",
|
package/dist/types/index.d.ts
CHANGED
|
@@ -296,6 +296,7 @@ type Props$I = {
|
|
|
296
296
|
triggerEvent?: (props: any) => void;
|
|
297
297
|
user: User;
|
|
298
298
|
isLaunchpad?: boolean;
|
|
299
|
+
isbetaLaunchpad?: boolean;
|
|
299
300
|
userTeamsError?: boolean;
|
|
300
301
|
userTeamsLoading?: boolean;
|
|
301
302
|
history?: any;
|
|
@@ -366,6 +367,7 @@ type Props$G = {
|
|
|
366
367
|
className?: string;
|
|
367
368
|
createJoinTeamTrigger?: Function;
|
|
368
369
|
enableAppSwitcher?: boolean;
|
|
370
|
+
enableTeamSwitcher?: boolean;
|
|
369
371
|
instanceSwitcherEnabled?: boolean;
|
|
370
372
|
enableNotifications?: boolean;
|
|
371
373
|
enableNotificationsCount?: boolean;
|
|
@@ -656,6 +658,7 @@ type Props$y = {
|
|
|
656
658
|
onChange?: (items: string[]) => void;
|
|
657
659
|
placeholder?: string;
|
|
658
660
|
readOnly?: boolean;
|
|
661
|
+
reorderable?: boolean;
|
|
659
662
|
tagProps?: any;
|
|
660
663
|
tagType?: string;
|
|
661
664
|
textInputProps?: any;
|
|
@@ -670,7 +673,7 @@ type Props$y = {
|
|
|
670
673
|
value?: string | string[];
|
|
671
674
|
values?: string | string[];
|
|
672
675
|
};
|
|
673
|
-
declare function CreatableComponent({ buttonClassName, buttonContent, buttonProps, createKeyValuePair, disabled, id, initialValues: externalInitialValues, invalid, invalidText, helperText, key, keyHelperText, keyLabel, keyLabelText, keyPlaceholder, label, labelText, max, nonDeletable, onKeyBlur, onValueBlur, onInputBlur, onChange, placeholder, tagProps, tagType, textInputProps, tooltipClassName, tooltipContent, tooltipProps, type, valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput, removeOnlyFirst, }: Props$y): React.JSX.Element;
|
|
676
|
+
declare function CreatableComponent({ buttonClassName, buttonContent, buttonProps, createKeyValuePair, disabled, id, initialValues: externalInitialValues, invalid, invalidText, helperText, key, keyHelperText, keyLabel, keyLabelText, keyPlaceholder, label, labelText, max, nonDeletable, onKeyBlur, onValueBlur, onInputBlur, onChange, placeholder, reorderable, tagProps, tagType, textInputProps, tooltipClassName, tooltipContent, tooltipProps, type, valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput, removeOnlyFirst, }: Props$y): React.JSX.Element;
|
|
674
677
|
|
|
675
678
|
type OwnDataDrivenInputProps = {
|
|
676
679
|
id?: string;
|
|
@@ -1436,6 +1439,7 @@ type Props = {
|
|
|
1436
1439
|
};
|
|
1437
1440
|
platformMessage?: any;
|
|
1438
1441
|
};
|
|
1442
|
+
enableTeamSwitcher?: boolean;
|
|
1439
1443
|
history?: any;
|
|
1440
1444
|
isLaunchpad?: boolean;
|
|
1441
1445
|
isLoadingTeamSwitcher?: boolean;
|
|
@@ -1456,6 +1460,7 @@ type Props = {
|
|
|
1456
1460
|
component: React.ReactNode;
|
|
1457
1461
|
};
|
|
1458
1462
|
refetchUser?: Function;
|
|
1463
|
+
refetchUserTeams?: Function;
|
|
1459
1464
|
refetchNavigation?: Function;
|
|
1460
1465
|
skipToContentProps?: {
|
|
1461
1466
|
href?: string;
|
|
@@ -1481,6 +1486,6 @@ type Props = {
|
|
|
1481
1486
|
handleShowTutorial?: Function;
|
|
1482
1487
|
tutorialScreenToShow?: string;
|
|
1483
1488
|
};
|
|
1484
|
-
declare function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme, config, createJoinTeamTrigger, history, isLaunchpad, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems, supportMenuItems, renderPrivacyRedirect, renderPrivacyStatement, rightPanel, handleShowTutorial, refetchUser, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }: Props): React.JSX.Element;
|
|
1489
|
+
declare function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme, config, createJoinTeamTrigger, enableTeamSwitcher, history, isLaunchpad, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems, supportMenuItems, renderPrivacyRedirect, renderPrivacyStatement, rightPanel, handleShowTutorial, refetchUser, refetchUserTeams, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }: Props): React.JSX.Element;
|
|
1485
1490
|
|
|
1486
1491
|
export { AdvantageSideNav, AutoSuggestBmrg as AutoSuggest, Avatar, CheckboxListComponent as CheckboxList, ComboBoxComponent as ComboBox, ComboBoxMultiSelect, ComposedModal, ConfirmModal, CreatableComponent as Creatable, DataDrivenInput, DateInputComponent as DateInput, DecisionButtons, DelayedRender, DynamicFormik, DynamicInput, Error, Error403, Error404, ErrorBoundary, ErrorDragon, ErrorFullPage, Error as ErrorMessage, ErrorPage, ErrorPageCore, FeatureHeader, FeatureHeaderSubtitle, FeatureHeaderTitle, FeatureNavTab, FeatureNavTabs, FeatureSideNav, FeatureSideNavFooter, FeatureSideNavHeader, FeatureSideNavLink, FeatureSideNavLinks, FlowModalContainer as FlowModal, FlowModalForm, FormInput, Header, _default as HeaderMenuItem, ImageModal, InputGovernor, Loading, MemberBar, Modal, ModalConfirmEdit, FlowModalContainer as ModalFlow, FlowModalForm as ModalFlowForm, ModalForm, ModalFunctionChildrenProps, ModalTrigger, NotificationsContainer, PlatformBanner, PlatformNotificationsContainer, Portal, PrivacyStatement, ProtectedRoute, RadioGroupComponent as RadioGroup, RichTextAreaComponent as RichTextArea, SimpleTeamService, Team, TextAreaComponent as TextArea, TextInputComponent as TextInput, ToastNotification, ToggleComponent as Toggle, TooltipHover, UIShell, User, UserTeams, notify };
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@boomerang-io/carbon-addons-boomerang-react",
|
|
3
3
|
"description": "Carbon Addons for Boomerang apps",
|
|
4
|
-
"version": "4.6.
|
|
4
|
+
"version": "4.6.22-beta.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Tim Bula",
|
|
7
7
|
"email": "timrbula@gmail.com"
|
|
8
8
|
},
|
|
9
9
|
"license": "Apache-2",
|
|
10
|
-
"repository": {
|
|
10
|
+
"repository": {
|
|
11
11
|
"type": "git",
|
|
12
12
|
"url": "git@github.com:boomerang-io/carbon-addons-boomerang-react"
|
|
13
13
|
},
|
|
@@ -49,12 +49,16 @@
|
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@carbon/ibm-products": "2.57.1",
|
|
51
51
|
"@carbon/react": "1.77.0",
|
|
52
|
+
"@dnd-kit/core": "^6.3.1",
|
|
53
|
+
"@dnd-kit/sortable": "^10.0.0",
|
|
54
|
+
"@dnd-kit/utilities": "^3.2.2",
|
|
52
55
|
"@stomp/stompjs": "6.1.2",
|
|
53
56
|
"@tippyjs/react": "4.2.6",
|
|
54
57
|
"classnames": "2.3.2",
|
|
55
58
|
"dayjs": "^1.11.11",
|
|
56
59
|
"dompurify": "3.2.6",
|
|
57
60
|
"downshift": "6.1.7",
|
|
61
|
+
"history": "^5.3.0",
|
|
58
62
|
"lodash.get": "4.4.2",
|
|
59
63
|
"lodash.isequal": "4.5.0",
|
|
60
64
|
"lodash.sortby": "4.7.0",
|
|
@@ -73,7 +77,7 @@
|
|
|
73
77
|
"react": "^17.0.0 || ^16.14.0",
|
|
74
78
|
"react-dom": "^17.0.0 || ^16.14.0",
|
|
75
79
|
"react-query": "^3.34.12",
|
|
76
|
-
"react-router-dom": "^
|
|
80
|
+
"react-router-dom": "^5.3.0",
|
|
77
81
|
"yup": ">=0.32.11"
|
|
78
82
|
},
|
|
79
83
|
"devDependencies": {
|
|
@@ -4,7 +4,6 @@ IBM Confidential
|
|
|
4
4
|
© Copyright IBM Corp. 2022, 2024
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
@use "../../global/config" as *;
|
|
9
8
|
.#{$prefix}--bmrg-creatable {
|
|
10
9
|
position: relative;
|
|
@@ -42,6 +41,37 @@ IBM Confidential
|
|
|
42
41
|
width: 100%;
|
|
43
42
|
}
|
|
44
43
|
|
|
44
|
+
.#{$prefix}--bmrg-creatable__tags--reorderable {
|
|
45
|
+
display: flex;
|
|
46
|
+
flex-direction: column;
|
|
47
|
+
margin-top: 0.5rem;
|
|
48
|
+
width: 100%;
|
|
49
|
+
|
|
50
|
+
.cds--tag {
|
|
51
|
+
cursor: grab;
|
|
52
|
+
margin-left: 0;
|
|
53
|
+
min-width: 100%;
|
|
54
|
+
width: 100%;
|
|
55
|
+
|
|
56
|
+
.cds--tag__custom-icon ~ span {
|
|
57
|
+
min-width: calc(100% - 1.25rem);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.cds--interactive--tag-children {
|
|
61
|
+
max-inline-size: none !important;
|
|
62
|
+
width: 100%;
|
|
63
|
+
|
|
64
|
+
.cds--popover {
|
|
65
|
+
display: none;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.cds--tag__label {
|
|
70
|
+
min-width: calc(100% - 1.5rem);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
45
75
|
.#{$prefix}--bmrg-creatable__tooltip {
|
|
46
76
|
line-height: 0;
|
|
47
77
|
margin-left: 0.5rem;
|
|
@@ -4,7 +4,6 @@ IBM Confidential
|
|
|
4
4
|
© Copyright IBM Corp. 2022, 2024
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
8
7
|
@use "../../global/config" as *;
|
|
9
8
|
@use "../../global/utils";
|
|
10
9
|
@use "../../global/themes/shell-tokens" as shell;
|
|
@@ -29,6 +28,7 @@ IBM Confidential
|
|
|
29
28
|
|
|
30
29
|
.#{$prefix}--modal-content {
|
|
31
30
|
color: shell.$bmrg-theme-primary;
|
|
31
|
+
mask-image: none !important;
|
|
32
32
|
.#{$prefix}--bmrg-profile-settings__title {
|
|
33
33
|
color: shell.$bmrg-theme-primary;
|
|
34
34
|
font-size: utils.rem(14px);
|