@boomerang-io/carbon-addons-boomerang-react 4.6.11-beta.3 → 4.6.11-beta.31

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.
@@ -20,26 +20,66 @@ IBM Confidential
20
20
  694970X, 69497O0
21
21
  © Copyright IBM Corp. 2022, 2024
22
22
  */
23
+ const SideNavUrlKeys = {
24
+ Home: "home",
25
+ TeamPage: "teamPage",
26
+ Chat: "chat",
27
+ Tools: "tools",
28
+ AgentStudio: "agentStudio",
29
+ AgentLibrary: "agentLibrary",
30
+ DocumentCollections: "documentCollections",
31
+ Catalog: "catalog",
32
+ Settings: "settings",
33
+ Admin: "admin",
34
+ };
23
35
  function AdvantageSideNav(props) {
24
- const { app, appLink, regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, homeLink, assistantLink, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, userTeamsError = false, userTeamsLoading = false, history, children, ...rest } = props;
25
- const [activeSubmenu, setActiveSubmenu] = React__default.default.useState("");
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, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
26
37
  const [activeMenu, setActiveMenu] = React__default.default.useState(false);
27
- const [teamList, setTeamList] = React__default.default.useState(null);
28
- const [regionalModalIsOpen, setRegionalModalIsOpen] = React__default.default.useState(false);
29
- const [selectedTeam, setSelectedTeam] = React__default.default.useState(null);
30
38
  const isMenuOpen = isOpen || activeMenu;
31
39
  const windowLocation = window.location;
32
40
  const isPartnerUser = user?.type === UserType.USER_PLATFORM_ROLE.Partner;
41
+ const defaultTeamHasAssistantsAccess = user?.defaultTeamHasAssistantsAccess;
33
42
  const joinButtontitle = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
34
- const standardTeamsList = [...personalTeams.map((pteams) => ({ ...pteams, isPersonal: true })), ...teams];
35
- const teamsMenuRef = React__default.default.useRef(null);
36
- const accountsMenuRef = React__default.default.useRef(null);
37
43
  const hamburguerMenu = document.getElementById("header-sidenav-menu-button");
38
- const noTeamsMessage = userTeamsError
39
- ? "Failed to get teams, please try again later."
40
- : "No teams or accounts available.";
41
- const teamsRef = React__default.default.useRef([]);
42
- const accountsRef = React__default.default.useRef([]);
44
+ const homeLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Home)?.url;
45
+ const chatLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Chat)?.url;
46
+ const toolsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Tools)?.url;
47
+ const agentAssistantStudioLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.AgentStudio)?.url;
48
+ const agentAssistantLibraryLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.AgentLibrary)?.url;
49
+ const documentCollectionsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.DocumentCollections)?.url;
50
+ const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
51
+ const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
52
+ const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
53
+ // get current selected team
54
+ let teamSwitcherTeam = null;
55
+ if (Array.isArray(personalTeams) && personalTeams.length > 0) {
56
+ personalTeams.forEach((team) => {
57
+ if (team.id === user?.teamInstanceSwitcherDefault) {
58
+ teamSwitcherTeam = { ...team, isPersonal: true };
59
+ }
60
+ });
61
+ }
62
+ if (Array.isArray(teams) && teams.length > 0) {
63
+ teams.forEach((team) => {
64
+ if (team.id === user?.teamInstanceSwitcherDefault) {
65
+ teamSwitcherTeam = { ...team, isStandard: true };
66
+ }
67
+ });
68
+ }
69
+ if (Array.isArray(accounts) && accounts.length > 0) {
70
+ accounts.forEach((account) => {
71
+ if (account.id === user?.teamInstanceSwitcherDefault) {
72
+ teamSwitcherTeam = { ...account, isAccount: true };
73
+ }
74
+ else if (Array.isArray(account.projectTeams) && account.projectTeams.length > 0) {
75
+ account.projectTeams.forEach((projectTeam) => {
76
+ if (projectTeam.id === user?.teamInstanceSwitcherDefault) {
77
+ teamSwitcherTeam = { ...projectTeam, isProject: true };
78
+ }
79
+ });
80
+ }
81
+ });
82
+ }
43
83
  // Functions to track IBM Instrumentation on Segment
44
84
  const handleHomeClick = () => {
45
85
  triggerEvent &&
@@ -49,24 +89,57 @@ function AdvantageSideNav(props) {
49
89
  destinationPath: homeLink,
50
90
  });
