@boomerang-io/carbon-addons-boomerang-react 4.6.13-beta.0 → 4.6.13-beta.20
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 +10 -4
- package/dist/cjs/components/Feedback/Feedback.js +1 -0
- package/dist/cjs/components/Header/Header.js +11 -3
- package/dist/cjs/components/Header/HeaderAppSwitcher.js +4 -4
- package/dist/cjs/components/UIShell/UIShell.js +2 -2
- package/dist/cjs/config/servicesConfig.js +1 -0
- package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +10 -4
- package/dist/esm/components/Feedback/Feedback.js +1 -0
- package/dist/esm/components/Header/Header.js +11 -3
- package/dist/esm/components/Header/HeaderAppSwitcher.js +4 -4
- package/dist/esm/components/UIShell/UIShell.js +2 -2
- package/dist/esm/config/servicesConfig.js +1 -0
- package/dist/types/index.d.ts +15 -1
- package/package.json +1 -1
- package/scss/components/Feedback/_feedback.scss +5 -1
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var React = require('react');
|
|
6
|
+
var reactRouterDom = require('react-router-dom');
|
|
6
7
|
var cx = require('classnames');
|
|
7
8
|
var react = require('@carbon/react');
|
|
8
9
|
var TooltipHover = require('../TooltipHover/TooltipHover.js');
|
|
@@ -179,14 +180,14 @@ function AdvantageSideNav(props) {
|
|
|
179
180
|
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) => {
|
|
180
181
|
if (isLaunchpad) {
|
|
181
182
|
handleLaunchpadLink(e);
|
|
182
|
-
history.push("/
|
|
183
|
+
history.push("/");
|
|
183
184
|
}
|
|
184
185
|
handleHomeClick();
|
|
185
186
|
} }, "Home")) : null,
|
|
186
187
|
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) => {
|
|
187
188
|
if (isLaunchpad) {
|
|
188
189
|
handleLaunchpadLink(e);
|
|
189
|
-
history.push(`/
|
|
190
|
+
history.push(`/teams/${teamSwitcherTeam.id}`);
|
|
190
191
|
}
|
|
191
192
|
handleTeamClick({
|
|
192
193
|
team: teamSwitcherTeam,
|
|
@@ -225,11 +226,16 @@ function AdvantageSideNav(props) {
|
|
|
225
226
|
handleDocumentCollectionsClick();
|
|
226
227
|
} }, "Document Collections")) : null,
|
|
227
228
|
showSecondDivider ? React__default.default.createElement(react.SideNavDivider, null) : null,
|
|
228
|
-
catalogNavlink ? (
|
|
229
|
+
catalogNavlink ? (
|
|
230
|
+
// <SideNavLink data-testid="sidenav-catalog-link" href={catalogNavlink} renderIcon={Catalog}>
|
|
231
|
+
// Catalog
|
|
232
|
+
// </SideNavLink>
|
|
233
|
+
React__default.default.createElement(reactRouterDom.Link, { to: catalogNavlink },
|
|
234
|
+
React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-catalog-link", renderIcon: icons.Catalog }, "Catalog"))) : null,
|
|
229
235
|
settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink, onClick: (e) => {
|
|
230
236
|
handleSettingsClick();
|
|
231
237
|
} }, "Settings")) : null,
|
|
232
|
-
adminNavlink ? (React__default.default.createElement(react.SideNavLink, { href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
|
|
238
|
+
adminNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
|
|
233
239
|
children ? (React__default.default.createElement(React__default.default.Fragment, null,
|
|
234
240
|
React__default.default.createElement(react.SideNavDivider, null),
|
|
235
241
|
children)) : null)));
|
|
@@ -33,6 +33,7 @@ function Feedback(props) {
|
|
|
33
33
|
"Submit your idea ",
|
|
34
34
|
React__default.default.createElement("a", { "aria-describedby": "new-window-aria-desc-0", href: props.sendBluePointsAwardUrl, target: "_blank", rel: "noopener noreferrer" }, "here"),
|
|
35
35
|
" and you could win a BluePoints award."),
|
|
36
|
+
React__default.default.createElement("p", null, "You must have an IBM email address to submit the idea."),
|
|
36
37
|
React__default.default.createElement("p", null, "We look forward to your feedback and ideas!"))),
|
|
37
38
|
React__default.default.createElement(react.ModalFooter, null,
|
|
38
39
|
React__default.default.createElement(react.Button, { "data-modal-primary-focus": true, kind: "primary", onClick: props.closeModal }, "OK"))));
|
|
@@ -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, } = 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;
|
|
66
66
|
const hasUserTeams = Boolean(userTeams);
|
|
67
67
|
const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
|
|
68
68
|
const teamsQuery = reactQuery.useQuery({
|
|
@@ -86,7 +86,7 @@ function Header(props) {
|
|
|
86
86
|
React__default.default.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
|
|
87
87
|
React__default.default.createElement(SupportMenu, { enabled: Array.isArray(props.supportMenuItems) && props.supportMenuItems.length > 0, menuItems: props.supportMenuItems }),
|
|
88
88
|
React__default.default.createElement(ProfileMenu, { enabled: Array.isArray(props.profileMenuItems) && props.profileMenuItems.length > 0, menuItems: props.profileMenuItems }),
|
|
89
|
-
React__default.default.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher,
|
|
89
|
+
React__default.default.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, userTeams: userTeamsAssets }),
|
|
90
90
|
React__default.default.createElement(RightPanelMenu, { enabled: Boolean(rightPanel && Object.keys(rightPanel).length), ...rightPanel })))),
|
|
91
91
|
React__default.default.createElement(NotificationsContainer.default, { enableMultiContainer: true, containerId: `${settings.prefix}--bmrg-header-notifications` })));
|
|
92
92
|
}
|
|
@@ -162,12 +162,20 @@ function ProfileMenu(props) {
|
|
|
162
162
|
}
|
|
163
163
|
function AppSwitcherMenu(props) {
|
|
164
164
|
const { isOpen, toggleActive, ref } = useHeaderMenu.default(MenuButtonId.Switcher);
|
|
165
|
+
const hasUserTeamsAssets = Boolean(props.userTeams);
|
|
166
|
+
const userTeamsAssetsUrl = servicesConfig.serviceUrl.getUserTeamsServicesAssets({ baseServicesUrl: props.baseServicesUrl });
|
|
167
|
+
const queryEnabled = isOpen && props.enabled && !hasUserTeamsAssets && Boolean(props.baseServicesUrl);
|
|
168
|
+
const teamsAssetsQuery = reactQuery.useQuery({
|
|
169
|
+
queryKey: userTeamsAssetsUrl,
|
|
170
|
+
queryFn: servicesConfig.resolver.query(userTeamsAssetsUrl, null),
|
|
171
|
+
enabled: queryEnabled,
|
|
172
|
+
});
|
|
165
173
|
if (!props.enabled || !props.baseServicesUrl) {
|
|
166
174
|
return null;
|
|
167
175
|
}
|
|
168
176
|
return (React__default.default.createElement("div", { ref: ref },
|
|
169
177
|
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 })),
|
|
170
|
-
React__default.default.createElement(HeaderAppSwitcher.default, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, teamsQuery:
|
|
178
|
+
React__default.default.createElement(HeaderAppSwitcher.default, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, teamsQuery: teamsAssetsQuery, templateMeteringEvent: props.templateMeteringEvent, triggerEvent: props.triggerEvent, userTeams: props.userTeams })));
|
|
171
179
|
}
|
|
172
180
|
function RightPanelMenu(props) {
|
|
173
181
|
const { isOpen, toggleActive, ref } = useHeaderMenu.default(MenuButtonId.RightPanel);
|
|
@@ -71,17 +71,17 @@ function HeaderAppSwitcher({ baseServicesUrl, baseEnvUrl, id, isOpen, teamsQuery
|
|
|
71
71
|
return null;
|
|
72
72
|
}
|
|
73
73
|
function TeamServiceListMenu({ baseEnvUrl, isAccount, isMember, team, templateMeteringEvent, triggerEvent, }) {
|
|
74
|
-
const { name, displayName, services } = team;
|
|
74
|
+
const { id, name, displayName, services } = team;
|
|
75
75
|
const nameToDisplay = displayName ? displayName : name;
|
|
76
76
|
const isNameTruncated = nameToDisplay?.length > 30;
|
|
77
77
|
if (!isMember) {
|
|
78
|
-
return (React__default.default.createElement("div", { className: `${settings.prefix}--side-nav__item`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
78
|
+
return (React__default.default.createElement("div", { id: id, className: `${settings.prefix}--side-nav__item`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
79
79
|
React__default.default.createElement("button", { disabled: true, className: `${settings.prefix}--side-nav__submenu`, "data-testid": "header-app-switcher-service" },
|
|
80
80
|
React__default.default.createElement("span", { className: `${settings.prefix}--side-nav__submenu-title` }, nameToDisplay))));
|
|
81
81
|
}
|
|
82
82
|
return (
|
|
83
83
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
84
|
-
React__default.default.createElement("ul", { className: `${settings.prefix}--bmrg-header-team`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
84
|
+
React__default.default.createElement("ul", { id: id, className: `${settings.prefix}--bmrg-header-team`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
85
85
|
React__default.default.createElement(react.SideNavMenu, { title: nameToDisplay },
|
|
86
86
|
React__default.default.createElement(ServiceList, { baseEnvUrl: baseEnvUrl, isAccount: isAccount, servicesData: services, team: team, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent }))));
|
|
87
87
|
}
|
|
@@ -98,7 +98,7 @@ function ServiceList(props) {
|
|
|
98
98
|
return (React__default.default.createElement(React__default.default.Fragment, null, servicesData.map((service) => {
|
|
99
99
|
const isExternalLink = typeof service?.url?.includes === "function" && !service.url.includes(baseEnvUrl);
|
|
100
100
|
const isNameTruncated = isExternalLink ? service.name.length > 28 : service.name.length > 32;
|
|
101
|
-
return (React__default.default.createElement(react.SideNavMenuItem, { key: service.
|
|
101
|
+
return (React__default.default.createElement(react.SideNavMenuItem, { id: service.id, key: service.id, href: service.url, title: isNameTruncated ? service.name : undefined, onClick: () => handleLinkClick(service), "data-testid": "header-app-switcher-service", ...(isExternalLink ? externalProps : undefined) },
|
|
102
102
|
React__default.default.createElement("span", null, service.name),
|
|
103
103
|
isExternalLink ? React__default.default.createElement(icons.Launch, { size: 16, title: "Opens page in new tab" }) : undefined));
|
|
104
104
|
})));
|
|
@@ -26,7 +26,7 @@ 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, enableIcaMacs, }) {
|
|
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, }) {
|
|
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 },
|
|
@@ -91,7 +91,7 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
91
91
|
isAboutPlatformEnabled && (React__default.default.createElement(AboutPlatform.AboutPlatformMenuItem, { key: "about-platform", name: platform.name, baseServicesUrl: platform.baseServicesUrl })),
|
|
92
92
|
tutorialScreenToShow && handleShowTutorial && (React__default.default.createElement(HeaderMenuItem.default, { key: "launch-tutorial", onClick: handleShowTutorial, icon: React__default.default.createElement(icons.Book, null), "data-testid": "launch-tutorial", text: "Launch Tutorial", type: "button" })),
|
|
93
93
|
...supportMenuItems,
|
|
94
|
-
].filter(Boolean), history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, refetchUser: refetchUser, refetchNavigation: refetchNavigation, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, trackEvent: trackEvent, user: user, userTeams: userTeams }),
|
|
94
|
+
].filter(Boolean), history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, refetchUser: refetchUser, refetchNavigation: refetchNavigation, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, trackEvent: trackEvent, user: user, userTeams: userTeams, userTeamsAssets: userTeamsAssets }),
|
|
95
95
|
isPrivacyModalRendered ? (React__default.default.createElement(PrivacyRedirect.default, { isOpen: true, baseEnvUrl: platform.baseEnvUrl, platformName: platform?.name, user: user })) : null));
|
|
96
96
|
}
|
|
97
97
|
/**
|
|
@@ -21,6 +21,7 @@ const serviceUrl = {
|
|
|
21
21
|
getStatement: ({ baseServicesUrl }) => `${baseServicesUrl}/users/consents`,
|
|
22
22
|
getTeamServices: ({ baseServicesUrl, teamId }) => `${baseServicesUrl}/launchpad/teams/${teamId}/services`,
|
|
23
23
|
getUserTeamsServices: ({ baseServicesUrl }) => `${baseServicesUrl}/users/teams/services`,
|
|
24
|
+
getUserTeamsServicesAssets: ({ baseServicesUrl }) => `${baseServicesUrl}/users/teams/services/assets`,
|
|
24
25
|
resourceUserConsent: ({ baseServicesUrl }) => `${baseServicesUrl}/users/consent`,
|
|
25
26
|
resourceUserProfile: ({ baseServicesUrl }) => `${baseServicesUrl}/users/profile`,
|
|
26
27
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
2
3
|
import cx from 'classnames';
|
|
3
4
|
import { SideNavLink, SideNav, SideNavItems, SideNavDivider } from '@carbon/react';
|
|
4
5
|
import TooltipHover from '../TooltipHover/TooltipHover.js';
|
|
@@ -170,14 +171,14 @@ function AdvantageSideNav(props) {
|
|
|
170
171
|
homeLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-home-link", isActive: `${baseEnvUrl}/${app}/`.includes(windowLocation.href), renderIcon: Home, href: homeLink, onClick: (e) => {
|
|
171
172
|
if (isLaunchpad) {
|
|
172
173
|
handleLaunchpadLink(e);
|
|
173
|
-
history.push("/
|
|
174
|
+
history.push("/");
|
|
174
175
|
}
|
|
175
176
|
handleHomeClick();
|
|
176
177
|
} }, "Home")) : null,
|
|
177
178
|
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(teamSwitcherTeam.id), className: `${prefix}--bmrg-advantage-sidenav-team`, renderIcon: UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
|
|
178
179
|
if (isLaunchpad) {
|
|
179
180
|
handleLaunchpadLink(e);
|
|
180
|
-
history.push(`/
|
|
181
|
+
history.push(`/teams/${teamSwitcherTeam.id}`);
|
|
181
182
|
}
|
|
182
183
|
handleTeamClick({
|
|
183
184
|
team: teamSwitcherTeam,
|
|
@@ -216,11 +217,16 @@ function AdvantageSideNav(props) {
|
|
|
216
217
|
handleDocumentCollectionsClick();
|
|
217
218
|
} }, "Document Collections")) : null,
|
|
218
219
|
showSecondDivider ? React.createElement(SideNavDivider, null) : null,
|
|
219
|
-
catalogNavlink ? (
|
|
220
|
+
catalogNavlink ? (
|
|
221
|
+
// <SideNavLink data-testid="sidenav-catalog-link" href={catalogNavlink} renderIcon={Catalog}>
|
|
222
|
+
// Catalog
|
|
223
|
+
// </SideNavLink>
|
|
224
|
+
React.createElement(Link, { to: catalogNavlink },
|
|
225
|
+
React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", renderIcon: Catalog }, "Catalog"))) : null,
|
|
220
226
|
settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings, href: settingsLink, onClick: (e) => {
|
|
221
227
|
handleSettingsClick();
|
|
222
228
|
} }, "Settings")) : null,
|
|
223
|
-
adminNavlink ? (React.createElement(SideNavLink, { href: adminNavlink, renderIcon: LicenseThirdParty }, "Admin")) : null),
|
|
229
|
+
adminNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: LicenseThirdParty }, "Admin")) : null),
|
|
224
230
|
children ? (React.createElement(React.Fragment, null,
|
|
225
231
|
React.createElement(SideNavDivider, null),
|
|
226
232
|
children)) : null)));
|
|
@@ -25,6 +25,7 @@ function Feedback(props) {
|
|
|
25
25
|
"Submit your idea ",
|
|
26
26
|
React.createElement("a", { "aria-describedby": "new-window-aria-desc-0", href: props.sendBluePointsAwardUrl, target: "_blank", rel: "noopener noreferrer" }, "here"),
|
|
27
27
|
" and you could win a BluePoints award."),
|
|
28
|
+
React.createElement("p", null, "You must have an IBM email address to submit the idea."),
|
|
28
29
|
React.createElement("p", null, "We look forward to your feedback and ideas!"))),
|
|
29
30
|
React.createElement(ModalFooter, null,
|
|
30
31
|
React.createElement(Button, { "data-modal-primary-focus": true, kind: "primary", onClick: props.closeModal }, "OK"))));
|
|
@@ -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, } = 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;
|
|
58
58
|
const hasUserTeams = Boolean(userTeams);
|
|
59
59
|
const userTeamsUrl = serviceUrl.getUserTeamsServices({ baseServicesUrl });
|
|
60
60
|
const teamsQuery = useQuery({
|
|
@@ -78,7 +78,7 @@ function Header(props) {
|
|
|
78
78
|
React.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
|
|
79
79
|
React.createElement(SupportMenu, { enabled: Array.isArray(props.supportMenuItems) && props.supportMenuItems.length > 0, menuItems: props.supportMenuItems }),
|
|
80
80
|
React.createElement(ProfileMenu, { enabled: Array.isArray(props.profileMenuItems) && props.profileMenuItems.length > 0, menuItems: props.profileMenuItems }),
|
|
81
|
-
React.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher,
|
|
81
|
+
React.createElement(AppSwitcherMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: props.enableAppSwitcher, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, userTeams: userTeamsAssets }),
|
|
82
82
|
React.createElement(RightPanelMenu, { enabled: Boolean(rightPanel && Object.keys(rightPanel).length), ...rightPanel })))),
|
|
83
83
|
React.createElement(NotificationsContainer, { enableMultiContainer: true, containerId: `${prefix}--bmrg-header-notifications` })));
|
|
84
84
|
}
|
|
@@ -154,12 +154,20 @@ function ProfileMenu(props) {
|
|
|
154
154
|
}
|
|
155
155
|
function AppSwitcherMenu(props) {
|
|
156
156
|
const { isOpen, toggleActive, ref } = useHeaderMenu(MenuButtonId.Switcher);
|
|
157
|
+
const hasUserTeamsAssets = Boolean(props.userTeams);
|
|
158
|
+
const userTeamsAssetsUrl = serviceUrl.getUserTeamsServicesAssets({ baseServicesUrl: props.baseServicesUrl });
|
|
159
|
+
const queryEnabled = isOpen && props.enabled && !hasUserTeamsAssets && Boolean(props.baseServicesUrl);
|
|
160
|
+
const teamsAssetsQuery = useQuery({
|
|
161
|
+
queryKey: userTeamsAssetsUrl,
|
|
162
|
+
queryFn: resolver.query(userTeamsAssetsUrl, null),
|
|
163
|
+
enabled: queryEnabled,
|
|
164
|
+
});
|
|
157
165
|
if (!props.enabled || !props.baseServicesUrl) {
|
|
158
166
|
return null;
|
|
159
167
|
}
|
|
160
168
|
return (React.createElement("div", { ref: ref },
|
|
161
169
|
React.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.createElement(Close, { size: 20 }) : React.createElement(Switcher, { size: 20 })),
|
|
162
|
-
React.createElement(HeaderAppSwitcher, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, teamsQuery:
|
|
170
|
+
React.createElement(HeaderAppSwitcher, { baseEnvUrl: props.baseEnvUrl, baseServicesUrl: props.baseServicesUrl, id: MenuListId.Switcher, isOpen: isOpen, teamsQuery: teamsAssetsQuery, templateMeteringEvent: props.templateMeteringEvent, triggerEvent: props.triggerEvent, userTeams: props.userTeams })));
|
|
163
171
|
}
|
|
164
172
|
function RightPanelMenu(props) {
|
|
165
173
|
const { isOpen, toggleActive, ref } = useHeaderMenu(MenuButtonId.RightPanel);
|
|
@@ -62,17 +62,17 @@ function HeaderAppSwitcher({ baseServicesUrl, baseEnvUrl, id, isOpen, teamsQuery
|
|
|
62
62
|
return null;
|
|
63
63
|
}
|
|
64
64
|
function TeamServiceListMenu({ baseEnvUrl, isAccount, isMember, team, templateMeteringEvent, triggerEvent, }) {
|
|
65
|
-
const { name, displayName, services } = team;
|
|
65
|
+
const { id, name, displayName, services } = team;
|
|
66
66
|
const nameToDisplay = displayName ? displayName : name;
|
|
67
67
|
const isNameTruncated = nameToDisplay?.length > 30;
|
|
68
68
|
if (!isMember) {
|
|
69
|
-
return (React.createElement("div", { className: `${prefix}--side-nav__item`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
69
|
+
return (React.createElement("div", { id: id, className: `${prefix}--side-nav__item`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
70
70
|
React.createElement("button", { disabled: true, className: `${prefix}--side-nav__submenu`, "data-testid": "header-app-switcher-service" },
|
|
71
71
|
React.createElement("span", { className: `${prefix}--side-nav__submenu-title` }, nameToDisplay))));
|
|
72
72
|
}
|
|
73
73
|
return (
|
|
74
74
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
75
|
-
React.createElement("ul", { className: `${prefix}--bmrg-header-team`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
75
|
+
React.createElement("ul", { id: id, className: `${prefix}--bmrg-header-team`, title: isNameTruncated ? nameToDisplay : undefined },
|
|
76
76
|
React.createElement(SideNavMenu, { title: nameToDisplay },
|
|
77
77
|
React.createElement(ServiceList, { baseEnvUrl: baseEnvUrl, isAccount: isAccount, servicesData: services, team: team, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent }))));
|
|
78
78
|
}
|
|
@@ -89,7 +89,7 @@ function ServiceList(props) {
|
|
|
89
89
|
return (React.createElement(React.Fragment, null, servicesData.map((service) => {
|
|
90
90
|
const isExternalLink = typeof service?.url?.includes === "function" && !service.url.includes(baseEnvUrl);
|
|
91
91
|
const isNameTruncated = isExternalLink ? service.name.length > 28 : service.name.length > 32;
|
|
92
|
-
return (React.createElement(SideNavMenuItem, { key: service.
|
|
92
|
+
return (React.createElement(SideNavMenuItem, { id: service.id, key: service.id, href: service.url, title: isNameTruncated ? service.name : undefined, onClick: () => handleLinkClick(service), "data-testid": "header-app-switcher-service", ...(isExternalLink ? externalProps : undefined) },
|
|
93
93
|
React.createElement("span", null, service.name),
|
|
94
94
|
isExternalLink ? React.createElement(Launch, { size: 16, title: "Opens page in new tab" }) : undefined));
|
|
95
95
|
})));
|
|
@@ -18,7 +18,7 @@ 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, enableIcaMacs, }) {
|
|
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, }) {
|
|
22
22
|
// Support base header .e.g for an error state
|
|
23
23
|
if (!config) {
|
|
24
24
|
return (React.createElement(QueryClientProvider, { client: queryClient },
|
|
@@ -83,7 +83,7 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
83
83
|
isAboutPlatformEnabled && (React.createElement(AboutPlatformMenuItem, { key: "about-platform", name: platform.name, baseServicesUrl: platform.baseServicesUrl })),
|
|
84
84
|
tutorialScreenToShow && handleShowTutorial && (React.createElement(HeaderMenuItem, { key: "launch-tutorial", onClick: handleShowTutorial, icon: React.createElement(Book, null), "data-testid": "launch-tutorial", text: "Launch Tutorial", type: "button" })),
|
|
85
85
|
...supportMenuItems,
|
|
86
|
-
].filter(Boolean), history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, refetchUser: refetchUser, refetchNavigation: refetchNavigation, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, trackEvent: trackEvent, user: user, userTeams: userTeams }),
|
|
86
|
+
].filter(Boolean), history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, refetchUser: refetchUser, refetchNavigation: refetchNavigation, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, trackEvent: trackEvent, user: user, userTeams: userTeams, userTeamsAssets: userTeamsAssets }),
|
|
87
87
|
isPrivacyModalRendered ? (React.createElement(PrivacyRedirect, { isOpen: true, baseEnvUrl: platform.baseEnvUrl, platformName: platform?.name, user: user })) : null));
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
@@ -15,6 +15,7 @@ const serviceUrl = {
|
|
|
15
15
|
getStatement: ({ baseServicesUrl }) => `${baseServicesUrl}/users/consents`,
|
|
16
16
|
getTeamServices: ({ baseServicesUrl, teamId }) => `${baseServicesUrl}/launchpad/teams/${teamId}/services`,
|
|
17
17
|
getUserTeamsServices: ({ baseServicesUrl }) => `${baseServicesUrl}/users/teams/services`,
|
|
18
|
+
getUserTeamsServicesAssets: ({ baseServicesUrl }) => `${baseServicesUrl}/users/teams/services/assets`,
|
|
18
19
|
resourceUserConsent: ({ baseServicesUrl }) => `${baseServicesUrl}/users/consent`,
|
|
19
20
|
resourceUserProfile: ({ baseServicesUrl }) => `${baseServicesUrl}/users/profile`,
|
|
20
21
|
};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -78,11 +78,15 @@ type SimpleIdNameMap = {
|
|
|
78
78
|
privateTeam?: boolean;
|
|
79
79
|
displayName?: string;
|
|
80
80
|
services?: Array<{
|
|
81
|
+
id: string;
|
|
82
|
+
templateId: string;
|
|
81
83
|
name: string;
|
|
82
84
|
url: string;
|
|
83
85
|
}>;
|
|
84
86
|
};
|
|
85
87
|
type SimpleTeamService = {
|
|
88
|
+
id: string;
|
|
89
|
+
templateId: string;
|
|
86
90
|
name: string;
|
|
87
91
|
url: string;
|
|
88
92
|
};
|
|
@@ -407,6 +411,11 @@ type Props$G = {
|
|
|
407
411
|
isLoading: boolean;
|
|
408
412
|
error: any;
|
|
409
413
|
};
|
|
414
|
+
userTeamsAssets?: {
|
|
415
|
+
data: any;
|
|
416
|
+
isLoading: boolean;
|
|
417
|
+
error: any;
|
|
418
|
+
};
|
|
410
419
|
};
|
|
411
420
|
declare function Header(props: Props$G): React.JSX.Element;
|
|
412
421
|
|
|
@@ -1463,10 +1472,15 @@ type Props = {
|
|
|
1463
1472
|
isLoading: boolean;
|
|
1464
1473
|
error: any;
|
|
1465
1474
|
};
|
|
1475
|
+
userTeamsAssets?: {
|
|
1476
|
+
data: any;
|
|
1477
|
+
isLoading: boolean;
|
|
1478
|
+
error: any;
|
|
1479
|
+
};
|
|
1466
1480
|
enableIcaMacs?: boolean;
|
|
1467
1481
|
handleShowTutorial?: Function;
|
|
1468
1482
|
tutorialScreenToShow?: string;
|
|
1469
1483
|
};
|
|
1470
|
-
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, enableIcaMacs, }: Props): React.JSX.Element;
|
|
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;
|
|
1471
1485
|
|
|
1472
1486
|
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
|
@@ -11,7 +11,11 @@ IBM Confidential
|
|
|
11
11
|
|
|
12
12
|
.#{$prefix}--bmrg-feedback-container {
|
|
13
13
|
.#{$prefix}--modal-container {
|
|
14
|
-
height:
|
|
14
|
+
height: 22rem;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.#{$prefix}--modal-content {
|
|
18
|
+
mask-image: none !important;
|
|
15
19
|
}
|
|
16
20
|
|
|
17
21
|
.#{$prefix}--bmrg-feedback {
|