@rh-support/manage 2.5.30 → 2.5.32

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.
Files changed (82) hide show
  1. package/lib/esm/components/Configs/ConfigsTable.js +1 -1
  2. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts.map +1 -1
  3. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.js +1 -1
  4. package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts.map +1 -1
  5. package/lib/esm/components/Groups/GroupSelect/GroupSelect.js +54 -22
  6. package/lib/esm/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.d.ts.map +1 -1
  7. package/lib/esm/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.js +19 -14
  8. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +3 -3
  9. package/lib/esm/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.d.ts.map +1 -1
  10. package/lib/esm/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.js +9 -9
  11. package/lib/esm/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.d.ts.map +1 -1
  12. package/lib/esm/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.js +106 -67
  13. package/lib/esm/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.d.ts.map +1 -1
  14. package/lib/esm/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.js +7 -12
  15. package/lib/esm/components/ManageExpiredContents/ExpiredContentCategory.js +3 -3
  16. package/lib/esm/components/ManageExpiredContents/ExpiredContentHeader.js +1 -1
  17. package/lib/esm/components/ManageExpiredContents/ExpiredContentManager.d.ts.map +1 -1
  18. package/lib/esm/components/ManageExpiredContents/ExpiredContentManager.js +5 -6
  19. package/lib/esm/components/ManageExpiredContents/ExpiredContentSingleItem.js +2 -2
  20. package/lib/esm/components/ManageExpiredContents/ExpiredContentSingleItemView.js +2 -2
  21. package/lib/esm/components/ManagePartnerships/NonOrgCustomerInfoModal.js +5 -5
  22. package/lib/esm/components/ManagePartnerships/PartnershipsList.d.ts.map +1 -1
  23. package/lib/esm/components/ManagePartnerships/PartnershipsList.js +5 -6
  24. package/lib/esm/components/ManagePartnerships/PartnershipsTermsModal.d.ts.map +1 -1
  25. package/lib/esm/components/ManagePartnerships/PartnershipsTermsModal.js +15 -20
  26. package/lib/esm/components/ManagePartnerships/RequestCollaborationModal.d.ts.map +1 -1
  27. package/lib/esm/components/ManagePartnerships/RequestCollaborationModal.js +9 -16
  28. package/lib/esm/components/ManagePartnerships/Requests.d.ts.map +1 -1
  29. package/lib/esm/components/ManagePartnerships/Requests.js +5 -6
  30. package/lib/esm/components/ManagePartnerships/index.js +1 -1
  31. package/lib/esm/components/ManagePreferences/PreferencesHeader.js +1 -1
  32. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.d.ts +1 -1
  33. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.d.ts.map +1 -1
  34. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.js +26 -27
  35. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.js +3 -3
  36. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.d.ts.map +1 -1
  37. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.js +3 -4
  38. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseSearch.d.ts.map +1 -1
  39. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseSearch.js +2 -3
  40. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.js +6 -7
  41. package/lib/esm/components/ManageTable/ManageTable.d.ts +3 -4
  42. package/lib/esm/components/ManageTable/ManageTable.d.ts.map +1 -1
  43. package/lib/esm/components/ManageTable/ManageTable.js +12 -19
  44. package/lib/esm/components/ManageTags/TagsManager.d.ts.map +1 -1
  45. package/lib/esm/components/ManageTags/TagsManager.js +24 -27
  46. package/lib/esm/components/NotificationEmails/NotificationEmailsModal.d.ts.map +1 -1
  47. package/lib/esm/components/NotificationEmails/NotificationEmailsModal.js +14 -14
  48. package/lib/esm/components/NotificationEmails/index.js +2 -3
  49. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimit.d.ts.map +1 -1
  50. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimit.js +2 -3
  51. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimitGuidelines.js +6 -6
  52. package/lib/esm/components/TopContentManagement/CategoryLimit/QuestionAnswer.js +1 -1
  53. package/lib/esm/components/TopContentManagement/ContentUsage/ContentAccordion.d.ts.map +1 -1
  54. package/lib/esm/components/TopContentManagement/ContentUsage/ContentAccordion.js +5 -5
  55. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetrics.js +8 -8
  56. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.d.ts +2 -3
  57. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.d.ts.map +1 -1
  58. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.js +16 -9
  59. package/lib/esm/components/TopContentManagement/ContentUsage/VersionPerformanceMetrics.d.ts.map +1 -1
  60. package/lib/esm/components/TopContentManagement/ContentUsage/VersionPerformanceMetrics.js +11 -11
  61. package/lib/esm/components/TopContentManagement/NoTopContentFound.d.ts.map +1 -1
  62. package/lib/esm/components/TopContentManagement/NoTopContentFound.js +13 -14
  63. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/AddNewCategoryDropDown.d.ts.map +1 -1
  64. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/AddNewCategoryDropDown.js +46 -39
  65. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentCategory.js +4 -4
  66. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentCategoryNew.js +3 -3
  67. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentComponent.js +1 -1
  68. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItem.js +5 -5
  69. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItemLink.d.ts.map +1 -1
  70. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItemLink.js +2 -3
  71. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentEditor.js +4 -4
  72. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestion.js +2 -2
  73. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHint.js +4 -5
  74. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHintAccept.d.ts.map +1 -1
  75. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHintAccept.js +51 -25
  76. package/lib/esm/components/TopContentManagement/TopContentHeader.js +1 -1
  77. package/lib/esm/components/TopContentManagement/TopContentProductVersionSelector.d.ts.map +1 -1
  78. package/lib/esm/components/TopContentManagement/TopContentProductVersionSelector.js +58 -29
  79. package/lib/esm/scss/_main.scss +23 -19
  80. package/lib/esm/scss/_pf-overrides.scss +50 -46
  81. package/lib/esm/scss/index.scss +4 -4
  82. package/package.json +12 -12
@@ -120,7 +120,7 @@ export const ConfigsTable = () => {
120
120
  React.createElement("div", { className: "toolbar-right" },
121
121
  React.createElement("label", { htmlFor: "search-config-filelds" },
122
122
  React.createElement(Trans, null, "Filter by")),
123
- React.createElement(SearchInput, { className: "pf-v5-u-flex-grow-1 pf-v5-c-search-input pf-v5-u-background-color-100", id: "search-config-filelds", placeholder: "Search for an existing config name", value: searchString, onChange: (_, value) => onSearchChange(value), onClear: () => onSearchChange(''), "aria-label": "Search for an existing config name" }))),
123
+ React.createElement(SearchInput, { className: "pf-v6-u-flex-grow-1 pf-v6-c-search-input pf-v6-u-background-color-100", id: "search-config-filelds", placeholder: "Search for an existing config name", value: searchString, onChange: (_, value) => onSearchChange(value), onClear: () => onSearchChange(''), "aria-label": "Search for an existing config name" }))),
124
124
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: 'There was an error loading config page' } },
125
125
  React.createElement(ManageTable, { sortInfo: { column: 'created-date', direction: 'desc' }, ariaLabel: 'Table to manage pcm config', columns: columns, data: filteredValues, isFetching: isFetching, isError: false, errorTitle: 'Config table error', errorComponent: React.createElement(Trans, null, "Could not get configs"), keepPageNumberOnDataChange: keepPageNumberOnDataChange }))));