51
91
  };
52
- const handleRegionalNewStartNewChat = (team) => {
53
- const assistantLink = `${appLink?.newChatRedirect()}?teamName=${team.name}&teamId=${team.id}`;
54
- window.open(assistantLink, "_self", "noopener,noreferrer");
92
+ const handleToolsClick = () => {
93
+ triggerEvent &&
94
+ triggerEvent({
95
+ action: "Clicked on SideNav Tools link",
96
+ category: "Sidenav",
97
+ destinationPath: toolsLink,
98
+ });
55
99
  };
56
- const handleAssistantClick = () => {
57
- if (regionalTeam?.length > 1) {
58
- setRegionalModalIsOpen(true);
59
- setTeamList(regionalTeam?.map((team) => ({
60
- id: team.id,
61
- name: team.name,
62
- })));
63
- }
100
+ const handleAgentAssistantStudioClick = () => {
101
+ triggerEvent &&
102
+ triggerEvent({
103
+ action: "Clicked on SideNav Agent & Assistant Studio link",
104
+ category: "Sidenav",
105
+ destinationPath: agentAssistantStudioLink,
106
+ });
107
+ };
108
+ const handleAgentAssistantLibraryClick = () => {
109
+ triggerEvent &&
110
+ triggerEvent({
111
+ action: "Clicked on SideNav Agent & Assistant Library link",
112
+ category: "Sidenav",
113
+ destinationPath: agentAssistantLibraryLink,
114
+ });
115
+ };
116
+ const handleDocumentCollectionsClick = () => {
117
+ triggerEvent &&
118
+ triggerEvent({
119
+ action: "Clicked on SideNav Document Collections link",
120
+ category: "Sidenav",
121
+ destinationPath: documentCollectionsLink,
122
+ });
123
+ };
124
+ const handleSettingsClick = () => {
125
+ triggerEvent &&
126
+ triggerEvent({
127
+ action: "Clicked on SideNav Settings link",
128
+ category: "Sidenav",
129
+ destinationPath: settingsLink,
130
+ });
131
+ };
132
+ const handleChatClick = () => {
133
+ let redirectLink = chatLink
134
+ ? chatLink
135
+ : `${appLink.newChatRedirect()}?teamName=${teamSwitcherTeam.name}&teamId=${teamSwitcherTeam.id}`;
64
136
  triggerEvent &&
65
137
  triggerEvent({
66
- action: "Clicked on SideNav Assistant link",
138
+ action: "Clicked on SideNav Chat link",
67
139
  category: "Sidenav",
68
- destinationPath: assistantLink,
140
+ destinationPath: redirectLink,
69
141
  });
142
+ window.open(redirectLink, "_self", "noopener,noreferrer");
70
143
  };
71
144
  const handleCreateJoinClick = () => {
72
145
  triggerEvent &&
@@ -87,60 +160,27 @@ function AdvantageSideNav(props) {
87
160
  teamType: type,
88
161
  });
89
162
  };
90
- const handleServiceClick = ({ service, team }) => {
91
- if (templateMeteringEvent) {
92
- templateMeteringEvent({ service, team });
93
- }
94
- triggerEvent &&
95
- triggerEvent({
96
- action: "Clicked on SideNav Service link",
97
- category: "Sidenav",
98
- destinationPath: service.url,
99
- });
100
- };
101
163
  const handleLaunchpadLink = (event) => {
102
164
  event.preventDefault();
103
- // remediation to close menu, submenu and accordion when select a team on Launchpad
104
- //@ts-ignore
105
- if (Boolean(teamsMenuRef.current?.ariaExpanded === "true")) {
106
- //@ts-ignore
107
- teamsMenuRef.current.click();
108
- }
109
- //@ts-ignore
110
- if (Boolean(accountsMenuRef.current?.ariaExpanded === "true")) {
111
- //@ts-ignore
112
- accountsMenuRef.current.click();
113
- }
114
165
  //@ts-ignore
115
166
  if (Boolean(hamburguerMenu) && hamburguerMenu.className.includes("active")) {
116
167
  //@ts-ignore
117
168
  Boolean(hamburguerMenu) && hamburguerMenu?.click();
118
169
  }
119
170
  setActiveMenu(false);
120
- setActiveSubmenu("");
121
171
  };
122
- // add or remove refs
123
- if (teamsRef.current.length !== standardTeamsList?.length) {
124
- //@ts-ignore
125
- teamsRef.current = Array(standardTeamsList?.length).fill().map((_, i) => teamsRef.current[i] || React__default.default.createRef());
126
- }
127
- if (accountsRef.current.length !== accounts?.length) {
128
- //@ts-ignore
129
- accountsRef.current = Array(accounts?.length).fill().map((_, i) => accountsRef.current[i] || React__default.default.createRef());
130
- }
131
- const assistantSideNavLink = (
132
- // assistantLink &&
133
- React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-assistant-link", className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), isActive: assistantLink ? windowLocation.href.includes(assistantLink) : '', renderIcon: icons.ChatBot, href: enableChatButton && assistantLink, onClick: enableChatButton ? handleAssistantClick : (e) => e.preventDefault() }, `Start a ${defaultAssistantLink ? "" : "New "}Chat`));
172
+ 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"));
173
+ const showSecondDivider = (!isPartnerUser && showChatButton) ||
174
+ toolsLink ||
175
+ agentAssistantStudioLink ||
176
+ agentAssistantLibraryLink ||
177
+ documentCollectionsLink;
134
178
  return (React__default.default.createElement(react.SideNav, { "aria-label": "sidenav-container", className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-container`, className, {
135
179
  "--closed": !isMenuOpen,
136
- }), "data-testid": "sidenav-container", isRail: true, expanded: isMenuOpen, onToggle: () => setActiveSubmenu(""), onMouseEnter: () => setActiveMenu(true), onMouseLeave: () => {
180
+ }), "data-testid": "sidenav-container", isRail: true, expanded: isMenuOpen, onMouseEnter: () => setActiveMenu(true), onMouseLeave: () => {
137
181
  setActiveMenu(false);
138
- setActiveSubmenu("");
139
182
  }, ...rest }, React__default.default.createElement(react.SideNavItems, null,
140
- isMenuOpen && navLinks?.length ? (React__default.default.createElement("div", null,
141
- navLinks.map((link) => (React__default.default.createElement(react.SideNavLink, { href: link.url, target: link.isExternal ? "_blank" : undefined, rel: link.isExternal ? "noopener noreferrer" : undefined }, link.name))),
142
- React__default.default.createElement(react.SideNavDivider, null))) : null,
143
- React__default.default.createElement("div", { onMouseEnter: () => setActiveSubmenu("") },
183
+ React__default.default.createElement("div", null,
144
184
  homeLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-home-link", isActive: `${baseEnvUrl}/${app}/`.includes(windowLocation.href), renderIcon: icons.Home, href: homeLink, onClick: (e) => {
145
185
  if (isLaunchpad) {
146
186
  handleLaunchpadLink(e);
@@ -148,116 +188,56 @@ function AdvantageSideNav(props) {
148
188
  }
149
189
  handleHomeClick();
150
190
  } }, "Home")) : null,
151
- !isPartnerUser &&
152
- // assistantLink &&
153
- showChatButton &&
154
- (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
155
- React__default.default.createElement("span", null, assistantSideNavLink))) : (assistantSideNavLink)),
156
- React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
157
- React__default.default.createElement("span", null, assistantSideNavLink)),
158
- regionalModalIsOpen && React__default.default.createElement(react.ComposedModal, { className: `${settings.prefix}--teamSelectionModalContainer`, open: regionalModalIsOpen, onClose: () => setRegionalModalIsOpen(false), onKeyDown: (e) => e.stopPropagation(), "data-testid": "select-team-chat-modal" },
159
- React__default.default.createElement(react.ModalHeader, { title: "Select Team to Start a New Chat", closeModal: () => setRegionalModalIsOpen(false) }),
160
- React__default.default.createElement(react.ModalBody, { className: `${settings.prefix}--teamSelectModalBody` },
161
- React__default.default.createElement(react.ComboBox, { items: teamList, disabled: !teamList?.length, id: "select-team-chat-modal-dropdown", selectedItem: selectedTeam, size: "md", "data-testid": "select-team-chat-modal-dropdown", itemToString: (item) => item?.name, label: "Choose a team", onChange: ({ selectedItem }) => setSelectedTeam(selectedItem) })),
162
- React__default.default.createElement(react.ModalFooter, null,
163
- React__default.default.createElement(react.Button, { kind: "secondary", "data-testid": "select-team-chat-modal-cancel-button", onClick: () => setRegionalModalIsOpen(false) }, "Cancel"),
164
- React__default.default.createElement(react.Button, { "data-modal-primary-focus": true, kind: "primary", disabled: !selectedTeam, "data-testid": "select-team-chat-modal-continue-button", onClick: () => {
165
- if (selectedTeam) {
166
- handleRegionalNewStartNewChat(selectedTeam);
167
- setRegionalModalIsOpen(false);
168
- // closeModal();
169
- }
170
- } }, "Continue"))),
171
- !isPartnerUser && joinCreateTrigger ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-create-join-trigger", renderIcon: icons.AddAlt, onClick: (e) => {
191
+ 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(teamSwitcherTeam.id), className: `${settings.prefix}--bmrg-advantage-sidenav-team`, renderIcon: icons.UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
192
+ if (isLaunchpad) {
193
+ handleLaunchpadLink(e);
194
+ history.push(`/teams/${teamSwitcherTeam.id}`);
195
+ }
196
+ handleTeamClick({
197
+ team: teamSwitcherTeam,
198
+ type: teamSwitcherTeam.isPersonal
199
+ ? "personal"
200
+ : teamSwitcherTeam.isAccount
201
+ ? "account"
202
+ : teamSwitcherTeam.isproject
203
+ ? "project"
204
+ : "standard",
205
+ });
206
+ } },
207
+ React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-teams__title` }, teamSwitcherTeam.isAccount ? "Account Page" : "Team Page"))) : !isPartnerUser && joinCreateTrigger ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-create-join-trigger", renderIcon: icons.AddAlt, onClick: (e) => {
172
208
  joinCreateTrigger(e);
173
209
  handleCreateJoinClick();
174
- } }, joinButtontitle)) : null),
175
- children ? (React__default.default.createElement(React__default.default.Fragment, null,
210
+ } }, joinButtontitle)) : null,
176
211
  React__default.default.createElement(react.SideNavDivider, null),
