@rh-support/manage 2.6.1 → 2.6.11

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 (157) hide show
  1. package/lib/esm/ManageTabs.d.ts.map +1 -1
  2. package/lib/esm/ManageTabs.js +48 -20
  3. package/lib/esm/Routes.d.ts +1 -0
  4. package/lib/esm/Routes.d.ts.map +1 -1
  5. package/lib/esm/Routes.js +6 -0
  6. package/lib/esm/components/Configs/ConfigsTable.d.ts.map +1 -1
  7. package/lib/esm/components/Configs/ConfigsTable.js +33 -9
  8. package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.d.ts +12 -0
  9. package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.d.ts.map +1 -0
  10. package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.js +80 -0
  11. package/lib/esm/components/Groups/AddMembersModal/index.d.ts +2 -0
  12. package/lib/esm/components/Groups/AddMembersModal/index.d.ts.map +1 -0
  13. package/lib/esm/components/Groups/AddMembersModal/index.js +1 -0
  14. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts +5 -3
  15. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts.map +1 -1
  16. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.js +21 -14
  17. package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts +1 -0
  18. package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts.map +1 -1
  19. package/lib/esm/components/Groups/GroupSelect/GroupSelect.js +240 -105
  20. package/lib/esm/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.d.ts.map +1 -1
  21. package/lib/esm/components/Groups/GroupUserPermissionsSelect/GroupUserPermissionsSelect.js +19 -14
  22. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.d.ts.map +1 -1
  23. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +187 -77
  24. package/lib/esm/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.d.ts.map +1 -1
  25. package/lib/esm/components/ManageBookmarkedAccountsTab/AddEditBookmarkModal.js +15 -12
  26. package/lib/esm/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.d.ts.map +1 -1
  27. package/lib/esm/components/ManageBookmarkedAccountsTab/BookmarkAccountSelector.js +106 -67
  28. package/lib/esm/components/ManageBookmarkedAccountsTab/BookmarkGroupSelector.d.ts.map +1 -1
  29. package/lib/esm/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.d.ts.map +1 -1
  30. package/lib/esm/components/ManageBookmarkedAccountsTab/ManageGroupedBookmarkedAccountsTab.js +15 -22
  31. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts +19 -0
  32. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts.map +1 -0
  33. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.js +97 -0
  34. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts +3 -0
  35. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts.map +1 -0
  36. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.js +220 -0
  37. package/lib/esm/components/ManageCaseLabels/index.d.ts +2 -0
  38. package/lib/esm/components/ManageCaseLabels/index.d.ts.map +1 -0
  39. package/lib/esm/components/ManageCaseLabels/index.js +1 -0
  40. package/lib/esm/components/ManageCaseLabels/types.d.ts +6 -0
  41. package/lib/esm/components/ManageCaseLabels/types.d.ts.map +1 -0
  42. package/lib/esm/components/ManageCaseLabels/types.js +1 -0
  43. package/lib/esm/components/ManageExpiredContents/ExpiredContentCategory.js +4 -4
  44. package/lib/esm/components/ManageExpiredContents/ExpiredContentHeader.js +1 -1
  45. package/lib/esm/components/ManageExpiredContents/ExpiredContentManager.d.ts.map +1 -1
  46. package/lib/esm/components/ManageExpiredContents/ExpiredContentManager.js +12 -12
  47. package/lib/esm/components/ManageExpiredContents/ExpiredContentSingleItem.js +3 -3
  48. package/lib/esm/components/ManageExpiredContents/ExpiredContentSingleItemView.d.ts.map +1 -1
  49. package/lib/esm/components/ManageExpiredContents/ExpiredContentSingleItemView.js +43 -35
  50. package/lib/esm/components/ManagePartnerships/NonOrgCustomerInfoModal.d.ts.map +1 -1
  51. package/lib/esm/components/ManagePartnerships/NonOrgCustomerInfoModal.js +8 -5
  52. package/lib/esm/components/ManagePartnerships/PartnershipsList.d.ts.map +1 -1
  53. package/lib/esm/components/ManagePartnerships/PartnershipsList.js +19 -12
  54. package/lib/esm/components/ManagePartnerships/PartnershipsTermsModal.d.ts.map +1 -1
  55. package/lib/esm/components/ManagePartnerships/PartnershipsTermsModal.js +17 -20
  56. package/lib/esm/components/ManagePartnerships/RequestCollaborationModal.d.ts.map +1 -1
  57. package/lib/esm/components/ManagePartnerships/RequestCollaborationModal.js +39 -27
  58. package/lib/esm/components/ManagePartnerships/Requests.d.ts +1 -0
  59. package/lib/esm/components/ManagePartnerships/Requests.d.ts.map +1 -1
  60. package/lib/esm/components/ManagePartnerships/Requests.js +22 -9
  61. package/lib/esm/components/ManagePartnerships/index.js +1 -1
  62. package/lib/esm/components/ManagePreferences/PreferencesBody.d.ts.map +1 -1
  63. package/lib/esm/components/ManagePreferences/PreferencesBody.js +1 -5
  64. package/lib/esm/components/ManagePreferences/PreferencesHeader.js +1 -1
  65. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.d.ts +1 -1
  66. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.d.ts.map +1 -1
  67. package/lib/esm/components/ManagePreferences/components/PreferenceSelect.js +26 -27
  68. package/lib/esm/components/ManagePreferences/components/PreferenceSwitch.d.ts.map +1 -1
  69. package/lib/esm/components/ManagePreferences/components/PreferenceSwitch.js +6 -6
  70. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.d.ts.map +1 -1
  71. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.js +8 -9
  72. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.d.ts.map +1 -1
  73. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.js +77 -63
  74. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseSearch.d.ts.map +1 -1
  75. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseSearch.js +3 -4
  76. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.d.ts.map +1 -1
  77. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.js +47 -103
  78. package/lib/esm/components/ManageTable/ManageTable.d.ts +3 -4
  79. package/lib/esm/components/ManageTable/ManageTable.d.ts.map +1 -1
  80. package/lib/esm/components/ManageTable/ManageTable.js +12 -18
  81. package/lib/esm/components/ManageTags/TagsManager.d.ts.map +1 -1
  82. package/lib/esm/components/ManageTags/TagsManager.js +58 -50
  83. package/lib/esm/components/NotificationEmails/NotificationEmailsModal.d.ts.map +1 -1
  84. package/lib/esm/components/NotificationEmails/NotificationEmailsModal.js +35 -26
  85. package/lib/esm/components/NotificationEmails/index.d.ts.map +1 -1
  86. package/lib/esm/components/NotificationEmails/index.js +10 -7
  87. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimit.d.ts.map +1 -1
  88. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimit.js +2 -3
  89. package/lib/esm/components/TopContentManagement/CategoryLimit/CategoryLimitGuidelines.js +6 -6
  90. package/lib/esm/components/TopContentManagement/CategoryLimit/QuestionAnswer.js +1 -1
  91. package/lib/esm/components/TopContentManagement/ContentUsage/ContentAccordion.d.ts.map +1 -1
  92. package/lib/esm/components/TopContentManagement/ContentUsage/ContentAccordion.js +7 -9
  93. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricClickCount.d.ts +1 -0
  94. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricClickCount.d.ts.map +1 -1
  95. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricClickCount.js +2 -2
  96. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetrics.d.ts.map +1 -1
  97. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetrics.js +12 -10
  98. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.d.ts +2 -3
  99. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.d.ts.map +1 -1
  100. package/lib/esm/components/TopContentManagement/ContentUsage/PerformanceMetricsSelect.js +16 -9
  101. package/lib/esm/components/TopContentManagement/ContentUsage/VersionPerformanceMetrics.d.ts.map +1 -1
  102. package/lib/esm/components/TopContentManagement/ContentUsage/VersionPerformanceMetrics.js +15 -16
  103. package/lib/esm/components/TopContentManagement/NoTopContentFound.d.ts.map +1 -1
  104. package/lib/esm/components/TopContentManagement/NoTopContentFound.js +14 -15
  105. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/AddNewCategoryDropDown.d.ts.map +1 -1
  106. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/AddNewCategoryDropDown.js +47 -39
  107. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentCategory.d.ts.map +1 -1
  108. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentCategory.js +12 -6
  109. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentCategoryNew.js +3 -3
  110. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentComponent.d.ts.map +1 -1
  111. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentComponent.js +11 -7
  112. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItem.d.ts.map +1 -1
  113. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItem.js +62 -53
  114. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItemLink.d.ts.map +1 -1
  115. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentCategoryContent/TopContentSingleItemLink.js +2 -3
  116. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentEditor.d.ts.map +1 -1
  117. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentEditor.js +8 -9
  118. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestion.js +2 -2
  119. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHint.js +4 -5
  120. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHintAccept.d.ts.map +1 -1
  121. package/lib/esm/components/TopContentManagement/TopContentEditor/TopContentSuggestion/TopContentSuggestionHintAccept.js +51 -25
  122. package/lib/esm/components/TopContentManagement/TopContentHeader.js +1 -1
  123. package/lib/esm/components/TopContentManagement/TopContentProductVersionSelector.d.ts.map +1 -1
  124. package/lib/esm/components/TopContentManagement/TopContentProductVersionSelector.js +64 -32
  125. package/lib/esm/constants/GroupSelectActions.d.ts +2 -1
  126. package/lib/esm/constants/GroupSelectActions.d.ts.map +1 -1
  127. package/lib/esm/constants/GroupSelectActions.js +1 -0
  128. package/lib/esm/constants/PartnershipLink.d.ts +3 -0
  129. package/lib/esm/constants/PartnershipLink.d.ts.map +1 -0
  130. package/lib/esm/constants/PartnershipLink.js +2 -0
  131. package/lib/esm/context/ExpiredContentContextProvider.d.ts.map +1 -1
  132. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts +42 -0
  133. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts.map +1 -0
  134. package/lib/esm/hooks/useCaseGroupGraphQL.js +117 -0
  135. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts +26 -0
  136. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts.map +1 -0
  137. package/lib/esm/hooks/useCaseLabelGraphQL.js +104 -0
  138. package/lib/esm/hooks/useCurrentUserContact.d.ts +8 -0
  139. package/lib/esm/hooks/useCurrentUserContact.d.ts.map +1 -0
  140. package/lib/esm/hooks/useCurrentUserContact.js +74 -0
  141. package/lib/esm/hooks/useVersionsDiffer.d.ts.map +1 -1
  142. package/lib/esm/index.d.ts.map +1 -1
  143. package/lib/esm/index.js +2 -0
  144. package/lib/esm/reducers/ExpiredContentReducer.d.ts.map +1 -1
  145. package/lib/esm/reducers/ManagePartnershipsReducer.d.ts.map +1 -1
  146. package/lib/esm/reducers/TagManagmentReducer.d.ts +1 -1
  147. package/lib/esm/reducers/TagManagmentReducer.d.ts.map +1 -1
  148. package/lib/esm/reducers/TopContentHelpers.d.ts.map +1 -1
  149. package/lib/esm/reducers/TopContentReducer.d.ts.map +1 -1
  150. package/lib/esm/reducers/TopContentReducer.js +5 -2
  151. package/lib/esm/scss/_main.scss +266 -24
  152. package/lib/esm/scss/_pf-overrides.scss +66 -53
  153. package/lib/esm/scss/index.scss +5 -4
  154. package/lib/esm/utils/caseGroupMapper.d.ts +18 -0
  155. package/lib/esm/utils/caseGroupMapper.d.ts.map +1 -0
  156. package/lib/esm/utils/caseGroupMapper.js +50 -0
  157. package/package.json +21 -22
