@boomerang-io/carbon-addons-boomerang-react 4.6.21-beta.4 → 4.6.21-beta.40

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.
@@ -3,7 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var reactRouterDom = require('react-router-dom');
7
6
  var cx = require('classnames');
8
7
  var react = require('@carbon/react');
9
8
  var TooltipHover = require('../TooltipHover/TooltipHover.js');
@@ -34,11 +33,10 @@ const SideNavUrlKeys = {
34
33
  Admin: "admin",
35
34
  };
36
35
  function AdvantageSideNav(props) {
37
- const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
36
+ const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, isbetaLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
38
37
  const [activeMenu, setActiveMenu] = React__default.default.useState(false);
39
38
  const isMenuOpen = isOpen || activeMenu;
40
39
  const windowLocation = window.location;
41
- const location = reactRouterDom.useLocation();
42
40
  const isPartnerUser = user?.type === UserType.USER_PLATFORM_ROLE.Partner;
43
41
  const joinButtontitle = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
44
42
  const hamburguerMenu = document.getElementById("header-sidenav-menu-button");
@@ -51,6 +49,7 @@ function AdvantageSideNav(props) {
51
49
  const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
52
50
  const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
53
51
  const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
52
+ const AssistantStudioLink = false;
54
53
  // get current selected team
55
54
  let teamSwitcherTeam = null;
56
55
  if (Array.isArray(personalTeams) && personalTeams.length > 0) {
@@ -98,38 +97,6 @@ function AdvantageSideNav(props) {
98
97
  destinationPath: toolsLink,
99
98
  });
100
99
  };
101
- const handleAgentAssistantStudioClick = () => {
102
- triggerEvent &&
103
- triggerEvent({
104
- action: "Clicked on SideNav Agent & Assistant Studio link",
105
- category: "Sidenav",
106
- destinationPath: agentAssistantStudioLink,
107
- });
108
- };
109
- const handleAgentAssistantLibraryClick = () => {
110
- triggerEvent &&
111
- triggerEvent({
112
- action: "Clicked on SideNav Agent & Assistant Library link",
113
- category: "Sidenav",
114
- destinationPath: agentAssistantLibraryLink,
115
- });
116
- };
117
- const handleDocumentCollectionsClick = () => {
118
- triggerEvent &&
119
- triggerEvent({
120
- action: "Clicked on SideNav Document Collections link",
121
- category: "Sidenav",
122
- destinationPath: documentCollectionsLink,
123
- });
124
- };
125
- const handleSettingsClick = () => {
126
- triggerEvent &&
127
- triggerEvent({
128
- action: "Clicked on SideNav Settings link",
129
- category: "Sidenav",
130
- destinationPath: settingsLink,
131
- });
132
- };
133
100
  const handleChatClick = () => {
134
101
  let redirectLink = chatLink
135
102
  ? chatLink
@@ -170,8 +137,17 @@ function AdvantageSideNav(props) {
170
137
  }
171
138
  setActiveMenu(false);
172
139
  };
173
- const chatSideNavLink = (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), renderIcon: icons.ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
140
+ const chatSideNavLink = (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", isActive: windowLocation.href.includes(`${baseEnvUrl}/chat`), disabled: Boolean(!enableChatButton), renderIcon: icons.ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
174
141
  const showSecondDivider = showChatButton || toolsLink || agentAssistantStudioLink || agentAssistantLibraryLink || documentCollectionsLink;
142
+ const navigateInternal = (url) => {
143
+ const target = new URL(url, window.location.origin);
144
+ if (target.origin === window.location.origin) {
145
+ history.push(target.pathname + target.search + target.hash);
146
+ }
147
+ else {
148
+ window.location.href = url;
149
+ }
150
+ };
175
151
  return (React__default.default.createElement(react.SideNav, { "aria-label": "sidenav-container", className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-container`, className, {
176
152
  "--closed": !isMenuOpen,
177
153
  }), "data-testid": "sidenav-container", isRail: true, expanded: isMenuOpen, onMouseEnter: () => setActiveMenu(true), onMouseLeave: () => {
@@ -183,6 +159,11 @@ function AdvantageSideNav(props) {
183
159
  handleLaunchpadLink(e);
184
160
  history.push("/");
185
161
  }
162
+ if (isbetaLaunchpad) {
163
+ console.log("beta launchpad home link clicked");
164
+ handleLaunchpadLink(e);
165
+ history.push("/launchpad");
166
+ }
186
167
  handleHomeClick();
187
168
  } }, "Home")) : null,
188
169
  teamSwitcherTeam ? (React__default.default.createElement(react.SideNavLink, { title: teamSwitcherTeam.isAccount ? "Account Page" : "Team Page", name: teamSwitcherTeam.name, "data-testid": "sidenav-team-link", id: teamSwitcherTeam.id, isActive: windowLocation.href.includes(`/launchpad/teams/${teamSwitcherTeam.id}`), className: `${settings.prefix}--bmrg-advantage-sidenav-team`, renderIcon: icons.UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
@@ -207,7 +188,7 @@ function AdvantageSideNav(props) {
207
188
  } }, joinButtontitle)) : null,
208
189
  React__default.default.createElement(react.SideNavDivider, null),
209
190
  showChatButton &&
210
- (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
191
+ (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, isActive: windowLocation.href.includes(`${baseEnvUrl}/chat`), content: tooltipMessage, direction: "right" },
211
192
  React__default.default.createElement("span", null, chatSideNavLink))) : (chatSideNavLink)),
212
193
  toolsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-tools-link", renderIcon: icons.Api, href: toolsLink, onClick: (e) => {
213
194
  handleToolsClick();
@@ -215,37 +196,27 @@ function AdvantageSideNav(props) {
215
196
  React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-advantage-sidenav-item-tag` },
216
197
  "Tools",
217
198
  React__default.default.createElement(react.Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
218
- agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link", isActive: (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
219
- (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`)), renderIcon: icons.IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
220
- if (isLaunchpad) {
221
- handleLaunchpadLink(e);
222
- history.push(agentStudioPath);
223
- }
224
- handleAgentAssistantStudioClick();
225
- } }, "Agent & Assistant Studio")) : null,
226
- agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders, href: agentAssistantLibraryLink, onClick: (e) => {
227
- handleAgentAssistantLibraryClick();
228
- } }, "Agent & Assistant Library")) : null,
229
- documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: icons.DocumentMultiple_02, href: documentCollectionsLink, onClick: (e) => {
230
- handleDocumentCollectionsClick();
231
- } }, "Document Collections")) : null,
199
+ agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
200
+ // isActive={
201
+ // (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
202
+ // (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
203
+ // }
204
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink), renderIcon: icons.IntentRequestCreate }, "Agent & Assistant Studio")) : null,
205
+ agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders,
206
+ //href={agentAssistantLibraryLink}
207
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Agent & Assistant Library")) : null,
208
+ documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: icons.DocumentMultiple_02,
209
+ //href={documentCollectionsLink}
210
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Document Collections")) : null,
232
211
  showSecondDivider ? React__default.default.createElement(react.SideNavDivider, null) : null,
233
- catalogNavlink ? (React__default.default.createElement(reactRouterDom.Link, { to: catalogNavlink, style: { textDecoration: "none" } },
234
- React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: location.pathname.includes("/catalog"), renderIcon: icons.Catalog }, "Catalog"))
235
- // <SideNavLink
236
- // to={catalogNavlink}
237
- // data-testid="sidenav-catalog-link"
238
- // isActive={windowLocation.href.includes(`${baseEnvUrl}/catalog`)}
239
- // // href={catalogNavlink}
240
- // renderIcon={Catalog}
241
- // >
242
- // Catalog
243
- // </SideNavLink>
244
- ) : null,
245
- settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink, onClick: (e) => {
246
- handleSettingsClick();
247
- } }, "Settings")) : null,
248
- adminNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
212
+ 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,
213
+ settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings,
214
+ // href={settingsLink}
215
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Settings")) : null,
216
+ adminNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-admin-link", renderIcon: icons.LicenseThirdParty, onClick: (e) => {
217
+ e.preventDefault();
218
+ navigateInternal(adminNavlink);
219
+ } }, "Admin")) : null),
249
220
  children ? (React__default.default.createElement(React__default.default.Fragment, null,
250
221
  React__default.default.createElement(react.SideNavDivider, null),
251
222
  children)) : 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
 
@@ -52,6 +53,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
52
53
  const showSelectTeamPurpose = navigationPlatform?.requireTeamPurpose;
53
54
  const createTeamButtonText = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
54
55
  const userTeamInstanceSwitcherDefault = user?.teamInstanceSwitcherDefault;
56
+ const hasUpdatedDefaultTeamRef = React__default.default.useRef(false);
55
57
  const teamLink = ({ teamId }) => {
56
58
  return `${navigationPlatform.baseEnvUrl}/launchpad/teams/${teamId}`;
57
59
  };
@@ -90,7 +92,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
90
92
  const userHasTeams = userHasPersonalTeam || userHasAccountTeams || userHasStandardTeams;
91
93
  const handleSelectTeam = async ({ team }) => {
92
94
  setSelectedTeam(team);
93
- if (!userTeamInstanceSwitcherDefault) {
95
+ if (!userTeamInstanceSwitcherDefault &&
96
+ !hasUpdatedDefaultTeamRef.current) {
97
+ hasUpdatedDefaultTeamRef.current = true;
94
98
  const body = {
95
99
  teamInstanceSwitcherDefault: team.id,
96
100
  };
@@ -98,6 +102,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
98
102
  }
99
103
  };
100
104
  const handleNoTeamsToSelect = async () => {
105
+ if (hasUpdatedDefaultTeamRef.current)
106
+ return;
107
+ hasUpdatedDefaultTeamRef.current = true;
101
108
  const body = {
102
109
  teamInstanceSwitcherDefault: null,
103
110
  };
@@ -147,6 +154,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
147
154
  teamsQuery?.data?.personalTeam?.length === 0))) {
148
155
  handleNoTeamsToSelect();
149
156
  }
157
+ else if (userTeamInstanceSwitcherDefault === null) {
158
+ setSelectedTeam(null);
159
+ }
150
160
  }, [
151
161
  baseServicesUrl,
152
162
  hasUserTeams,
@@ -223,33 +233,58 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
223
233
  standardTeams = teamsQuery?.data?.standardTeams ?? [];
224
234
  personalTeam = teamsQuery?.data?.personalTeam ?? [];
225
235
  }
226
- let sortedAccountTeamsWithNamesToDisplay = [];
227
- let sortedStandardTeamsWithNamesToDisplay = [];
236
+ let newPersonalTeam = personalTeam.length > 0
237
+ ? personalTeam.map((personalTeam) => ({
238
+ ...personalTeam,
239
+ type: TeamTypes.TEAM_TYPES.PERSONAL,
240
+ nameToDisplay: personalTeam.displayName ? personalTeam.displayName : personalTeam.name,
241
+ }))
242
+ : [];
243
+ let newAccountTeams = [];
244
+ let newStandardTeams = [];
228
245
  if (accountTeams?.length > 0) {
229
- const newAccountTeams = accountTeams.map((team) => {
246
+ newAccountTeams = accountTeams.map((team) => {
230
247
  let newProjectTeams = [];
231
248
  if (team.projectTeams && team.projectTeams.length > 0) {
232
- newProjectTeams = team.projectTeams?.map((team) => ({
233
- ...team,
234
- nameToDisplay: team.displayName ? team.displayName : team.name,
235
- }));
249
+ newProjectTeams = team.projectTeams?.map((projectTeam) => {
250
+ return {
251
+ ...projectTeam,
252
+ nameToDisplay: projectTeam.displayName ? projectTeam.displayName : projectTeam.name,
253
+ };
254
+ });
236
255
  }
237
256
  return {
238
257
  ...team,
239
258
  nameToDisplay: team.displayName ? team.displayName : team.name,
259
+ type: TeamTypes.TEAM_TYPES.ACCOUNT,
240
260
  projectTeams: sortBy__default.default(newProjectTeams, ["nameToDisplay"]),
241
261
  };
242
262
  });
243
- sortedAccountTeamsWithNamesToDisplay = sortBy__default.default(newAccountTeams, ["nameToDisplay"]);
244
263
  }
245
264
  if (standardTeams?.length > 0) {
246
- const newStandardTeams = standardTeams.map((team) => {
265
+ newStandardTeams = standardTeams.map((team) => {
247
266
  return {
248
267
  ...team,
268
+ type: TeamTypes.TEAM_TYPES.STANDARD,
249
269
  nameToDisplay: team.displayName ? team.displayName : team.name,
250
270
  };
251
271
  });
252
- sortedStandardTeamsWithNamesToDisplay = sortBy__default.default(newStandardTeams, ["nameToDisplay"]);
272
+ }
273
+ let allTeams = newPersonalTeam.concat(newAccountTeams, newStandardTeams);
274
+ const order = { [TeamTypes.TEAM_TYPES.PERSONAL]: 1, [TeamTypes.TEAM_TYPES.ACCOUNT]: 2, [TeamTypes.TEAM_TYPES.STANDARD]: 3 };
275
+ allTeams = sortBy__default.default(allTeams, [(team) => order[team.type], "nameToDisplay"]);
276
+ if (selectedTeam) {
277
+ const selectedTeamIndex = allTeams.findIndex((team, index) => {
278
+ if (team.id === selectedTeam.id) {
279
+ return true;
280
+ }
281
+ else if (Array.isArray(team.projectTeams) && team.projectTeams?.length > 0) {
282
+ return team.projectTeams.some((projectTeam) => projectTeam.id === selectedTeam.id);
283
+ }
284
+ return false;
285
+ });
286
+ const [removedTeam] = allTeams.splice(selectedTeamIndex, 1);
287
+ allTeams.unshift(removedTeam);
253
288
  }
254
289
  let selectedTeamName = selectedTeam?.displayName
255
290
  ? selectedTeam.displayName
@@ -271,29 +306,22 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
271
306
  React__default.default.createElement("div", { className: headerTeamSwitcherCreateTeamButtonClassname },
272
307
  React__default.default.createElement("span", { className: headerTeamSwitcherCreateTeamButtonTextClassname }, createTeamButtonText),
273
308
  React__default.default.createElement(icons.AddAlt, { className: headerTeamSwitcherCreateTeamButtonIconClassname })))),
274
- personalTeam.length > 0
275
- ? personalTeam.map((team) => {
276
- const teamName = team.displayName ? team.displayName : team.name;
277
- const isTeamSelected = team.id === selectedTeam?.id;
278
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-personal-menu-item-id` },
279
- React__default.default.createElement(react.HeaderMenuItem, { key: team.id, id: `${team.id}-personal-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
280
- handleTeamClick({ team, type: "personal" });
281
- },
282
- // eslint-disable-next-line no-script-url
283
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-item" },
284
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
285
- React__default.default.createElement("span", { title: teamName, className: headerDropdownMenuItemTextClassname }, teamName),
286
- isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
287
- })
288
- : null,
289
- accountTeams.length > 0
290
- ? sortedAccountTeamsWithNamesToDisplay.map((team) => {
309
+ allTeams.map((team) => {
310
+ const isTeamSelected = team.id === selectedTeam?.id;
311
+ if (team.type === TeamTypes.TEAM_TYPES.ACCOUNT) {
291
312
  const isSubmenuOpen = team.id === openAccountSubmenuId;
292
- const isProjectTeamSelected = team.projectTeams &&
293
- team.projectTeams.length > 0 &&
294
- team.projectTeams.some((team) => team.id === selectedTeam?.id);
295
- const isTeamSelected = team.id === selectedTeam?.id;
313
+ const projectTeams = team.projectTeams;
314
+ const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
315
+ let selectedProjectTeamIndex = -1;
316
+ if (existProjectTeams) {
317
+ selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
318
+ }
319
+ const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
296
320
  const isMenuSelected = isTeamSelected || isProjectTeamSelected;
321
+ if (existProjectTeams && isProjectTeamSelected) {
322
+ const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
323
+ projectTeams.unshift(removedTeam);
324
+ }
297
325
  return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
298
326
  React__default.default.createElement(react.HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
299
327
  // eslint-disable-next-line no-script-url
@@ -301,7 +329,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
301
329
  React__default.default.createElement("div", { className: headerDropdownMenuItemAccountClassname },
302
330
  React__default.default.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
303
331
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
304
- isMenuSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
332
+ isMenuSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null),
305
333
  React__default.default.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
306
334
  React__default.default.createElement(icons.GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
307
335
  React__default.default.createElement(icons.ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
@@ -313,9 +341,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
313
341
  href: "javascript:void(0)" },
314
342
  React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
315
343
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
316
- isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
317
- team.projectTeams && team.projectTeams.length > 0
318
- ? team.projectTeams.map((team) => {
344
+ isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null)),
345
+ projectTeams && projectTeams.length > 0
346
+ ? projectTeams.map((team) => {
319
347
  const isTeamSelected = team.id === selectedTeam?.id;
320
348
  return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
321
349
  React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
@@ -328,22 +356,19 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
328
356
  isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
329
357
  })
330
358
  : null)));
331
- })
332
- : null,
333
- standardTeams.length > 0
334
- ? sortedStandardTeamsWithNamesToDisplay.map((team) => {
335
- const isTeamSelected = team.id === selectedTeam?.id;
336
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-standard-menu-item` },
359
+ }
360
+ else {
361
+ return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
337
362
  React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
338
- handleTeamClick({ team, type: "standard" });
363
+ handleTeamClick({ team, type: team.type ?? "" });
339
364
  }, "data-testid": "header-team-switcher-menu-item",
340
365
  // eslint-disable-next-line no-script-url
341
366
  href: "javascript:void(0)" },
342
367
  React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
343
368
  React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
344
369
  isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
345
- })
346
- : null))));
370
+ }
371
+ })))));
347
372
  }
