@boomerang-io/carbon-addons-boomerang-react
Version:
Carbon Addons for Boomerang apps
222 lines (215 loc) • 17.9 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var React = require('react');
var cx = require('classnames');
var react = require('@carbon/react');
var TooltipHover = require('../TooltipHover/TooltipHover.js');
var icons = require('@carbon/react/icons');
var UserType = require('../../constants/UserType.js');
var settings = require('../../internal/settings.js');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var React__default = /*#__PURE__*/_interopDefault(React);
var cx__default = /*#__PURE__*/_interopDefault(cx);
/*
IBM Confidential
694970X, 69497O0
© Copyright IBM Corp. 2022, 2024
*/
function AdvantageSideNav(props) {
const { app, 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;
const [activeSubmenu, setActiveSubmenu] = React__default.default.useState("");
const [activeMenu, setActiveMenu] = React__default.default.useState(false);
const isMenuOpen = isOpen || activeMenu;
const windowLocation = window.location;
const isPartnerUser = user?.type === UserType.USER_PLATFORM_ROLE.Partner;
const joinButtontitle = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
const standardTeamsList = [...personalTeams.map(pteams => ({ ...pteams, isPersonal: true })), ...teams];
const teamsMenuRef = React__default.default.useRef(null);
const accountsMenuRef = React__default.default.useRef(null);
const hamburguerMenu = document.getElementById("header-sidenav-menu-button");
const noTeamsMessage = userTeamsError ? "Failed to get teams, please try again later." : "No teams or accounts available.";
const teamsRef = React__default.default.useRef([]);
const accountsRef = React__default.default.useRef([]);
// Functions to track IBM Instrumentation on Segment
const handleHomeClick = () => {
triggerEvent && triggerEvent({
action: "Clicked on SideNav Home link",
category: "Sidenav",
destinationPath: homeLink,
});
};
const handleAssistantClick = () => {
triggerEvent && triggerEvent({
action: "Clicked on SideNav Assistant link",
category: "Sidenav",
destinationPath: assistantLink,
});
};
const handleCreateJoinClick = () => {
triggerEvent && triggerEvent({
action: "Clicked on SideNav Create/Join link",
category: "Sidenav",
CTA: "Create/Join team cliked",
type: "Button",
});
};
const handleTeamClick = (team) => {
triggerEvent && triggerEvent({
action: "Clicked on SideNav Team link",
category: "Sidenav",
destinationPath: `${baseEnvUrl}/${app}/teams/${team.id}`,
teamId: team.id
});
};
const handleServiceClick = ({ service, team }) => {
if (templateMeteringEvent) {
templateMeteringEvent({ service, team });
}
triggerEvent && triggerEvent({
action: "Clicked on SideNav Service link",
category: "Sidenav",
destinationPath: service.url,
});
};
const handleLaunchpadLink = (event) => {
event.preventDefault();
// remediation to close menu, submenu and accordion when select a team on Launchpad
//@ts-ignore
if (Boolean(teamsMenuRef.current?.ariaExpanded === "true")) {
//@ts-ignore
teamsMenuRef.current.click();
}
//@ts-ignore
if (Boolean(accountsMenuRef.current?.ariaExpanded === "true")) {
//@ts-ignore
accountsMenuRef.current.click();
}
//@ts-ignore
if (Boolean(hamburguerMenu) && hamburguerMenu.className.includes("active")) {
//@ts-ignore
Boolean(hamburguerMenu) && hamburguerMenu?.click();
}
setActiveMenu(false);
setActiveSubmenu("");
};
// add or remove refs
if (teamsRef.current.length !== standardTeamsList?.length) {
//@ts-ignore
teamsRef.current = Array(standardTeamsList?.length).fill().map((_, i) => teamsRef.current[i] || React__default.default.createRef());
}
if (accountsRef.current.length !== accounts?.length) {
//@ts-ignore
accountsRef.current = Array(accounts?.length).fill().map((_, i) => accountsRef.current[i] || React__default.default.createRef());
}
const assistantSideNavLink = assistantLink && (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-assistant-link", className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), isActive: windowLocation.href.includes(assistantLink), renderIcon: icons.ChatBot, href: enableChatButton && assistantLink, onClick: enableChatButton ? handleAssistantClick : (e) => e.preventDefault() }, `Start a ${defaultAssistantLink ? "" : "New "}Chat`));
return (React__default.default.createElement(react.SideNav, { "aria-label": "sidenav-container", className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-container`, className, {
"--closed": !isMenuOpen
}), "data-testid": "sidenav-container", isRail: true, expanded: isMenuOpen, onToggle: () => setActiveSubmenu(""), onMouseEnter: () => setActiveMenu(true), onMouseLeave: () => { setActiveMenu(false); setActiveSubmenu(""); }, ...rest }, (React__default.default.createElement(react.SideNavItems, null,
isMenuOpen && navLinks?.length ? (React__default.default.createElement("div", null,
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))),
React__default.default.createElement(react.SideNavDivider, null))) : null,
React__default.default.createElement("div", { onMouseEnter: () => setActiveSubmenu("") },
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) => {
if (isLaunchpad) {
handleLaunchpadLink(e);
history.push(homeLink);
}
handleHomeClick();
} }, "Home") : null,
!isPartnerUser && assistantLink && showChatButton && (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
React__default.default.createElement("span", null, assistantSideNavLink))) : (assistantSideNavLink)),
(!isPartnerUser && joinCreateTrigger) ?
React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-create-join-trigger", renderIcon: icons.AddAlt, onClick: (e) => {
joinCreateTrigger(e);
handleCreateJoinClick();
} }, joinButtontitle) : null),
children ?
React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement(react.SideNavDivider, null),
children) : null,
userTeamsLoading && isMenuOpen ?
React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement(react.SideNavDivider, null),
React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-advantage-sidenav-loading-container` },
React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` }),
React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` }),
React__default.default.createElement(react.SkeletonPlaceholder, { className: `${settings.prefix}--bmrg-advantage-sidenav-loading` }))) : null,
((!Boolean(standardTeamsList?.length) && !Boolean(accounts?.length) && !userTeamsLoading) || userTeamsError) && isMenuOpen ?
React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-no-teams__text` }, noTeamsMessage))
: null,
Boolean(standardTeamsList?.length) ?
React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement(react.SideNavDivider, null),
React__default.default.createElement(react.SideNavMenu, { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-menu`, {
"--active-closed": !isMenuOpen && standardTeamsList.some(t => windowLocation.href.includes(t.id))
}), 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 ? standardTeamsList?.map((team, i) => {
const topPosition = document?.getElementById(team.id)?.getBoundingClientRect()?.top ?? 0;
const teamDisplayName = Boolean(team.displayName) ? team.displayName : team.name;
return (React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-team-item` },
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) => {
if (isLaunchpad) {
handleLaunchpadLink(e);
history.push(`/teams/${team.id}`);
}
handleTeamClick(team);
} },
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-teams__title` }, teamDisplayName),
Boolean(team?.services?.length) ? React__default.default.createElement(icons.ChevronRight, null) : null),
Boolean(team?.services?.length) && team.id === activeSubmenu ?
React__default.default.createElement("ul", { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-submenu`, {
"--open": team.id === activeSubmenu
}), style: { top: `${window.scrollY + topPosition}px` } },
React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-wrapper` },
React__default.default.createElement("ul", { className: `${settings.prefix}--bmrg-advantage-sidenav-services-submenu` },
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) => {
if (isLaunchpad) {
handleLaunchpadLink(e);
history.push(`/teams/${team.id}`);
}
handleTeamClick(team);
} }, "Team Page"),
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)));
}) : null)) : null,
Boolean(accounts?.length) ?
React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement(react.SideNavDivider, null),
React__default.default.createElement(react.SideNavMenu, { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-menu`, {
"--active-closed": !isMenuOpen && (accounts.some(t => {
const pIds = t?.projectTeams?.map(project => project.id) ?? [];
return windowLocation.href.includes(t.id) || pIds.some(id => windowLocation.href.includes(id));
}))
}), renderIcon: icons.GroupAccount, title: "Accounts", "data-testid": "sidenav-accounts", id: "sidenav-accounts", ref: accountsMenuRef, "aria-expanded": isMenuOpen, isSideNavExpanded: isMenuOpen }, isMenuOpen ? accounts?.map((team, i) => {
const topPosition = document?.getElementById(team.id)?.getBoundingClientRect()?.top ?? 0;
const teamDisplayName = Boolean(team.displayName) ? team.displayName : team.name;
const projectIds = team?.projectTeams?.map(project => project.id) ?? [];
const isAccountActive = windowLocation.href.includes(team.id) || projectIds.some(id => windowLocation.href.includes(id));
return (React__default.default.createElement(React__default.default.Fragment, null,
React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-team-item` },
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) => {
if (isLaunchpad) {
handleLaunchpadLink(e);
history.push(`/teams/${team.id}`);
}
handleTeamClick(team);
} },
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-advantage-sidenav-teams__title` }, teamDisplayName),
Boolean(team?.projectTeams?.length) ? React__default.default.createElement(icons.ChevronRight, null) : null),
Boolean(team?.projectTeams?.length) && team.id === activeSubmenu ?
React__default.default.createElement("ul", { className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-submenu`, {
"--open": team.id === activeSubmenu
}), style: { top: `${window.scrollY + topPosition}px` } },
React__default.default.createElement("li", { className: `${settings.prefix}--bmrg-advantage-sidenav-submenu-wrapper` },
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) => {
if (isLaunchpad) {
handleLaunchpadLink(e);
history.push(`/teams/${accTeam.id}`);
}
handleTeamClick(accTeam);
} }, accTeam.name))) ?? null))) : null)));
}) : null)) : null))));
}
exports.AdvantageSideNav = AdvantageSideNav;
exports.default = AdvantageSideNav;