@rh-support/manage 2.5.271 → 2.5.275
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.
- package/lib/esm/ManageTabs.d.ts.map +1 -1
- package/lib/esm/ManageTabs.js +46 -18
- package/lib/esm/Routes.d.ts +1 -0
- package/lib/esm/Routes.d.ts.map +1 -1
- package/lib/esm/Routes.js +6 -0
- package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.d.ts +12 -0
- package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.d.ts.map +1 -0
- package/lib/esm/components/Groups/AddMembersModal/AddMembersModal.js +80 -0
- package/lib/esm/components/Groups/AddMembersModal/index.d.ts +2 -0
- package/lib/esm/components/Groups/AddMembersModal/index.d.ts.map +1 -0
- package/lib/esm/components/Groups/AddMembersModal/index.js +1 -0
- package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts +5 -3
- package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.d.ts.map +1 -1
- package/lib/esm/components/Groups/DefualtGroupSwitch/DefaultGroupSwitch.js +21 -14
- package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts +1 -0
- package/lib/esm/components/Groups/GroupSelect/GroupSelect.d.ts.map +1 -1
- package/lib/esm/components/Groups/GroupSelect/GroupSelect.js +160 -85
- package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.d.ts.map +1 -1
- package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +163 -42
- package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts +19 -0
- package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.d.ts.map +1 -0
- package/lib/esm/components/ManageCaseLabels/AddEditCaseLabelModal.js +83 -0
- package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts +3 -0
- package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.d.ts.map +1 -0
- package/lib/esm/components/ManageCaseLabels/ManageCaseLabelsTab.js +217 -0
- package/lib/esm/components/ManageCaseLabels/index.d.ts +2 -0
- package/lib/esm/components/ManageCaseLabels/index.d.ts.map +1 -0
- package/lib/esm/components/ManageCaseLabels/index.js +1 -0
- package/lib/esm/components/ManageCaseLabels/types.d.ts +6 -0
- package/lib/esm/components/ManageCaseLabels/types.d.ts.map +1 -0
- package/lib/esm/components/ManageCaseLabels/types.js +1 -0
- package/lib/esm/components/ManagePreferences/sections/PreferencesACL.d.ts.map +1 -1
- package/lib/esm/components/ManagePreferences/sections/PreferencesACL.js +3 -4
- package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.d.ts.map +1 -1
- package/lib/esm/components/ManagePreferences/sections/PreferencesCaseCreate.js +73 -58
- package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.d.ts.map +1 -1
- package/lib/esm/components/ManagePreferences/sections/PreferencesCaseView.js +43 -98
- package/lib/esm/constants/GroupSelectActions.d.ts +2 -1
- package/lib/esm/constants/GroupSelectActions.d.ts.map +1 -1
- package/lib/esm/constants/GroupSelectActions.js +1 -0
- package/lib/esm/hooks/useCaseGroupGraphQL.d.ts +42 -0
- package/lib/esm/hooks/useCaseGroupGraphQL.d.ts.map +1 -0
- package/lib/esm/hooks/useCaseGroupGraphQL.js +109 -0
- package/lib/esm/hooks/useCaseLabelGraphQL.d.ts +26 -0
- package/lib/esm/hooks/useCaseLabelGraphQL.d.ts.map +1 -0
- package/lib/esm/hooks/useCaseLabelGraphQL.js +100 -0
- package/lib/esm/hooks/useCurrentUserContact.d.ts +8 -0
- package/lib/esm/hooks/useCurrentUserContact.d.ts.map +1 -0
- package/lib/esm/hooks/useCurrentUserContact.js +74 -0
- package/lib/esm/hooks/useVersionsDiffer.d.ts.map +1 -1
- package/lib/esm/index.js +1 -0
- package/lib/esm/scss/_main.scss +77 -0
- package/lib/esm/utils/caseGroupMapper.d.ts +18 -0
- package/lib/esm/utils/caseGroupMapper.d.ts.map +1 -0
- package/lib/esm/utils/caseGroupMapper.js +50 -0
- 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 {
|
|
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,
|
|
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 {
|
|
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
|
|
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
|
-
|
|
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 (
|
|
44
|
-
|
|
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
|
-
}, [
|
|
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
|
|
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
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
231
|
-
ToastNotification.
|
|
263
|
+
if (!accountId) {
|
|
264
|
+
ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
|
|
232
265
|
break;
|
|
233
266
|
}
|
|
234
267
|
try {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|