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