@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.
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
  var cx = require('classnames');
7
+ require('history');
7
8
  var react = require('@carbon/react');
8
9
  var TooltipHover = require('../TooltipHover/TooltipHover.js');
9
10
  var icons = require('@carbon/react/icons');
@@ -33,7 +34,7 @@ const SideNavUrlKeys = {
33
34
  Admin: "admin",
34
35
  };
35
36
  function AdvantageSideNav(props) {
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;
37
+ 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;
37
38
  const [activeMenu, setActiveMenu] = React__default.default.useState(false);
38
39
  const isMenuOpen = isOpen || activeMenu;
39
40
  const windowLocation = window.location;
@@ -49,6 +50,11 @@ function AdvantageSideNav(props) {
49
50
  const catalogNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Catalog)?.url;
50
51
  const settingsLink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Settings)?.url;
51
52
  const adminNavlink = sideNavUrls?.find((sideNavUrl) => sideNavUrl.key === SideNavUrlKeys.Admin)?.url;
53
+ const AssistantStudioLink = false;
54
+ const currentUrl = new URL(window.location.href);
55
+ const workspace = currentUrl.searchParams.get("workspace");
56
+ const isDocumentCollectionsActive = currentUrl.pathname.includes("/chat") && workspace === "knowledge";
57
+ const isChatActive = currentUrl.pathname.includes("/chat") && !isDocumentCollectionsActive;
52
58
  // get current selected team
53
59
  let teamSwitcherTeam = null;
54
60
  if (Array.isArray(personalTeams) && personalTeams.length > 0) {
@@ -96,30 +102,6 @@ function AdvantageSideNav(props) {
96
102
  destinationPath: toolsLink,
97
103
  });
98
104
  };