348
373
  return null;
349
374
  }
@@ -34,12 +34,13 @@ function determineIfConfigIsDifferent(teams, initialTeams) {
34
34
  }
35
35
  return isConfigDifferent;
36
36
  }
37
- function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal }) {
37
+ function ProfileSettings({ baseServicesUrl, refetchUser, refetchUserTeams, refetchNavigation, src, userName, isOpen, closeModal, }) {
38
38
  const queryClient = reactQuery.useQueryClient();
39
39
  const [initialTeams, setInitialTeams] = React.useState([]);
40
40
  const [teams, setTeams] = React.useState([]);
41
41
  const userUrl = servicesConfig.serviceUrl.getLaunchpadUser({ baseServicesUrl });
42
42
  const profileUrl = servicesConfig.serviceUrl.resourceUserProfile({ baseServicesUrl });
43
+ const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
43
44
  const { data: user, isLoading: userIsLoading, error: userError, } = reactQuery.useQuery({
44
45
  queryKey: userUrl,
45
46
  queryFn: servicesConfig.resolver.query(userUrl),
@@ -48,6 +49,22 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
48
49
  onSuccess: () => {
49
50
  queryClient.invalidateQueries(userUrl);
50
51
  queryClient.invalidateQueries(profileUrl);
52
+ queryClient.invalidateQueries(userTeamsUrl);
53
+ if (refetchUser) {
54
+ setTimeout(() => {
55
+ refetchUser();
56
+ }, 1000);
57
+ }
58
+ if (refetchUserTeams) {
59
+ setTimeout(() => {
60
+ refetchUserTeams();
61
+ }, 1000);
62
+ }
63
+ if (refetchNavigation) {
64
+ setTimeout(() => {
65
+ refetchNavigation();
66
+ }, 1000);
67
+ }
51
68
  },
52
69
  });
53
70
  // Only disable when we have a user and we know that there aren' any lower level groups to manage
@@ -63,6 +80,7 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
63
80
  }
64
81
  async function handleSubmit() {
65
82
  const body = {
83
+ teamInstanceSwitcherDefault: null,
66
84
  lowerLevelGroups: teams,
67
85
  };
68
86
  try {
@@ -104,9 +122,9 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
104
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 },
105
123
  React__default.default.createElement(react.ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
106
124
  React__default.default.createElement(react.ModalBody, { style: { maxHeight: "31.5rem" } },
107
- 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."),
108
- React__default.default.createElement("h2", { className: `${settings.prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
109
- 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."),
110
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` },
111
129
  React__default.default.createElement(react.StructuredListHead, null,
112
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, 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,8 +71,8 @@ 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: [
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 })),
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
+ 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 })),
78
78
  ...profileMenuItems,
@@ -82,7 +82,15 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
82
82
  isSupportEnabled &&
83
83
  (supportFlagCheck || isPartnerUser ? (React__default.default.createElement(SupportCenter.SupportCenterMenuItem, { key: "support-center", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, supportLink: supportLink, partnerEmailId: partnerEmailId, enablePartner: isPartnerUser, baseServicesUrl: platform.baseServicesUrl })) : (React__default.default.createElement(HeaderMenuItem.default, { key: "support-center", href: platform?.supportUrl, icon: React__default.default.createElement(icons.HelpDesk, null), kind: "external", text: "Support Center", type: "link" }))),
84
84
  React__default.default.createElement(HeaderMenuItem.default, { key: "release-notes", href: platform?.releaseNotesUrl, icon: React__default.default.createElement(icons.CatalogPublish, null), "data-testid": "release-notes", kind: "app", text: "Release Notes", type: "link" }),
85
- React__default.default.createElement(HeaderMenuItem.default, { key: "legal-terms", href: platform?.legalTermsUrl, icon: React__default.default.createElement(icons.Policy, null), "data-testid": "legal-terms", kind: "app", text: "Legal Terms", type: "link" }),
85
+ // <HeaderMenuItem
86
+ // key="legal-terms"
87
+ // href={platform?.legalTermsUrl as string}
88
+ // icon={<Policy />}
89
+ // data-testid="legal-terms"
90
+ // kind="app"
91
+ // text="Legal Terms"
92
+ // type="link"
93
+ // />,
86
94
  React__default.default.createElement("span", { style: { borderBottom: "1px solid #b8c1c1" } }),
87
95
  isCommunityEnabled && (React__default.default.createElement(HeaderMenuItem.default, { key: "community", href: platform?.communityUrl, icon: React__default.default.createElement(icons.Forum, null), kind: "external", text: "Community", type: "link" })),
88
96
  isFeedbackEnabled && (React__default.default.createElement(Feedback.FeedbackMenuItem, { key: "feedback", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, sendIdeasUrl: sendIdeasUrl, sendBluePointsAwardUrl: sendBluePointsAwardUrl })),
@@ -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;
@@ -1,5 +1,4 @@
1
1
  import React from 'react';
2
- import { useLocation, Link } from 'react-router-dom';
3
2
  import cx from 'classnames';
4
3
  import { SideNavLink, SideNav, SideNavItems, SideNavDivider, Tag } from '@carbon/react';
5
4
  import TooltipHover from '../TooltipHover/TooltipHover.js';
@@ -25,11 +24,10 @@ const SideNavUrlKeys = {
25
24
  Admin: "admin",
26
25
  };
27
26
  function AdvantageSideNav(props) {
28
- const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
27
+ const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, isbetaLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
29
28
  const [activeMenu, setActiveMenu] = React.useState(false);
30
29
  const isMenuOpen = isOpen || activeMenu;
31
30
  const windowLocation = window.location;
32
- const location = useLocation();
33
31
  const isPartnerUser = user?.type === USER_PLATFORM_ROLE.Partner;
34
32
  const joinButtontitle = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
35
33
  const hamburguerMenu = document.getElementById("header-sidenav-menu-button");
@@ -42,6 +40,7 @@ function AdvantageSideNav(props) {
42
40
  const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
43
41
  const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
44
42
  const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
43
+ const AssistantStudioLink = false;
45
44
  // get current selected team
46
45
  let teamSwitcherTeam = null;
47
46
  if (Array.isArray(personalTeams) && personalTeams.length > 0) {
@@ -89,38 +88,6 @@ function AdvantageSideNav(props) {
89
88
  destinationPath: toolsLink,
90
89
  });
91
90
  };
92
- const handleAgentAssistantStudioClick = () => {
93
- triggerEvent &&
94
- triggerEvent({
95
- action: "Clicked on SideNav Agent & Assistant Studio link",
96
- category: "Sidenav",
97
- destinationPath: agentAssistantStudioLink,
98
- });
99
- };
100
- const handleAgentAssistantLibraryClick = () => {
101
- triggerEvent &&
102
- triggerEvent({
103
- action: "Clicked on SideNav Agent & Assistant Library link",
104
- category: "Sidenav",
105
- destinationPath: agentAssistantLibraryLink,
106
- });
107
- };
108
- const handleDocumentCollectionsClick = () => {
109
- triggerEvent &&
110
- triggerEvent({
111
- action: "Clicked on SideNav Document Collections link",
112
- category: "Sidenav",
113
- destinationPath: documentCollectionsLink,
114
- });
115
- };
116
- const handleSettingsClick = () => {
117
- triggerEvent &&
118
- triggerEvent({
119
- action: "Clicked on SideNav Settings link",
120
- category: "Sidenav",
121
- destinationPath: settingsLink,
122
- });
123
- };
124
91
  const handleChatClick = () => {
125
92
  let redirectLink = chatLink
126
93
  ? chatLink
@@ -161,8 +128,17 @@ function AdvantageSideNav(props) {
161
128
  }
162
129
  setActiveMenu(false);
163
130
  };
164
- const chatSideNavLink = (React.createElement(SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), renderIcon: ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
131
+ const chatSideNavLink = (React.createElement(SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", isActive: windowLocation.href.includes(`${baseEnvUrl}/chat`), disabled: Boolean(!enableChatButton), renderIcon: ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
165
132
  const showSecondDivider = showChatButton || toolsLink || agentAssistantStudioLink || agentAssistantLibraryLink || documentCollectionsLink;
133
+ const navigateInternal = (url) => {
134
+ const target = new URL(url, window.location.origin);
135
+ if (target.origin === window.location.origin) {
136
+ history.push(target.pathname + target.search + target.hash);
137
+ }
138
+ else {
139
+ window.location.href = url;
140
+ }
141
+ };
166
142
  return (React.createElement(SideNav, { "aria-label": "sidenav-container", className: cx(`${prefix}--bmrg-advantage-sidenav-container`, className, {
167
143
  "--closed": !isMenuOpen,
168
144
  }), "data-testid": "sidenav-container", isRail: true, expanded: isMenuOpen, onMouseEnter: () => setActiveMenu(true), onMouseLeave: () => {
@@ -174,6 +150,11 @@ function AdvantageSideNav(props) {
174
150
  handleLaunchpadLink(e);
175
151
  history.push("/");
176
152
  }
153
+ if (isbetaLaunchpad) {
154
+ console.log("beta launchpad home link clicked");
155
+ handleLaunchpadLink(e);
156
+ history.push("/launchpad");
157
+ }
177
158
  handleHomeClick();
178
159
  } }, "Home")) : null,
179
160
  teamSwitcherTeam ? (React.createElement(SideNavLink, { title: teamSwitcherTeam.isAccount ? "Account Page" : "Team Page", name: teamSwitcherTeam.name, "data-testid": "sidenav-team-link", id: teamSwitcherTeam.id, isActive: windowLocation.href.includes(`/launchpad/teams/${teamSwitcherTeam.id}`), className: `${prefix}--bmrg-advantage-sidenav-team`, renderIcon: UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
@@ -198,7 +179,7 @@ function AdvantageSideNav(props) {
198
179
  } }, joinButtontitle)) : null,
199
180
  React.createElement(SideNavDivider, null),
200
181
  showChatButton &&
201
- (showChatTooltip ? (React.createElement(TooltipHover, { className: `${prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
182
+ (showChatTooltip ? (React.createElement(TooltipHover, { className: `${prefix}--bmrg-side-nav__tooltip`, isActive: windowLocation.href.includes(`${baseEnvUrl}/chat`), content: tooltipMessage, direction: "right" },
202
183
  React.createElement("span", null, chatSideNavLink))) : (chatSideNavLink)),
203
184
  toolsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-tools-link", renderIcon: Api, href: toolsLink, onClick: (e) => {
204
185
  handleToolsClick();
@@ -206,37 +187,27 @@ function AdvantageSideNav(props) {
206
187
  React.createElement("div", { className: `${prefix}--bmrg-advantage-sidenav-item-tag` },
207
188
  "Tools",
208
189
  React.createElement(Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
209
- agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link", isActive: (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
210
- (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`)), renderIcon: IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
211
- if (isLaunchpad) {
212
- handleLaunchpadLink(e);
213
- history.push(agentStudioPath);
214
- }
215
- handleAgentAssistantStudioClick();
216
- } }, "Agent & Assistant Studio")) : null,
217
- agentAssistantLibraryLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: Folders, href: agentAssistantLibraryLink, onClick: (e) => {
218
- handleAgentAssistantLibraryClick();
219
- } }, "Agent & Assistant Library")) : null,
220
- documentCollectionsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: DocumentMultiple_02, href: documentCollectionsLink, onClick: (e) => {
221
- handleDocumentCollectionsClick();
222
- } }, "Document Collections")) : null,
190
+ agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
191
+ // isActive={
192
+ // (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
193
+ // (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
194
+ // }
195
+ className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink), renderIcon: IntentRequestCreate }, "Agent & Assistant Studio")) : null,
196
+ agentAssistantLibraryLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: Folders,
197
+ //href={agentAssistantLibraryLink}
198
+ className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Agent & Assistant Library")) : null,
199
+ documentCollectionsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: DocumentMultiple_02,
200
+ //href={documentCollectionsLink}
201
+ className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Document Collections")) : null,
223
202
  showSecondDivider ? React.createElement(SideNavDivider, null) : null,
