@rh-support/manage 2.5.272 → 2.5.276

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 (56) 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 +160 -85
  18. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.d.ts.map +1 -1
  19. package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +163 -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/sections/PreferencesACL.d.ts.map +1 -1
  33. package/lib/esm/components/ManagePreferences/sections/PreferencesACL.js +3 -4
  34. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.d.ts.map +1 -1
  35. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.js +73 -58
  36. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.d.ts.map +1 -1
  37. package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.js +43 -98
  38. package/lib/esm/constants/GroupSelectActions.d.ts +2 -1
  39. package/lib/esm/constants/GroupSelectActions.d.ts.map +1 -1
  40. package/lib/esm/constants/GroupSelectActions.js +1 -0
  41. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts +42 -0
  42. package/lib/esm/hooks/useCaseGroupGraphQL.d.ts.map +1 -0
  43. package/lib/esm/hooks/useCaseGroupGraphQL.js +109 -0
  44. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts +26 -0
  45. package/lib/esm/hooks/useCaseLabelGraphQL.d.ts.map +1 -0
  46. package/lib/esm/hooks/useCaseLabelGraphQL.js +104 -0
  47. package/lib/esm/hooks/useCurrentUserContact.d.ts +8 -0
  48. package/lib/esm/hooks/useCurrentUserContact.d.ts.map +1 -0
  49. package/lib/esm/hooks/useCurrentUserContact.js +74 -0
  50. package/lib/esm/hooks/useVersionsDiffer.d.ts.map +1 -1
  51. package/lib/esm/index.js +1 -0
  52. package/lib/esm/scss/_main.scss +77 -0
  53. package/lib/esm/utils/caseGroupMapper.d.ts +18 -0
  54. package/lib/esm/utils/caseGroupMapper.d.ts.map +1 -0
  55. package/lib/esm/utils/caseGroupMapper.js +50 -0
  56. package/package.json +11 -8
@@ -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,39 @@ 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
+ // Always fetch groups from GraphQL — never rely on potentially stale Hydra data.
53
+ // Auto-select only after this settles so members can load against real group data.
54
+ useEffect(() => {
55
+ if (!apolloClient || !accountId) {
56
+ setGroupsFetchCompleted(true);
57
+ return;
58
+ }
59
+ if (hasFetchedFromGraphQL.current)
60
+ return;
61
+ hasFetchedFromGraphQL.current = true;
62
+ const fetchGroups = () => __awaiter(void 0, void 0, void 0, function* () {
63
+ try {
64
+ yield fetchCaseGroupsForSSO(dispatch, apolloClient, accountId);
65
+ }
66
+ finally {
67
+ setGroupsFetchCompleted(true);
68
+ }
69
+ });
70
+ fetchGroups();
71
+ }, [dispatch, apolloClient, accountId]);
72
+ // Set default group once groups are loaded
41
73
  useEffect(() => {
42
74
  var _a, _b;
43
- if (haventLoadedMetadata(caseGroups, (data) => data === undefined))
44
- fetchCaseGroupsForSSO(dispatch, loggedInUserJwtToken.preferred_username);
75
+ if (!groupsFetchCompleted || caseGroups.isFetching)
76
+ return;
45
77
  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
78
  const defaultCaseGroup = find(caseGroups === null || caseGroups === void 0 ? void 0 : caseGroups.data, (g) => g.isDefault);
47
79
  const newSelectedGroup = (defaultCaseGroup === null || defaultCaseGroup === void 0 ? void 0 : defaultCaseGroup.groupNum) === '-1'
@@ -53,7 +85,7 @@ export const GroupSelect = (props) => {
53
85
  }
54
86
  }
55
87
  // eslint-disable-next-line react-hooks/exhaustive-deps
56
- }, [dispatch, loggedInUserJwtToken, caseGroups]);
88
+ }, [caseGroups, groupsFetchCompleted]);
57
89
  // handle dropdown open/close toggle
58
90
  const [isOpen, setIsOpen] = useState(false);
59
91
  // handle group selection