99
- const handleAgentAssistantStudioClick = () => {
100
- triggerEvent &&
101
- triggerEvent({
102
- action: "Clicked on SideNav Agent & Assistant Studio link",
103
- category: "Sidenav",
104
- destinationPath: agentAssistantStudioLink,
105
- });
106
- };
107
- const handleAgentAssistantLibraryClick = () => {
108
- triggerEvent &&
109
- triggerEvent({
110
- action: "Clicked on SideNav Agent & Assistant Library link",
111
- category: "Sidenav",
112
- destinationPath: agentAssistantLibraryLink,
113
- });
114
- };
115
- const handleDocumentCollectionsClick = () => {
116
- triggerEvent &&
117
- triggerEvent({
118
- action: "Clicked on SideNav Document Collections link",
119
- category: "Sidenav",
120
- destinationPath: documentCollectionsLink,
121
- });
122
- };
123
105
  const handleSettingsClick = () => {
124
106
  triggerEvent &&
125
107
  triggerEvent({
@@ -168,7 +150,7 @@ function AdvantageSideNav(props) {
168
150
  }
169
151
  setActiveMenu(false);
170
152
  };
171
- 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"));
153
+ const chatSideNavLink = (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-chat-link", className: !enableChatButton ? `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` : "", isActive: isChatActive, disabled: Boolean(!enableChatButton), renderIcon: icons.ChatBot, href: enableChatButton && chatLink, onClick: enableChatButton ? handleChatClick : (e) => e.preventDefault() }, "Chat"));
172
154
  const showSecondDivider = showChatButton || toolsLink || agentAssistantStudioLink || agentAssistantLibraryLink || documentCollectionsLink;
173
155
  return (React__default.default.createElement(react.SideNav, { "aria-label": "sidenav-container", className: cx__default.default(`${settings.prefix}--bmrg-advantage-sidenav-container`, className, {
174
156
  "--closed": !isMenuOpen,
@@ -181,6 +163,11 @@ function AdvantageSideNav(props) {
181
163
  handleLaunchpadLink(e);
182
164
  history.push("/");
183
165
  }
166
+ if (isbetaLaunchpad) {
167
+ console.log("beta launchpad home link clicked");
168
+ handleLaunchpadLink(e);
169
+ history.push("/launchpad");
170
+ }
184
171
  handleHomeClick();
185
172
  } }, "Home")) : null,
186
173
  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(`/launchpad/teams/${teamSwitcherTeam.id}`), className: `${settings.prefix}--bmrg-advantage-sidenav-team`, renderIcon: icons.UserMultiple, href: `${baseEnvUrl}/${app}/teams/${teamSwitcherTeam.id}`, onClick: (e) => {
@@ -205,7 +192,7 @@ function AdvantageSideNav(props) {
205
192
  } }, joinButtontitle)) : null,
206
193
  React__default.default.createElement(react.SideNavDivider, null),
207
194
  showChatButton &&
208
- (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, content: tooltipMessage, direction: "right" },
195
+ (showChatTooltip ? (React__default.default.createElement(TooltipHover.default, { className: `${settings.prefix}--bmrg-side-nav__tooltip`, isActive: isChatActive, content: tooltipMessage, direction: "right" },
209
196
  React__default.default.createElement("span", null, chatSideNavLink))) : (chatSideNavLink)),
210
197
  toolsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-tools-link", renderIcon: icons.Api, href: toolsLink, onClick: (e) => {
211
198
  handleToolsClick();
@@ -213,27 +200,24 @@ function AdvantageSideNav(props) {
213
200
  React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-advantage-sidenav-item-tag` },
214
201
  "Tools",
215
202
  React__default.default.createElement(react.Tag, { size: "sm", title: "BETA", type: "high-contrast" }, "BETA")))) : null,
216
- agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link", isActive: (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
217
- (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`)), renderIcon: icons.IntentRequestCreate, href: agentAssistantStudioLink, onClick: (e) => {
218
- if (isLaunchpad) {
219
- handleLaunchpadLink(e);
220
- history.push(agentStudioPath);
221
- }
222
- handleAgentAssistantStudioClick();
223
- } }, "Agent & Assistant Studio")) : null,
224
- agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders, href: agentAssistantLibraryLink, onClick: (e) => {
225
- handleAgentAssistantLibraryClick();
226
- } }, "Agent & Assistant Library")) : null,
227
- documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link", renderIcon: icons.DocumentMultiple_02, href: documentCollectionsLink, onClick: (e) => {
228
- handleDocumentCollectionsClick();
229
- } }, "Document Collections")) : null,
203
+ agentAssistantStudioLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-studio-link",
204
+ // isActive={
205
+ // (agentStudioPath && windowLocation.href.includes(`/launchpad${agentStudioPath}`)) ||
206
+ // (agenticAppsPath && windowLocation.href.includes(`/launchpad${agenticAppsPath}`))
207
+ // }
208
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink), renderIcon: icons.IntentRequestCreate }, "Agent & Assistant Studio")) : null,
209
+ agentAssistantLibraryLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-agent-assistant-library-link", renderIcon: icons.Folders,
210
+ //href={agentAssistantLibraryLink}
211
+ className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Agent & Assistant Library")) : null,
212
+ documentCollectionsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-document-collections-link",
213
+ //isActive={isDocumentCollectionsActive}
214
+ renderIcon: icons.DocumentMultiple_02, className: `${settings.prefix}--bmrg-advantage-sidenav__inactive-link` , disabled: Boolean(!AssistantStudioLink) }, "Document Collections")) : null,
230
215
  showSecondDivider ? React__default.default.createElement(react.SideNavDivider, null) : null,
231
- catalogNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: location.pathname.includes("/catalog"), renderIcon: icons.Catalog, href: catalogNavlink, onClick: (e) => {
232
- console.log("ss", catalogNavlink);
233
- e.preventDefault();
234
- history.push(catalogNavlink);
235
- } }, "Catalog")) : null,
236
- settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink, onClick: (e) => {
216
+ catalogNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-catalog-link", isActive: windowLocation.href.includes(`${baseEnvUrl}/catalog`), href: catalogNavlink, renderIcon: icons.Catalog }, "Catalog")) : null,
217
+ settingsLink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-settings-link", renderIcon: icons.Settings, href: settingsLink,
218
+ //className={!AssistantStudioLink ? `${prefix}--bmrg-advantage-sidenav__inactive-link` : ""}
219
+ //disabled={Boolean(!AssistantStudioLink)}
220
+ onClick: (e) => {
237
221
  handleSettingsClick();
238
222
  } }, "Settings")) : null,
