@boomerang-io/carbon-addons-boomerang-react 4.6.21-beta.29 → 4.6.21-beta.30

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.
@@ -47,10 +47,8 @@ function AdvantageSideNav(props) {
47
47
  const agentAssistantLibraryLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.AgentLibrary)?.url;
48
48
  const documentCollectionsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.DocumentCollections)?.url;
49
49
  const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
50
- sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
50
+ const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
51
51
  const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
52
- const isAgentStudioEnabled = true;
53
- const isDocumentCollectionsEnabled = true;
54
52
  // get current selected team
55
53
  let teamSwitcherTeam = null;
56
54
  if (Array.isArray(personalTeams) && personalTeams.length > 0) {
@@ -122,6 +120,14 @@ function AdvantageSideNav(props) {
122
120
  destinationPath: documentCollectionsLink,
123
121
  });
124
122
  };
123
+ const handleSettingsClick = () => {
124
+ triggerEvent &&
125
+ triggerEvent({
126
+ action: "Clicked on SideNav Settings link",
127
+ category: "Sidenav",
128
+ destinationPath: settingsLink,
129
+ });
130
+ };
125
131
  const handleChatClick = () => {
126
132
  let redirectLink = chatLink
127
133
  ? chatLink
@@ -212,22 +218,29 @@ function AdvantageSideNav(props) {
212
218
  React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-advantage-sidenav-item-tag` },
213
219
  "Tools",
214
220
  React__default.default.createElement(react.Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
215
- agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link", isActive: (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
216
- (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`)), disabled: Boolean(isAgentStudioEnabled), className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , renderIcon: icons.IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
221
+ agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
222
+ // isActive={
223
+ // (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
224
+ // (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
225
+ // }
226
+ className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), renderIcon: icons.IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
217
227
  if (isLaunchpad) {
218
228
  handleLaunchpadLink(e);
219
229
  history.push(agentStudioPath);
220
230
  }
221
231
  handleAgentAssistantStudioClick();
222
232
  } }, "Agent & Assistant Studio")) : null,
223
- agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders, href: agentAssistantLibraryLink, disabled: Boolean(isAgentStudioEnabled), className: Boolean(isAgentStudioEnabled) ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", onClick: (e) => {
233
+ agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders, href: agentAssistantLibraryLink, className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), onClick: (e) => {
224
234
  handleAgentAssistantLibraryClick();
225
235
  } }, "Agent & Assistant Library")) : null,
226
- documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: icons.DocumentMultiple_02, href: documentCollectionsLink, disabled: Boolean(isDocumentCollectionsEnabled), className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , onClick: (e) => {
236
+ documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: icons.DocumentMultiple_02, href: documentCollectionsLink, className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), onClick: (e) => {
227
237
  handleDocumentCollectionsClick();
228
238
  } }, "Document Collections")) : null,
229
239
  showSecondDivider ? React__default.default.createElement(react.SideNavDivider, null) : null,
230
240
  catalogNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: windowLocation.href.includes(`${baseEnvUrl}/catalog`), href: catalogNavlink, renderIcon: icons.Catalog }, "Catalog")) : null,
241
+ settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink, onClick: (e) => {
242
+ handleSettingsClick();
243
+ } }, "Settings")) : null,
231
244
  adminNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
