@rh-support/manage 2.5.281 → 2.6.10

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 (58) hide show
  1. package/lib/esm/ManageTabs.d.ts.map +1 -1
  2. package/lib/esm/ManageTabs.js +46 -18
  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/Groups/AddMembersModal/AddMembersModal.d.ts +12 -0
  7. package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.d.ts.map +1 -0
  8. package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.js +80 -0
  9. package/lib/esm/components/Groups/AddMembersModal/index.d.ts +2 -0
  10. package/lib/esm/components/Groups/AddMembersModal/index.d.ts.map +1 -0
  11. package/lib/esm/components/Groups/AddMembersModal/index.js +1 -0
  12. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts +5 -3
  13. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts.map +1 -1
  14. package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.js +21 -14
  15. package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts +1 -0
  16. package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts.map +1 -1
  17. package/lib/esm/components/Groups/GroupSelect/GroupSelect.js +169 -85
  18. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.d.ts.map +1 -1
  19. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +182 -42
  20. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts +19 -0
  21. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts.map +1 -0
  22. package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.js +97 -0
  23. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts +3 -0
  24. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts.map +1 -0
  25. package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.js +220 -0
  26. package/lib/esm/components/ManageCaseLabels/index.d.ts +2 -0
  27. package/lib/esm/components/ManageCaseLabels/index.d.ts.map +1 -0
  28. package/lib/esm/components/ManageCaseLabels/index.js +1 -0
  29. package/lib/esm/components/ManageCaseLabels/types.d.ts +6 -0
  30. package/lib/esm/components/ManageCaseLabels/types.d.ts.map +1 -0
  31. package/lib/esm/components/ManageCaseLabels/types.js +1 -0
  32. package/lib/esm/components/ManagePreferences/PreferencesBody.d.ts.map +1 -1
  33. package/lib/esm/components/ManagePreferences/PreferencesBody.js +1 -5
  34. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.d.ts.map +1 -1
  35. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.js +3 -4
  36. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.d.ts.map +1 -1
  37. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.js +73 -58
  38. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.d.ts.map +1 -1
  39. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.js +43 -98
  40. package/lib/esm/constants/GroupSelectActions.d.ts +2 -1
  41. package/lib/esm/constants/GroupSelectActions.d.ts.map +1 -1
  42. package/lib/esm/constants/GroupSelectActions.js +1 -0
  43. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts +42 -0
  44. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts.map +1 -0
  45. package/lib/esm/hooks/useCaseGroupGraphQL.js +117 -0
  46. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts +26 -0
  47. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts.map +1 -0
  48. package/lib/esm/hooks/useCaseLabelGraphQL.js +104 -0
  49. package/lib/esm/hooks/useCurrentUserContact.d.ts +8 -0
  50. package/lib/esm/hooks/useCurrentUserContact.d.ts.map +1 -0
  51. package/lib/esm/hooks/useCurrentUserContact.js +74 -0
  52. package/lib/esm/hooks/useVersionsDiffer.d.ts.map +1 -1
  53. package/lib/esm/index.js +1 -0
  54. package/lib/esm/scss/_main.scss +77 -0
  55. package/lib/esm/utils/caseGroupMapper.d.ts +18 -0
  56. package/lib/esm/utils/caseGroupMapper.d.ts.map +1 -0
  57. package/lib/esm/utils/caseGroupMapper.js +50 -0
  58. package/package.json +9 -6
@@ -7,26 +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';
10
+ import { useApolloClient } from '@apollo/client/react';
11
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
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
+ import { AlertMessage, AlertType, ToastNotification, useConfirmation, usePrevious, useSelectKeyboardNavigator, } from '@rh-support/components';
15
15
  import { fetchCaseGroupsForSSO, setCaseGroups, useGlobalDispatchContext, useGlobalStateContext, } from '@rh-support/react-context';
16
16
  import { ability, resourceActions, resources } from '@rh-support/user-permissions';
