@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.
- 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 +169 -85
- package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.d.ts.map +1 -1
- package/lib/esm/components/Groups/ManageGroupUsers/ManageGroupUsers.js +182 -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 +97 -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 +220 -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/PreferencesBody.d.ts.map +1 -1
- package/lib/esm/components/ManagePreferences/PreferencesBody.js +1 -5
- 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 +117 -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 +104 -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 +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 {
|
|
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,45 @@ 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
|
+
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 (
|
|
44
|
-
|
|
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
|
-
}, [
|
|
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
|
|
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
|
|
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
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
231
|
-
ToastNotification.
|
|
272
|
+
if (!accountId) {
|
|
273
|
+
ToastNotification.addDangerMessage(t('There was an error while duplicating group'));
|
|
232
274
|
break;
|
|
233
275
|
}
|
|
234
276
|
try {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|