232
245
  children ? (React__default.default.createElement(React__default.default.Fragment, null,
233
246
  React__default.default.createElement(react.SideNavDivider, null),
@@ -62,7 +62,7 @@ const MenuAriaLabelRecord = {
62
62
  const headerButtonClassNames = "cds--btn--icon-only cds--header__action cds--btn cds--btn--primary cds--btn--icon-only cds--btn cds--btn--primary";
63
63
  const instanceCheckMarkContainerClass = "instance-checkmark-style-container";
64
64
  function Header(props) {
65
- const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
65
+ const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, enableTeamSwitcher = true, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
66
66
  const hasUserTeams = Boolean(userTeams);
67
67
  const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
68
68
  const teamsQuery = reactQuery.useQuery({
@@ -70,6 +70,7 @@ function Header(props) {
70
70
  queryFn: servicesConfig.resolver.query(userTeamsUrl, null),
71
71
  enabled: !hasUserTeams && Boolean(baseServicesUrl),
72
72
  });
73
+ const showTeamSwitcher = enableTeamSwitcher && Boolean(user);
73
74
  return (React__default.default.createElement(React__default.default.Fragment, null,
74
75
  React__default.default.createElement(react.Theme, { theme: carbonTheme },
75
76
  React__default.default.createElement(react.Header, { "aria-label": "App navigation header", className: className },
@@ -80,7 +81,7 @@ function Header(props) {
80
81
  ? navLinks.map((link) => (React__default.default.createElement(react.HeaderMenuItem, { "aria-label": `Link for ${link.name}`, "data-testid": "header-menu-link", href: link.url, isCurrentPage: window?.location?.href && link.url ? window.location.href.startsWith(link.url) : false, key: link.name, target: link.isExternal ? "_blank" : undefined, rel: link.isExternal ? "noopener noreferrer" : undefined }, link.name)))
81
82
  : null),
82
83
  React__default.default.createElement(react.HeaderGlobalBar, null,
83
- React__default.default.createElement(HeaderTeamSwitcher.default, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams }),
84
+ showTeamSwitcher ? (React__default.default.createElement(HeaderTeamSwitcher.default, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams })) : null,
84
85
  props?.instanceSwitcherEnabled && (React__default.default.createElement(InstanceSwitcherMenu, { enabled: Boolean(props.instanceSwitcherEnabled), menuItems: platform?.instances })),
85
86
  React__default.default.createElement(RequestsMenu, { baseEnvUrl: baseEnvUrl, enabled: Boolean(props.requestSummary), summary: props.requestSummary }),
86
87
  React__default.default.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
@@ -11,6 +11,7 @@ var HeaderMenu = require('./HeaderMenu.js');
11
11
  var servicesConfig = require('../../config/servicesConfig.js');
12
12
  var settings = require('../../internal/settings.js');
13
13
  var UserType = require('../../constants/UserType.js');
14
+ var TeamTypes = require('../../constants/TeamTypes.js');
14
15
 
15
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
17
 
@@ -226,33 +227,58 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
226
227
  standardTeams = teamsQuery?.data?.standardTeams ?? [];
227
228
  personalTeam = teamsQuery?.data?.personalTeam ?? [];
228
229
  }
229
- let sortedAccountTeamsWithNamesToDisplay = [];
230
- let sortedStandardTeamsWithNamesToDisplay = [];
230
+ let newPersonalTeam = personalTeam.length > 0
231
+ ? personalTeam.map((personalTeam) => ({
232
+ ...personalTeam,
233
+ type: TeamTypes.TEAM_TYPES.PERSONAL,
234
+ nameToDisplay: personalTeam.displayName ? personalTeam.displayName : personalTeam.name,
235
+ }))
236
+ : [];
237
+ let newAccountTeams = [];
238
+ let newStandardTeams = [];
231
239
  if (accountTeams?.length > 0) {
232
- const newAccountTeams = accountTeams.map((team) => {
240
+ newAccountTeams = accountTeams.map((team) => {
233
241
  let newProjectTeams = [];
234
242
  if (team.projectTeams && team.projectTeams.length > 0) {
235
- newProjectTeams = team.projectTeams?.map((team) => ({
236
- ...team,
237
- nameToDisplay: team.displayName ? team.displayName : team.name,
238
- }));
243
+ newProjectTeams = team.projectTeams?.map((projectTeam) => {
244
+ return {
245
+ ...projectTeam,
246
+ nameToDisplay: projectTeam.displayName ? projectTeam.displayName : projectTeam.name,
247
+ };
248
+ });
239
249
  }
240
250
  return {
241
251
  ...team,
242
252
  nameToDisplay: team.displayName ? team.displayName : team.name,
253
+ type: TeamTypes.TEAM_TYPES.ACCOUNT,
243
254
  projectTeams: sortBy__default.default(newProjectTeams, ["nameToDisplay"]),
244
255
  };
245
256
  });
246
- sortedAccountTeamsWithNamesToDisplay = sortBy__default.default(newAccountTeams, ["nameToDisplay"]);
247
257
  }
248
258
  if (standardTeams?.length > 0) {
249
- const newStandardTeams = standardTeams.map((team) => {
259
+ newStandardTeams = standardTeams.map((team) => {
250
260
  return {
251
261
  ...team,
262
+ type: TeamTypes.TEAM_TYPES.STANDARD,
252
263
  nameToDisplay: team.displayName ? team.displayName : team.name,
253
264
  };
254
265
  });
255
- sortedStandardTeamsWithNamesToDisplay = sortBy__default.default(newStandardTeams, ["nameToDisplay"]);
266
+ }
267
+ let allTeams = newPersonalTeam.concat(newAccountTeams, newStandardTeams);
268
+ const order = { [TeamTypes.TEAM_TYPES.PERSONAL]: 1, [TeamTypes.TEAM_TYPES.ACCOUNT]: 2, [TeamTypes.TEAM_TYPES.STANDARD]: 3 };
269
+ allTeams = sortBy__default.default(allTeams, [(team) => order[team.type], "nameToDisplay"]);
270
+ if (selectedTeam) {
271
+ const selectedTeamIndex = allTeams.findIndex((team, index) => {
272
+ if (team.id === selectedTeam.id) {
273
+ return true;
274
+ }
275
+ else if (Array.isArray(team.projectTeams) && team.projectTeams?.length > 0) {
276
+ return team.projectTeams.some((projectTeam) => projectTeam.id === selectedTeam.id);
277
+ }
278
+ return false;
279
+ });
280
+ const [removedTeam] = allTeams.splice(selectedTeamIndex, 1);
281
+ allTeams.unshift(removedTeam);
256
282
  }
257
283
  let selectedTeamName = selectedTeam?.displayName
258
284
  ? selectedTeam.displayName
@@ -274,29 +300,22 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
274
300
  React__default.default.createElement("div", { className: headerTeamSwitcherCreateTeamButtonClassname },
275
301
  React__default.default.createElement("span", { className: headerTeamSwitcherCreateTeamButtonTextClassname }, createTeamButtonText),
276
302
  React__default.default.createElement(icons.AddAlt, { className: headerTeamSwitcherCreateTeamButtonIconClassname })))),
277
- personalTeam.length > 0
278
- ? personalTeam.map((team) => {
279
- const teamName = team.displayName ? team.displayName : team.name;
280
- const isTeamSelected = team.id === selectedTeam?.id;
281
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-personal-menu-item-id` },
282
- React__default.default.createElement(react.HeaderMenuItem, { key: team.id, id: `${team.id}-personal-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
283
- handleTeamClick({ team, type: "personal" });
284
- },
285
- // eslint-disable-next-line no-script-url
286
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-item" },
287
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
288
- React__default.default.createElement("span", { title: teamName, className: headerDropdownMenuItemTextClassname }, teamName),
289
- isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
290
- })
291
- : null,
292
- accountTeams.length > 0
293
- ? sortedAccountTeamsWithNamesToDisplay.map((team) => {
303
+ allTeams.map((team) => {
304
+ const isTeamSelected = team.id === selectedTeam?.id;
305
+ if (team.type === TeamTypes.TEAM_TYPES.ACCOUNT) {
294
306
  const isSubmenuOpen = team.id === openAccountSubmenuId;
295
- const isProjectTeamSelected = team.projectTeams &&
296
- team.projectTeams.length > 0 &&
297
- team.projectTeams.some((team) => team.id === selectedTeam?.id);
298
- const isTeamSelected = team.id === selectedTeam?.id;
307
+ const projectTeams = team.projectTeams;
308
+ const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
309
+ let selectedProjectTeamIndex = -1;
310
+ if (existProjectTeams) {
311
+ selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
312
+ }
313
+ const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
299
314
  const isMenuSelected = isTeamSelected || isProjectTeamSelected;
315
+ if (existProjectTeams && isProjectTeamSelected) {
316
+ const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
317
+ projectTeams.unshift(removedTeam);
318
+ }
300
319
  return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
301
320
  React__default.default.createElement(react.HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
302
321
  // eslint-disable-next-line no-script-url
@@ -304,7 +323,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
304
323
  React__default.default.createElement("div", { className: headerDropdownMenuItemAccountClassname },
305
324
  React__default.default.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
306
325
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
307
- isMenuSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
326
+ isMenuSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null),
308
327
  React__default.default.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
309
328
  React__default.default.createElement(icons.GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
310
329
  React__default.default.createElement(icons.ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
@@ -316,9 +335,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
316
335
  href: "javascript:void(0)" },
317
336
  React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
318
337
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
319
- isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
320
- team.projectTeams && team.projectTeams.length > 0
321
- ? team.projectTeams.map((team) => {
338
+ isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null)),
339
+ projectTeams && projectTeams.length > 0
340
+ ? projectTeams.map((team) => {
322
341
  const isTeamSelected = team.id === selectedTeam?.id;
323
342
  return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
324
343
  React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
@@ -331,22 +350,19 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
331
350
  isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
332
351
  })
333
352
  : null)));
334
- })
335
- : null,
336
- standardTeams.length > 0
337
- ? sortedStandardTeamsWithNamesToDisplay.map((team) => {
338
- const isTeamSelected = team.id === selectedTeam?.id;
339
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-standard-menu-item` },
353
+ }
354
+ else {
355
+ return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
340
356
  React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
341
- handleTeamClick({ team, type: "standard" });
357
+ handleTeamClick({ team, type: team.type ?? "" });
342
358
  }, "data-testid": "header-team-switcher-menu-item",
343
359
  // eslint-disable-next-line no-script-url
344
360
  href: "javascript:void(0)" },
345
361
  React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
346
362
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
347
363
  isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
348
- })
349
- : null))));
364
+ }
365
+ })))));
350
366
  }
351
367
  return null;
352
368
  }
@@ -122,9 +122,9 @@ function ProfileSettings({ baseServicesUrl, refetchUser, refetchUserTeams, refet
122
122
  return (React__default.default.createElement(react.ComposedModal, { "aria-label": "Profile Settings", className: `${settings.prefix}--bmrg-profile-settings-container ${settings.prefix}--bmrg-header-modal`, open: isOpen, onClose: handleClose, preventCloseOnClickOutside: true },
123
123
  React__default.default.createElement(react.ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
124
124
  React__default.default.createElement(react.ModalBody, { style: { maxHeight: "31.5rem" } },
125
- React__default.default.createElement("p", { className: `${settings.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."),
126
- React__default.default.createElement("h2", { className: `${settings.prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
127
- React__default.default.createElement("p", { className: `${settings.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."),
125
+ React__default.default.createElement("p", { className: `${settings.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."),
126
+ React__default.default.createElement("h2", { className: `${settings.prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad team switcher"),
127
+ React__default.default.createElement("p", { className: `${settings.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."),
128
128
  userIsLoading ? (React__default.default.createElement(react.StructuredListSkeleton, null)) : userError ? (React__default.default.createElement(ErrorMessage.default, { style: { color: "#F2F4F8", padding: "1rem" } })) : teams?.length > 0 ? (React__default.default.createElement(react.StructuredListWrapper, { className: `${settings.prefix}--bmrg-profile-settings-list` },
129
129
  React__default.default.createElement(react.StructuredListHead, null,
130
130
  React__default.default.createElement(react.StructuredListRow, { head: true },
@@ -26,11 +26,11 @@ IBM Confidential
26
26
  694970X, 69497O0
27
27
  © Copyright IBM Corp. 2022, 2024
28
28
  */
29
- 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, refetchUserTeams, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }) {
29
+ 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, }) {
30
30
  // Support base header .e.g for an error state
31
31
  if (!config) {
32
32
  return (React__default.default.createElement(reactQuery.QueryClientProvider, { client: servicesConfig.queryClient },
33
- React__default.default.createElement(Header.default, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, productName: productName || platformName || "", user: user })));
33
+ React__default.default.createElement(Header.default, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, enableTeamSwitcher: enableTeamSwitcher, productName: productName || platformName || "", user: user })));
34
34
  }
35
35
  const { features, navigation, platform, platformMessage } = config;
36
36
  const names = getProductAndPlatformNames({ productName, platformName, platform });
@@ -71,7 +71,7 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
71
71
  */
72
72
  const isPrivacyStatementDisabled = renderPrivacyStatement === false || features?.["consent.enabled"] === false;
73
73
  return (React__default.default.createElement(reactQuery.QueryClientProvider, { client: servicesConfig.queryClient },
74
- React__default.default.createElement(Header.default, { 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: [
74
+ React__default.default.createElement(Header.default, { 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: [
75
75
  isUserEnabled && (React__default.default.createElement(ProfileSettings.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 })),
76
76
  isSendMailEnabled && (React__default.default.createElement(HeaderMenuItem.default, { key: "email-preferences", href: `${platform.baseEnvUrl}/launchpad/email-preferences`, icon: React__default.default.createElement(icons.Email, null), kind: "internal", text: "Email Preferences", type: "link" })),
77
77
  !isPrivacyStatementDisabled && (React__default.default.createElement(PrivacyStatement.PrivacyStatementMenuItem, { key: "privacy-statement", baseServicesUrl: platform.baseServicesUrl, platformEmail: platform?.platformEmail })),
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ /*
4
+ IBM Confidential
5
+ 694970X, 69497O0
6
+ © Copyright IBM Corp. 2022, 2024
7
+ */
8
+ const TEAM_TYPES = {
9
+ ACCOUNT: "account",
10
+ PERSONAL: "personal",
11
+ PROJECT: "project",
12
+ STANDARD: "standard",
13
+ };
14
+
15
+ exports.TEAM_TYPES = TEAM_TYPES;
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import cx from 'classnames';
3
3
  import { SideNavLink, SideNav, SideNavItems, SideNavDivider, Tag } from '@carbon/react';
4
4
  import TooltipHover from '../TooltipHover/TooltipHover.js';
5
- import { ChatBot, Home, UserMultiple, AddAlt, Api, IntentRequestCreate, Folders, DocumentMultiple_02, Catalog, LicenseThirdParty } from '@carbon/react/icons';
5
+ import { ChatBot, Home, UserMultiple, AddAlt, Api, IntentRequestCreate, Folders, DocumentMultiple_02, Catalog, Settings, LicenseThirdParty } from '@carbon/react/icons';
6
6
  import { USER_PLATFORM_ROLE } from '../../constants/UserType.js';
7
7
  import { prefix } from '../../internal/settings.js';
8
8
 
@@ -38,10 +38,8 @@ function AdvantageSideNav(props) {
38
38
  const agentAssistantLibraryLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.AgentLibrary)?.url;
39
39
  const documentCollectionsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.DocumentCollections)?.url;
40
40
  const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
41
- sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
41
+ const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
42
42
  const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
43
- const isAgentStudioEnabled = true;
44
- const isDocumentCollectionsEnabled = true;
45
43
  // get current selected team
46
44
  let teamSwitcherTeam = null;
47
45
  if (Array.isArray(personalTeams) && personalTeams.length > 0) {
@@ -113,6 +111,14 @@ function AdvantageSideNav(props) {
113
111
  destinationPath: documentCollectionsLink,
114
112
  });
115
113
  };
114
+ const handleSettingsClick = () => {
115
+ triggerEvent &&
116
+ triggerEvent({
117
+ action: "Clicked on SideNav Settings link",
118
+ category: "Sidenav",
119
+ destinationPath: settingsLink,
120
+ });
121
+ };
116
122
  const handleChatClick = () => {
117
123
  let redirectLink = chatLink
118
124
  ? chatLink
@@ -203,22 +209,29 @@ function AdvantageSideNav(props) {
203
209
  React.createElement("div", { className: `${prefix}--bmrg-advantage-sidenav-item-tag` },
204
210
  "Tools",
205
211
  React.createElement(Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
206
- agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link", isActive: (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
207
- (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`)), disabled: Boolean(isAgentStudioEnabled), className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , renderIcon: IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
212
+ agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
213
+ // isActive={
214
+ // (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
215
+ // (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
216
+ // }
217
+ className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), renderIcon: IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
208
218
  if (isLaunchpad) {
209
219
  handleLaunchpadLink(e);
210
220
  history.push(agentStudioPath);
211
221
  }
212
222
  handleAgentAssistantStudioClick();
213
223
  } }, "Agent & Assistant Studio")) : null,
214
- agentAssistantLibraryLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: Folders, href: agentAssistantLibraryLink, disabled: Boolean(isAgentStudioEnabled), className: Boolean(isAgentStudioEnabled) ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", onClick: (e) => {
224
+ agentAssistantLibraryLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: Folders, href: agentAssistantLibraryLink, className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), onClick: (e) => {
215
225
  handleAgentAssistantLibraryClick();
216
226
  } }, "Agent & Assistant Library")) : null,
217
- documentCollectionsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: DocumentMultiple_02, href: documentCollectionsLink, disabled: Boolean(isDocumentCollectionsEnabled), className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , onClick: (e) => {
227
+ documentCollectionsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: DocumentMultiple_02, href: documentCollectionsLink, className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), onClick: (e) => {
218
228
  handleDocumentCollectionsClick();
219
229
  } }, "Document Collections")) : null,
220
230
  showSecondDivider ? React.createElement(SideNavDivider, null) : null,
221
231
  catalogNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: windowLocation.href.includes(`${baseEnvUrl}/catalog`), href: catalogNavlink, renderIcon: Catalog }, "Catalog")) : null,
232
+ settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings, href: settingsLink, onClick: (e) => {
233
+ handleSettingsClick();
234
+ } }, "Settings")) : null,
222
235
  adminNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: LicenseThirdParty }, "Admin")) : null),