177
- children)) : null,
178
- userTeamsLoading && isMenuOpen ? (React__default.default.createElement(React__default.default.Fragment, null,
179
- React__default.default.createElement(react.SideNavDivider, null),
180
- React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-advantage-sidenav-loading-container` },
181
- React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` }),
182
- React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` }),
183
- React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` })))) : null,
184
- ((!Boolean(standardTeamsList?.length) && !Boolean(accounts?.length) && !userTeamsLoading) ||
185
- userTeamsError) &&
186
- isMenuOpen ? (React__default.default.createElement(React__default.default.Fragment, null,
187
- React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-no-teams__text` }, noTeamsMessage))) : null,
188
- Boolean(standardTeamsList?.length) ? (React__default.default.createElement(React__default.default.Fragment, null,
189
- React__default.default.createElement(react.SideNavDivider, null),
190
- React__default.default.createElement(react.SideNavMenu, { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-menu`, {
191
- "--active-closed": !isMenuOpen && standardTeamsList.some((t) => windowLocation.href.includes(t.id)),
192
- }), renderIcon: icons.UserMultiple, title: "Teams", "data-testid": "sidenav-teams", id: "sidenav-teams", ref: teamsMenuRef, isActive: standardTeamsList.some((t) => windowLocation.href.includes(t.id)), isSideNavExpanded: isMenuOpen }, isMenuOpen
193
- ? standardTeamsList?.map((team, i) => {
194
- const topPosition = document?.getElementById(team.id)?.getBoundingClientRect()?.top ?? 0;
195
- const teamDisplayName = Boolean(team.displayName) ? team.displayName : team.name;
196
- return (React__default.default.createElement(React__default.default.Fragment, null,
197
- React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-team-item` },
198
- React__default.default.createElement(react.SideNavLink, { title: teamDisplayName, name: team.name, "data-testid": "sidenav-team-link", id: team.id, isActive: windowLocation.href.includes(team.id), ref: teamsRef.current[i], className: `${settings.prefix}--bmrg-advantage-sidenav-team`, renderIcon: team?.isPersonal ? icons.User : team.privateTeam ? icons.Locked : icons.Unlocked, href: `${baseEnvUrl}/${app}/teams/${team.id}`, onMouseEnter: () => setActiveSubmenu(team.id), onFocus: () => setActiveSubmenu(team.id), onClick: (e) => {
199
- if (isLaunchpad) {
200
- handleLaunchpadLink(e);
201
- history.push(`/teams/${team.id}`);
202
- }
203
- handleTeamClick({ team, type: team.isPersonal ? "personal" : "standard" });
204
- } },
205
- React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-teams__title` }, teamDisplayName),
206
- Boolean(team?.services?.length) ? React__default.default.createElement(icons.ChevronRight, null) : null),
207
- Boolean(team?.services?.length) && team.id === activeSubmenu ? (React__default.default.createElement("ul", { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-submenu`, {
208
- "--open": team.id === activeSubmenu,
209
- }), style: { top: `${window.scrollY + topPosition}px` } },
210
- React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-wrapper` },
211
- React__default.default.createElement("ul", { className: `${settings.prefix}--bmrg-advantage-sidenav-services-submenu` },
212
- React__default.default.createElement(react.SideNavLink, { title: "Team Page", className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-link`, "data-testid": "sidenav-team-submenu-link", href: `${baseEnvUrl}/${app}/teams/${team.id}`, onClick: (e) => {
213
- if (isLaunchpad) {
214
- handleLaunchpadLink(e);
215
- history.push(`/teams/${team.id}`);
216
- }
217
- handleTeamClick({ team, type: team.isPersonal ? "personal" : "standard" });
218
- } }, "Team Page"),
219
- team.services?.map((service) => (React__default.default.createElement(react.SideNavLink, { title: service.name, className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-link`, "data-testid": "sidenav-service-submenu-link", href: service.url, onClick: () => handleServiceClick({ service, team }) }, service.name))) ?? null)))) : null)));
220
- })
221
- : null))) : null,
222
- Boolean(accounts?.length) ? (React__default.default.createElement(React__default.default.Fragment, null,
212
+ defaultTeamHasAssistantsAccess && personalTeamEnabled && showChatButton &&
213
+ (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
214
+ React__default.default.createElement("span", null, chatSideNavLink))) : (chatSideNavLink)),
215
+ toolsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-tools-link", renderIcon: icons.Api, href: toolsLink, onClick: (e) => {
216
+ handleToolsClick();
217
+ } }, "Tools")) : 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,
232
+ showSecondDivider ? React__default.default.createElement(react.SideNavDivider, null) : null,
233
+ catalogNavlink ? (React__default.default.createElement(react.SideNavLink, { href: catalogNavlink, renderIcon: icons.Catalog }, "Catalog")) : null,
234
+ settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink, onClick: (e) => {
235
+ handleSettingsClick();
236
+ } }, "Settings")) : null,
237
+ adminNavlink ? (React__default.default.createElement(react.SideNavLink, { href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
238
+ children ? (React__default.default.createElement(React__default.default.Fragment, null,
223
239
  React__default.default.createElement(react.SideNavDivider, null),
224
- React__default.default.createElement(react.SideNavMenu, { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-menu`, {
225
- "--active-closed": !isMenuOpen &&
226
- accounts.some((t) => {
227
- const pIds = t?.projectTeams?.map((project) => project.id) ?? [];
228
- return windowLocation.href.includes(t.id) || pIds.some((id) => windowLocation.href.includes(id));
229
- }),
230
- }), renderIcon: icons.GroupAccount, title: "Accounts", "data-testid": "sidenav-accounts", id: "sidenav-accounts", ref: accountsMenuRef, "aria-expanded": isMenuOpen, isSideNavExpanded: isMenuOpen }, isMenuOpen
231
- ? accounts?.map((team, i) => {
232
- const topPosition = document?.getElementById(team.id)?.getBoundingClientRect()?.top ?? 0;
233
- const teamDisplayName = Boolean(team.displayName) ? team.displayName : team.name;
234
- const projectIds = team?.projectTeams?.map((project) => project.id) ?? [];
235
- const isAccountActive = windowLocation.href.includes(team.id) ||
236
- projectIds.some((id) => windowLocation.href.includes(id));
237
- return (React__default.default.createElement(React__default.default.Fragment, null,
238
- React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-team-item` },
239
- React__default.default.createElement(react.SideNavLink, { title: teamDisplayName, id: team.id, isActive: isAccountActive, ref: accountsRef.current[i], className: `${settings.prefix}--bmrg-advantage-sidenav-account`, href: `${baseEnvUrl}/${app}/teams/${team.id}`, onMouseEnter: () => setActiveSubmenu(team.id), onFocus: () => setActiveSubmenu(team.id), onClick: (e) => {
240
- if (isLaunchpad) {
241
- handleLaunchpadLink(e);
242
- history.push(`/teams/${team.id}`);
243
- }
244
- handleTeamClick({ team, type: "account" });
245
- } },
246
- React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-teams__title` }, teamDisplayName),
247
- Boolean(team?.projectTeams?.length) ? React__default.default.createElement(icons.ChevronRight, null) : null),
248
- Boolean(team?.projectTeams?.length) && team.id === activeSubmenu ? (React__default.default.createElement("ul", { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-submenu`, {
249
- "--open": team.id === activeSubmenu,
250
- }), style: { top: `${window.scrollY + topPosition}px` } },
251
- React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-wrapper` },
252
- React__default.default.createElement("ul", { className: `${settings.prefix}--bmrg-advantage-sidenav-services-submenu` }, team.projectTeams?.map((accTeam) => (React__default.default.createElement(react.SideNavLink, { title: accTeam.name, className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-link`, "data-testid": "sidenav-account-submenu-link", href: `${baseEnvUrl}/${app}/teams/${accTeam.id}`, onClick: (e) => {
253
- if (isLaunchpad) {
254
- handleLaunchpadLink(e);
255
- history.push(`/teams/${accTeam.id}`);
256
- }
257
- handleTeamClick({ team: accTeam, type: "project" });
258
- } }, accTeam.name))) ?? null)))) : null)));
259
- })
260
- : null))) : null)));
240
+ children)) : null)));
261
241
  }