239
223
  adminNavlink ? (React__default.default.createElement(react.SideNavLink, { "data-testid": "sidenav-admin-link", href: adminNavlink, renderIcon: icons.LicenseThirdParty }, "Admin")) : null),
@@ -5,6 +5,9 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var react = require('@carbon/react');
7
7
  var icons = require('@carbon/react/icons');
8
+ var core = require('@dnd-kit/core');
9
+ var sortable = require('@dnd-kit/sortable');
10
+ var utilities = require('@dnd-kit/utilities');
8
11
  var cx = require('classnames');
9
12
  var TooltipHover = require('../TooltipHover/TooltipHover.js');
10
13
  var accessibility = require('../../tools/accessibility.js');
@@ -20,7 +23,7 @@ IBM Confidential
20
23
  694970X, 69497O0
21
24
  © Copyright IBM Corp. 2022, 2024
22
25
  */
23
- function CreatableComponent({ buttonClassName = `${settings.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 = `${settings.prefix}--bmrg-creatable__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, type = "text", valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput = false, removeOnlyFirst = false, }) {
26
+ function CreatableComponent({ buttonClassName = `${settings.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 = `${settings.prefix}--bmrg-creatable__tooltip`, tooltipContent, tooltipProps = { direction: "top" }, type = "text", valueHelperText, valueLabel, valueLabelText, valuePlaceholder, value: externalValues, values, trimInput = false, removeOnlyFirst = false, }) {
24
27
  const [keyValue, setKeyValue] = React.useState("");
25
28
  const [value, setValue] = React.useState("");
26
29
  const [input, setInput] = React.useState("");
@@ -128,6 +131,21 @@ function CreatableComponent({ buttonClassName = `${settings.prefix}--bmrg-creata
128
131
  if (onChange)
129
132
  onChange(items);
130
133
  };
134
+ const sensors = core.useSensors(core.useSensor(core.PointerSensor, {
135
+ activationConstraint: { distance: 5 },
136
+ }));
137
+ function handleDragEnd(event) {
138
+ const { active, over } = event;
139
+ if (over && active.id !== over.id) {
140
+ const oldIndex = tagItems.indexOf(active.id);
141
+ const newIndex = tagItems.indexOf(over.id);
142
+ const reorderedItems = sortable.arrayMove(tagItems, oldIndex, newIndex);
143
+ setCreatedItems(reorderedItems);
144
+ if (onChange) {
145
+ onChange(reorderedItems);
146
+ }
147
+ }
148
+ }
131
149
  return (React__default.default.createElement("div", { key: key, className: `${settings.prefix}--bmrg-creatable` },
132
150
  React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-creatable__input` },
133
151
  createKeyValuePair ? (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-creatable__key-value-inputs` },
@@ -149,9 +167,20 @@ function CreatableComponent({ buttonClassName = `${settings.prefix}--bmrg-creata
149
167
  React__default.default.createElement(TooltipHover.default, { ...tooltipProps, tooltipText: tooltipContent },
150
168
  React__default.default.createElement(icons.Information, { size: 16, fill: "currentColor" }))))), onBlur: onInputBlur, onChange: onInputChange, placeholder: placeholder, ref: inputRef, type: type, value: input, ...textInputProps })),
151
169
  React__default.default.createElement(react.Button, { className: createButtonClassName, disabled: isAddButtonDisabled, onClick: addValue, iconDescription: "Add", renderIcon: icons.Add, size: "md", type: "button", ...buttonProps }, buttonContent)),
152
- React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-creatable__tags` }, tagsToShow.map((item, index) => (React__default.default.createElement(react.Tag, { key: `${item}-${index}`, disabled: disabled, type: tagType, onClick: nonDeletable && initialTagItems.includes(item) ? undefined : () => removeValue(item), onKeyDown: nonDeletable && initialTagItems.includes(item)
170
+ reorderable ? (React__default.default.createElement(core.DndContext, { sensors: disabled ? [] : sensors, collisionDetection: core.closestCenter, onDragEnd: handleDragEnd },
171
+ React__default.default.createElement(sortable.SortableContext, { items: tagsToShow, strategy: sortable.verticalListSortingStrategy },
172
+ React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-creatable__tags--reorderable` }, tagsToShow.map((item, index) => (React__default.default.createElement(ReorderableTag, { key: `${item}-${index}`, disabled: disabled, initialTagItems: initialTagItems, item: item, nonDeletable: nonDeletable, removeValue: removeValue, tagProps: tagProps, tagType: tagType }))))))) : (React__default.default.createElement("div", { className: `${settings.prefix}--bmrg-creatable__tags` }, tagsToShow.map((item, index) => (React__default.default.createElement(react.Tag, { key: `${item}-${index}`, disabled: disabled, type: tagType, onClick: nonDeletable && initialTagItems.includes(item) ? undefined : () => removeValue(item), onKeyDown: nonDeletable && initialTagItems.includes(item)
153
173
  ? undefined
154
- : (e) => accessibility.isAccessibleKeyDownEvent(e) && removeValue(item), filter: !nonDeletable || (nonDeletable && !initialTagItems.includes(item)), ...tagProps }, item))))));
174
+ : (e) => accessibility.isAccessibleKeyDownEvent(e) && removeValue(item), filter: !nonDeletable || (nonDeletable && !initialTagItems.includes(item)), ...tagProps }, item)))))));
175
+ }
176
+ function ReorderableTag({ disabled, initialTagItems, item, nonDeletable, removeValue, tagProps, tagType, }) {
177
+ const { attributes, listeners, setNodeRef, transform, transition } = sortable.useSortable({ id: item });
178
+ const style = {
179
+ transform: utilities.CSS.Transform.toString(transform),
180
+ transition,
181
+ };
182
+ return (React__default.default.createElement("div", { ref: setNodeRef, ...attributes, ...(!disabled ? listeners : {}), style: style },
183
+ React__default.default.createElement(react.DismissibleTag, { disabled: disabled, type: tagType, onClose: nonDeletable && initialTagItems.includes(item) ? undefined : () => removeValue(item), renderIcon: icons.Draggable, title: "", text: item, ...tagProps })));
155
184
  }
156
185
 
157
186
  exports.default = CreatableComponent;
@@ -117,9 +117,18 @@ function DataDrivenInput(props) {
117
117
  Component = Creatable$1;
118
118
  componentProps = {
119
119
  ...allInputProps,
120
- createKeyValuePair: type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR || type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE,
120
+ createKeyValuePair: type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR ||
121
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
122
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
123
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
121
124
  nonDeletable: type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_NON_DELETABLE ||
122
- type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE,
125
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
126
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
127
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
128
+ reorderable: type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE ||
129
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
130
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
131
+ type === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE,
123
132
  invalid: invalidInput,
124
133
  invalidText: invalidTextMessage,
125
134
  placeholder,
@@ -134,7 +134,13 @@ async function handleGoverningSelectChange({ formikProps, input, inputs, isInput
134
134
  /** Erase value of governed inputs */
135
135
  if (inputsGovernedByCurrentOne.length) {
136
136
  await inputsGovernedByCurrentOne.forEach(async (input) => {
137
- await handleGoverningSelectChange({ formikProps, input, inputs, isInputBeingChanged: false, selectedItem: null });
137
+ await handleGoverningSelectChange({
138
+ formikProps,
139
+ input,
140
+ inputs,
141
+ isInputBeingChanged: false,
142
+ selectedItem: null,
143
+ });
138
144
  });
139
145
  }
140
146
  // only the top governing select should display warnings if changed and reset touched status for governed ones
@@ -226,8 +232,12 @@ function generateYupAst({ inputs, allowCustomPropertySyntax, customPropertySynta
226
232
  if (inputType === DataDrivenInputTypes.MULTI_SELECT_TYPES.MULTI_SELECT ||
227
233
  inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE ||
228
234
  inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_NON_DELETABLE ||
235
+ inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE ||
236
+ inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_SINGLE_REORDERABLE_NON_DELETABLE ||
229
237
  inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR ||
230
238
  inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_NON_DELETABLE ||
239
+ inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE ||
240
+ inputType === DataDrivenInputTypes.CREATABLE_TYPES.CREATABLE_PAIR_REORDERABLE_NON_DELETABLE ||
231
241
  inputType === DataDrivenInputTypes.CHECKBOX_TYPES.CHECKBOX) {
232
242
  if (useCSVforArrays) {
233
243
  yupValidationArray.push(["yup.string"]);
@@ -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, userTeamsAssets, } = props;
65
+ 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;
66
66
  const hasUserTeams = Boolean(userTeams);
67
67
  const userTeamsUrl = servicesConfig.serviceUrl.getUserTeamsServices({ baseServicesUrl });
68
68
  const teamsQuery = reactQuery.useQuery({
@@ -70,6 +70,7 @@ function Header(props) {
70
70
  queryFn: servicesConfig.resolver.query(userTeamsUrl, null),
71
71
  enabled: !hasUserTeams && Boolean(baseServicesUrl),
72
72
  });
73
+ const showTeamSwitcher = enableTeamSwitcher && Boolean(user);
73
74
  return (React__default.default.createElement(React__default.default.Fragment, null,
74
75
  React__default.default.createElement(react.Theme, { theme: carbonTheme },
75
76
  React__default.default.createElement(react.Header, { "aria-label": "App navigation header", className: className },
@@ -80,7 +81,7 @@ function Header(props) {
80
81
  ? 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)))
81
82
  : null),
82
83
  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, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams }),
84
+ showTeamSwitcher ? (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, refetchUser: refetchUser, refetchNavigation: refetchNavigation, teamsQuery: teamsQuery, trackEvent: trackEvent, user: user, userTeams: userTeams })) : null,
84
85
  props?.instanceSwitcherEnabled && (React__default.default.createElement(InstanceSwitcherMenu, { enabled: Boolean(props.instanceSwitcherEnabled), menuItems: platform?.instances })),
85
86
  React__default.default.createElement(RequestsMenu, { baseEnvUrl: baseEnvUrl, enabled: Boolean(props.requestSummary), summary: props.requestSummary }),
86
87
  React__default.default.createElement(NotificationsMenu, { baseEnvUrl: baseEnvUrl, baseServicesUrl: baseServicesUrl, enabled: Boolean(props.enableNotifications), countEnabled: Boolean(props.enableNotificationsCount) }),
@@ -11,6 +11,7 @@ var HeaderMenu = require('./HeaderMenu.js');
11
11
  var servicesConfig = require('../../config/servicesConfig.js');
12
12
  var settings = require('../../internal/settings.js');
13
13
  var UserType = require('../../constants/UserType.js');
14
+ var TeamTypes = require('../../constants/TeamTypes.js');
14
15
 
15
16
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
17
 
@@ -52,6 +53,7 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
52
53
  const showSelectTeamPurpose = navigationPlatform?.requireTeamPurpose;
53
54
  const createTeamButtonText = showSelectTeamPurpose ? "Create Team" : "Create or Join Team";
54
55
  const userTeamInstanceSwitcherDefault = user?.teamInstanceSwitcherDefault;
56
+ const hasUpdatedDefaultTeamRef = React__default.default.useRef(false);
55
57
  const teamLink = ({ teamId }) => {
56
58
  return `${navigationPlatform.baseEnvUrl}/launchpad/teams/${teamId}`;
57
59
  };
@@ -90,7 +92,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
90
92
  const userHasTeams = userHasPersonalTeam || userHasAccountTeams || userHasStandardTeams;
91
93
  const handleSelectTeam = async ({ team }) => {
92
94
  setSelectedTeam(team);
93
- if (!userTeamInstanceSwitcherDefault) {
95
+ if (!userTeamInstanceSwitcherDefault &&
96
+ !hasUpdatedDefaultTeamRef.current) {
97
+ hasUpdatedDefaultTeamRef.current = true;
94
98
  const body = {
95
99
  teamInstanceSwitcherDefault: team.id,
96
100
  };
@@ -98,6 +102,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
98
102
  }
99
103
  };
100
104
  const handleNoTeamsToSelect = async () => {
105
+ if (hasUpdatedDefaultTeamRef.current)
106
+ return;
107
+ hasUpdatedDefaultTeamRef.current = true;
101
108
  const body = {
102
109
  teamInstanceSwitcherDefault: null,
103
110
  };
@@ -147,6 +154,9 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
147
154
  teamsQuery?.data?.personalTeam?.length === 0))) {
148
155
  handleNoTeamsToSelect();
149
156
  }
157
+ else if (userTeamInstanceSwitcherDefault === null) {
158
+ setSelectedTeam(null);
159
+ }
150
160
  }, [
151
161
  baseServicesUrl,
152
162
  hasUserTeams,
@@ -223,33 +233,58 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
223
233
  standardTeams = teamsQuery?.data?.standardTeams ?? [];
224
234
  personalTeam = teamsQuery?.data?.personalTeam ?? [];
225
235
  }
226
- let sortedAccountTeamsWithNamesToDisplay = [];
227
- let sortedStandardTeamsWithNamesToDisplay = [];
236
+ let newPersonalTeam = personalTeam.length > 0
237
+ ? personalTeam.map((personalTeam) => ({
238
+ ...personalTeam,
239
+ type: TeamTypes.TEAM_TYPES.PERSONAL,
240
+ nameToDisplay: personalTeam.displayName ? personalTeam.displayName : personalTeam.name,
241
+ }))
242
+ : [];
243
+ let newAccountTeams = [];
244
+ let newStandardTeams = [];
228
245
  if (accountTeams?.length > 0) {
229
- const newAccountTeams = accountTeams.map((team) => {
246
+ newAccountTeams = accountTeams.map((team) => {
230
247
  let newProjectTeams = [];
231
248
  if (team.projectTeams && team.projectTeams.length > 0) {
232
- newProjectTeams = team.projectTeams?.map((team) => ({
233
- ...team,
234
- nameToDisplay: team.displayName ? team.displayName : team.name,
235
- }));
249
+ newProjectTeams = team.projectTeams?.map((projectTeam) => {
250
+ return {
251
+ ...projectTeam,
252
+ nameToDisplay: projectTeam.displayName ? projectTeam.displayName : projectTeam.name,
253
+ };
254
+ });
236
255
  }
237
256
  return {
238
257
  ...team,
239
258
  nameToDisplay: team.displayName ? team.displayName : team.name,
259
+ type: TeamTypes.TEAM_TYPES.ACCOUNT,
240
260
  projectTeams: sortBy__default.default(newProjectTeams, ["nameToDisplay"]),
241
261
  };
242
262
  });
243
- sortedAccountTeamsWithNamesToDisplay = sortBy__default.default(newAccountTeams, ["nameToDisplay"]);
244
263
  }
245
264
  if (standardTeams?.length > 0) {
246
- const newStandardTeams = standardTeams.map((team) => {
265
+ newStandardTeams = standardTeams.map((team) => {
247
266
  return {
248
267
  ...team,
268
+ type: TeamTypes.TEAM_TYPES.STANDARD,
249
269
  nameToDisplay: team.displayName ? team.displayName : team.name,
250
270
  };
251
271
  });
252
- sortedStandardTeamsWithNamesToDisplay = sortBy__default.default(newStandardTeams, ["nameToDisplay"]);
272
+ }
273
+ let allTeams = newPersonalTeam.concat(newAccountTeams, newStandardTeams);
274
+ const order = { [TeamTypes.TEAM_TYPES.PERSONAL]: 1, [TeamTypes.TEAM_TYPES.ACCOUNT]: 2, [TeamTypes.TEAM_TYPES.STANDARD]: 3 };
275
+ allTeams = sortBy__default.default(allTeams, [(team) => order[team.type], "nameToDisplay"]);
276
+ if (selectedTeam) {
277
+ const selectedTeamIndex = allTeams.findIndex((team, index) => {
278
+ if (team.id === selectedTeam.id) {
279
+ return true;
280
+ }
281
+ else if (Array.isArray(team.projectTeams) && team.projectTeams?.length > 0) {
282
+ return team.projectTeams.some((projectTeam) => projectTeam.id === selectedTeam.id);
283
+ }
284
+ return false;
285
+ });
286
+ const [removedTeam] = allTeams.splice(selectedTeamIndex, 1);
287
+ allTeams.unshift(removedTeam);
253
288
  }
254
289
  let selectedTeamName = selectedTeam?.displayName
255
290
  ? selectedTeam.displayName
@@ -271,79 +306,72 @@ function HeaderTeamSwitcher({ analyticsHelpers, baseServicesUrl, createJoinTeamT
271
306
  React__default.default.createElement("div", { className: headerTeamSwitcherCreateTeamButtonClassname },
272
307
  React__default.default.createElement("span", { className: headerTeamSwitcherCreateTeamButtonTextClassname }, createTeamButtonText),
273
308
  React__default.default.createElement(icons.AddAlt, { className: headerTeamSwitcherCreateTeamButtonIconClassname })))),
274
- personalTeam.length > 0
275
- ? personalTeam.map((team) => {
276
- const teamName = team.displayName ? team.displayName : team.name;
309
+ allTeams.map((team) => {
310
+ if (Boolean(team?.id)) {
277
311
  const isTeamSelected = team.id === selectedTeam?.id;
278
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-personal-menu-item-id` },
279
- React__default.default.createElement(react.HeaderMenuItem, { key: team.id, id: `${team.id}-personal-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
280
- handleTeamClick({ team, type: "personal" });
281
- },
282
- // eslint-disable-next-line no-script-url
283
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-item" },
284
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
285
- React__default.default.createElement("span", { title: teamName, className: headerDropdownMenuItemTextClassname }, teamName),
286
- isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
287
- })
288
- : null,
289
- accountTeams.length > 0
290
- ? sortedAccountTeamsWithNamesToDisplay.map((team) => {
291
- const isSubmenuOpen = team.id === openAccountSubmenuId;
292
- const isProjectTeamSelected = team.projectTeams &&
293
- team.projectTeams.length > 0 &&
294
- team.projectTeams.some((team) => team.id === selectedTeam?.id);
295
- const isTeamSelected = team.id === selectedTeam?.id;
296
- const isMenuSelected = isTeamSelected || isProjectTeamSelected;
297
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
298
- React__default.default.createElement(react.HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
299
- // eslint-disable-next-line no-script-url
300
- href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-account-accordion" },
301
- React__default.default.createElement("div", { className: headerDropdownMenuItemAccountClassname },
302
- React__default.default.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
303
- React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
304
- isMenuSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
305
- React__default.default.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
306
- React__default.default.createElement(icons.GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
307
- React__default.default.createElement(icons.ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
308
- React__default.default.createElement("div", { id: `${team.id}-account-submenu`, key: `${team.id}-account-submenu`, "aria-expanded": isSubmenuOpen, className: headerDropdownMenuItemAccountSubmenuClassname },
309
- React__default.default.createElement(react.HeaderMenuItem, { key: `${team.id}-menu-item`, id: `${team.id}-account-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
310
- handleTeamClick({ team, type: "account" });
311
- }, "data-testid": "header-team-switcher-menu-account-accordion-item",
312
+ if (team.type === TeamTypes.TEAM_TYPES.ACCOUNT) {
313
+ const isSubmenuOpen = team.id === openAccountSubmenuId;
314
+ const projectTeams = team.projectTeams;
315
+ const existProjectTeams = Array.isArray(projectTeams) && projectTeams.length > 0;
316
+ let selectedProjectTeamIndex = -1;
317
+ if (existProjectTeams) {
318
+ selectedProjectTeamIndex = projectTeams.findIndex((team) => team.id === selectedTeam?.id);
319
+ }
320
+ const isProjectTeamSelected = selectedProjectTeamIndex >= 0;
321
+ const isMenuSelected = isTeamSelected || isProjectTeamSelected;
322
+ if (existProjectTeams && isProjectTeamSelected) {
323
+ const [removedTeam] = projectTeams.splice(selectedProjectTeamIndex, 1);
324
+ projectTeams.unshift(removedTeam);
325
+ }
326
+ return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-account-menu` },
327
+ React__default.default.createElement(react.HeaderMenuItem, { "aria-expanded": isSubmenuOpen, "aria-selected": isMenuSelected, className: headerDropdownMenuItemAccountContainerClassname, onClick: (e) => handleOpenAccountSubmenu({ e, id: team.id }),
328
+ // eslint-disable-next-line no-script-url
329
+ href: "javascript:void(0)", "data-testid": "header-team-switcher-menu-account-accordion" },
330
+ React__default.default.createElement("div", { className: headerDropdownMenuItemAccountClassname },
331
+ React__default.default.createElement("div", { className: headerDropdownMenuItemTextIconClassname },
332
+ React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
333
+ isMenuSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null),
334
+ React__default.default.createElement("div", { className: headerDropdownMenuItemAccountIconsClassname },
335
+ React__default.default.createElement(icons.GroupAccount, { className: headerDropdownMenuItemAccountGroupIconClassname }),
336
+ React__default.default.createElement(icons.ChevronDown, { className: headerDropdownMenuItemAccountChevronIconClassname })))),
337
+ React__default.default.createElement("div", { id: `${team.id}-account-submenu`, key: `${team.id}-account-submenu`, "aria-expanded": isSubmenuOpen, className: headerDropdownMenuItemAccountSubmenuClassname },
338
+ React__default.default.createElement(react.HeaderMenuItem, { key: `${team.id}-menu-item`, id: `${team.id}-account-menu-item`, "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
339
+ handleTeamClick({ team, type: "account" });
340
+ }, "data-testid": "header-team-switcher-menu-account-accordion-item",
341
+ // eslint-disable-next-line no-script-url
342
+ href: "javascript:void(0)" },
343
+ React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
344
+ React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
345
+ isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
346
+ projectTeams && projectTeams.length > 0
347
+ ? projectTeams.map((team) => {
348
+ const isTeamSelected = team.id === selectedTeam?.id;
349
+ return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
350
+ React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
351
+ handleTeamClick({ team, type: "project" });
352
+ }, "data-testid": "header-team-switcher-menu-account-accordion-item",
353
+ // eslint-disable-next-line no-script-url
354
+ href: "javascript:void(0)" },
355
+ React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
356
+ React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
357
+ isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
358
+ })
359
+ : null)));
360
+ }
361
+ else {
362
+ return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-${team.type}-menu-item` },
363
+ React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
364
+ handleTeamClick({ team, type: team.type ?? "" });
365
+ }, "data-testid": "header-team-switcher-menu-item",
312
366
  // eslint-disable-next-line no-script-url
313
367
  href: "javascript:void(0)" },
314
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
315
- React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, "Account Page"),
316
- isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null)),
317
- team.projectTeams && team.projectTeams.length > 0
318
- ? team.projectTeams.map((team) => {
319
- const isTeamSelected = team.id === selectedTeam?.id;
320
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-project-menu-item` },
321
- React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
322
- handleTeamClick({ team, type: "project" });
323
- }, "data-testid": "header-team-switcher-menu-account-accordion-item",
324
- // eslint-disable-next-line no-script-url
325
- href: "javascript:void(0)" },
326
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname, style: { paddingLeft: "1rem" } },
327
- React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
328
- isTeamSelected ? (React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname })) : null))));
329
- })
330
- : null)));
331
- })
332
- : null,
333
- standardTeams.length > 0
334
- ? sortedStandardTeamsWithNamesToDisplay.map((team) => {
335
- const isTeamSelected = team.id === selectedTeam?.id;
336
- return (React__default.default.createElement("div", { key: team.id, id: `${team.id}-standard-menu-item` },
337
- React__default.default.createElement(react.HeaderMenuItem, { "aria-selected": isTeamSelected, className: headerDropdownMenuItemContainerClassname, onClick: () => {
338
- handleTeamClick({ team, type: "standard" });
339
- }, "data-testid": "header-team-switcher-menu-item",
340
- // eslint-disable-next-line no-script-url
341
- href: "javascript:void(0)" },
342
- React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
343
- React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
344
- isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
345
- })
346
- : null))));
368
+ React__default.default.createElement("div", { className: headerDropdownMenuItemClassname },
369
+ React__default.default.createElement("span", { title: team.nameToDisplay, className: headerDropdownMenuItemTextClassname }, team.nameToDisplay),
370
+ isTeamSelected ? React__default.default.createElement(icons.CheckmarkFilled, { className: headerDropdownMenuItemIconClassname }) : null))));
371
+ }
372
+ }
373
+ return null;
374
+ })))));
347
375
  }
348
376
  return null;
349
377
  }