17
- import { haventLoadedMetadata } from '@rh-support/utils';
17
+ import { GET_CASE_GROUP_MEMBERS } from '@rh-support/utils';
18
18
  import find from 'lodash/find';
19
19
  import isEmpty from 'lodash/isEmpty';
20
+ import unescape from 'lodash/unescape';
20
21
  import React, { useCallback, useEffect, useRef, useState } from 'react';
21
22
  import { Trans, useTranslation } from 'react-i18next';
22
23
  import { GroupSelectActions } from '../../../constants/GroupSelectActions';
24
+ import { useCreateCaseGroup, useCreateCaseGroupMember, useDeleteCaseGroup, useRenameCaseGroup, } from '../../../hooks/useCaseGroupGraphQL';
23
25
  const actions = GroupSelectActions;
24
26
  const unGroupedCaseGroupNumber = '-1';
25
27
  export const GroupSelect = (props) => {
28
+ var _a;
26
29
  const { t } = useTranslation();
27
30
  const { onSelect: onSelectProp } = props;
28
31
  const manageActionsRef = useRef();
29
- const { globalMetadataState: { caseGroups, loggedInUserJwtToken }, } = useGlobalStateContext();
32
+ const apolloClient = useApolloClient();
33
+ const { globalMetadataState: { caseGroups, loggedInUsersAccount }, } = useGlobalStateContext();
30
34
  const dispatch = useGlobalDispatchContext();
31
35
  const selectAGroupText = caseGroups.isFetching
32
36
  ? t('Loading groups')
@@ -37,11 +41,45 @@ export const GroupSelect = (props) => {
37
41
  const confirmation = useConfirmation();
38
42
  const [input, setInput] = useState('');
39
43
  const [shouldFilter, setShouldFilter] = useState(false);
40
- // Fetch groups on init
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
41
79
  useEffect(() => {
42
80
  var _a, _b;
43
- if (haventLoadedMetadata(caseGroups, (data) => data === undefined))
44
- fetchCaseGroupsForSSO(dispatch, loggedInUserJwtToken.preferred_username);
81
+ if (!groupsFetchCompleted || caseGroups.isFetching)
82
+ return;
45
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) {
46
84
  const defaultCaseGroup = find(caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data, (g) => g.isDefault);
47
85
  const newSelectedGroup = (defaultCaseGroup === null || defaultCaseGroup === void 0 ? void 0 : defaultCaseGroup.groupNum) === '-1'
@@ -53,7 +91,7 @@ export const GroupSelect = (props) => {
53
91
  }
54
92
  }
55
93
  // eslint-disable-next-line react-hooks/exhaustive-deps
56
- }, [dispatch, loggedInUserJwtToken, caseGroups]);
94
+ }, [caseGroups, groupsFetchCompleted]);
57
95
  // handle dropdown open/close toggle
58
96
  const [isOpen, setIsOpen] = useState(false);
59
97
  // handle group selection