@@ -7,25 +7,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { publicApi } from '@cee-eng/hydrajs';
11
- import { Dropdown, DropdownItem, DropdownToggle, Select, SelectOption, SelectVariant, } from '@patternfly/react-core/deprecated';
10
+ import { useApolloClient } from '@apollo/client/react';
11
+ import { Button, Divider, 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, 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
- import { haventLoadedMetadata } from '@rh-support/utils';
17
+ import { GET_CASE_GROUP_MEMBERS } from '@rh-support/utils';
17
18
  import find from 'lodash/find';
18
19
  import isEmpty from 'lodash/isEmpty';
20
+ import unescape from 'lodash/unescape';
19
21
  import React, { useCallback, useEffect, useRef, useState } from 'react';
20
22
  import { Trans, useTranslation } from 'react-i18next';
21
23
  import { GroupSelectActions } from '../../../constants/GroupSelectActions';
24
+ import { useCreateCaseGroup, useCreateCaseGroupMember, useDeleteCaseGroup, useRenameCaseGroup, } from '../../../hooks/useCaseGroupGraphQL';
22
25
  const actions = GroupSelectActions;
23
26
  const unGroupedCaseGroupNumber = '-1';
24
27
  export const GroupSelect = (props) => {
28
+ var _a;
25
29
  const { t } = useTranslation();
26
30
  const { onSelect: onSelectProp } = props;
27
31
  const manageActionsRef = useRef();
28
- const { globalMetadataState: { caseGroups, loggedInUserJwtToken }, } = useGlobalStateContext();
32
+ const apolloClient = useApolloClient();
33
+ const { globalMetadataState: { caseGroups, loggedInUsersAccount }, } = useGlobalStateContext();
29
34
  const dispatch = useGlobalDispatchContext();
30
35
  const selectAGroupText = caseGroups.isFetching
31
36
  ? t('Loading groups')
@@ -34,11 +39,47 @@ export const GroupSelect = (props) => {
34
39
  : t('Select a group to view accounts');
35
40
  const getGroup = useCallback((groupName) => (caseGroups.data || []).find((groupObj) => groupObj.name === groupName), [caseGroups]);
36
41
  const confirmation = useConfirmation();
37
- // Fetch groups on init
42
+ const [input, setInput] = useState('');
43
+ const [shouldFilter, setShouldFilter] = useState(false);
44
+ const accountId = (_a = loggedInUsersAccount === null || loggedInUsersAccount === void 0 ? void 0 : loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
45
+ // GraphQL hooks for mutations
46
+ const { createGroup: createGroupMutation, loading: createLoading } = useCreateCaseGroup();
47
+ const { createMember: createMemberMutation } = useCreateCaseGroupMember();
48
+ const { renameGroup: renameGroupMutation, loading: renameLoading } = useRenameCaseGroup();
49
+ const { deleteGroup: deleteGroupMutation, loading: deleteLoading } = useDeleteCaseGroup();
50
+ const hasFetchedFromGraphQL = useRef(false);
51
+ const [groupsFetchCompleted, setGroupsFetchCompleted] = useState(false);
52
+ const previousCaseGroupsIsError = usePrevious(caseGroups.isError);
53
+ useEffect(() => {
54
+ if (caseGroups.isError && !previousCaseGroupsIsError) {
55
+ ToastNotification.addDangerMessage(t('Could not fetch groups. Please try again or refresh'));
56
+ }
57
+ }, [caseGroups.isError, previousCaseGroupsIsError, t]);
58
+ // Always fetch groups from GraphQL — never rely on potentially stale Hydra data.
59
+ // Auto-select only after this settles so members can load against real group data.
60
+ useEffect(() => {
61
+ if (!apolloClient || !accountId) {
62
+ setGroupsFetchCompleted(true);
63
+ return;
64
+ }
65
+ if (hasFetchedFromGraphQL.current)
66
+ return;
67
+ hasFetchedFromGraphQL.current = true;
68
+ const fetchGroups = () => __awaiter(void 0, void 0, void 0, function* () {
69
+ try {
70
+ yield fetchCaseGroupsForSSO(dispatch, apolloClient, accountId);
71
+ }
72
+ finally {
73
+ setGroupsFetchCompleted(true);
74
+ }
75
+ });
76
+ fetchGroups();
77
+ }, [dispatch, apolloClient, accountId]);
78
+ // Set default group once groups are loaded
38
79
  useEffect(() => {
39
80
  var _a, _b;
40
- if (haventLoadedMetadata(caseGroups, (data) => data === undefined))
41
- fetchCaseGroupsForSSO(dispatch, loggedInUserJwtToken.username);
81
+ if (!groupsFetchCompleted || caseGroups.isFetching)
82
+ return;
42
83
  if (isEmpty(selectedGroup) && !isEmpty(caseGroups) && ((_a = caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data) === null || _a === void 0 ? void 0 : _a.length) > 0) {
43
84
  const defaultCaseGroup = find(caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data, (g) => g.isDefault);
44
85
  const newSelectedGroup = (defaultCaseGroup === null || defaultCaseGroup === void 0 ? void 0 : defaultCaseGroup.groupNum) === '-1'
@@ -50,15 +91,15 @@ export const GroupSelect = (props) => {
50
91
  }
51
92
  }
52
93
  // eslint-disable-next-line react-hooks/exhaustive-deps
53
- }, [dispatch, loggedInUserJwtToken, caseGroups]);
54
- // handle dropdown open/close toggle.
94
+ }, [caseGroups, groupsFetchCompleted]);
95
+ // handle dropdown open/close toggle
55
96
  const [isOpen, setIsOpen] = useState(false);
56
- const toggleIsOpen = (isExpanded) => setIsOpen(isExpanded);
57
97
  // handle group selection
58
98
  const [selectedGroup, setSelectedGroup] = useState();
59
99
  const previouslySelectedGroup = usePrevious(selectedGroup);
60
100
  const onClear = () => {
61
101
  setSelectedGroup(null);
102
+ setShouldFilter(false);
62
103
  props.onSelect(null);
63
104
  };
64
105
  useEffect(() => {
@@ -66,95 +107,125 @@ export const GroupSelect = (props) => {
66
107
  onSelectProp(selectedGroup ? getGroup(selectedGroup) : null);
67
108
  }
68
109
  }, [selectedGroup, getGroup, onSelectProp, previouslySelectedGroup]);
69
- const onSelect = (event, group) => {
70
- const newGroup = getGroup(group);
110
+ const handleSelect = (group) => {
111
+ const newGroup = selectedGroup !== group.name;
112
+ setInput(group.name);
71
113
  if (newGroup) {
72
- setSelectedGroup(group);
114
+ setSelectedGroup(group.name);
115
+ setShouldFilter(false);
73
116
  }
74
117
  setIsOpen(false);
75
118
  };
76
119
  // Group actions dropdown state
77
120
  const hasGroupPermissions = ability.can(resourceActions.CREATE, resources.CASE_GROUPS);
78
121
  const [showDropdown, setShowDropdown] = useState(hasGroupPermissions);
122
+ useEffect(() => setShowDropdown(hasGroupPermissions), [hasGroupPermissions]);
79
123
  const [showInput, setShowInput] = useState(false);
80
124
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
81
125
  const toggleIsDropdownOpen = () => setIsDropdownOpen(!isDropdownOpen);
82
126
  const closeDropdown = () => setIsDropdownOpen(false);
127
+ const [activeItem, setActiveItem] = useState(null);
83
128
  const onActionFocus = (action) => () => {
84
129
  closeDropdown();
85
130
  setAction(action);
86
131
  };
87
- // fetch objects for apis
88
132
  const [showErrorMessage] = useState(false);
89
- const createGroupFetch = useFetch(publicApi.caseGroups.createGroup, { propgateErrors: true });
90
- const renameGroupFetch = useFetch(publicApi.caseGroups.renameGroup, { propgateErrors: true });
91
- const deleteGroupFetch = useFetch(publicApi.caseGroups.deleteGroup, { propgateErrors: true });
92
- const duplicateGroupFetch = useFetch(publicApi.caseGroups.createGroup, { propgateErrors: true });
93
133
  // group actions input state
94
- const [input, setInput] = useState('');
95
- const onMultiSelect = () => null;
96
- const onMultiClear = () => setInput('');
97
- const disableOnFetch = caseGroups.isFetching ||
98
- createGroupFetch.isFetching ||
99
- renameGroupFetch.isFetching ||
100
- deleteGroupFetch.isFetching ||
101
- duplicateGroupFetch.isFetching;
102
- const onChange = (e) => {
103
- setInput(e.target.value);
104
- return [];
134
+ const textInputRef = useRef();
135
+ const disableOnFetch = caseGroups.isFetching || createLoading || renameLoading || deleteLoading;
136
+ const onChange = (e, value) => {
137
+ if (!showInput) {
138
+ setIsOpen(true);
139
+ }
140
+ setInput(value);
141
+ if (value !== input) {
142
+ setShouldFilter(true);
143
+ }
105
144
  };
106
145
  useEffect(() => setInput(selectedGroup), [selectedGroup]);
146
+ useEffect(() => {
147
+ if (!showInput && input && input != selectedGroup) {
148
+ if (!isOpen) {
149
+ setIsOpen(true);
150
+ }
151
+ }
152
+ setFocusedItemIndex(-1);
153
+ setActiveItem(null);
154
+ // eslint-disable-next-line react-hooks/exhaustive-deps
155
+ }, [input, showInput]);
107
156
  // group actions
108
- function setGroupOnFetch(groupName) {
109
- return __awaiter(this, void 0, void 0, function* () {
110
- yield fetchCaseGroupsForSSO(dispatch, loggedInUserJwtToken.username);
111
- setSelectedGroup(groupName);
112
- });
113
- }
114
- function createGroup(groupName, ssoUsername) {
157
+ function createGroup(groupName) {
115
158
  return __awaiter(this, void 0, void 0, function* () {
159
+ if (!accountId) {
160
+ ToastNotification.addDangerMessage(t('There was an error while creating this group'));
161
+ return;
162
+ }
116
163
  try {
117
- yield createGroupFetch.request({ name: groupName, contactSsoName: ssoUsername });
164
+ const response = yield createGroupMutation(groupName, accountId);
165
+ const createdRecord = response.redhat_support_uiapi.CaseGroup__cCreate.RedHatSupportRecord;
118
166
  ToastNotification.addSuccessMessage(t('Group has been successfully created'));
119
- try {
120
- yield setGroupOnFetch(groupName);
121
- setShowDropdown(true);
122
- setShowInput(false);
123
- setSelectedGroup(groupName);
124
- }
125
- catch (error) {
126
- ToastNotification.addDangerMessage(t("We're having an issue finding this group's users"));
127
- onClear();
128
- }
167
+ const newGroup = {
168
+ groupNum: createdRecord.Id,
169
+ name: unescape(createdRecord.Name.value),
170
+ isPrivate: false,
171
+ isDefault: false,
172
+ defaultMembers: [],
173
+ members: [],
174
+ };
175
+ const updatedGroups = [...(caseGroups.data || []), newGroup];
176
+ setCaseGroups(dispatch, updatedGroups);
177
+ setShowDropdown(true);
178
+ setShowInput(false);
179
+ setSelectedGroup(groupName);
129
180
  }
130
181
  catch (e) {
131
- ToastNotification.addDangerMessage(t('There was an error while creating this group'));
182
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
183
+ if (message.includes('insufficient access rights')) {
184
+ ToastNotification.addDangerMessage(t('You do not have permission to create this group'));
185
+ }
186
+ else {
187
+ ToastNotification.addDangerMessage(t('There was an error while creating this group'));
188
+ }
132
189
  }
133
190
  });
134
191
  }
135
192
  const [action, setAction] = useState('');
136
193
  const isUserInputAGroup = () => (caseGroups.data || []).find((value) => value.name === input);
194
+ const handleDeleteGroup = () => __awaiter(void 0, void 0, void 0, function* () {
195
+ const groupToDelete = getGroup(selectedGroup);
196
+ yield confirmation({
197
+ catchOnCancel: true,
198
+ title: t('Delete group'),
199
+ description: (React.createElement(Trans, null,
200
+ "Are you sure you want to delete ",
201
+ React.createElement("strong", null, groupToDelete.name),
202
+ "?")),
203
+ });
204
+ yield deleteGroupMutation(groupToDelete.groupNum);
205
+ const index = (caseGroups.data || []).findIndex((value) => value.name === groupToDelete.name);
206
+ (caseGroups.data || []).splice(index, 1);
207
+ setCaseGroups(dispatch, caseGroups.data || []);
208
+ onClear();
209
+ ToastNotification.addSuccessMessage(t('Group has been successfully deleted'));
210
+ });
137
211
  const onAction = () => __awaiter(void 0, void 0, void 0, function* () {
212
+ var _a, _b, _c, _d;
213
+ const needsUniqueName = action === actions.create || action === actions.rename || action === actions.duplicate;
214
+ if (needsUniqueName && isUserInputAGroup()) {
215
+ ToastNotification.addWarningMessage(t('Group already exists'));
216
+ return;
217
+ }
138
218
  switch (action) {
139
219
  case actions.create: {
140
- if (isUserInputAGroup()) {
141
- ToastNotification.addWarningMessage(t('Group already exists'));
142
- break;
143
- }
144
- yield createGroup(input, loggedInUserJwtToken.username);
220
+ yield createGroup(input);
145
221
  setAction('');
146
222
  break;
147
223
  }
148
224
  case actions.rename: {
149
- if (isUserInputAGroup()) {
150
- ToastNotification.addWarningMessage(t('Group already exists'));
151
- break;
152
- }
153
225
  const previousGroup = selectedGroup;
154
226
  const group = getGroup(previousGroup);
155
227
  try {
156
- // change name in the current caseGroups list
157
- yield renameGroupFetch.request(input, group.groupNum, group.isPrivate);
228
+ yield renameGroupMutation(group.groupNum, input);
158
229
  const copyCaseGroups = [...(caseGroups.data || [])];
159
230
  const index = copyCaseGroups.findIndex((value) => value.name === previousGroup);
160
231
  copyCaseGroups[index].name = input;
@@ -166,7 +237,13 @@ export const GroupSelect = (props) => {
166
237
  ToastNotification.addSuccessMessage(t('Group has been renamed'));
167
238
  }
168
239
  catch (e) {
169
- ToastNotification.addDangerMessage(t('There was an error renaming this group '));
240
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
241
+ if (message.includes('insufficient access rights')) {
242
+ ToastNotification.addDangerMessage(t('You do not have permission to rename this group'));
243
+ }
244
+ else {
245
+ ToastNotification.addDangerMessage(t('There was an error renaming this group'));
246
+ }
170
247
  }
171
248
  finally {
172
249
  setAction('');
@@ -175,32 +252,16 @@ export const GroupSelect = (props) => {
175
252
  }
176
253
  case actions.delete: {
177
254
  try {
178
- const groupToDelete = getGroup(selectedGroup);
179
- try {
180
- // get confirmation on delete
181
- yield confirmation({
182
- catchOnCancel: true,
183
- title: t('Delete group'),
184
- description: (React.createElement(Trans, null,
185
- "Are you sure you want to delete ",
186
- React.createElement("strong", null, groupToDelete.name),
187
- "?")),
188
- });
189
- // delete action is confirmed
190
- yield deleteGroupFetch.request(groupToDelete.groupNum);
191
- // remove group from list
192
- const index = (caseGroups.data || []).findIndex((value) => value.name === groupToDelete.name);
193
- (caseGroups.data || []).splice(index, 1);
194
- setCaseGroups(dispatch, caseGroups.data || []);
195
- onClear();
196
- ToastNotification.addSuccessMessage(t('Group has been successfully deleted'));
197
- }
198
- catch (_a) {
199
- // user didn't confirm the delete action
200
- }
255
+ yield handleDeleteGroup();
201
256
  }
202
257
  catch (e) {
203
- ToastNotification.addDangerMessage(t('There was an error deleting this group'));
258
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
259
+ if (message.includes('insufficient access rights')) {
260
+ ToastNotification.addDangerMessage(t('You do not have permission to delete this group'));
261
+ }
262
+ else {
263
+ ToastNotification.addDangerMessage(t('There was an error deleting this group'));
264
+ }
204
265
  }
205
266
  finally {
206
267
  setAction('');
@@ -208,20 +269,63 @@ export const GroupSelect = (props) => {
208
269
  }
209
270
  }
210
271
  case actions.duplicate: {
211
- if (isUserInputAGroup()) {
212
- ToastNotification.addWarningMessage(t('Group already exists'));
272
+ if (!accountId) {
273
+ ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
213
274
  break;
214
275
  }
215
276
  try {
216
- yield duplicateGroupFetch.request({ name: input, contactSsoName: loggedInUserJwtToken.username });
217
- yield setGroupOnFetch(input);
277
+ const sourceGroup = getGroup(selectedGroup);
278
+ const dupResponse = yield createGroupMutation(input, accountId);
279
+ const dupRecord = dupResponse.redhat_support_uiapi.CaseGroup__cCreate.RedHatSupportRecord;
280
+ const newGroupId = dupRecord.Id;
281
+ if (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.groupNum) {
282
+ const membersResponse = yield apolloClient.query({
283
+ query: GET_CASE_GROUP_MEMBERS,
284
+ variables: {
285
+ where: { Group__c: { eq: sourceGroup.groupNum } },
286
+ first: 2000,
287
+ },
288
+ fetchPolicy: 'network-only',
289
+ });
290
+ const sourceMembers = ((_d = (_c = (_b = (_a = membersResponse.data) === null || _a === void 0 ? void 0 : _a.redhat_support_uiapi) === null || _b === void 0 ? void 0 : _b.query) === null || _c === void 0 ? void 0 : _c.RedHatSupportCaseGroupMember__c) === null || _d === void 0 ? void 0 : _d.edges) ||
291
+ [];
292
+ const contactIds = sourceMembers
293
+ .filter(({ node }) => { var _a; return (_a = node.Contact__c) === null || _a === void 0 ? void 0 : _a.value; })
294
+ .map(({ node }) => node.Contact__c.value);
295
+ if (contactIds.length > 0) {
296
+ const results = yield Promise.allSettled(contactIds.map((contactId) => createMemberMutation(contactId, newGroupId)));
297
+ const failed = results.filter((r) => r.status === 'rejected');
298
+ if (failed.length > 0) {
299
+ ToastNotification.addWarningMessage(t('Group duplicated but {{count}} members could not be copied', {
300
+ count: failed.length,
301
+ }));
302
+ }
303
+ }
304
+ }
305
+ const dupGroup = {
306
+ groupNum: newGroupId,
307
+ name: unescape(dupRecord.Name.value),
308
+ isPrivate: false,
309
+ isDefault: false,
310
+ defaultMembers: [],
311
+ members: [],
312
+ };
313
+ const updatedDupGroups = [...(caseGroups.data || []), dupGroup];
314
+ setCaseGroups(dispatch, updatedDupGroups);
218
315
  setShowDropdown(true);
219
316
  setShowInput(false);
317
+ setSelectedGroup(input);
220
318
  setInput('');
221
319
  ToastNotification.addSuccessMessage(t('Group has been successfully duplicated'));
222
320
  }
223
321
  catch (e) {
224
- ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
322
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
323
+ if (message.includes('insufficient access rights')) {
324
+ ToastNotification.addDangerMessage(t('You do not have permission to duplicate this group'));
325
+ }
326
+ else {
327
+ ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
328
+ }
225
329
  }
226
330
  finally {
227
331
  setAction('');
@@ -232,6 +336,7 @@ export const GroupSelect = (props) => {
232
336
  });
233
337
  useEffect(() => {
234
338
  if (action === actions.rename || action === actions.duplicate || action === actions.create) {
339
+ setIsOpen(false);
235
340
  setShowDropdown(false);
236
341
  setShowInput(true);
237
342
  action === actions.duplicate && setInput(`${selectedGroup} Duplicate`);
@@ -255,19 +360,26 @@ export const GroupSelect = (props) => {
255
360
  }
256
361
  }, [caseGroups.isFetching, caseGroups.isError, props.isDisabled, disableOnFetch, selectedGroup]);
257
362
  const onGroupActionCancel = () => {
363
+ setIsOpen(false);
258
364
  setShowInput(false);
259
365
  setShowDropdown(hasGroupPermissions);
260
366
  setAction('');
261
367
  setInput(selectedGroup);
262
368
  };
369
+ const handleAddMembers = () => {
370
+ var _a;
371
+ closeDropdown();
372
+ (_a = props.onAddMembers) === null || _a === void 0 ? void 0 : _a.call(props);
373
+ };
263
374
  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')),
375
+ 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')),
376
+ React.createElement(Divider, { component: "li" }),
377
+ 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')),
378
+ 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')),
379
+ React.createElement(MenuItem, { className: "create-group-action", isDisabled: !selectedGroup || !ability.can(resourceActions.CREATE, resources.CASE_GROUPS), key: "add-members", onClick: handleAddMembers, "data-tracking-id": "manage-group-add-members" }, t('Add members')),
380
+ React.createElement(MenuItem, { isDanger: true, className: "create-group-action del-btn", isDisabled: !selectedGroup || !ability.can(resourceActions.DELETE, resources.CASE_GROUPS), key: "delete", onClick: onActionFocus(actions.delete), "data-tracking-id": "manage-group-delete" }, t('Delete')),
268
381
  ];
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" },
270
- React.createElement(CogIcon, null)));
382
+ const dropdownToggle = (toggleRef) => (React.createElement(MenuToggle, { isFullHeight: true, className: "pf-v6-u-ml-sm manage-group-actions-toggle-options pf-v6-u-p-md", ref: toggleRef, isDisabled: props.isDisabled || disableOnFetch, onClick: toggleIsDropdownOpen, isExpanded: isDropdownOpen, "data-tracking-id": "manage-group-toggle-options", "aria-label": "Group actions dropdown toggle", icon: React.createElement(CogIcon, null) }));
271
383
  const submitActionBtn = useRef();
272
384
  useEffect(() => {
273
385
  if (isEmpty(manageActionsRef.current))
@@ -291,14 +403,11 @@ export const GroupSelect = (props) => {
291
403
  };
292
404
  const selectTypeahead = manageActionsRef.current.querySelector('input');
293
405
  if (!showInput) {
294
- // adds event listeners that prevent using enter to select a group.
295
406
  selectTypeahead.addEventListener('keydown', dontSubmitOnEnterCb);
296
407
  selectTypeahead.addEventListener('keyup', dontSubmitOnEnterCb);
297
408
  selectTypeahead.addEventListener('keypress', dontSubmitOnEnterCb);
298
409
  }
299
410
  else {
300
- // adds event listeners that allows submitting actions using enter on select
301
- // inupt used for getting user input for actions.
302
411
  selectTypeahead.addEventListener('keydown', submitOnEnterCb);
303
412
  }
304
413
  return () => {
@@ -312,22 +421,48 @@ export const GroupSelect = (props) => {
312
421
  }
313
422
  };
314
423
  }, [manageActionsRef, showInput]);
315
- //added for validation of new group name
316
424
  const containsOnlySpecialChars = (str) => {
317
425
  return /^[^a-zA-Z0-9]*$/.test(str);
318
426
  };
427
+ const onToggleClick = () => {
428
+ var _a;
429
+ setIsOpen(!isOpen);
430
+ setShouldFilter(false);
431
+ (_a = textInputRef === null || textInputRef === void 0 ? void 0 : textInputRef.current) === null || _a === void 0 ? void 0 : _a.focus();
432
+ };
433
+ const filteredGroups = (caseGroups.data || [])
434
+ .filter((g) => g.groupNum !== unGroupedCaseGroupNumber)
435
+ .filter((g) => !shouldFilter ||
436
+ isEmpty(input && typeof input === 'string' && input.trim()) ||
437
+ g.name.toLowerCase().includes(input.toLowerCase()));
438
+ const { focusedItemIndex, onInputKeyDown, setFocusedItemIndex } = useSelectKeyboardNavigator({
439
+ list: filteredGroups,
440
+ isOpen,
441
+ ignoreResetOnListChange: true,
442
+ resetIndexOnClose: true,
443
+ isDisabled: props.isDisabled,
444
+ setIsOpen,
445
+ onSelect: (selection) => handleSelect(selection),
446
+ });
447
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { ref: toggleRef, variant: "typeahead", onClick: onToggleClick, isExpanded: isOpen, isFullWidth: true, isDisabled: props.isDisabled },
448
+ React.createElement(TextInputGroup, { isPlain: true },
449
+ React.createElement(TextInputGroupMain, Object.assign({ value: input, onClick: onToggleClick, onKeyDown: onInputKeyDown, onChange: onChange, autoComplete: "off", innerRef: textInputRef, placeholder: selectAGroupText, role: "combobox", isExpanded: isOpen, "aria-controls": "group-selector-listbox" }, (activeItem && { 'aria-activedescendant': activeItem }))),
450
+ caseGroups.isFetching ? (React.createElement(TextInputGroupUtilities, null,
451
+ React.createElement(Spinner, { size: "md" }))) : (React.createElement(TextInputGroupUtilities, Object.assign({}, (!input ? { style: { display: 'none' } } : {})),
452
+ React.createElement(Button, { icon: React.createElement(TimesIcon, { "aria-hidden": true }), variant: "plain", onClick: onClear, "aria-label": "Clear input value" }))))));
319
453
  return (React.createElement("div", { ref: manageActionsRef, className: "toolbar-left" },
320
454
  showErrorMessage && (React.createElement(AlertMessage, { variant: AlertType.DANGER, title: t('Could not create group'), show: true })),
321
455
  !showErrorMessage && !showInput && (React.createElement(React.Fragment, null,
322
456
  React.createElement("label", null,
323
457
  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 })),
458
+ 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", isScrollable: true },
459
+ 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'))))))),
460
+ !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 },
461
+ React.createElement(MenuContent, null,
462
+ React.createElement(MenuList, null, dropdownItems)))),
328
463
  !showErrorMessage && showInput && (React.createElement("div", { className: "group-name-select" },
329
464
  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') }),
465
+ 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
466
  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
467
  React.createElement(Trans, null, "Save")),
333
468
  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,GAAI,OAAO,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
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ManageGroupUsers.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/ManageGroupUsers/ManageGroupUsers.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,eAAO,MAAM,gBAAgB,yBAiQ5B,CAAC"}
1
+ {"version":3,"file":"ManageGroupUsers.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/ManageGroupUsers/ManageGroupUsers.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAuC,MAAM,OAAO,CAAC;AA0C5D,eAAO,MAAM,gBAAgB,yBAoX5B,CAAC"}