@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.
- package/dist/cjs/components/AdvantageSideNav/AdvantageSideNav.js +153 -173
- package/dist/cjs/components/Feedback/Feedback.js +9 -12
- package/dist/cjs/components/Header/Header.js +18 -4
- package/dist/cjs/components/Header/HeaderAppSwitcher.js +2 -10
- package/dist/cjs/components/Header/HeaderTeamSwitcher.js +326 -0
- package/dist/cjs/components/UIShell/UIShell.js +9 -4
- package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +155 -175
- package/dist/esm/components/Feedback/Feedback.js +9 -12
- package/dist/esm/components/Header/Header.js +18 -4
- package/dist/esm/components/Header/HeaderAppSwitcher.js +2 -10
- package/dist/esm/components/Header/HeaderTeamSwitcher.js +317 -0
- package/dist/esm/components/UIShell/UIShell.js +10 -5
- package/dist/types/index.d.ts +37 -6
- package/package.json +2 -2
- package/scss/components/AdvantageSideNav/_advantageSideNav.scss +0 -6
- package/scss/components/Header/_headerTeamSwitcher.scss +195 -0
- package/scss/global/index.scss +7 -8
|
@@ -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,
|
|
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
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
const
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
|
138
|
+
action: "Clicked on SideNav Chat link",
|
|
67
139
|
category: "Sidenav",
|
|
68
|
-
destinationPath:
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
React__default.default.createElement(
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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
|
-
|
|
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
|
-
"
|
|
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" },
|
|
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
|
-
"
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
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,
|
|
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;
|