@@ -81,6 +119,7 @@ export const GroupSelect = (props) => {
81
119
  // Group actions dropdown state
82
120
  const hasGroupPermissions = ability.can(resourceActions.CREATE, resources.CASE_GROUPS);
83
121
  const [showDropdown, setShowDropdown] = useState(hasGroupPermissions);
122
+ useEffect(() => setShowDropdown(hasGroupPermissions), [hasGroupPermissions]);
84
123
  const [showInput, setShowInput] = useState(false);
85
124
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
86
125
  const toggleIsDropdownOpen = () => setIsDropdownOpen(!isDropdownOpen);
@@ -90,19 +129,10 @@ export const GroupSelect = (props) => {
90
129
  closeDropdown();
91
130
  setAction(action);
92
131
  };
93
- // fetch objects for apis
94
132
  const [showErrorMessage] = useState(false);
95
- const createGroupFetch = useFetch(publicApi.caseGroups.createGroup, { propgateErrors: true });
96
- const renameGroupFetch = useFetch(publicApi.caseGroups.renameGroup, { propgateErrors: true });
97
- const deleteGroupFetch = useFetch(publicApi.caseGroups.deleteGroup, { propgateErrors: true });
98
- const duplicateGroupFetch = useFetch(publicApi.caseGroups.createGroup, { propgateErrors: true });
99
133
  // group actions input state
100
134
  const textInputRef = useRef();
101
- const disableOnFetch = caseGroups.isFetching ||
102
- createGroupFetch.isFetching ||
103
- renameGroupFetch.isFetching ||
104
- deleteGroupFetch.isFetching ||
105
- duplicateGroupFetch.isFetching;
135
+ const disableOnFetch = caseGroups.isFetching || createLoading || renameLoading || deleteLoading;
106
136
  const onChange = (e, value) => {
107
137
  if (!showInput) {
108
138
  setIsOpen(true);
@@ -124,56 +154,78 @@ export const GroupSelect = (props) => {
124
154
  // eslint-disable-next-line react-hooks/exhaustive-deps
125
155
  }, [input, showInput]);
126
156
  // group actions
127
- function setGroupOnFetch(groupName) {
128
- return __awaiter(this, void 0, void 0, function* () {
129
- yield fetchCaseGroupsForSSO(dispatch, loggedInUserJwtToken.preferred_username);
130
- setSelectedGroup(groupName);
131
- });
132
- }
133
- function createGroup(groupName, ssoUsername) {
157
+ function createGroup(groupName) {
134
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
+ }
135
163
  try {
136
- yield createGroupFetch.request({ name: groupName, contactSsoName: ssoUsername });
164
+ const response = yield createGroupMutation(groupName, accountId);
165
+ const createdRecord = response.redhat_support_uiapi.CaseGroup__cCreate.RedHatSupportRecord;
137
166
  ToastNotification.addSuccessMessage(t('Group has been successfully created'));
138
- try {
139
- yield setGroupOnFetch(groupName);
140
- setShowDropdown(true);
141
- setShowInput(false);
142
- setSelectedGroup(groupName);
143
- }
144
- catch (error) {
145
- ToastNotification.addDangerMessage(t("We're having an issue finding this group's users"));
146
- onClear();
147
- }
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);
148
180
  }
149
181
  catch (e) {
150
- 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
+ }
151
189
  }
152
190
  });
153
191
  }
154
192
  const [action, setAction] = useState('');