224
- catalogNavlink ? (React.createElement(Link, { to: catalogNavlink, style: { textDecoration: "none" } },
225
- React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: location.pathname.includes("/catalog"), renderIcon: Catalog }, "Catalog"))
226
- // <SideNavLink
227
- // to={catalogNavlink}
228
- // data-testid="sidenav-catalog-link"
229
- // isActive={windowLocation.href.includes(`${baseEnvUrl}/catalog`)}
230
- // // href={catalogNavlink}
231
- // renderIcon={Catalog}
232
- // >
233
- // Catalog
234
- // </SideNavLink>
235
- ) : null,
236
- settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings, href: settingsLink, onClick: (e) => {
237
- handleSettingsClick();
238
- } }, "Settings")) : null,
239
- adminNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: LicenseThirdParty }, "Admin")) : null),
203
+ catalogNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: windowLocation.href.includes(`${baseEnvUrl}/catalog`), href: catalogNavlink, renderIcon: Catalog }, "Catalog")) : null,
204
+ settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings,
205
+ // href={settingsLink}
206
+ className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Settings")) : null,
207
+ adminNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-admin-link", renderIcon: LicenseThirdParty, onClick: (e) => {
208
+ e.preventDefault();
209
+ navigateInternal(adminNavlink);
210
+ } }, "Admin")) : null),
240
211
  children ? (React.createElement(React.Fragment, null,
241
212
  React.createElement(SideNavDivider, null),
242
213
  children)) : 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