126
126
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultGroupSwitch.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAIvF,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,MAAM;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,kBAAkB,UAAW,MAAM,sBA6C/C,CAAC"}
1
+ {"version":3,"file":"DefaultGroupSwitch.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAIvF,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,MAAM;IACZ,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5D;AAED,eAAO,MAAM,kBAAkB,UAAW,MAAM,sBA4C/C,CAAC"}
@@ -34,6 +34,6 @@ export const DefaultGroupSwitch = (props) => {
34
34
  }
35
35
  });
36
36
  return (React.createElement(React.Fragment, null,
37
- React.createElement(Switch, { "aria-label": "Toggle default group", "data-tracking-id": `group-user-toggle-default-${user.isDefault ? 'off' : 'on'}`, label: t('On'), labelOff: t('Off'), id: id, isDisabled: user.access === false || user.write === false || toggleDefaultGroupFetch.isFetching, isChecked: user.isDefault, onChange: (_event, isChecked) => toggleDefault(isChecked) }),
37
+ React.createElement(Switch, { "aria-label": "Toggle default group", "data-tracking-id": `group-user-toggle-default-${user.isDefault ? 'off' : 'on'}`, label: t('On'), id: id, isDisabled: user.access === false || user.write === false || toggleDefaultGroupFetch.isFetching, isChecked: user.isDefault, onChange: (_event, isChecked) => toggleDefault(isChecked) }),
38
38
  React.createElement(LoadingIndicator, { show: toggleDefaultGroupFetch.isFetching, size: "xs" })));
39
39
  };
@@ -1 +1 @@
1
- {"version":3,"file":"GroupSelect.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/GroupSelect/GroupSelect.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AA4B3E,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,UAAU,MAAM;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAKD,eAAO,MAAM,WAAW,UAAW,MAAM,sBAycxC,CAAC"}
1
+ {"version":3,"file":"GroupSelect.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/GroupSelect/GroupSelect.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAuC3E,OAAO,KAAmD,MAAM,OAAO,CAAC;AAKxE,UAAU,MAAM;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAKD,eAAO,MAAM,WAAW,UAAW,MAAM,sBAuhBxC,CAAC"}
@@ -8,9 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { publicApi } from '@cee-eng/hydrajs';
11
- import { Dropdown, DropdownItem, DropdownToggle, Select, SelectOption, SelectVariant, } from '@patternfly/react-core/deprecated';
11
+ import { Button, Dropdown, MenuContent, MenuItem, MenuList, MenuToggle, Select, SelectList, SelectOption, Spinner, TextInput, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, } from '@patternfly/react-core';
12
12
  import CogIcon from '@patternfly/react-icons/dist/js/icons/cog-icon';
13
- import { AlertMessage, AlertType, ToastNotification, useConfirmation, useFetch, usePrevious, } from '@rh-support/components';
13
+ import TimesIcon from '@patternfly/react-icons/dist/js/icons/times-icon';
14
+ import { AlertMessage, AlertType, ToastNotification, useConfirmation, useFetch, usePrevious, useSelectKeyboardNavigator, } from '@rh-support/components';
14
15
  import { fetchCaseGroupsForSSO, setCaseGroups, useGlobalDispatchContext, useGlobalStateContext, } from '@rh-support/react-context';
15
16
  import { ability, resourceActions, resources } from '@rh-support/user-permissions';
16
17
  import { haventLoadedMetadata } from '@rh-support/utils';
@@ -34,6 +35,8 @@ export const GroupSelect = (props) => {
34
35
  : t('Select a group to view accounts');
35
36
  const getGroup = useCallback((groupName) => (caseGroups.data || []).find((groupObj) => groupObj.name === groupName), [caseGroups]);
36
37
  const confirmation = useConfirmation();
38
+ const [input, setInput] = useState('');
39
+ const [shouldFilter, setShouldFilter] = useState(false);
37
40
  // Fetch groups on init
38
41
  useEffect(() => {
39
42
  var _a, _b;
@@ -53,12 +56,12 @@ export const GroupSelect = (props) => {
53
56
  }, [dispatch, loggedInUserJwtToken, caseGroups]);
54
57
  // handle dropdown open/close toggle.
55
58
  const [isOpen, setIsOpen] = useState(false);
56
- const toggleIsOpen = (isExpanded) => setIsOpen(isExpanded);
57
59
  // handle group selection
58
60
  const [selectedGroup, setSelectedGroup] = useState();
59
61
  const previouslySelectedGroup = usePrevious(selectedGroup);
60
62
  const onClear = () => {
61
63
  setSelectedGroup(null);
64
+ setShouldFilter(false);
62
65
  props.onSelect(null);
63
66
  };
64
67
  useEffect(() => {
@@ -66,10 +69,12 @@ export const GroupSelect = (props) => {
66
69
  onSelectProp(selectedGroup ? getGroup(selectedGroup) : null);
67
70
  }
68
71
  }, [selectedGroup, getGroup, onSelectProp, previouslySelectedGroup]);
69
- const onSelect = (event, group) => {
70
- const newGroup = getGroup(group);
72
+ const handleSelect = (group) => {
73
+ const newGroup = selectedGroup !== group.name;
74
+ setInput(group.name);
71
75
  if (newGroup) {
72
- setSelectedGroup(group);
76
+ setSelectedGroup(group.name);
77
+ setShouldFilter(false);
73
78
  }
74
79
  setIsOpen(false);
75
80
  };
@@ -91,17 +96,17 @@ export const GroupSelect = (props) => {
91
96
  const deleteGroupFetch = useFetch(publicApi.caseGroups.deleteGroup, { propgateErrors: true });
92
97
  const duplicateGroupFetch = useFetch(publicApi.caseGroups.createGroup, { propgateErrors: true });
93
98
  // group actions input state
94
- const [input, setInput] = useState('');
95
- const onMultiSelect = () => null;
96
- const onMultiClear = () => setInput('');
99
+ const textInputRef = useRef();
97
100
  const disableOnFetch = caseGroups.isFetching ||
98
101
  createGroupFetch.isFetching ||
99
102
  renameGroupFetch.isFetching ||
100
103
  deleteGroupFetch.isFetching ||
101
104
  duplicateGroupFetch.isFetching;
102
- const onChange = (e) => {
103
- setInput(e.target.value);
104
- return [];
105
+ const onChange = (e, value) => {
106
+ setInput(value);
107
+ if (value !== input) {
108
+ setShouldFilter(true);
109
+ }
105
110
  };
106
111
  useEffect(() => setInput(selectedGroup), [selectedGroup]);
107
112
  // group actions
@@ -261,12 +266,12 @@ export const GroupSelect = (props) => {
261
266
  setInput(selectedGroup);
262
267
  };
263
268
  const dropdownItems = [
264
- React.createElement(DropdownItem, { className: "create-group-action", isDisabled: !ability.can(resourceActions.CREATE, resources.CASE_GROUPS), key: "create", component: "button", onClick: onActionFocus(actions.create), "data-tracking-id": "manage-group-create" }, t('Create')),
265
- React.createElement(DropdownItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.UPDATE, resources.CASE_GROUPS), key: "rename", component: "button", onClick: onActionFocus(actions.rename), "data-tracking-id": "manage-group-rename" }, t('Rename')),
266
- React.createElement(DropdownItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.DELETE, resources.CASE_GROUPS), key: "delete", component: "button", onClick: onActionFocus(actions.delete), "data-tracking-id": "manage-group-delete" }, t('Delete')),
267
- React.createElement(DropdownItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.CREATE, resources.CASE_GROUPS), key: "duplicate", component: "button", "data-tracking-id": "manage-group-duplicate", onClick: onActionFocus(actions.duplicate) }, t('Duplicate')),
269
+ React.createElement(MenuItem, { className: "create-group-action", isDisabled: !ability.can(resourceActions.CREATE, resources.CASE_GROUPS), key: "create", onClick: onActionFocus(actions.create), "data-tracking-id": "manage-group-create" }, t('Create')),
270
+ React.createElement(MenuItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.UPDATE, resources.CASE_GROUPS), key: "rename", onClick: onActionFocus(actions.rename), "data-tracking-id": "manage-group-rename" }, t('Rename')),
271
+ React.createElement(MenuItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.DELETE, resources.CASE_GROUPS), key: "delete", onClick: onActionFocus(actions.delete), "data-tracking-id": "manage-group-delete" }, t('Delete')),
272
+ React.createElement(MenuItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.CREATE, resources.CASE_GROUPS), key: "duplicate", onClick: onActionFocus(actions.duplicate), "data-tracking-id": "manage-group-duplicate" }, t('Duplicate')),
268
273
  ];