223
236
  children ? (React.createElement(React.Fragment, null,
224
237
  React.createElement(SideNavDivider, null),
@@ -54,7 +54,7 @@ const MenuAriaLabelRecord = {
54
54
  const headerButtonClassNames = "cds--btn--icon-only cds--header__action cds--btn cds--btn--primary cds--btn--icon-only cds--btn cds--btn--primary";
55
55
  const instanceCheckMarkContainerClass = "instance-checkmark-style-container";
56
56
  function Header(props) {
57
- const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
57
+ const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, enableTeamSwitcher = true, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
58
58
  const hasUserTeams = Boolean(userTeams);
59
59
  const userTeamsUrl = serviceUrl.getUserTeamsServices({ baseServicesUrl });
60
60
  const teamsQuery = useQuery({
@@ -62,6 +62,7 @@ function Header(props) {
62
62
  queryFn: resolver.query(userTeamsUrl, null),
63
63
  enabled: !hasUserTeams && Boolean(baseServicesUrl),
64
64
  });
65
+ const showTeamSwitcher = enableTeamSwitcher && Boolean(user);
65
66
  return (React.createElement(React.Fragment, null,
66
67
  React.createElement(Theme, { theme: carbonTheme },
67
68
  React.createElement(Header$1, { "aria-label": "App navigation header", className: className },
@@ -72,7 +73,7 @@ function Header(props) {
72
73
  ? navLinks.map((link) => (React.createElement(HeaderMenuItem, { "aria-label": `Link for ${link.name}`, "data-testid": "header-menu-link", href: link.url, isCurrentPage: window?.location?.href && link.url ? window.location.href.startsWith(link.url) : false, key: link.name, target: link.isExternal ? "_blank" : undefined, rel: link.isExternal ? "noopener noreferrer" : undefined }, link.name)))
73
74
  : null),
74
75
  React.createElement(HeaderGlobalBar, null,
75
- React.createElement(HeaderTeamSwitcher, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams }),
76
+ showTeamSwitcher ? (React.createElement(HeaderTeamSwitcher, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams })) : null,
76
77
  props?.instanceSwitcherEnabled && (React.createElement(InstanceSwitcherMenu, { enabled: Boolean(props.instanceSwitcherEnabled), menuItems: platform?.instances })),
77
78
  React.createElement(RequestsMenu, { baseEnvUrl: baseEnvUrl, enabled: Boolean(props.requestSummary), summary: props.requestSummary }),
78
79
  React.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
@@ -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
@@ -217,33 +218,58 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
217
218
  standardTeams = teamsQuery?.data?.standardTeams ?? [];
218
219
  personalTeam = teamsQuery?.data?.personalTeam ?? [];
219
220
  }
220
- let sortedAccountTeamsWithNamesToDisplay = [];
221
- let sortedStandardTeamsWithNamesToDisplay = [];
221
+ let newPersonalTeam = personalTeam.length > 0
222
+ ? personalTeam.map((personalTeam) => ({
223
+ ...personalTeam,
224
+ type: TEAM_TYPES.PERSONAL,
225
+ nameToDisplay: personalTeam.displayName ? personalTeam.displayName : personalTeam.name,
226
+ }))
227
+ : [];
228
+ let newAccountTeams = [];
229
+ let newStandardTeams = [];
222
230
  if (accountTeams?.length > 0) {
223
- const newAccountTeams = accountTeams.map((team) => {
231
+ newAccountTeams = accountTeams.map((team) => {
224
232
  let newProjectTeams = [];
225
233
  if (team.projectTeams && team.projectTeams.length > 0) {
226
- newProjectTeams = team.projectTeams?.map((team) => ({
227
- ...team,
228
- nameToDisplay: team.displayName ? team.displayName : team.name,
229
- }));
234
+ newProjectTeams = team.projectTeams?.map((projectTeam) => {
235
+ return {
236
+ ...projectTeam,
237
+ nameToDisplay: projectTeam.displayName ? projectTeam.displayName : projectTeam.name,
238
+ };
239
+ });
230
240
  }
231
241
  return {
232
242
  ...team,
233
243
  nameToDisplay: team.displayName ? team.displayName : team.name,
244
+ type: TEAM_TYPES.ACCOUNT,
234
245
  projectTeams: sortBy(newProjectTeams, ["nameToDisplay"]),
235
246
  };
236
247
  });
237
- sortedAccountTeamsWithNamesToDisplay = sortBy(newAccountTeams, ["nameToDisplay"]);
238
248
  }
239
249
  if (standardTeams?.length > 0) {
240
- const newStandardTeams = standardTeams.map((team) => {
250
+ newStandardTeams = standardTeams.map((team) => {
241
251
  return {
242
252
  ...team,
253
+ type: TEAM_TYPES.STANDARD,
243
254
  nameToDisplay: team.displayName ? team.displayName : team.name,
244
255
  };
245
256
  });
246
- sortedStandardTeamsWithNamesToDisplay = sortBy(newStandardTeams, ["nameToDisplay"]);
257
+ }
258
+ let allTeams = newPersonalTeam.concat(newAccountTeams, newStandardTeams);
259
+ const order = { [TEAM_TYPES.PERSONAL]: 1, [TEAM_TYPES.ACCOUNT]: 2, [TEAM_TYPES.STANDARD]: 3 };
260
+ allTeams = sortBy(allTeams, [(team) => order[team.type], "nameToDisplay"]);
261
+ if (selectedTeam) {
262
+ const selectedTeamIndex = allTeams.findIndex((team, index) => {
263
+ if (team.id === selectedTeam.id) {
264
+ return true;
265
+ }
266
+ else if (Array.isArray(team.projectTeams) && team.projectTeams?.length > 0) {
267
+ return team.projectTeams.some((projectTeam) => projectTeam.id === selectedTeam.id);
268
+ }
269
+ return false;
270
+ });
271
+ const [removedTeam] = allTeams.splice(selectedTeamIndex, 1);
272
+ allTeams.unshift(removedTeam);
247
273
  }
248
274
  let selectedTeamName = selectedTeam?.displayName
249
275
  ? selectedTeam.displayName
@@ -265,29 +291,22 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
265
291
  React.createElement("div", { className: headerTeamSwitcherCreateTeamButtonClassname },
266
292
  React.createElement("span", { className: headerTeamSwitcherCreateTeamButtonTextClassname }, createTeamButtonText),
267
293
  React.createElement(AddAlt, { className: headerTeamSwitcherCreateTeamButtonIconClassname })))),
268
- personalTeam.length > 0
269
- ? personalTeam.map((team) => {
270
- const teamName = team.displayName ? team.displayName : team.name;
271
- const isTeamSelected = team.id === selectedTeam?.id;
272
- return (React.createElement("div", { key: team.id, id: `${team.id}-personal-menu-item-id` },
273
- React.createElement(HeaderMenuItem, { key: team.id, id: `${team.id}-personal-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
274
- handleTeamClick({ team, type: "personal" });
275
- },
276
- // eslint-disable-next-line no-script-url
277
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-item" },
278
- React.createElement("div", { className: headerDropdownMenuItemClassname },
279
- React.createElement("span", { title: teamName, className: headerDropdownMenuItemTextClassname }, teamName),
280
- isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
281
- })
282
- : null,
283
- accountTeams.length > 0
284
- ? sortedAccountTeamsWithNamesToDisplay.map((team) => {
294
+ allTeams.map((team) => {
295
+ const isTeamSelected = team.id === selectedTeam?.id;
296
+ if (team.type === TEAM_TYPES.ACCOUNT) {
285
297
  const isSubmenuOpen = team.id === openAccountSubmenuId;
286
- const isProjectTeamSelected = team.projectTeams &&
287
- team.projectTeams.length > 0 &&
288
- team.projectTeams.some((team) => team.id === selectedTeam?.id);
289
- const isTeamSelected = team.id === selectedTeam?.id;
298
+ const projectTeams = team.projectTeams;
299
+ const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
300
+ let selectedProjectTeamIndex = -1;
301
+ if (existProjectTeams) {
302
+ selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
303
+ }
304
+ const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
290
305
  const isMenuSelected = isTeamSelected || isProjectTeamSelected;
306
+ if (existProjectTeams && isProjectTeamSelected) {
307
+ const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
308
+ projectTeams.unshift(removedTeam);
309
+ }
291
310
  return (React.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
292
311
  React.createElement(HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
293
312
  // eslint-disable-next-line no-script-url
@@ -295,7 +314,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
295
314
  React.createElement("div", { className: headerDropdownMenuItemAccountClassname },
296
315
  React.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
297
316
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
298
- isMenuSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
317
+ isMenuSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null),
299
318
  React.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
300
319
  React.createElement(GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
301
320
  React.createElement(ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
@@ -307,9 +326,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
307
326
  href: "javascript:void(0)" },
308
327
  React.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
309
328
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
310
- isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
311
- team.projectTeams && team.projectTeams.length > 0
312
- ? team.projectTeams.map((team) => {
329
+ isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null)),
330
+ projectTeams && projectTeams.length > 0
331
+ ? projectTeams.map((team) => {
313
332
  const isTeamSelected = team.id === selectedTeam?.id;
314
333
  return (React.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
315
334
  React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
@@ -322,22 +341,19 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
322
341
  isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
323
342
  })
324
343
  : null)));
325
- })
326
- : null,
327
- standardTeams.length > 0
328
- ? sortedStandardTeamsWithNamesToDisplay.map((team) => {
329
- const isTeamSelected = team.id === selectedTeam?.id;
330
- return (React.createElement("div", { key: team.id, id: `${team.id}-standard-menu-item` },
344
+ }
345
+ else {
346
+ return (React.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
331
347
  React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
332
- handleTeamClick({ team, type: "standard" });
348
+ handleTeamClick({ team, type: team.type ?? "" });
333
349
  }, "data-testid": "header-team-switcher-menu-item",
334
350
  // eslint-disable-next-line no-script-url
335
351
  href: "javascript:void(0)" },
336
352
  React.createElement("div", { className: headerDropdownMenuItemClassname },
337
353
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
338
354
  isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
339
- })
340
- : null))));
355
+ }
356
+ })))));
341
357
  }
342
358
  return null;
343
359
  }
@@ -113,9 +113,9 @@ function ProfileSettings({ baseServicesUrl, refetchUser, refetchUserTeams, refet
113
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 },
114
114
  React.createElement(ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
115
115
  React.createElement(ModalBody, { style: { maxHeight: "31.5rem" } },
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 sidebar in Launchpad."),
117
- React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
118
- 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."),
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."),
119
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` },
120
120
  React.createElement(StructuredListHead, null,
121
121
  React.createElement(StructuredListRow, { head: true },
@@ -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, refetchUserTeams, 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,7 +63,7 @@ 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: [
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
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 })),
@@ -0,0 +1,13 @@
1
+ /*
2
+ IBM Confidential
3
+ 694970X, 69497O0
4
+ © Copyright IBM Corp. 2022, 2024
5
+ */
6
+ const TEAM_TYPES = {
7
+ ACCOUNT: "account",
8
+ PERSONAL: "personal",
9
+ PROJECT: "project",
10
+ STANDARD: "standard",
11
+ };
12
+
13
+ export { TEAM_TYPES };
@@ -367,6 +367,7 @@ type Props$G = {
367
367
  className?: string;
368
368
  createJoinTeamTrigger?: Function;
369
369
  enableAppSwitcher?: boolean;
370
+ enableTeamSwitcher?: boolean;
370
371
  instanceSwitcherEnabled?: boolean;
371
372
  enableNotifications?: boolean;
372
373
  enableNotificationsCount?: boolean;
@@ -1437,6 +1438,7 @@ type Props = {
1437
1438
  };
1438
1439
  platformMessage?: any;
1439
1440
  };
1441
+ enableTeamSwitcher?: boolean;
1440
1442
  history?: any;
1441
1443
  isLaunchpad?: boolean;
1442
1444
  isLoadingTeamSwitcher?: boolean;
@@ -1457,8 +1459,8 @@ type Props = {
1457
1459
  component: React.ReactNode;
1458
1460
  };
1459
1461
  refetchUser?: Function;
1460
- refetchNavigation?: Function;
1461
1462
  refetchUserTeams?: Function;
1463
+ refetchNavigation?: Function;
1462
1464
  skipToContentProps?: {
1463
1465
  href?: string;
1464
1466
  children?: string;
@@ -1483,6 +1485,6 @@ type Props = {
1483
1485
  handleShowTutorial?: Function;
1484
1486
  tutorialScreenToShow?: string;
1485
1487
  };
1486
- declare function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme, config, createJoinTeamTrigger, 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;
1488
+ 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;
1487
1489
 
1488
1490
  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,7 +1,7 @@
1
1
  {
2
2
  "name": "@boomerang-io/carbon-addons-boomerang-react",
3
3
  "description": "Carbon Addons for Boomerang apps",
4
- "version": "4.6.21-beta.29",
4
+ "version": "4.6.21-beta.30",
5
5
  "author": {
6
6
  "name": "Tim Bula",
7
7
  "email": "timrbula@gmail.com"
@@ -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;