@@ -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 sortedAccountTeamsWithNamesToDisplay = [];
218
- let sortedStandardTeamsWithNamesToDisplay = [];
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
- const newAccountTeams = accountTeams.map((team) => {
237
+ newAccountTeams = accountTeams.map((team) => {
221
238
  let newProjectTeams = [];
222
239
  if (team.projectTeams && team.projectTeams.length > 0) {
223
- newProjectTeams = team.projectTeams?.map((team) => ({
224
- ...team,
225
- nameToDisplay: team.displayName ? team.displayName : team.name,
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
- const newStandardTeams = standardTeams.map((team) => {
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
- sortedStandardTeamsWithNamesToDisplay = sortBy(newStandardTeams, ["nameToDisplay"]);
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,29 +297,22 @@ 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
- personalTeam.length > 0
266
- ? personalTeam.map((team) => {
267
- const teamName = team.displayName ? team.displayName : team.name;
268
- const isTeamSelected = team.id === selectedTeam?.id;
269
- return (React.createElement("div", { key: team.id, id: `${team.id}-personal-menu-item-id` },
270
- React.createElement(HeaderMenuItem, { key: team.id, id: `${team.id}-personal-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
271
- handleTeamClick({ team, type: "personal" });
272
- },
273
- // eslint-disable-next-line no-script-url
274
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-item" },
275
- React.createElement("div", { className: headerDropdownMenuItemClassname },
276
- React.createElement("span", { title: teamName, className: headerDropdownMenuItemTextClassname }, teamName),
277
- isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
278
- })
279
- : null,
280
- accountTeams.length > 0
281
- ? sortedAccountTeamsWithNamesToDisplay.map((team) => {
300
+ allTeams.map((team) => {
301
+ const isTeamSelected = team.id === selectedTeam?.id;
302
+ if (team.type === TEAM_TYPES.ACCOUNT) {
282
303
  const isSubmenuOpen = team.id === openAccountSubmenuId;
283
- const isProjectTeamSelected = team.projectTeams &&
284
- team.projectTeams.length > 0 &&
285
- team.projectTeams.some((team) => team.id === selectedTeam?.id);
286
- const isTeamSelected = team.id === selectedTeam?.id;
304
+ const projectTeams = team.projectTeams;
305
+ const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
306
+ let selectedProjectTeamIndex = -1;
307
+ if (existProjectTeams) {
308
+ selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
309
+ }
310
+ const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
287
311
  const isMenuSelected = isTeamSelected || isProjectTeamSelected;
312
+ if (existProjectTeams && isProjectTeamSelected) {
313
+ const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
314
+ projectTeams.unshift(removedTeam);
315
+ }
288
316
  return (React.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
289
317
  React.createElement(HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
290
318
  // eslint-disable-next-line no-script-url
@@ -292,7 +320,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
292
320
  React.createElement("div", { className: headerDropdownMenuItemAccountClassname },
293
321
  React.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
294
322
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
295
- isMenuSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
323
+ isMenuSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null),
296
324
  React.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
297
325
  React.createElement(GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
298
326
  React.createElement(ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
@@ -304,9 +332,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
304
332
  href: "javascript:void(0)" },
305
333
  React.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
306
334
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
307
- isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
308
- team.projectTeams && team.projectTeams.length > 0
309
- ? team.projectTeams.map((team) => {
335
+ isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null)),
336
+ projectTeams && projectTeams.length > 0
337
+ ? projectTeams.map((team) => {
310
338
  const isTeamSelected = team.id === selectedTeam?.id;
311
339
  return (React.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
312
340
  React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
@@ -319,22 +347,19 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
319
347
  isTeamSelected ? (React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
320
348
  })
321
349
  : 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` },
350
+ }
351
+ else {
352
+ return (React.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
328
353
  React.createElement(HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
329
- handleTeamClick({ team, type: "standard" });
354
+ handleTeamClick({ team, type: team.type ?? "" });
330
355
  }, "data-testid": "header-team-switcher-menu-item",
331
356
  // eslint-disable-next-line no-script-url
332
357
  href: "javascript:void(0)" },
333
358
  React.createElement("div", { className: headerDropdownMenuItemClassname },
334
359
  React.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
335
360
  isTeamSelected ? React.createElement(CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
336
- })
337
- : null))));
361
+ }
362
+ })))));
338
363
  }
339
364
  return null;
340
365
  }
@@ -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 sidebar in Launchpad."),
99
- React.createElement("h2", { className: `${prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad sidebar"),
100
- React.createElement("p", { className: `${prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad sidebar and Catalog (useful for sensitive demos). You will not be able to access or view unchecked Teams from the sidebar, and cannot add items to them from Catalog."),
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, Policy, Forum, ChatLaunch, Cognitive, Book } from '@carbon/react/icons';
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
- React.createElement(HeaderMenuItem, { key: "legal-terms", href: platform?.legalTermsUrl, icon: React.createElement(Policy, null), "data-testid": "legal-terms", kind: "app", text: "Legal Terms", type: "link" }),
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 })),
@@ -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 };
@@ -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;
@@ -1436,6 +1438,7 @@ type Props = {
1436
1438
  };
1437
1439
  platformMessage?: any;
1438
1440
  };
1441
+ enableTeamSwitcher?: boolean;
1439
1442
  history?: any;
1440
1443
  isLaunchpad?: boolean;
1441
1444
  isLoadingTeamSwitcher?: boolean;
@@ -1456,6 +1459,7 @@ type Props = {
1456
1459
  component: React.ReactNode;
1457
1460
  };
1458
1461
  refetchUser?: Function;
1462
+ refetchUserTeams?: Function;
1459
1463
  refetchNavigation?: Function;
1460
1464
  skipToContentProps?: {
1461
1465
  href?: string;
@@ -1481,6 +1485,6 @@ type Props = {
1481
1485
  handleShowTutorial?: Function;
1482
1486
  tutorialScreenToShow?: string;
1483
1487
  };
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;
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;
1485
1489
 
1486
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.4",
4
+ "version": "4.6.21-beta.40",
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;
@@ -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);