269
- const dropdownToggle = (React.createElement(DropdownToggle, { isDisabled: props.isDisabled || disableOnFetch, toggleIndicator: null, onToggle: toggleIsDropdownOpen, "data-tracking-id": "manage-group-toggle-options", "aria-label": "Group actions dropdown toggle" },
274
+ const dropdownToggle = (toggleRef) => (React.createElement(MenuToggle, { ref: toggleRef, isDisabled: props.isDisabled || disableOnFetch, onClick: toggleIsDropdownOpen, isExpanded: isDropdownOpen, "data-tracking-id": "manage-group-toggle-options", "aria-label": "Group actions dropdown toggle", variant: "plain" },
270
275
  React.createElement(CogIcon, null)));
271
276
  const submitActionBtn = useRef();
272
277
  useEffect(() => {
@@ -316,18 +321,45 @@ export const GroupSelect = (props) => {
316
321
  const containsOnlySpecialChars = (str) => {
317
322
  return /^[^a-zA-Z0-9]*$/.test(str);
318
323
  };
324
+ const onToggleClick = () => {
325
+ var _a;
326
+ setIsOpen(!isOpen);
327
+ setShouldFilter(false);
328
+ (_a = textInputRef === null || textInputRef === void 0 ? void 0 : textInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
329
+ };
330
+ const filteredGroups = (caseGroups.data || [])
331
+ .filter((g) => g.groupNum !== unGroupedCaseGroupNumber)
332
+ .filter((g) => !shouldFilter ||
333
+ isEmpty(input && typeof input === 'string' && input.trim()) ||
334
+ g.name.toLowerCase().includes(input.toLowerCase()));
335
+ const { focusedItemIndex, onInputKeyDown } = useSelectKeyboardNavigator({
336
+ list: filteredGroups,
337
+ isOpen,
338
+ ignoreResetOnListChange: true,
339
+ resetIndexOnClose: true,
340
+ isDisabled: props.isDisabled,
341
+ setIsOpen,
342
+ onSelect: (selection) => handleSelect(selection),
343
+ });
344
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { ref: toggleRef, variant: "typeahead", onClick: onToggleClick, isExpanded: isOpen, isFullWidth: true, isDisabled: props.isDisabled },
345
+ React.createElement(TextInputGroup, { isPlain: true },
346
+ React.createElement(TextInputGroupMain, { value: input, onClick: onToggleClick, onKeyDown: onInputKeyDown, onChange: onChange, autoComplete: "off", innerRef: textInputRef, placeholder: selectAGroupText, role: "combobox", isExpanded: isOpen, "aria-controls": "group-selector-listbox" }),
347
+ caseGroups.isFetching ? (React.createElement(TextInputGroupUtilities, null,
348
+ React.createElement(Spinner, { size: "md" }))) : (React.createElement(TextInputGroupUtilities, Object.assign({}, (!input ? { style: { display: 'none' } } : {})),
349
+ React.createElement(Button, { icon: React.createElement(TimesIcon, { "aria-hidden": true }), variant: "plain", onClick: onClear, "aria-label": "Clear input value" }))))));
319
350
  return (React.createElement("div", { ref: manageActionsRef, className: "toolbar-left" },
320
351
  showErrorMessage && (React.createElement(AlertMessage, { variant: AlertType.DANGER, title: t('Could not create group'), show: true })),
321
352
  !showErrorMessage && !showInput && (React.createElement(React.Fragment, null,
322
353
  React.createElement("label", null,
323
354
  React.createElement(Trans, null, "Group")),
324
- React.createElement(Select, { variant: SelectVariant.typeahead, isDisabled: caseGroups.isFetching || caseGroups.isError || props.isDisabled || disableOnFetch, "aria-label": "Select a group to view accounts", onToggle: (_event, isExpanded) => toggleIsOpen(isExpanded), onSelect: onSelect, onClear: onClear, noResultsFoundText: t('No results found'), selections: selectedGroup, isOpen: isOpen, "aria-labelledby": selectAGroupText, placeholderText: selectAGroupText, "data-tracking-id": "group-list-selector" }, (caseGroups.data || [])
325
- .filter((g) => g.groupNum !== unGroupedCaseGroupNumber)
326
- .map((data, index) => (React.createElement(SelectOption, { key: index, isSelected: data.name === selectedGroup, value: data.name }, data.name)))))),
327
- !showErrorMessage && showDropdown && (React.createElement(Dropdown, { className: "group-actions-dropdown group-action", onSelect: closeDropdown, toggle: dropdownToggle, isOpen: isDropdownOpen, "aria-label": t('Group actions dropdown'), isPlain: true, dropdownItems: dropdownItems })),
355
+ React.createElement(Select, { id: "group-selector", isOpen: isOpen, onSelect: (e, selection) => handleSelect(selection), onOpenChange: (isOpen) => setIsOpen(isOpen), toggle: toggle, selected: selectedGroup, shouldFocusFirstItemOnOpen: false, "aria-label": "Select a group to view accounts", "aria-labelledby": selectAGroupText, "data-tracking-id": "group-list-selector" },
356
+ React.createElement(SelectList, { id: "group-selector-listbox" }, filteredGroups.length > 0 ? (filteredGroups.map((group, index) => (React.createElement(SelectOption, { id: `group-option-${group.name}`, key: index, value: group, isFocused: focusedItemIndex === index, className: "pf-v6-c-select__menu-wrapper", isSelected: group.name === selectedGroup }, group.name)))) : (React.createElement(SelectOption, { key: "no-results", value: '' }, t('No results found'))))))),
357
+ !showErrorMessage && showDropdown && (React.createElement(Dropdown, { className: "group-actions-dropdown group-action", toggle: dropdownToggle, isOpen: isDropdownOpen, onOpenChange: (isOpen) => setIsDropdownOpen(isOpen), "aria-label": t('Group actions dropdown'), shouldFocusFirstItemOnOpen: false, shouldFocusToggleOnSelect: true, isPlain: true },
358
+ React.createElement(MenuContent, null,
359
+ React.createElement(MenuList, null, dropdownItems)))),
328
360
  !showErrorMessage && showInput && (React.createElement("div", { className: "group-name-select" },
329
361
  React.createElement("div", { className: "group-name-buttons" },
330
- React.createElement(Select, { className: "group-select-input pf-v5-u-mr-sm", isDisabled: disableOnFetch, variant: SelectVariant.typeahead, "aria-label": t('Enter group name'), onToggle: onMultiSelect, onSelect: onMultiSelect, onClear: onMultiClear, onFilter: onChange, selections: input, isOpen: false, placeholderText: t('Enter group name') }),
362
+ React.createElement(TextInput, { className: "group-select-input pf-v6-u-mr-sm", isDisabled: disableOnFetch, "aria-label": t('Enter group name'), placeholder: t('Enter group name'), onChange: onChange, value: input || '' }),
331
363
  React.createElement("button", { ref: submitActionBtn, disabled: disableOnFetch || input.length === 0 || containsOnlySpecialChars(input), className: "btn btn-app btn-link group-action", onClick: onAction, "aria-label": "Group action submit", "data-tracking-id": "group-action-submit", type: "button" },
332
364
  React.createElement(Trans, null, "Save")),
333
365
  React.createElement("button", { key: "cancel", onClick: onGroupActionCancel, className: "btn btn-app btn-link group-action", disabled: disableOnFetch, "data-tracking-id": "group-action-cancel", "aria-label": "Group action cancel", type: "button" },
@@ -1 +1 @@
1
- {"version":3,"file":"GroupUserPermissionsSelect.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAGlE,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,UAAU,MAAM;IACZ,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CAClE;AAID,eAAO,MAAM,0BAA0B,UAAW,MAAM,sBAoFvD,CAAC"}
1
+ {"version":3,"file":"GroupUserPermissionsSelect.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAQlE,OAAO,KAA8B,MAAM,OAAO,CAAC;AAKnD,UAAU,MAAM;IACZ,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,CAAC,CAAC,SAAS,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CAClE;AAID,eAAO,MAAM,0BAA0B,UAAW,MAAM,sBAkFvD,CAAC"}
@@ -8,40 +8,35 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { publicApi } from '@cee-eng/hydrajs';
11
- import { Select, SelectOption } from '@patternfly/react-core/deprecated';
12
- import { LoadingIndicator, ToastNotification, useFetch } from '@rh-support/components';
11
+ import { LoadingIndicator, SingleSelectDropdown, ToastNotification, useFetch, } from '@rh-support/components';
13
12
  import React, { useEffect, useState } from 'react';
14
13
  import { useTranslation } from 'react-i18next';
15
14
  import { GroupUserPermissionOptions } from '../../../constants/GroupUserPermissionsOptions';
16
15
  const options = GroupUserPermissionOptions;
17
16
  export const GroupUserPermissionsSelect = (props) => {
18
17
  const { t } = useTranslation();
19
- const [isOpen, setIsOpen] = useState(false);
20
- const onToggle = () => setIsOpen(!isOpen);
21
18
  const [option, setOption] = useState(initialOptionsSelect(props.user));
22
- const onClear = () => setOption(null);
23
19
  const updateUsersFetch = useFetch(publicApi.caseGroups.updateUsers, { propgateErrors: true });
24
20
  // reset options when user changes
25
21
  useEffect(() => setOption(initialOptionsSelect(props.user)), [props.user]);
26
- const onSelect = (event, newOption) => __awaiter(void 0, void 0, void 0, function* () {
27
- setIsOpen(false);
28
- if (newOption === option) {
22
+ const onSelect = (newOption) => __awaiter(void 0, void 0, void 0, function* () {
23
+ if (newOption.value === option) {
29
24
  return;
30
25
  }
31
26
  try {
32
27
  let newUser = null;
33
28
  switch (true) {
34
- case options.readWrite === newOption:
29
+ case options.readWrite === newOption.value:
35
30
  newUser = Object.assign(Object.assign({}, props.user), { write: true, access: true });
36
31
  break;
37
- case options.read === newOption:
32
+ case options.read === newOption.value:
38
33
  newUser = Object.assign(Object.assign({}, props.user), { write: false, access: true });
39
34
  break;
40
- case options.noAccess === newOption:
35
+ case options.noAccess === newOption.value:
41
36
  newUser = Object.assign(Object.assign({}, props.user), { write: false, access: false });
42
37
  break;
43
38
  }
44
- setOption(newOption);
39
+ setOption(newOption.value);
45
40
  yield updateUsersFetch.request(props.account.accountNumber, props.group.groupNum, [newUser]);
46
41
  props.onChange(newUser);
47
42
  ToastNotification.addSuccessMessage(t(`User permission updated successfully`));
@@ -71,7 +66,17 @@ export const GroupUserPermissionsSelect = (props) => {
71
66
  * 3. We are fetching users
72
67
  * 4. Non-org admins cannot see the manage tab itself and thus that check is not added.
73
68
  */
74
- return (React.createElement(React.Fragment, null,
75
- React.createElement(Select, { isDisabled: updateUsersFetch.isFetching, className: "permissions-select", "aria-label": t('User permissions'), onToggle: onToggle, onSelect: onSelect, onClear: onClear, selections: option, isOpen: isOpen, "aria-labelledby": t('User permissions'), placeholderText: t('Select a permission') }, Object.keys(options).map((key) => (React.createElement(SelectOption, { key: key, value: options[key], "data-tracking-id": `group-user-permission-${key}` }, t(options[key]))))),
69
+ const getSelectedDropdownOption = {
70
+ label: option || '',
71
+ value: option || '',
72
+ };
73
+ const getDropdownOptions = () => {
74
+ return Object.keys(options).map((key) => ({
75
+ label: t(options[key]),
76
+ value: options[key],
77
+ }));
78
+ };
79
+ return (React.createElement("div", { className: "permissions-select" },
80
+ React.createElement(SingleSelectDropdown, { placeholder: 'Select a permission', className: "permissions-select", ariaLabel: t('User permissions'), options: getDropdownOptions(), onSelect: onSelect, isDisabled: updateUsersFetch.isFetching, selected: getSelectedDropdownOption }),
76
81
  React.createElement(LoadingIndicator, { show: updateUsersFetch.isFetching, size: "xs" })));
77
82
  };
@@ -132,7 +132,7 @@ export const ManageGroupUsers = () => {
132
132
  return (React.createElement(React.Fragment, null,
133
133
  React.createElement(AlertMessage, { variant: AlertType.INFO, show: loggedInUserRights.data.isOrgAdmin() &&
134
134
  !loggedInUsersAccount.data.hasGroupACLs &&
135
- !loggedInUserRights.data.isInternal(), isInline: true, className: "pf-v5-u-mb-md", title: t('Case Group ACL is not enabled') },
135
+ !loggedInUserRights.data.isInternal(), isInline: true, className: "pf-v6-u-mb-md", title: t('Case Group ACL is not enabled') },
136
136
  React.createElement("p", null,
137
137
  React.createElement(Trans, { i18nKey: "i18nRequestControl" },
138
138
  "To use case groups to limit user access, enable the",
@@ -146,7 +146,7 @@ export const ManageGroupUsers = () => {
146
146
  }, "data-tracking-id": "case-contact-phone-number-review" }, "Preferences")),
147
147
  React.createElement("br", null),
148
148
  React.createElement(Trans, null, "You can organize and group related cases and filter on the case list page, but you cannot change permissions for case groups unless the Case Group ACL is enabled."))),
149
- React.createElement(AlertMessage, { variant: AlertType.INFO, show: loggedInUserRights.data.isInternal(), isInline: true, className: "pf-v5-u-mb-md", title: t('Case Group ACL is not available for internal users.') },
149
+ React.createElement(AlertMessage, { variant: AlertType.INFO, show: loggedInUserRights.data.isInternal(), isInline: true, className: "pf-v6-u-mb-md", title: t('Case Group ACL is not available for internal users.') },
150
150
  React.createElement("p", null,
151
151
  React.createElement(Trans, { i18nKey: "i18nRequestControl" },
152
152
  "As an internal user you can use case group without ACL functionality. To use case groups to limit user access, customers can enable the",
@@ -168,7 +168,7 @@ export const ManageGroupUsers = () => {
168
168
  React.createElement("span", { className: "toolbar-right" },
169
169
  React.createElement("label", { htmlFor: "account-group-filter" },
170
170
  React.createElement(Trans, null, "Filter by")),
171
- React.createElement(SearchInput, { className: "pf-v5-u-flex-grow-1 pf-v5-c-search-input pf-v5-u-background-color-100", id: "account-group-filter", value: userSearch, isDisabled: isFetching || !selectedGroup, onChange: (_, value) => setUserSearch(value), placeholder: t('Search for people in this group'), "aria-label": "Group search input", onClear: () => setUserSearch('') }))),
171
+ React.createElement(SearchInput, { className: "pf-v6-u-flex-grow-1 pf-v6-c-search-input pf-v6-u-background-color-100", id: "account-group-filter", value: userSearch, isDisabled: isFetching || !selectedGroup, onChange: (_, value) => setUserSearch(value), placeholder: t('Search for people in this group'), "aria-label": "Group search input", onClear: () => setUserSearch('') }))),
172
172
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading group users list') } },
173
173
  React.createElement(ManageTable, { ariaLabel: t('Table to manage groups'), columns: columns, data: data, sortInfo: { column: 'first-name', direction: 'asc' }, isFetching: isFetching, isError: false }))));
174
174
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AddEditBookmarkModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,UAAU,MAAM;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,UAAW,MAAM,sBA2IjD,CAAC"}
1
+ {"version":3,"file":"AddEditBookmarkModal.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,OAAO,KAA8B,MAAM,OAAO,CAAC;AAMnD,UAAU,MAAM;IACZ,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,MAAM,EAAE,CAAC,gBAAgB,EAAE,SAAS,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE,gBAAgB,EAAE,SAAS,EAAE,CAAC;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,oBAAoB,UAAW,MAAM,sBA0IjD,CAAC"}
@@ -1,4 +1,4 @@
1
- import { Button, ButtonVariant, Modal, ModalVariant } from '@patternfly/react-core';
1
+ import { Button, ButtonVariant, Modal, ModalFooter, ModalVariant } from '@patternfly/react-core';
2
2
  import isEmpty from 'lodash/isEmpty';
3
3
  import isEqual from 'lodash/isEqual';
4
4
  import React, { useEffect, useState } from 'react';
@@ -70,18 +70,18 @@ export const AddEditBookmarkModal = (props) => {
70
70
  isEqual(props.selectedAccounts.map((a) => a.accountNumber).sort(), localSelectedBookmarks.map((a) => a.accountNumber).sort()) &&
71
71
  selectedGroup === ((_a = props.selectedAccounts[0]) === null || _a === void 0 ? void 0 : _a.bookmarkGroupName));
72
72
  };
73
- return (React.createElement(Modal, { id: "Add-edit-bookmark-modal", className: "pf-modal-overflow-visible", title: props.title, "aria-describedby": "Add-edit-bookmark-modal", isOpen: props.isOpen, onClose: close, showClose: true, onEscapePress: props.onClose, variant: ModalVariant.medium, actions: [
74
- React.createElement(Button, { key: "save", variant: ButtonVariant.primary, onClick: save, isDisabled: isInValid || isNothingIsChangedOnEditMode() },
75
- React.createElement(Trans, null, "Save")),
76
- React.createElement(Button, { key: "cancel", variant: props.addMode ? ButtonVariant.link : ButtonVariant.secondary, onClick: close },
77
- React.createElement(Trans, null, "Cancel")),
78
- ] },
73
+ return (React.createElement(Modal, { id: "Add-edit-bookmark-modal", className: "pf-modal-overflow-visible", title: props.title, "aria-describedby": "Add-edit-bookmark-modal", isOpen: props.isOpen, onClose: close, onEscapePress: props.onClose, variant: ModalVariant.medium },
79
74
  React.createElement("div", null,
80
- React.createElement("div", { className: "pf-v5-u-mb-lg" },
75
+ React.createElement("div", { className: "pf-v6-u-mb-lg" },
81
76
  React.createElement(BookmarkGroupSelector, { selectedGroup: selectedGroup, groups: props.groups, onGroupInputBoxChanged: onGroupInputBoxChanged, isInValid: isInValid && (isPresentInGroups || isEmpty(selectedGroup === null || selectedGroup === void 0 ? void 0 : selectedGroup.trim())), setIsInValid: setIsInValid, isPresentInGroups: isPresentInGroups })),
82
77
  React.createElement("div", null,
83
78
  React.createElement("label", { id: "add-bookmark-account-on-add-modal" },
84
79
  React.createElement(Trans, null, "Account(s)"),
85
80
  React.createElement("span", { className: "form-required", "aria-hidden": true }, "*")),
86
- React.createElement(BookmarkAccountSelector, { defaultSelected: props.selectedAccounts, labelId: "add-bookmark-account-on-add-modal", bookmarkedGroupAccounts: props.bookmarkedGroupAccounts, onBookMarkAccountSelected: onBookMarkAccountSelected, addMode: props.addMode, isInValid: isInValid && isEmpty(localSelectedBookmarks) })))));
81
+ React.createElement(BookmarkAccountSelector, { defaultSelected: props.selectedAccounts, labelId: "add-bookmark-account-on-add-modal", bookmarkedGroupAccounts: props.bookmarkedGroupAccounts, onBookMarkAccountSelected: onBookMarkAccountSelected, addMode: props.addMode, isInValid: isInValid && isEmpty(localSelectedBookmarks) }))),
82
+ React.createElement(ModalFooter, null,
83
+ React.createElement(Button, { key: "save", variant: ButtonVariant.primary, onClick: save, isDisabled: isInValid || isNothingIsChangedOnEditMode() },
84
+ React.createElement(Trans, null, "Save")),
85
+ React.createElement(Button, { key: "cancel", variant: props.addMode ? ButtonVariant.link : ButtonVariant.secondary, onClick: close },
86
+ React.createElement(Trans, null, "Cancel")))));
87
87
  };
@@ -1 +1 @@
1
- {"version":3,"file":"BookmarkAccountSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAIhF,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAO3E,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,UAAU,MAAM;IACZ,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,qBA6PpD;yBA7Pe,uBAAuB"}
1
+ {"version":3,"file":"BookmarkAccountSelector.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAmBhF,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAO3E,OAAO,KAAsC,MAAM,OAAO,CAAC;AAG3D,UAAU,MAAM;IACZ,uBAAuB,EAAE,SAAS,EAAE,CAAC;IACrC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,SAAS,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,qBA0UpD;yBA1Ue,uBAAuB"}
@@ -8,9 +8,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
8
8
  });
9
9
  };
10
10
  import { accounts } from '@cee-eng/hydrajs';
11
- import { Label, LabelGroup, Tooltip } from '@patternfly/react-core';
12
- import { Select, SelectOption, SelectVariant } from '@patternfly/react-core/deprecated';
11
+ import { Button, Label, LabelGroup, MenuToggle, Select, SelectList, SelectOption, Spinner, TextInputGroup, TextInputGroupMain, TextInputGroupUtilities, Tooltip, } from '@patternfly/react-core';
13
12
  import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
13
+ import TimesIcon from '@patternfly/react-icons/dist/js/icons/times-icon';
14
+ import { useSelectKeyboardNavigator } from '@rh-support/components';
14
15
  import { sortAccountsByQuery } from '@rh-support/react-context';
15
16
  import assign from 'lodash/assign';
16
17
  import compact from 'lodash/compact';
@@ -21,15 +22,18 @@ import remove from 'lodash/remove';
21
22
  import React, { useEffect, useRef, useState } from 'react';
22
23
  import { Trans, useTranslation } from 'react-i18next';
23
24
  export function BookmarkAccountSelector(props) {
25
+ const { t } = useTranslation();
26
+ const textInputRef = useRef();
27
+ const abortControllerRef = useRef(undefined);
24
28
  const [options, setOptions] = useState([]);
25
29
  const [isSearching, setIsSearching] = useState(false);
26
- const abortControllerRef = useRef(undefined);
27
- const { t } = useTranslation();
28
30
  const [isOpen, setIsOpen] = useState(false);
29
31
  const [selected, setSelected] = useState([]);
30
- const onToggle = (isOpen) => setIsOpen(isOpen);
32
+ const [inputValue, setInputValue] = useState('');
33
+ const [activeItem, setActiveItem] = useState(null);
31
34
  const clearSelection = () => {
32
35
  setIsOpen(false);
36
+ setInputValue('');
33
37
  setSelected([]);
34
38
  props.onBookMarkAccountSelected([]);
35
39
  };
@@ -67,9 +71,9 @@ export function BookmarkAccountSelector(props) {
67
71
  const response = yield accounts.getAccounts(queryParams, controller.signal);
68
72
  const accountsResponse = response.items.map((account) => {
69
73
  const bookmarksMatch = props.bookmarkedGroupAccounts.filter((a) => a.accountNumber === account.accountNumber);
70
- const acountGroups = (bookmarksMatch || []).map((b) => b.bookmarkGroupName);
74
+ const accountGroups = (bookmarksMatch || []).map((b) => b.bookmarkGroupName);
71
75
  return bookmarksMatch.length > 0
72
- ? Object.assign(Object.assign({}, account), { bookmarkGroupName: acountGroups, isBookmarked: true, isBookmarkedAndHasGroup: acountGroups.length > 0 }) : Object.assign(Object.assign({}, account), { bookmarkGroupName: [], isBookmarked: false, isBookmarkedAndHasGroup: false });
76
+ ? Object.assign(Object.assign({}, account), { bookmarkGroupName: accountGroups, isBookmarked: true, isBookmarkedAndHasGroup: accountGroups.length > 0 }) : Object.assign(Object.assign({}, account), { bookmarkGroupName: [], isBookmarked: false, isBookmarkedAndHasGroup: false });
73
77
  });
74
78
  const sortedOptions = sortAccountsByQuery(accountsResponse, query, queryKey);
75
79
  setOptions(sortedOptions);
@@ -84,24 +88,61 @@ export function BookmarkAccountSelector(props) {
84
88
  }
85
89
  }
86
90
  });
87
- const onTypeaheadInputChanged = (input) => __awaiter(this, void 0, void 0, function* () {
88
- yield fetchAccounts(input);
91
+ const onSelect = (value) => {
92
+ if (value) {
93
+ const currentSelected = value;
94
+ const alreadySelected = find(selected, (account) => account.accountNumber === currentSelected.accountNumber);
95
+ if (alreadySelected)
96
+ return;
97
+ const selectedAccounts = [
98
+ ...selected,
99
+ Object.assign(Object.assign({}, currentSelected), { bookmarkId: currentSelected.bookmarkId || undefined, rootBookmarkId: currentSelected.rootBookmarkId || undefined }),
100
+ ];
101
+ setSelected(selectedAccounts);
102
+ props.onBookMarkAccountSelected(selectedAccounts);
103
+ setIsOpen(false);
104
+ setInputValue('');
105
+ }
106
+ };
107
+ const { focusedItemIndex, onInputKeyDown, setFocusedItemIndex } = useSelectKeyboardNavigator({
108
+ list: options,
109
+ isOpen,
110
+ ignoreResetOnListChange: false,
111
+ resetIndexOnClose: true,
112
+ isDisabled: props.isDisabled,
113
+ setIsOpen,
114
+ onSelect: (value) => onSelect(value),
89
115
  });
90
- // this ref is used to call clearSelection() outside component
91
- props.clearRef.current = clearSelection;
92
- const debounceFn = debounce(onTypeaheadInputChanged, 500);
93
- const onSelect = (event, currentSelected) => {
94
- const alreadySelected = find(selected, (account) => account.accountNumber === currentSelected.accountNumber);
95
- if (alreadySelected)
96
- return;
97
- const selectedAccounts = [
98
- ...selected,
99
- Object.assign(Object.assign({}, currentSelected), { bookmarkId: currentSelected.bookmarkId || undefined, rootBookmarkId: currentSelected.rootBookmarkId || undefined }),
100
- ];
101
- setSelected(selectedAccounts);
102
- props.onBookMarkAccountSelected(selectedAccounts);
103
- setIsOpen(false);
116
+ const onToggleClick = (e) => {
117
+ e.stopPropagation();
118
+ setIsOpen(!isOpen);
104
119
  };
120
+ const removeAccountLabel = (event, removedAccount) => {
121
+ event.stopPropagation();
122
+ const updatedSelectedAccounts = remove(selected, (account) => account.accountNumber !== removedAccount.accountNumber);
123
+ setSelected(updatedSelectedAccounts);
124
+ props.onBookMarkAccountSelected(updatedSelectedAccounts);
125
+ };
126
+ const debounceFn = debounce((value) => fetchAccounts(value), 500);
127
+ const onTextInputChange = (_event, value) => {
128
+ setInputValue(value);
129
+ debounceFn(value);
130
+ };
131
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true },
132
+ React.createElement(TextInputGroup, { isPlain: true },
133
+ React.createElement(TextInputGroupMain, Object.assign({ value: inputValue, onChange: onTextInputChange, onClick: (e) => {
134
+ e.stopPropagation();
135
+ setIsOpen(true);
136
+ setFocusedItemIndex(null);
137
+ setActiveItem(null);
138
+ }, onKeyDown: onInputKeyDown, id: "bookmark-account-select-input", autoComplete: "off", innerRef: textInputRef, placeholder: t('Search for account names or numbers'), role: "combobox", isExpanded: isOpen, "aria-controls": "bookmark-account-select-listbox" }, (activeItem && { 'aria-activedescendant': activeItem })),
139
+ React.createElement(LabelGroup, { "aria-label": "Selected accounts" }, selected.map((account, index) => (React.createElement(Label, { key: index, color: "teal", onClose: (ev) => removeAccountLabel(ev, account) },
140
+ account.name,
141
+ " (",
142
+ account.accountNumber,
143
+ ")"))))),
144
+ selected.length > 0 && (React.createElement(TextInputGroupUtilities, null,
145
+ React.createElement(Button, { variant: "plain", onClick: clearSelection, "aria-label": "Clear input value", icon: React.createElement(TimesIcon, { "aria-hidden": true }) }))))));
105
146
  const duplicateAccounts = (props.selectedGroup &&
106
147
  props.addMode &&
107
148
  props.bookmarkedGroupAccounts
@@ -110,57 +151,55 @@ export function BookmarkAccountSelector(props) {
110
151
  })
111
152
  .map((a) => a.accountNumber)) ||
112
153
  [];
113
- const removeAccountLabel = (event, removedAccount) => {
114
- event.stopPropagation();
115
- const updatedSelectedAccounts = remove(selected, (account) => account.accountNumber !== removedAccount.accountNumber);
116
- setSelected(updatedSelectedAccounts);
117
- props.onBookMarkAccountSelected(updatedSelectedAccounts);
118
- };
119
- const labelGroupComponent = () => {
120
- return (React.createElement(LabelGroup, { numLabels: 2 }, (selected || []).map((currentLabel) => (React.createElement(Label, { key: currentLabel.accountNumber, onClose: (event) => removeAccountLabel(event, currentLabel), color: "cyan", onClick: (event) => event.stopPropagation() },
121
- currentLabel.name,
122
- " (",
123
- currentLabel.accountNumber,
124
- ")")))));
125
- };
154
+ const renderAccountOption = (account, index) => (React.createElement(SelectOption, { value: account, key: index, isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `bookmark-account-${account.accountNumber}` },
155
+ React.createElement("div", null,
156
+ React.createElement("div", { className: "pf-v6-u-color-100 pf-v6-u-font-size-sm" },
157
+ account.name,
158
+ " (",
159
+ account.accountNumber,
160
+ ")"),
161
+ React.createElement("div", null, account.bookmarkGroupName.length === 0 ? (React.createElement("span", { className: "pf-v6-u-color-400" },
162
+ React.createElement(Trans, null, "This account has not been bookmarked."))) : account.bookmarkGroupName.length > 2 ? (React.createElement("div", null,
163
+ React.createElement(Tooltip, { isContentLeftAligned: true, content: Array.isArray(account.bookmarkGroupName) ? (account.bookmarkGroupName.map((group) => React.createElement("div", { key: group }, group))) : (React.createElement("div", null, account.bookmarkGroupName)) },
164
+ React.createElement(Label, { color: "purple", icon: React.createElement(InfoCircleIcon, null), key: `${account.accountNumber}${account.bookmarkGroupName}` },
165
+ "Bookmarked ",
166
+ account.bookmarkGroupName.length,
167
+ " times")))) : Array.isArray(account.bookmarkGroupName) ? (account.bookmarkGroupName.map((group) => !isEmpty(group) && (React.createElement(Label, { color: "purple", key: `${account.accountNumber}-${group}` }, group)))) : (!isEmpty(account.bookmarkGroupName) && (React.createElement(Label, { color: "purple", key: `${account.accountNumber}-${account.bookmarkGroupName}` }, account.bookmarkGroupName)))))));
126
168
  useEffect(() => {
127
169
  setSelected(props.defaultSelected || []);
128
170
  }, [props.defaultSelected]);
129
- // when a group is added or removed from account we need to update dropdown
130
- // options to show correct group
131
171
  useEffect(() => {
132
- let newOptions = [];
133
- setOptions(undefined);
134
- // if group is not empty then add it
135
- options.forEach((option) => {
136
- const updatedGroupNames = compact(props.bookmarkedGroupAccounts
137
- .filter((b) => b.accountNumber === option.accountNumber)
138
- .map((b) => b.bookmarkGroupName));
139
- newOptions = [
140
- ...newOptions,
141
- Object.assign(Object.assign({}, option), { bookmarkGroupName: compact(updatedGroupNames), isBookmarked: true, isBookmarkedAndHasGroup: !!updatedGroupNames.length }),
142
- ];
143
- });
144
- setOptions(newOptions);
172
+ if (options.length > 0) {
173
+ const newOptions = options.map((option) => {
174
+ const updatedGroupNames = compact(props.bookmarkedGroupAccounts
175
+ .filter((b) => b.accountNumber === option.accountNumber)
176
+ .map((b) => b.bookmarkGroupName));
177
+ return Object.assign(Object.assign({}, option), { bookmarkGroupName: compact(updatedGroupNames), isBookmarked: true, isBookmarkedAndHasGroup: !!updatedGroupNames.length });
178
+ });
179
+ setOptions(newOptions);
180
+ }
145
181
  // eslint-disable-next-line react-hooks/exhaustive-deps
146
182
  }, [props.bookmarkedGroupAccounts]);
147
- const titleId = 'multi-typeahead-bookmark-chip-group-props-id';
183
+ // Update activeItem when focusedItemIndex changes
184
+ useEffect(() => {
185
+ var _a;
186
+ if (focusedItemIndex !== null && options[focusedItemIndex]) {
187
+ setActiveItem(`bookmark-account-${(_a = options[focusedItemIndex]) === null || _a === void 0 ? void 0 : _a.accountNumber}`);
188
+ }
189
+ else {
190
+ setActiveItem(null);
191
+ }
192
+ }, [focusedItemIndex, options]);
193
+ props.clearRef.current = clearSelection;
148
194
  return (React.createElement(React.Fragment, null,
149
- React.createElement("span", { id: titleId, hidden: true }, "Select a state"),
150
- React.createElement(Select, Object.assign({ chipGroupComponent: labelGroupComponent(), variant: SelectVariant.typeaheadMulti, typeAheadAriaLabel: t('Search for account names or numbers'), onToggle: (_event, isOpen) => onToggle(isOpen), onSelect: onSelect, onClear: clearSelection, "data-tracking-id": props.labelId, selections: selected, isOpen: isOpen, "aria-labelledby": titleId, placeholderText: t('Search for account names or numbers'), hasInlineFilter: false, onTypeaheadInputChanged: debounceFn, onFilter: () => undefined, "aria-describedby": "clusterID-validate-helper" }, (isSearching && { loadingVariant: 'spinner' })), options.map((account, index) => (React.createElement(SelectOption, { value: account, key: index },
151
- React.createElement("div", null,
152
- React.createElement("div", { className: "pf-v5-u-color-100 pf-v5-u-font-size-sm" },
153
- account.name,
154
- " (",
155
- account.accountNumber,
156
- ")"),
157
- React.createElement("div", null, account.bookmarkGroupName.length === 0 ? (React.createElement("span", { className: "pf-v5-u-color-400" },
158
- React.createElement(Trans, null, "This account has not been bookmarked."))) : account.bookmarkGroupName.length > 2 ? (React.createElement("div", null,
159
- React.createElement(Tooltip, { isContentLeftAligned: true, content: account.bookmarkGroupName.map((group) => (React.createElement("div", null, group))) },
160
- React.createElement(Label, { color: "purple", icon: React.createElement(InfoCircleIcon, null), key: `${account.accountNumber}${account.bookmarkGroupName}` },
161
- "Bookmarked ",
162
- account.bookmarkGroupName.length,
163
- " times")))) : (account.bookmarkGroupName.map((group) => !isEmpty(group) && (React.createElement(Label, { color: "purple", key: `${account.accountNumber}-${group}` }, group)))))))))),
195
+ React.createElement(Select, { id: "bookmark-account-select", isPlain: true, isOpen: isOpen, selected: selected, onSelect: onSelect, toggle: toggle, onOpenChange: (nextOpen) => {
196
+ setIsOpen(nextOpen);
197
+ if (!nextOpen) {
198
+ setInputValue('');
199
+ }
200
+ }, isScrollable: true },
201
+ React.createElement(SelectList, { id: "bookmark-account-select-listbox" }, isSearching ? (React.createElement(SelectOption, { isLoading: true, value: "loader", className: "pf-v6-u-text-align-center" },
202
+ React.createElement(Spinner, { size: "lg" }))) : options.length > 0 ? (options.map((account, index) => renderAccountOption(account, index))) : (React.createElement(SelectOption, { value: '', key: 'no-value' }, "No results found")))),
164
203
  props.isInValid && (React.createElement("p", { className: "form-instructions form-invalid" },
165
204
  React.createElement(Trans, null, "Select one or more accounts to bookmark"))),
166
205
  duplicateAccounts.length !== 0 && (React.createElement("p", { className: "form-instructions" },
@@ -1 +1 @@
1
- {"version":3,"file":"ManageGroupedBookmarkedAccountsTab.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAOhD,UAAU,MAAM;IACZ,yBAAyB,EAAE,OAAO,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAAC,EAAE,yBAAyB,EAAE,EAAE,MAAM,qBAqZvF"}
1
+ {"version":3,"file":"ManageGroupedBookmarkedAccountsTab.d.ts","sourceRoot":"","sources":["../../../../src/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAA2B,MAAM,OAAO,CAAC;AAOhD,UAAU,MAAM;IACZ,yBAAyB,EAAE,OAAO,CAAC;CACtC;AAED,wBAAgB,kCAAkC,CAAC,EAAE,yBAAyB,EAAE,EAAE,MAAM,qBA0ZvF"}