@@ -81,6 +113,7 @@ export const GroupSelect = (props) => {
81
113
  // Group actions dropdown state
82
114
  const hasGroupPermissions = ability.can(resourceActions.CREATE, resources.CASE_GROUPS);
83
115
  const [showDropdown, setShowDropdown] = useState(hasGroupPermissions);
116
+ useEffect(() => setShowDropdown(hasGroupPermissions), [hasGroupPermissions]);
84
117
  const [showInput, setShowInput] = useState(false);
85
118
  const [isDropdownOpen, setIsDropdownOpen] = useState(false);
86
119
  const toggleIsDropdownOpen = () => setIsDropdownOpen(!isDropdownOpen);
@@ -90,19 +123,10 @@ export const GroupSelect = (props) => {
90
123
  closeDropdown();
91
124
  setAction(action);
92
125
  };
93
- // fetch objects for apis
94
126
  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
127
  // group actions input state
100
128
  const textInputRef = useRef();
101
- const disableOnFetch = caseGroups.isFetching ||
102
- createGroupFetch.isFetching ||
103
- renameGroupFetch.isFetching ||
104
- deleteGroupFetch.isFetching ||
105
- duplicateGroupFetch.isFetching;
129
+ const disableOnFetch = caseGroups.isFetching || createLoading || renameLoading || deleteLoading;
106
130
  const onChange = (e, value) => {
107
131
  if (!showInput) {
108
132
  setIsOpen(true);
@@ -124,56 +148,78 @@ export const GroupSelect = (props) => {
124
148
  // eslint-disable-next-line react-hooks/exhaustive-deps
125
149
  }, [input, showInput]);
126
150
  // 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) {
151
+ function createGroup(groupName) {
134
152
  return __awaiter(this, void 0, void 0, function* () {
153
+ if (!accountId) {
154
+ ToastNotification.addDangerMessage(t('There was an error while creating this group'));
155
+ return;
156
+ }
135
157
  try {
136
- yield createGroupFetch.request({ name: groupName, contactSsoName: ssoUsername });
158
+ const response = yield createGroupMutation(groupName, accountId);
159
+ const createdRecord = response.redhat_support_uiapi.CaseGroup__cCreate.RedHatSupportRecord;
137
160
  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
- }
161
+ const newGroup = {
162
+ groupNum: createdRecord.Id,
163
+ name: unescape(createdRecord.Name.value),
164
+ isPrivate: false,
165
+ isDefault: false,
166
+ defaultMembers: [],
167
+ members: [],
168
+ };
169
+ const updatedGroups = [...(caseGroups.data || []), newGroup];
170
+ setCaseGroups(dispatch, updatedGroups);
171
+ setShowDropdown(true);
172
+ setShowInput(false);
173
+ setSelectedGroup(groupName);
148
174
  }
149
175
  catch (e) {
150
- ToastNotification.addDangerMessage(t('There was an error while creating this group'));
176
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
177
+ if (message.includes('insufficient access rights')) {
178
+ ToastNotification.addDangerMessage(t('You do not have permission to create this group'));
179
+ }
180
+ else {
181
+ ToastNotification.addDangerMessage(t('There was an error while creating this group'));
182
+ }
151
183
  }
152
184
  });
153
185
  }
154
186
  const [action, setAction] = useState('');
155
187
  const isUserInputAGroup = () => (caseGroups.data || []).find((value) => value.name === input);
188
+ const handleDeleteGroup = () => __awaiter(void 0, void 0, void 0, function* () {
189
+ const groupToDelete = getGroup(selectedGroup);
190
+ yield confirmation({
191
+ catchOnCancel: true,
192
+ title: t('Delete group'),
193
+ description: (React.createElement(Trans, null,
194
+ "Are you sure you want to delete ",
195
+ React.createElement("strong", null, groupToDelete.name),
196
+ "?")),
197
+ });
198
+ yield deleteGroupMutation(groupToDelete.groupNum);
199
+ const index = (caseGroups.data || []).findIndex((value) => value.name === groupToDelete.name);
200
+ (caseGroups.data || []).splice(index, 1);
201
+ setCaseGroups(dispatch, caseGroups.data || []);
202
+ onClear();
203
+ ToastNotification.addSuccessMessage(t('Group has been successfully deleted'));
204
+ });
156
205
  const onAction = () => __awaiter(void 0, void 0, void 0, function* () {
206
+ var _a, _b, _c, _d;
207
+ const needsUniqueName = action === actions.create || action === actions.rename || action === actions.duplicate;
208
+ if (needsUniqueName && isUserInputAGroup()) {
209
+ ToastNotification.addWarningMessage(t('Group already exists'));
210
+ return;
211
+ }
157
212
  switch (action) {
158
213
  case actions.create: {
159
- if (isUserInputAGroup()) {
160
- ToastNotification.addWarningMessage(t('Group already exists'));
161
- break;
162
- }
163
- yield createGroup(input, loggedInUserJwtToken.preferred_username);
214
+ yield createGroup(input);
164
215
  setAction('');
165
216
  break;
166
217
  }
167
218
  case actions.rename: {
168
- if (isUserInputAGroup()) {
169
- ToastNotification.addWarningMessage(t('Group already exists'));
170
- break;
171
- }
172
219
  const previousGroup = selectedGroup;
173
220
  const group = getGroup(previousGroup);
174
221
  try {
175
- // change name in the current caseGroups list
176
- yield renameGroupFetch.request(input, group.groupNum, group.isPrivate);
222
+ yield renameGroupMutation(group.groupNum, input);
177
223
  const copyCaseGroups = [...(caseGroups.data || [])];
178
224
  const index = copyCaseGroups.findIndex((value) => value.name === previousGroup);
179
225
  copyCaseGroups[index].name = input;
@@ -185,7 +231,13 @@ export const GroupSelect = (props) => {
185
231
  ToastNotification.addSuccessMessage(t('Group has been renamed'));
186
232
  }
187
233
  catch (e) {
188
- ToastNotification.addDangerMessage(t('There was an error renaming this group '));
234
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
235
+ if (message.includes('insufficient access rights')) {
236
+ ToastNotification.addDangerMessage(t('You do not have permission to rename this group'));
237
+ }
238
+ else {
239
+ ToastNotification.addDangerMessage(t('There was an error renaming this group'));
240
+ }
189
241
  }
190
242
  finally {
191
243
  setAction('');
@@ -194,32 +246,13 @@ export const GroupSelect = (props) => {
194
246
  }
195
247
  case actions.delete: {
196
248
  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
- }
249
+ yield handleDeleteGroup();
220
250
  }
221
251
  catch (e) {
222
- ToastNotification.addDangerMessage(t('There was an error deleting this group'));
252
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
253
+ if (message.includes('insufficient access rights')) {
254
+ ToastNotification.addDangerMessage(t('You do not have permission to delete this group'));
255
+ }
223
256
  }
224
257
  finally {
225
258
  setAction('');
@@ -227,23 +260,63 @@ export const GroupSelect = (props) => {
227
260
  }
228
261
  }
229
262
  case actions.duplicate: {
230
- if (isUserInputAGroup()) {
231
- ToastNotification.addWarningMessage(t('Group already exists'));
263
+ if (!accountId) {
264
+ ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
232
265
  break;
233
266
  }
234
267
  try {
235
- yield duplicateGroupFetch.request({
236
- name: input,
237
- contactSsoName: loggedInUserJwtToken.preferred_username,
238
- });
239
- yield setGroupOnFetch(input);
268
+ const sourceGroup = getGroup(selectedGroup);
269
+ const dupResponse = yield createGroupMutation(input, accountId);
270
+ const dupRecord = dupResponse.redhat_support_uiapi.CaseGroup__cCreate.RedHatSupportRecord;
271
+ const newGroupId = dupRecord.Id;
272
+ if (sourceGroup === null || sourceGroup === void 0 ? void 0 : sourceGroup.groupNum) {
273
+ const membersResponse = yield apolloClient.query({
274
+ query: GET_CASE_GROUP_MEMBERS,
275
+ variables: {
276
+ where: { Group__c: { eq: sourceGroup.groupNum } },
277
+ first: 2000,
278
+ },
279
+ fetchPolicy: 'network-only',
280
+ });
281
+ 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) ||
282
+ [];
283
+ const contactIds = sourceMembers
284
+ .filter(({ node }) => { var _a; return (_a = node.Contact__c) === null || _a === void 0 ? void 0 : _a.value; })
285
+ .map(({ node }) => node.Contact__c.value);
286
+ if (contactIds.length > 0) {
287
+ const results = yield Promise.allSettled(contactIds.map((contactId) => createMemberMutation(contactId, newGroupId)));
288
+ const failed = results.filter((r) => r.status === 'rejected');
289
+ if (failed.length > 0) {
290
+ ToastNotification.addWarningMessage(t('Group duplicated but {{count}} members could not be copied', {
291
+ count: failed.length,
292
+ }));
293
+ }
294
+ }
295
+ }
296
+ const dupGroup = {
297
+ groupNum: newGroupId,
298
+ name: unescape(dupRecord.Name.value),
299
+ isPrivate: false,
300
+ isDefault: false,
301
+ defaultMembers: [],
302
+ members: [],
303
+ };
304
+ const updatedDupGroups = [...(caseGroups.data || []), dupGroup];
305
+ setCaseGroups(dispatch, updatedDupGroups);
240
306
  setShowDropdown(true);
241
307
  setShowInput(false);
308
+ setSelectedGroup(input);
242
309
  setInput('');
243
310
  ToastNotification.addSuccessMessage(t('Group has been successfully duplicated'));
244
311
  }
245
312
  catch (e) {
246
- ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
313
+ const message = String((e === null || e === void 0 ? void 0 : e.message) || '');
314
+ if (message.includes('insufficient access rights')) {
315
+ ToastNotification.addDangerMessage(t('You do not have permission to duplicate this group'));
316
+ }
317
+ else {
318
+ ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
319
+ }
247
320
  }
248
321
  finally {
249
322
  setAction('');
@@ -284,11 +357,17 @@ export const GroupSelect = (props) => {
284
357
  setAction('');
285
358
  setInput(selectedGroup);
286
359
  };
360
+ const handleAddMembers = () => {
361
+ var _a;
362
+ closeDropdown();
363
+ (_a = props.onAddMembers) === null || _a === void 0 ? void 0 : _a.call(props);
364
+ };
287
365
  const dropdownItems = [
288
366
  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
367
  React.createElement(Divider, { component: "li" }),
290
368
  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
369
  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')),
370
+ 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
371
  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
372
  ];
294
373
  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 +394,11 @@ export const GroupSelect = (props) => {
315
394
  };
316
395
  const selectTypeahead = manageActionsRef.current.querySelector('input');
317
396
  if (!showInput) {
318
- // adds event listeners that prevent using enter to select a group.
319
397
  selectTypeahead.addEventListener('keydown', dontSubmitOnEnterCb);
320
398
  selectTypeahead.addEventListener('keyup', dontSubmitOnEnterCb);
321
399
  selectTypeahead.addEventListener('keypress', dontSubmitOnEnterCb);
322
400
  }
323
401
  else {
324
- // adds event listeners that allows submitting actions using enter on select
325
- // inupt used for getting user input for actions.
326
402
  selectTypeahead.addEventListener('keydown', submitOnEnterCb);
327
403
  }
328
404
  return () => {
@@ -336,7 +412,6 @@ export const GroupSelect = (props) => {
336
412
  }
337
413
  };
338
414
  }, [manageActionsRef, showInput]);
339
- //added for validation of new group name
340
415
  const containsOnlySpecialChars = (str) => {
341
416
  return /^[^a-zA-Z0-9]*$/.test(str);
342
417
  };
@@ -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;AAsC5D,eAAO,MAAM,gBAAgB,yBAwV5B,CAAC"}