155
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
+ });
156
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
+ }
157
218
  switch (action) {
158
219
  case actions.create: {
159
- if (isUserInputAGroup()) {
160
- ToastNotification.addWarningMessage(t('Group already exists'));
161
- break;
162
- }
163
- yield createGroup(input, loggedInUserJwtToken.preferred_username);
220
+ yield createGroup(input);
164
221
  setAction('');
165
222
  break;
166
223
  }
167
224
  case actions.rename: {
168
- if (isUserInputAGroup()) {
169
- ToastNotification.addWarningMessage(t('Group already exists'));
170
- break;
171
- }
172
225
  const previousGroup = selectedGroup;
173
226
  const group = getGroup(previousGroup);
174
227
  try {
175
- // change name in the current caseGroups list
176
- yield renameGroupFetch.request(input, group.groupNum, group.isPrivate);
228
+ yield renameGroupMutation(group.groupNum, input);
177
229
  const copyCaseGroups = [...(caseGroups.data || [])];
178
230
  const index = copyCaseGroups.findIndex((value) => value.name === previousGroup);
179
231
  copyCaseGroups[index].name = input;
@@ -185,7 +237,13 @@ export const GroupSelect = (props) => {
185
237
  ToastNotification.addSuccessMessage(t('Group has been renamed'));
186
238
  }
187
239
  catch (e) {
188
- 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
+ }
189
247
  }
190
248
  finally {
191
249
  setAction('');
@@ -194,32 +252,16 @@ export const GroupSelect = (props) => {
194
252
  }
195
253
  case actions.delete: {
196
254
  try {
197
- const groupToDelete = getGroup(selectedGroup);
198
- try {
199
- // get confirmation on delete
200
- yield confirmation({
201
- catchOnCancel: true,
202
- title: t('Delete group'),
203
- description: (React.createElement(Trans, null,
204
- "Are you sure you want to delete ",
205
- React.createElement("strong", null, groupToDelete.name),
206
- "?")),
207
- });
208
- // delete action is confirmed
209
- yield deleteGroupFetch.request(groupToDelete.groupNum);
210
- // remove group from list
211
- const index = (caseGroups.data || []).findIndex((value) => value.name === groupToDelete.name);
212
- (caseGroups.data || []).splice(index, 1);
213
- setCaseGroups(dispatch, caseGroups.data || []);
214
- onClear();
215
- ToastNotification.addSuccessMessage(t('Group has been successfully deleted'));
216
- }
217
- catch (_a) {
218
- // user didn't confirm the delete action
219
- }
255
+ yield handleDeleteGroup();
220
256
  }
221
257
  catch (e) {
222
- 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
+ }
223
265
  }
224
266
  finally {
225
267
  setAction('');
@@ -227,23 +269,63 @@ export const GroupSelect = (props) => {
227
269
  }
228
270
  }
229
271
  case actions.duplicate: {
230
- if (isUserInputAGroup()) {
231
- ToastNotification.addWarningMessage(t('Group already exists'));
272
+ if (!accountId) {
273
+ ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
232
274
  break;
233
275
  }
234
276
  try {
235
- yield duplicateGroupFetch.request({
236
- name: input,
237
- contactSsoName: loggedInUserJwtToken.preferred_username,
238
- });
239
- 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);
240
315
  setShowDropdown(true);
241
316
  setShowInput(false);
317
+ setSelectedGroup(input);
242
318
  setInput('');
243
319
  ToastNotification.addSuccessMessage(t('Group has been successfully duplicated'));
244
320
  }
245
321
  catch (e) {
246
- 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
+ }
247
329
  }
248
330
  finally {
249
331
  setAction('');
@@ -284,11 +366,17 @@ export const GroupSelect = (props) => {
284
366
  setAction('');
285
367
  setInput(selectedGroup);
286
368
  };
369
+ const handleAddMembers = () => {
370
+ var _a;
371
+ closeDropdown();
372
+ (_a = props.onAddMembers) === null || _a === void 0 ? void 0 : _a.call(props);
373
+ };
287
374
  const dropdownItems = [
288
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')),
289
376
  React.createElement(Divider, { component: "li" }),
290
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')),
291
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')),
292
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')),
293
381
  ];
294
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) }));
@@ -315,14 +403,11 @@ export const GroupSelect = (props) => {
315
403
  };
316
404
  const selectTypeahead = manageActionsRef.current.querySelector('input');
317
405
  if (!showInput) {
318
- // adds event listeners that prevent using enter to select a group.
319
406
  selectTypeahead.addEventListener('keydown', dontSubmitOnEnterCb);
320
407
  selectTypeahead.addEventListener('keyup', dontSubmitOnEnterCb);
321
408
  selectTypeahead.addEventListener('keypress', dontSubmitOnEnterCb);
322
409
  }
323
410
  else {
324
- // adds event listeners that allows submitting actions using enter on select
325
- // inupt used for getting user input for actions.
326
411
  selectTypeahead.addEventListener('keydown', submitOnEnterCb);
327
412
  }
328
413
  return () => {
@@ -336,7 +421,6 @@ export const GroupSelect = (props) => {
336
421
  }
337
422
  };
338
423
  }, [manageActionsRef, showInput]);
339
- //added for validation of new group name
340
424
  const containsOnlySpecialChars = (str) => {
341
425
  return /^[^a-zA-Z0-9]*$/.test(str);
342
426
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ManageGroupUsers.d.ts","sourceRoot":"","sources":["../../../../../src/components/Groups/ManageGroupUsers/ManageGroupUsers.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAS5D,eAAO,MAAM,gBAAgB,yBA4L5B,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"}