@boomerang-io/carbon-addons-boomerang-react 4.6.21-beta.9 → 4.6.22-beta.1
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 +31 -47
- package/dist/cjs/components/Creatable/Creatable.js +32 -3
- package/dist/cjs/components/DataDrivenInput/DataDrivenInput.js +11 -2
- package/dist/cjs/components/DynamicFormik/DynamicFormik.js +11 -1
- package/dist/cjs/components/Header/Header.js +3 -2
- package/dist/cjs/components/Header/HeaderTeamSwitcher.js +109 -81
- package/dist/cjs/components/ProfileSettings/ProfileSettings.js +22 -4
- package/dist/cjs/components/UIShell/UIShell.js +13 -5
- package/dist/cjs/constants/DataDrivenInputTypes.js +4 -0
- package/dist/cjs/constants/TeamTypes.js +15 -0
- package/dist/esm/components/AdvantageSideNav/AdvantageSideNav.js +31 -47
- package/dist/esm/components/Creatable/Creatable.js +34 -5
- package/dist/esm/components/DataDrivenInput/DataDrivenInput.js +11 -2
- package/dist/esm/components/DynamicFormik/DynamicFormik.js +11 -1
- package/dist/esm/components/Header/Header.js +3 -2
- package/dist/esm/components/Header/HeaderTeamSwitcher.js +109 -81
- package/dist/esm/components/ProfileSettings/ProfileSettings.js +22 -4
- package/dist/esm/components/UIShell/UIShell.js +14 -6
- package/dist/esm/constants/DataDrivenInputTypes.js +4 -0
- package/dist/esm/constants/TeamTypes.js +13 -0
- package/dist/types/index.d.ts +7 -2
- package/package.json +7 -3
- package/scss/components/Creatable/_creatable.scss +31 -1
- package/scss/components/ProfileSettings/_profileSettings.scss +1 -1
|
@@ -34,12 +34,13 @@ function determineIfConfigIsDifferent(teams, initialTeams) {
|
|
|
34
34
|
}
|
|
35
35
|
return isConfigDifferent;
|
|
36
36
|
}
|
|
37
|
-
function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal }) {
|
|
37
|
+
function ProfileSettings({ baseServicesUrl, refetchUser, refetchUserTeams, refetchNavigation, src, userName, isOpen, closeModal, }) {
|
|
38
38
|
const queryClient = reactQuery.useQueryClient();
|
|
39
39
|
const [initialTeams, setInitialTeams] = React.useState([]);
|
|
40
40
|
const [teams, setTeams] = React.useState([]);
|
|
41
41
|
const userUrl = servicesConfig.serviceUrl.getLaunchpadUser({ baseServicesUrl });
|
|
42
42
|
const profileUrl = servicesConfig.serviceUrl.resourceUserProfile({ baseServicesUrl });
|
|
43
|
+
const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
|
|
43
44
|
const { data: user, isLoading: userIsLoading, error: userError, } = reactQuery.useQuery({
|
|
44
45
|
queryKey: userUrl,
|
|
45
46
|
queryFn: servicesConfig.resolver.query(userUrl),
|
|
@@ -48,6 +49,22 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
48
49
|
onSuccess: () => {
|
|
49
50
|
queryClient.invalidateQueries(userUrl);
|
|
50
51
|
queryClient.invalidateQueries(profileUrl);
|
|
52
|
+
queryClient.invalidateQueries(userTeamsUrl);
|
|
53
|
+
if (refetchUser) {
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
refetchUser();
|
|
56
|
+
}, 1000);
|
|
57
|
+
}
|
|
58
|
+
if (refetchUserTeams) {
|
|
59
|
+
setTimeout(() => {
|
|
60
|
+
refetchUserTeams();
|
|
61
|
+
}, 1000);
|
|
62
|
+
}
|
|
63
|
+
if (refetchNavigation) {
|
|
64
|
+
setTimeout(() => {
|
|
65
|
+
refetchNavigation();
|
|
66
|
+
}, 1000);
|
|
67
|
+
}
|
|
51
68
|
},
|
|
52
69
|
});
|
|
53
70
|
// Only disable when we have a user and we know that there aren' any lower level groups to manage
|
|
@@ -63,6 +80,7 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
63
80
|
}
|
|
64
81
|
async function handleSubmit() {
|
|
65
82
|
const body = {
|
|
83
|
+
teamInstanceSwitcherDefault: null,
|
|
66
84
|
lowerLevelGroups: teams,
|
|
67
85
|
};
|
|
68
86
|
try {
|
|
@@ -104,9 +122,9 @@ function ProfileSettings({ baseServicesUrl, src, userName, isOpen, closeModal })
|
|
|
104
122
|
return (React__default.default.createElement(react.ComposedModal, { "aria-label": "Profile Settings", className: `${settings.prefix}--bmrg-profile-settings-container ${settings.prefix}--bmrg-header-modal`, open: isOpen, onClose: handleClose, preventCloseOnClickOutside: true },
|
|
105
123
|
React__default.default.createElement(react.ModalHeader, { closeModal: handleClose, title: `User profile - ${userName}` }),
|
|
106
124
|
React__default.default.createElement(react.ModalBody, { style: { maxHeight: "31.5rem" } },
|
|
107
|
-
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-profile-settings__title` }, "More user profile settings will be here eventually, but for now you can choose which Teams are shown in your
|
|
108
|
-
React__default.default.createElement("h2", { className: `${settings.prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad
|
|
109
|
-
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad
|
|
125
|
+
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-profile-settings__title` }, "More user profile settings will be here eventually, but for now you can choose which Teams are shown in your team switcher in Launchpad."),
|
|
126
|
+
React__default.default.createElement("h2", { className: `${settings.prefix}--bmrg-profile-settings__subtitle` }, "Teams visible in Launchpad team switcher"),
|
|
127
|
+
React__default.default.createElement("p", { className: `${settings.prefix}--bmrg-profile-settings__description` }, "Choose Teams to show or hide in your Launchpad team switcher and Catalog (useful for sensitive demos). You will not be able to access or view unchecked Teams from the team switcher, and cannot add items to them from Catalog."),
|
|
110
128
|
userIsLoading ? (React__default.default.createElement(react.StructuredListSkeleton, null)) : userError ? (React__default.default.createElement(ErrorMessage.default, { style: { color: "#F2F4F8", padding: "1rem" } })) : teams?.length > 0 ? (React__default.default.createElement(react.StructuredListWrapper, { className: `${settings.prefix}--bmrg-profile-settings-list` },
|
|
111
129
|
React__default.default.createElement(react.StructuredListHead, null,
|
|
112
130
|
React__default.default.createElement(react.StructuredListRow, { head: true },
|
|
@@ -26,11 +26,11 @@ IBM Confidential
|
|
|
26
26
|
694970X, 69497O0
|
|
27
27
|
© Copyright IBM Corp. 2022, 2024
|
|
28
28
|
*/
|
|
29
|
-
function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems = [], supportMenuItems = [], renderPrivacyRedirect = true, renderPrivacyStatement = true, rightPanel, handleShowTutorial, refetchUser, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }) {
|
|
29
|
+
function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, createJoinTeamTrigger, enableTeamSwitcher = true, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, leftPanel, platformName, productName, profileMenuItems = [], supportMenuItems = [], renderPrivacyRedirect = true, renderPrivacyStatement = true, rightPanel, handleShowTutorial, refetchUser, refetchUserTeams, refetchNavigation, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, tutorialScreenToShow, user, userTeams, userTeamsAssets, enableIcaMacs, }) {
|
|
30
30
|
// Support base header .e.g for an error state
|
|
31
31
|
if (!config) {
|
|
32
32
|
return (React__default.default.createElement(reactQuery.QueryClientProvider, { client: servicesConfig.queryClient },
|
|
33
|
-
React__default.default.createElement(Header.default, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, productName: productName || platformName || "", user: user })));
|
|
33
|
+
React__default.default.createElement(Header.default, { baseEnvUrl: baseEnvUrl ?? "", baseServicesUrl: "", carbonTheme: carbonTheme, enableAppSwitcher: false, enableNotifications: false, enableNotificationsCount: false, enableTeamSwitcher: enableTeamSwitcher, productName: productName || platformName || "", user: user })));
|
|
34
34
|
}
|
|
35
35
|
const { features, navigation, platform, platformMessage } = config;
|
|
36
36
|
const names = getProductAndPlatformNames({ productName, platformName, platform });
|
|
@@ -71,8 +71,8 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
71
71
|
*/
|
|
72
72
|
const isPrivacyStatementDisabled = renderPrivacyStatement === false || features?.["consent.enabled"] === false;
|
|
73
73
|
return (React__default.default.createElement(reactQuery.QueryClientProvider, { client: servicesConfig.queryClient },
|
|
74
|
-
React__default.default.createElement(Header.default, { analyticsHelpers: analyticsHelpers, baseEnvUrl: platform.baseEnvUrl, baseServicesUrl: platform.baseServicesUrl, carbonTheme: carbonTheme, createJoinTeamTrigger: createJoinTeamTrigger, enableAppSwitcher: isAppSwitcherEnabled, instanceSwitcherEnabled: instanceSwitcherEnabled, enableNotifications: isNotificationsEnabled, enableNotificationsCount: isNotificationsCountEnabled, leftPanel: leftPanel, navLinks: navigation, platform: platform, platformMessage: platformMessage, prefixName: names.platformName, productName: names.productName, rightPanel: rightPanel, requestSummary: user?.requestSummary, skipToContentProps: skipToContentProps, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, profileMenuItems: [
|
|
75
|
-
isUserEnabled && (React__default.default.createElement(ProfileSettings.ProfileSettingsMenuItem, { key: "profile-settings", baseServicesUrl: platform.baseServicesUrl, src: `${platform.baseServicesUrl}/users/image/${user?.email}`, userName: user?.displayName ?? user?.name })),
|
|
74
|
+
React__default.default.createElement(Header.default, { analyticsHelpers: analyticsHelpers, baseEnvUrl: platform.baseEnvUrl, baseServicesUrl: platform.baseServicesUrl, carbonTheme: carbonTheme, createJoinTeamTrigger: createJoinTeamTrigger, enableAppSwitcher: isAppSwitcherEnabled, instanceSwitcherEnabled: instanceSwitcherEnabled, enableNotifications: isNotificationsEnabled, enableNotificationsCount: isNotificationsCountEnabled, enableTeamSwitcher: enableTeamSwitcher, leftPanel: leftPanel, navLinks: navigation, platform: platform, platformMessage: platformMessage, prefixName: names.platformName, productName: names.productName, rightPanel: rightPanel, requestSummary: user?.requestSummary, skipToContentProps: skipToContentProps, templateMeteringEvent: templateMeteringEvent, triggerEvent: triggerEvent, profileMenuItems: [
|
|
75
|
+
isUserEnabled && (React__default.default.createElement(ProfileSettings.ProfileSettingsMenuItem, { key: "profile-settings", baseServicesUrl: platform.baseServicesUrl, src: `${platform.baseServicesUrl}/users/image/${user?.email}`, userName: user?.displayName ?? user?.name, refetchUser: refetchUser, refetchUserTeams: refetchUserTeams, refetchNavigation: refetchNavigation })),
|
|
76
76
|
isSendMailEnabled && (React__default.default.createElement(HeaderMenuItem.default, { key: "email-preferences", href: `${platform.baseEnvUrl}/launchpad/email-preferences`, icon: React__default.default.createElement(icons.Email, null), kind: "internal", text: "Email Preferences", type: "link" })),
|
|
77
77
|
!isPrivacyStatementDisabled && (React__default.default.createElement(PrivacyStatement.PrivacyStatementMenuItem, { key: "privacy-statement", baseServicesUrl: platform.baseServicesUrl, platformEmail: platform?.platformEmail })),
|
|
78
78
|
...profileMenuItems,
|
|
@@ -82,7 +82,15 @@ function UIShell({ analyticsHelpers, baseEnvUrl, carbonTheme = "g10", config, cr
|
|
|
82
82
|
isSupportEnabled &&
|
|
83
83
|
(supportFlagCheck || isPartnerUser ? (React__default.default.createElement(SupportCenter.SupportCenterMenuItem, { key: "support-center", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, supportLink: supportLink, partnerEmailId: partnerEmailId, enablePartner: isPartnerUser, baseServicesUrl: platform.baseServicesUrl })) : (React__default.default.createElement(HeaderMenuItem.default, { key: "support-center", href: platform?.supportUrl, icon: React__default.default.createElement(icons.HelpDesk, null), kind: "external", text: "Support Center", type: "link" }))),
|
|
84
84
|
React__default.default.createElement(HeaderMenuItem.default, { key: "release-notes", href: platform?.releaseNotesUrl, icon: React__default.default.createElement(icons.CatalogPublish, null), "data-testid": "release-notes", kind: "app", text: "Release Notes", type: "link" }),
|
|
85
|
-
|
|
85
|
+
// <HeaderMenuItem
|
|
86
|
+
// key="legal-terms"
|
|
87
|
+
// href={platform?.legalTermsUrl as string}
|
|
88
|
+
// icon={<Policy />}
|
|
89
|
+
// data-testid="legal-terms"
|
|
90
|
+
// kind="app"
|
|
91
|
+
// text="Legal Terms"
|
|
92
|
+
// type="link"
|
|
93
|
+
// />,
|
|
86
94
|
React__default.default.createElement("span", { style: { borderBottom: "1px solid #b8c1c1" } }),
|
|
87
95
|
isCommunityEnabled && (React__default.default.createElement(HeaderMenuItem.default, { key: "community", href: platform?.communityUrl, icon: React__default.default.createElement(icons.Forum, null), kind: "external", text: "Community", type: "link" })),
|
|
88
96
|
isFeedbackEnabled && (React__default.default.createElement(Feedback.FeedbackMenuItem, { key: "feedback", platformName: platform?.platformName, platformOrganization: platform?.platformOrganization, sendIdeasUrl: sendIdeasUrl, sendBluePointsAwardUrl: sendBluePointsAwardUrl })),
|
|
@@ -11,8 +11,12 @@ const CHECKBOX_TYPES = {
|
|
|
11
11
|
const CREATABLE_TYPES = {
|
|
12
12
|
CREATABLE_SINGLE: "creatable-single",
|
|
13
13
|
CREATABLE_SINGLE_NON_DELETABLE: "creatable-single-non-deletable",
|
|
14
|
+
CREATABLE_SINGLE_REORDERABLE: "creatable-single-reorderable",
|
|
15
|
+
CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE: "creatable-single-reorderable-non-deletable",
|
|
14
16
|
CREATABLE_PAIR: "creatable-pair",
|
|
15
17
|
CREATABLE_PAIR_NON_DELETABLE: "creatable-pair-non-deletable",
|
|
18
|
+
CREATABLE_PAIR_REORDERABLE: "creatable-pair-reorderable",
|
|
19
|
+
CREATABLE_PAIR_REORDERABLE_NON_DELETABLE: "creatable-pair-reorderable-non-deletable",
|
|
16
20
|
};
|
|
17
21
|
const DATE_TYPES = {
|
|
18
22
|
DATE: "date",
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
IBM Confidential
|
|
5
|
+
694970X, 69497O0
|
|
6
|
+
© Copyright IBM Corp. 2022, 2024
|
|
7
|
+
*/
|
|
8
|
+
const TEAM_TYPES = {
|
|
9
|
+
ACCOUNT: "account",
|
|
10
|
+
PERSONAL: "personal",
|
|
11
|
+
PROJECT: "project",
|
|
12
|
+
STANDARD: "standard",
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.TEAM_TYPES = TEAM_TYPES;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import cx from 'classnames';
|
|
3
|
+
import 'history';
|
|
3
4
|
import { SideNavLink, SideNav, SideNavItems, SideNavDivider, Tag } from '@carbon/react';
|
|
4
5
|
import TooltipHover from '../TooltipHover/TooltipHover.js';
|
|
5
6
|
import { ChatBot, Home, UserMultiple, AddAlt, Api, IntentRequestCreate, Folders, DocumentMultiple_02, Catalog, Settings, LicenseThirdParty } from '@carbon/react/icons';
|
|
@@ -24,7 +25,7 @@ const SideNavUrlKeys = {
|
|
|
24
25
|
Admin: "admin",
|
|
25
26
|
};
|
|
26
27
|
function AdvantageSideNav(props) {
|
|
27
|
-
const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
|
|
28
|
+
const { app, appLink, agenticAppsPath = "", agentStudioPath = "", regionalTeam, enableChatButton = true, showChatButton = true, showSelectTeamPurpose = false, defaultAssistantLink, joinCreateTrigger, isLoading, isOpen, teams = [], triggerEvent, accounts = [], baseEnvUrl, className, navLinks, personalTeams = [], user, showChatTooltip, templateMeteringEvent, tooltipMessage, isLaunchpad = false, isbetaLaunchpad = false, sideNavUrls, history, children, personalTeamEnabled, ...rest } = props;
|
|
28
29
|
const [activeMenu, setActiveMenu] = React.useState(false);
|
|
29
30
|
const isMenuOpen = isOpen || activeMenu;
|
|
30
31
|
const windowLocation = window.location;
|
|
@@ -40,6 +41,11 @@ function AdvantageSideNav(props) {
|
|
|
40
41
|
const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
|
|
41
42
|
const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
|
|
42
43
|
const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
|
|
44
|
+
const AssistantStudioLink = false;
|
|
45
|
+
const currentUrl = new URL(window.location.href);
|
|
46
|
+
const workspace = currentUrl.searchParams.get("workspace");
|
|
47
|
+
const isDocumentCollectionsActive = currentUrl.pathname.includes("/chat") && workspace === "knowledge";
|
|
48
|
+
const isChatActive = currentUrl.pathname.includes("/chat") && !isDocumentCollectionsActive;
|
|
43
49
|
// get current selected team
|
|
44
50
|
let teamSwitcherTeam = null;
|
|
45
51
|
if (Array.isArray(personalTeams) && personalTeams.length > 0) {
|
|
@@ -87,30 +93,6 @@ function AdvantageSideNav(props) {
|
|
|
87
93
|
destinationPath: toolsLink,
|
|
88
94
|
});
|
|
89
95
|
};
|
|
90
|
-
const handleAgentAssistantStudioClick = () => {
|
|
91
|
-
triggerEvent &&
|
|
92
|
-
triggerEvent({
|
|
93
|
-
action: "Clicked on SideNav Agent & Assistant Studio link",
|
|
94
|
-
category: "Sidenav",
|
|
95
|
-
destinationPath: agentAssistantStudioLink,
|
|
96
|
-
});
|
|
97
|
-
};
|
|
98
|
-
const handleAgentAssistantLibraryClick = () => {
|
|
99
|
-
triggerEvent &&
|
|
100
|
-
triggerEvent({
|
|
101
|
-
action: "Clicked on SideNav Agent & Assistant Library link",
|
|
102
|
-
category: "Sidenav",
|
|
103
|
-
destinationPath: agentAssistantLibraryLink,
|
|
104
|
-
});
|
|
105
|
-
};
|
|
106
|
-
const handleDocumentCollectionsClick = () => {
|
|
107
|
-
triggerEvent &&
|
|
108
|
-
triggerEvent({
|
|
109
|
-
action: "Clicked on SideNav Document Collections link",
|
|
110
|
-
category: "Sidenav",
|
|
111
|
-
destinationPath: documentCollectionsLink,
|
|
112
|
-
});
|
|
113
|
-
};
|
|
114
96
|
const handleSettingsClick = () => {
|
|
115
97
|
triggerEvent &&
|
|
116
98
|
triggerEvent({
|
|
@@ -159,7 +141,7 @@ function AdvantageSideNav(props) {
|
|
|
159
141
|
}
|
|
160
142
|
setActiveMenu(false);
|
|
161
143
|
};
|
|
162
|
-
const chatSideNavLink = (React.createElement(SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", disabled: Boolean(!enableChatButton), renderIcon: ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
|
|
144
|
+
const chatSideNavLink = (React.createElement(SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : "", isActive: isChatActive, disabled: Boolean(!enableChatButton), renderIcon: ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
|
|
163
145
|
const showSecondDivider = showChatButton || toolsLink || agentAssistantStudioLink || agentAssistantLibraryLink || documentCollectionsLink;
|
|
164
146
|
return (React.createElement(SideNav, { "aria-label": "sidenav-container", className: cx(`${prefix}--bmrg-advantage-sidenav-container`, className, {
|
|
165
147
|
"--closed": !isMenuOpen,
|
|
@@ -172,6 +154,11 @@ function AdvantageSideNav(props) {
|
|
|
172
154
|
handleLaunchpadLink(e);
|
|
173
155
|
history.push("/");
|
|
174
156
|
}
|
|
157
|
+
if (isbetaLaunchpad) {
|
|
158
|
+
console.log("beta launchpad home link clicked");
|
|
159
|
+
handleLaunchpadLink(e);
|
|
160
|
+
history.push("/launchpad");
|
|
161
|
+
}
|
|
175
162
|
handleHomeClick();
|
|
176
163
|
} }, "Home")) : null,
|
|
177
164
|
teamSwitcherTeam ? (React.createElement(SideNavLink, { title: teamSwitcherTeam.isAccount ? "Account Page" : "Team Page", name: teamSwitcherTeam.name, "data-testid": "sidenav-team-link", id: teamSwitcherTeam.id, isActive: windowLocation.href.includes(`/launchpad/teams/${teamSwitcherTeam.id}`), className: `${prefix}--bmrg-advantage-sidenav-team`, renderIcon: UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
|
|
@@ -196,7 +183,7 @@ function AdvantageSideNav(props) {
|
|
|
196
183
|
} }, joinButtontitle)) : null,
|
|
197
184
|
React.createElement(SideNavDivider, null),
|
|
198
185
|
showChatButton &&
|
|
199
|
-
(showChatTooltip ? (React.createElement(TooltipHover, { className: `${prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
|
|
186
|
+
(showChatTooltip ? (React.createElement(TooltipHover, { className: `${prefix}--bmrg-side-nav__tooltip`, isActive: isChatActive, content: tooltipMessage, direction: "right" },
|
|
200
187
|
React.createElement("span", null, chatSideNavLink))) : (chatSideNavLink)),
|
|
201
188
|
toolsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-tools-link", renderIcon: Api, href: toolsLink, onClick: (e) => {
|
|
202
189
|
handleToolsClick();
|
|
@@ -204,27 +191,24 @@ function AdvantageSideNav(props) {
|
|
|
204
191
|
React.createElement("div", { className: `${prefix}--bmrg-advantage-sidenav-item-tag` },
|
|
205
192
|
"Tools",
|
|
206
193
|
React.createElement(Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
|
|
207
|
-
agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
handleDocumentCollectionsClick();
|
|
220
|
-
} }, "Document Collections")) : null,
|
|
194
|
+
agentAssistantStudioLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
|
|
195
|
+
// isActive={
|
|
196
|
+
// (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
|
|
197
|
+
// (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
|
|
198
|
+
// }
|
|
199
|
+
className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink), renderIcon: IntentRequestCreate }, "Agent & Assistant Studio")) : null,
|
|
200
|
+
agentAssistantLibraryLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: Folders,
|
|
201
|
+
//href={agentAssistantLibraryLink}
|
|
202
|
+
className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Agent & Assistant Library")) : null,
|
|
203
|
+
documentCollectionsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-document-collections-link",
|
|
204
|
+
//isActive={isDocumentCollectionsActive}
|
|
205
|
+
renderIcon: DocumentMultiple_02, className: `${prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Document Collections")) : null,
|
|
221
206
|
showSecondDivider ? React.createElement(SideNavDivider, null) : null,
|
|
222
|
-
catalogNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", isActive:
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings, href: settingsLink, onClick: (e) => {
|
|
207
|
+
catalogNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: windowLocation.href.includes(`${baseEnvUrl}/catalog`), href: catalogNavlink, renderIcon: Catalog }, "Catalog")) : null,
|
|
208
|
+
settingsLink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: Settings, href: settingsLink,
|
|
209
|
+
//className={!AssistantStudioLink ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : ""}
|
|
210
|
+
//disabled={Boolean(!AssistantStudioLink)}
|
|
211
|
+
onClick: (e) => {
|
|
228
212
|
handleSettingsClick();
|
|
229
213
|
} }, "Settings")) : null,
|
|
230
214
|
adminNavlink ? (React.createElement(SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: LicenseThirdParty }, "Admin")) : null),
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
|
-
import { TextInput, Button, Tag } from '@carbon/react';
|
|
3
|
-
import { Information, Add } from '@carbon/react/icons';
|
|
2
|
+
import { TextInput, Button, Tag, DismissibleTag } from '@carbon/react';
|
|
3
|
+
import { Information, Add, Draggable } from '@carbon/react/icons';
|
|
4
|
+
import { useSensors, useSensor, PointerSensor, DndContext, closestCenter } from '@dnd-kit/core';
|
|
5
|
+
import { SortableContext, verticalListSortingStrategy, useSortable, arrayMove } from '@dnd-kit/sortable';
|
|
6
|
+
import { CSS } from '@dnd-kit/utilities';
|
|
4
7
|
import cx from 'classnames';
|
|
5
8
|
import TooltipHover from '../TooltipHover/TooltipHover.js';
|
|
6
9
|
import { isAccessibleKeyDownEvent } from '../../tools/accessibility.js';
|
|
@@ -11,7 +14,7 @@ IBM Confidential
|
|
|
11
14
|
694970X, 69497O0
|
|
12
15
|
© Copyright IBM Corp. 2022, 2024
|
|
13
16
|
*/
|
|
14
|
-
function CreatableComponent({ buttonClassName = `${prefix}--bmrg-creatable__button`, buttonContent = "Add", buttonProps, createKeyValuePair = false, disabled, id, initialValues: externalInitialValues, invalid, invalidText, helperText, key, keyHelperText, keyLabel, keyLabelText, keyPlaceholder, label, labelText = "", max, nonDeletable = false, onKeyBlur, onValueBlur, onInputBlur, onChange, placeholder, tagProps, tagType = "teal", textInputProps, tooltipClassName = `${prefix}--bmrg-creatable__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, type = "text", valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput = false, removeOnlyFirst = false, }) {
|
|
17
|
+
function CreatableComponent({ buttonClassName = `${prefix}--bmrg-creatable__button`, buttonContent = "Add", buttonProps, createKeyValuePair = false, disabled, id, initialValues: externalInitialValues, invalid, invalidText, helperText, key, keyHelperText, keyLabel, keyLabelText, keyPlaceholder, label, labelText = "", max, nonDeletable = false, onKeyBlur, onValueBlur, onInputBlur, onChange, placeholder, reorderable, tagProps, tagType = "teal", textInputProps, tooltipClassName = `${prefix}--bmrg-creatable__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, type = "text", valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput = false, removeOnlyFirst = false, }) {
|
|
15
18
|
const [keyValue, setKeyValue] = useState("");
|
|
16
19
|
const [value, setValue] = useState("");
|
|
17
20
|
const [input, setInput] = useState("");
|
|
@@ -119,6 +122,21 @@ function CreatableComponent({ buttonClassName = `${prefix}--bmrg-creatable__butt
|
|
|
119
122
|
if (onChange)
|
|
120
123
|
onChange(items);
|
|
121
124
|
};
|
|
125
|
+
const sensors = useSensors(useSensor(PointerSensor, {
|
|
126
|
+
activationConstraint: { distance: 5 },
|
|
127
|
+
}));
|
|
128
|
+
function handleDragEnd(event) {
|
|
129
|
+
const { active, over } = event;
|
|
130
|
+
if (over && active.id !== over.id) {
|
|
131
|
+
const oldIndex = tagItems.indexOf(active.id);
|
|
132
|
+
const newIndex = tagItems.indexOf(over.id);
|
|
133
|
+
const reorderedItems = arrayMove(tagItems, oldIndex, newIndex);
|
|
134
|
+
setCreatedItems(reorderedItems);
|
|
135
|
+
if (onChange) {
|
|
136
|
+
onChange(reorderedItems);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
122
140
|
return (React.createElement("div", { key: key, className: `${prefix}--bmrg-creatable` },
|
|
123
141
|
React.createElement("div", { className: `${prefix}--bmrg-creatable__input` },
|
|
124
142
|
createKeyValuePair ? (React.createElement("div", { className: `${prefix}--bmrg-creatable__key-value-inputs` },
|
|
@@ -140,9 +158,20 @@ function CreatableComponent({ buttonClassName = `${prefix}--bmrg-creatable__butt
|
|
|
140
158
|
React.createElement(TooltipHover, { ...tooltipProps, tooltipText: tooltipContent },
|
|
141
159
|
React.createElement(Information, { size: 16, fill: "currentColor" }))))), onBlur: onInputBlur, onChange: onInputChange, placeholder: placeholder, ref: inputRef, type: type, value: input, ...textInputProps })),
|
|
142
160
|
React.createElement(Button, { className: createButtonClassName, disabled: isAddButtonDisabled, onClick: addValue, iconDescription: "Add", renderIcon: Add, size: "md", type: "button", ...buttonProps }, buttonContent)),
|
|
143
|
-
|
|
161
|
+
reorderable ? (React.createElement(DndContext, { sensors: disabled ? [] : sensors, collisionDetection: closestCenter, onDragEnd: handleDragEnd },
|
|
162
|
+
React.createElement(SortableContext, { items: tagsToShow, strategy: verticalListSortingStrategy },
|
|
163
|
+
React.createElement("div", { className: `${prefix}--bmrg-creatable__tags--reorderable` }, tagsToShow.map((item, index) => (React.createElement(ReorderableTag, { key: `${item}-${index}`, disabled: disabled, initialTagItems: initialTagItems, item: item, nonDeletable: nonDeletable, removeValue: removeValue, tagProps: tagProps, tagType: tagType }))))))) : (React.createElement("div", { className: `${prefix}--bmrg-creatable__tags` }, tagsToShow.map((item, index) => (React.createElement(Tag, { key: `${item}-${index}`, disabled: disabled, type: tagType, onClick: nonDeletable && initialTagItems.includes(item) ? undefined : () => removeValue(item), onKeyDown: nonDeletable && initialTagItems.includes(item)
|
|
144
164
|
? undefined
|
|
145
|
-
: (e) => isAccessibleKeyDownEvent(e) && removeValue(item), filter: !nonDeletable || (nonDeletable && !initialTagItems.includes(item)), ...tagProps }, item))))));
|
|
165
|
+
: (e) => isAccessibleKeyDownEvent(e) && removeValue(item), filter: !nonDeletable || (nonDeletable && !initialTagItems.includes(item)), ...tagProps }, item)))))));
|
|
166
|
+
}
|
|
167
|
+
function ReorderableTag({ disabled, initialTagItems, item, nonDeletable, removeValue, tagProps, tagType, }) {
|
|
168
|
+
const { attributes, listeners, setNodeRef, transform, transition } = useSortable({ id: item });
|
|
169
|
+
const style = {
|
|
170
|
+
transform: CSS.Transform.toString(transform),
|
|
171
|
+
transition,
|
|
172
|
+
};
|
|
173
|
+
return (React.createElement("div", { ref: setNodeRef, ...attributes, ...(!disabled ? listeners : {}), style: style },
|
|
174
|
+
React.createElement(DismissibleTag, { disabled: disabled, type: tagType, onClose: nonDeletable && initialTagItems.includes(item) ? undefined : () => removeValue(item), renderIcon: Draggable, title: "", text: item, ...tagProps })));
|
|
146
175
|
}
|
|
147
176
|
|
|
148
177
|
export { CreatableComponent as default };
|
|
@@ -109,9 +109,18 @@ function DataDrivenInput(props) {
|
|
|
109
109
|
Component = Creatable;
|
|
110
110
|
componentProps = {
|
|
111
111
|
...allInputProps,
|
|
112
|
-
createKeyValuePair: type === CREATABLE_TYPES.CREATABLE_PAIR ||
|
|
112
|
+
createKeyValuePair: type === CREATABLE_TYPES.CREATABLE_PAIR ||
|
|
113
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
|
|
114
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
|
|
115
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
|
|
113
116
|
nonDeletable: type === CREATABLE_TYPES.CREATABLE_SINGLE_NON_DELETABLE ||
|
|
114
|
-
type === CREATABLE_TYPES.
|
|
117
|
+
type === CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
|
|
118
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
|
|
119
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
|
|
120
|
+
reorderable: type === CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE ||
|
|
121
|
+
type === CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
|
|
122
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
|
|
123
|
+
type === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
|
|
115
124
|
invalid: invalidInput,
|
|
116
125
|
invalidText: invalidTextMessage,
|
|
117
126
|
placeholder,
|
|
@@ -106,7 +106,13 @@ async function handleGoverningSelectChange({ formikProps, input, inputs, isInput
|
|
|
106
106
|
/** Erase value of governed inputs */
|
|
107
107
|
if (inputsGovernedByCurrentOne.length) {
|
|
108
108
|
await inputsGovernedByCurrentOne.forEach(async (input) => {
|
|
109
|
-
await handleGoverningSelectChange({
|
|
109
|
+
await handleGoverningSelectChange({
|
|
110
|
+
formikProps,
|
|
111
|
+
input,
|
|
112
|
+
inputs,
|
|
113
|
+
isInputBeingChanged: false,
|
|
114
|
+
selectedItem: null,
|
|
115
|
+
});
|
|
110
116
|
});
|
|
111
117
|
}
|
|
112
118
|
// only the top governing select should display warnings if changed and reset touched status for governed ones
|
|
@@ -198,8 +204,12 @@ function generateYupAst({ inputs, allowCustomPropertySyntax, customPropertySynta
|
|
|
198
204
|
if (inputType === MULTI_SELECT_TYPES.MULTI_SELECT ||
|
|
199
205
|
inputType === CREATABLE_TYPES.CREATABLE_SINGLE ||
|
|
200
206
|
inputType === CREATABLE_TYPES.CREATABLE_SINGLE_NON_DELETABLE ||
|
|
207
|
+
inputType === CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE ||
|
|
208
|
+
inputType === CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
|
|
201
209
|
inputType === CREATABLE_TYPES.CREATABLE_PAIR ||
|
|
202
210
|
inputType === CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
|
|
211
|
+
inputType === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
|
|
212
|
+
inputType === CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE ||
|
|
203
213
|
inputType === CHECKBOX_TYPES.CHECKBOX) {
|
|
204
214
|
if (useCSVforArrays) {
|
|
205
215
|
yupValidationArray.push(["yup.string"]);
|
|
@@ -54,7 +54,7 @@ const MenuAriaLabelRecord = {
|
|
|
54
54
|
const headerButtonClassNames = "cds--btn--icon-only cds--header__action cds--btn cds--btn--primary cds--btn--icon-only cds--btn cds--btn--primary";
|
|
55
55
|
const instanceCheckMarkContainerClass = "instance-checkmark-style-container";
|
|
56
56
|
function Header(props) {
|
|
57
|
-
const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
|
|
57
|
+
const { analyticsHelpers, productName, baseEnvUrl, baseServicesUrl, carbonTheme = "g10", className, createJoinTeamTrigger, enableTeamSwitcher = true, history, isLaunchpad = false, isLoadingTeamSwitcher, isSuccessTeamSwitcher, setIsSuccessTeamSwitcher, navLinks, platform, prefixName = "", refetchUser, refetchNavigation, rightPanel, skipToContentProps, templateMeteringEvent, trackEvent, triggerEvent, user, userTeams, userTeamsAssets, } = props;
|
|
58
58
|
const hasUserTeams = Boolean(userTeams);
|
|
59
59
|
const userTeamsUrl = serviceUrl.getUserTeamsServices({ baseServicesUrl });
|
|
60
60
|
const teamsQuery = useQuery({
|
|
@@ -62,6 +62,7 @@ function Header(props) {
|
|
|
62
62
|
queryFn: resolver.query(userTeamsUrl, null),
|
|
63
63
|
enabled: !hasUserTeams && Boolean(baseServicesUrl),
|
|
64
64
|
});
|
|
65
|
+
const showTeamSwitcher = enableTeamSwitcher && Boolean(user);
|
|
65
66
|
return (React.createElement(React.Fragment, null,
|
|
66
67
|
React.createElement(Theme, { theme: carbonTheme },
|
|
67
68
|
React.createElement(Header$1, { "aria-label": "App navigation header", className: className },
|
|
@@ -72,7 +73,7 @@ function Header(props) {
|
|
|
72
73
|
? navLinks.map((link) => (React.createElement(HeaderMenuItem, { "aria-label": `Link for ${link.name}`, "data-testid": "header-menu-link", href: link.url, isCurrentPage: window?.location?.href && link.url ? window.location.href.startsWith(link.url) : false, key: link.name, target: link.isExternal ? "_blank" : undefined, rel: link.isExternal ? "noopener noreferrer" : undefined }, link.name)))
|
|
73
74
|
: null),
|
|
74
75
|
React.createElement(HeaderGlobalBar, null,
|
|
75
|
-
React.createElement(HeaderTeamSwitcher, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams }),
|
|
76
|
+
showTeamSwitcher ? (React.createElement(HeaderTeamSwitcher, { analyticsHelpers: analyticsHelpers, baseServicesUrl: baseServicesUrl, createJoinTeamTrigger: createJoinTeamTrigger, history: history, isLaunchpad: isLaunchpad, isLoadingTeamSwitcher: isLoadingTeamSwitcher, isSuccessTeamSwitcher: isSuccessTeamSwitcher, setIsSuccessTeamSwitcher: setIsSuccessTeamSwitcher, menuAriaLabelRecord: MenuAriaLabelRecord.TeamSwitcher, menuButtonId: MenuButtonId.TeamSwitcher, menuListId: MenuListId.TeamSwitcher, navigationPlatform: platform, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams })) : null,
|
|
76
77
|
props?.instanceSwitcherEnabled && (React.createElement(InstanceSwitcherMenu, { enabled: Boolean(props.instanceSwitcherEnabled), menuItems: platform?.instances })),
|
|
77
78
|
React.createElement(RequestsMenu, { baseEnvUrl: baseEnvUrl, enabled: Boolean(props.requestSummary), summary: props.requestSummary }),
|
|
78
79
|
React.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
|