262
242
 
263
243
  exports.AdvantageSideNav = AdvantageSideNav;
@@ -23,20 +23,17 @@ function Feedback(props) {
23
23
  React__default.default.createElement(react.ModalBody, null,
24
24
  React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-feedback` },
25
25
  React__default.default.createElement("p", null,
26
- "Share your thoughts and ideas on what we can do to improve the ",
27
- props.platformName,
28
- " platform and our onboarding process."),
29
- React__default.default.createElement("p", null,
30
- "To submit your idea, visit our portal at",
26
+ "Have an idea on how we can improve Consulting Advantage? Submit your idea",
31
27
  " " /* We need to force a space before the link tag */,
32
- React__default.default.createElement("a", { "aria-describedby": "new-window-aria-desc-0", href: props.sendIdeasUrl, target: "_blank", rel: "noopener noreferrer" }, props.sendIdeasUrl),
33
- "."),
28
+ React__default.default.createElement("a", { "aria-describedby": "new-window-aria-desc-0", href: props.sendIdeasUrl, target: "_blank", rel: "noopener noreferrer" }, "here"),
29
+ ". You\u2019ll be able to see other public ideas, vote on them, and track the status of your idea."),
34
30
  React__default.default.createElement("p", null,
35
- "For now, you must have an ",
36
- props.platformOrganization,
37
- " email address and you will need to register with a password during your first visit."),
38
- React__default.default.createElement("p", null, "You will have the opportunity to see other public ideas, vote on them and track the status of your idea."),
39
- React__default.default.createElement("p", null, "We look forward to your feedback!"))),
31
+ "Have an innovative new asset, assistant, or automation you've built outside of ICA?",
32
+ " " /* We need to force a space before the link tag */,
33
+ "Submit your idea ",
34
+ React__default.default.createElement("a", { "aria-describedby": "new-window-aria-desc-0", href: props.sendIdeasUrl, target: "_blank", rel: "noopener noreferrer" }, "here"),
35
+ " and you could win a BluePoints award."),
36
+ React__default.default.createElement("p", null, "We look forward to your feedback and ideas!\""))),
40
37
  React__default.default.createElement(react.ModalFooter, null,
41
38
  React__default.default.createElement(react.Button, { "data-modal-primary-focus": true, kind: "primary", onClick: props.closeModal }, "OK"))));
42
39
  }
@@ -3,15 +3,18 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
+ var reactQuery = require('react-query');
6
7
  var react = require('@carbon/react');
7
8
  var icons = require('@carbon/react/icons');
8
9
  var HeaderAppSwitcher = require('./HeaderAppSwitcher.js');
10
+ var HeaderTeamSwitcher = require('./HeaderTeamSwitcher.js');
9
11
  var HeaderMenu = require('./HeaderMenu.js');
10
12
  var NotificationsContainer = require('../Notifications/NotificationsContainer.js');
11
13
  var PlatformNotificationsContainer = require('../PlatformNotifications/PlatformNotificationsContainer.js');
12
14
  var UserRequests = require('./UserRequests.js');
13
15
  var useHeaderMenu = require('../../hooks/useHeaderMenu.js');
14
16
  var useWindowSize = require('../../hooks/useWindowSize.js');
17
+ var servicesConfig = require('../../config/servicesConfig.js');
15
18
  var settings = require('../../internal/settings.js');
16
19
 
17
20
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -21,7 +24,7 @@ var React__default = /*#__PURE__*/_interopDefault(React);
21
24
  /*
22
25
  IBM Confidential
23
26
  694970X, 69497O0
24
- © Copyright IBM Corp. 2022, 2024
27
+ © Copyright IBM Corp. 2022, 2025
25
28
  */
26
29
  const MenuListId = {
27
30
  Notifcations: "header-notifications-dialog",
@@ -32,6 +35,7 @@ const MenuListId = {
32
35
  Support: "header-support-menu",
33
36
  instanceSwitcher: "header-instanceSwitcher-menu",
34
37
  Switcher: "header-switcher-menu",
38
+ TeamSwitcher: "header-team-switcher-menu",
35
39
  };
36
40
  const MenuButtonId = {
37
41
  Notifcations: "header-notifications-dialog-button",
@@ -42,6 +46,7 @@ const MenuButtonId = {
42
46
  Support: "header-support-menu-button",
43
47
  InstanceSwitcher: "header-instanceSwitcher-menu-button",
44
48
  Switcher: "header-switcher-menu-button",
49
+ TeamSwitcher: "header-team-switcher-menu-button",
45
50
  };
46
51
  const MenuAriaLabelRecord = {
47
52
  Notifcations: "Notifications dialog",
@@ -52,11 +57,19 @@ const MenuAriaLabelRecord = {
52
57
  instanceSwitcher: "Instance Switcher Menu",
53
58
  Support: "Support menu",
54
59
  Switcher: "Switcher menu",
60
+ TeamSwitcher: "Team Switcher menu",
55
61
  };
56
62
  const headerButtonClassNames = "cds--btn--icon-only cds--header__action cds--btn cds--btn--primary cds--btn--icon-only cds--btn cds--btn--primary";
57
63
  const instanceCheckMarkContainerClass = "instance-checkmark-style-container";
58
64
  function Header(props) {
59
- const { productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, navLinks, platform, prefixName = "", rightPanel, skipToContentProps, templateMeteringEvent, triggerEvent, userTeams, } = props;
65
+ const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, } = props;
66
+ const hasUserTeams = Boolean(userTeams);
67
+ const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
68
+ const teamsQuery = reactQuery.useQuery({
69
+ queryKey: userTeamsUrl,
70
+ queryFn: servicesConfig.resolver.query(userTeamsUrl, null),
71
+ enabled: !hasUserTeams && Boolean(baseServicesUrl),
72
+ });
60
73
  return (React__default.default.createElement(React__default.default.Fragment, null,
61
74
  React__default.default.createElement(react.Theme, { theme: carbonTheme },
62
75
  React__default.default.createElement(react.Header, { "aria-label": "App navigation header", className: className },
@@ -67,12 +80,13 @@ function Header(props) {
67
80
  ? 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)))
68
81
  : null),
69
82
  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, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams }),
70
84
  props?.instanceSwitcherEnabled && (React__default.default.createElement(InstanceSwitcherMenu, { enabled: Boolean(props.instanceSwitcherEnabled), menuItems: platform?.instances })),
71
85
  React__default.default.createElement(RequestsMenu, { baseEnvUrl: baseEnvUrl, enabled: Boolean(props.requestSummary), summary: props.requestSummary }),
72
86
  React__default.default.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
73
87
  React__default.default.createElement(SupportMenu, { enabled: Array.isArray(props.supportMenuItems) && props.supportMenuItems.length > 0, menuItems: props.supportMenuItems }),
74
88
  React__default.default.createElement(ProfileMenu, { enabled: Array.isArray(props.profileMenuItems) && props.profileMenuItems.length > 0, menuItems: props.profileMenuItems }),
75
- React__default.default.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, userTeams: userTeams }),
89
+ React__default.default.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher, teamsQuery: teamsQuery, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, userTeams: userTeams }),
76
90
  React__default.default.createElement(RightPanelMenu, { enabled: Boolean(rightPanel && Object.keys(rightPanel).length), ...rightPanel })))),
77
91
  React__default.default.createElement(NotificationsContainer.default, { enableMultiContainer: true, containerId: `${settings.prefix}--bmrg-header-notifications` })));
78
92
  }
@@ -153,7 +167,7 @@ function AppSwitcherMenu(props) {
153
167
  }
154
168
  return (React__default.default.createElement("div", { ref: ref },
155
169
  React__default.default.createElement("button", { "aria-controls": MenuListId.Switcher, "aria-expanded": isOpen, "aria-haspopup": "menu", "aria-label": MenuAriaLabelRecord.Switcher, className: headerButtonClassNames, "data-testid": "header-appswitcher-link", id: MenuButtonId.Switcher, onClick: toggleActive }, isOpen ? React__default.default.createElement(icons.Close, { size: 20 }) : React__default.default.createElement(icons.Switcher, { size: 20 })),
156
- React__default.default.createElement(HeaderAppSwitcher.default, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, templateMeteringEvent: props.templateMeteringEvent, triggerEvent: props.triggerEvent, userTeams: props.userTeams })));
170
+ React__default.default.createElement(HeaderAppSwitcher.default, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, teamsQuery: props.teamsQuery, templateMeteringEvent: props.templateMeteringEvent, triggerEvent: props.triggerEvent, userTeams: props.userTeams })));
157
171
  }
158
172
  function RightPanelMenu(props) {
159
173
  const { isOpen, toggleActive, ref } = useHeaderMenu.default(MenuButtonId.RightPanel);
@@ -3,12 +3,10 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var reactQuery = require('react-query');
7
6
  var react = require('@carbon/react');
8
7
  var icons = require('@carbon/react/icons');
9
8
  var ErrorMessage = require('../ErrorMessage/ErrorMessage.js');
10
9
  var cx = require('classnames');
11
- var servicesConfig = require('../../config/servicesConfig.js');
12
10
  var settings = require('../../internal/settings.js');
13
11
 
14
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -28,14 +26,8 @@ const externalProps = {
28
26
  const panelClassName = `${settings.prefix}--bmrg-header-switcher-panel`;
29
27
  const contentClassName = `${settings.prefix}--bmrg-header-switcher`;
30
28
  const skeletonClassName = `${settings.prefix}--bmrg-header-switcher__skeleton`;
31
- function HeaderAppSwitcher({ baseServicesUrl, baseEnvUrl, id, isOpen, templateMeteringEvent, triggerEvent, userTeams }) {
29
+ function HeaderAppSwitcher({ baseServicesUrl, baseEnvUrl, id, isOpen, teamsQuery, templateMeteringEvent, triggerEvent, userTeams, }) {
32
30
  const hasUserTeams = Boolean(userTeams);
33
- const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
34
- const teamsQuery = reactQuery.useQuery({
35
- queryKey: userTeamsUrl,
36
- queryFn: servicesConfig.resolver.query(userTeamsUrl, null),
37
- enabled: !hasUserTeams
38
- });
39
31
  if (userTeams?.isLoading || teamsQuery?.isLoading) {
40
32
  return (React__default.default.createElement(react.HeaderPanel, { "aria-label": "App Switcher", className: panelClassName, expanded: isOpen, id: id, role: "menu" },
41
33
  React__default.default.createElement("div", { className: cx__default.default(contentClassName, "--is-loading", { "--is-hidden": !isOpen }) },
@@ -78,7 +70,7 @@ function HeaderAppSwitcher({ baseServicesUrl, baseEnvUrl, id, isOpen, templateMe
78
70
  }
79
71
  return null;
80
72
  }
81
- function TeamServiceListMenu({ baseEnvUrl, isAccount, isMember, team, templateMeteringEvent, triggerEvent }) {
73
+ function TeamServiceListMenu({ baseEnvUrl, isAccount, isMember, team, templateMeteringEvent, triggerEvent, }) {
82
74
  const { name, displayName, services } = team;
83
75
  const nameToDisplay = displayName ? displayName : name;
84
76
  const isNameTruncated = nameToDisplay?.length > 30;