@rh-support/cases 2.6.235 → 2.7.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/components/case/NewCaseButton.js +1 -1
- package/lib/esm/components/case-list/CaseList.d.ts +0 -7
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +372 -137
- package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListContext.js +5 -2
- package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterContext.js +2 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts +3 -2
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.js +19 -6
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +36 -4
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +6 -12
- package/lib/esm/components/case-list/CaseListReducer.d.ts +22 -10
- package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListReducer.js +25 -7
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.js +18 -11
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +20 -4
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +178 -0
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +1 -7
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +12 -16
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +2 -5
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +14 -13
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +21 -14
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +3 -0
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +11 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +90 -70
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +1 -3
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +2 -2
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +5 -4
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +15 -54
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +18 -44
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +23 -49
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +1 -3
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +60 -59
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +8 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts +9 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.js +105 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +10 -3
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTable.js +98 -84
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts +33 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.js +51 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts +9 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.js +10 -0
- package/lib/esm/components/case-list/case-list-table/CloseCaseBtn.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/CloseCaseBtn.js +27 -28
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +0 -5
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +51 -70
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +5 -15
- package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +4 -5
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +1 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts +8 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.js +8 -0
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +15 -2
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +55 -24
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.js +29 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.js +16 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.js +21 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts +12 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.js +31 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.js +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.js +92 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.js +20 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.js +28 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.js +241 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts +11 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.js +23 -0
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +2 -1
- package/lib/esm/css/caseList.css +197 -28
- package/lib/esm/css/caseSearch.css +114 -0
- package/lib/esm/enums/case.d.ts +13 -5
- package/lib/esm/enums/case.d.ts.map +1 -1
- package/lib/esm/enums/case.js +23 -3
- package/lib/esm/enums/caseSearch.d.ts +3 -0
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +2 -1
- package/lib/esm/enums/filters.d.ts +5 -1
- package/lib/esm/enums/filters.d.ts.map +1 -1
- package/lib/esm/enums/filters.js +4 -0
- package/lib/esm/hooks/useCaseLabels.d.ts +14 -0
- package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -0
- package/lib/esm/hooks/useCaseLabels.js +50 -0
- package/lib/esm/hooks/useCloseCase.d.ts +1 -1
- package/lib/esm/hooks/useCloseCase.d.ts.map +1 -1
- package/lib/esm/hooks/useCloseCase.js +54 -30
- package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/hooks/useExportCaseListCSV.js +1 -9
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.js +7 -5
- package/lib/esm/index.js +1 -0
- package/lib/esm/models/caseList.d.ts +1 -0
- package/lib/esm/models/caseList.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.d.ts +1 -0
- package/lib/esm/test-utils/mockData.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.js +2 -1
- package/lib/esm/utils/advanceSearchFormMapper.d.ts +11 -0
- package/lib/esm/utils/advanceSearchFormMapper.d.ts.map +1 -0
- package/lib/esm/utils/advanceSearchFormMapper.js +71 -0
- package/lib/esm/utils/advanceSearchUtils.d.ts +24 -0
- package/lib/esm/utils/advanceSearchUtils.d.ts.map +1 -0
- package/lib/esm/utils/advanceSearchUtils.js +150 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts +12 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.js +34 -0
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts +10 -0
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseGroupDefaultUtils.js +20 -0
- package/lib/esm/utils/caseListGraphQLUtils.d.ts +28 -0
- package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseListGraphQLUtils.js +304 -0
- package/lib/esm/utils/caseListMapper.d.ts +6 -0
- package/lib/esm/utils/caseListMapper.d.ts.map +1 -0
- package/lib/esm/utils/caseListMapper.js +47 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +17 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -0
- package/lib/esm/utils/caseListVariablesBuilder.js +535 -0
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +39 -2
- package/lib/esm/utils/constants.d.ts +4 -1
- package/lib/esm/utils/constants.d.ts.map +1 -1
- package/lib/esm/utils/constants.js +9 -2
- package/lib/esm/utils/mockSolrResponse.js +1 -1
- package/package.json +8 -6
|
@@ -8,19 +8,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import './DownloadCSVFileModal.scss';
|
|
11
|
-
import {
|
|
11
|
+
import { useApolloClient } from '@apollo/client/react';
|
|
12
12
|
import { Button, Checkbox, Form, FormGroup, Grid, GridItem, InputGroup, Modal, ModalBody, ModalFooter, ModalHeader, ModalVariant, Spinner, TextInput, ValidatedOptions, } from '@patternfly/react-core';
|
|
13
13
|
import DownloadIcon from '@patternfly/react-icons/dist/js/icons/download-icon';
|
|
14
14
|
import TimesCircleIcon from '@patternfly/react-icons/dist/js/icons/times-circle-icon';
|
|
15
|
-
import { ToastNotification
|
|
16
|
-
import {
|
|
15
|
+
import { ToastNotification } from '@rh-support/components';
|
|
16
|
+
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
17
|
+
import { downloadCSV, formatDateTime, mapSfdcStatusToPortalStatus, toNewCaseTypeSwitcher, } from '@rh-support/utils';
|
|
17
18
|
import { isEmpty } from 'lodash';
|
|
18
|
-
import React, { useEffect, useMemo, useState } from 'react';
|
|
19
|
+
import React, { useContext, useEffect, useMemo, useState } from 'react';
|
|
19
20
|
import { useTranslation } from 'react-i18next';
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
const csvHeadersSolr = [
|
|
21
|
+
import { SolrKeys } from '../../../enums/filters';
|
|
22
|
+
import { getCaseListFromGraphQL } from '../../../utils/caseListGraphQLUtils';
|
|
23
|
+
const csvHeaders = [
|
|
24
24
|
{ label: 'Case number', key: SolrKeys.caseNumber },
|
|
25
25
|
{
|
|
26
26
|
label: 'Case link',
|
|
@@ -28,20 +28,14 @@ const csvHeadersSolr = [
|
|
|
28
28
|
},
|
|
29
29
|
{ label: 'Title', key: SolrKeys.caseSummary },
|
|
30
30
|
];
|
|
31
|
-
const csvHeadersSFDC = [
|
|
32
|
-
{ label: 'Case number', key: SFDCKeys.caseNumber },
|
|
33
|
-
{
|
|
34
|
-
label: 'Case link',
|
|
35
|
-
key: 'case_link',
|
|
36
|
-
},
|
|
37
|
-
{ label: 'Title', key: SFDCKeys.caseSummary },
|
|
38
|
-
];
|
|
39
31
|
export default function DownloadCSVFileModal(props) {
|
|
40
|
-
const { onClose, onModalshow, isDisabled,
|
|
32
|
+
const { onClose, onModalshow, isDisabled, filterState, selectedCases, filteredCaseCount } = props;
|
|
41
33
|
const { t } = useTranslation();
|
|
42
|
-
const
|
|
34
|
+
const apolloClient = useApolloClient();
|
|
35
|
+
const { globalMetadataState: { loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
|
|
36
|
+
const includeSecureSupportCases = Boolean(loggedInUsersAccount.data.secureSupport);
|
|
37
|
+
const [isFetching, setIsFetching] = useState(false);
|
|
43
38
|
const [downloadCSVFileName, setDownloadCSVFileName] = useState('CaseList.csv');
|
|
44
|
-
const [isFetchingSFDC, setIsFetchingSFDC] = useState(false);
|
|
45
39
|
const [checkboxes, setCheckboxes] = useState({
|
|
46
40
|
selectAll: false,
|
|
47
41
|
ownerName: false,
|
|
@@ -55,89 +49,96 @@ export default function DownloadCSVFileModal(props) {
|
|
|
55
49
|
type: false,
|
|
56
50
|
caseClosedDate: false,
|
|
57
51
|
group: false,
|
|
52
|
+
caseLabel: false,
|
|
58
53
|
});
|
|
59
54
|
const [isSaveClicked, setIsSavedClicked] = useState(false);
|
|
60
|
-
function getKey(key
|
|
61
|
-
return
|
|
55
|
+
function getKey(key) {
|
|
56
|
+
return SolrKeys[key];
|
|
62
57
|
}
|
|
63
|
-
const isSecureSupportUser = loggedInUsersAccount.data.secureSupport;
|
|
64
58
|
const headerDefinitions = useMemo(() => [
|
|
65
59
|
{
|
|
66
60
|
checkbox: checkboxes.ownerName,
|
|
67
|
-
key: getKey('ownerName'
|
|
61
|
+
key: getKey('ownerName'),
|
|
68
62
|
label: 'Owner name',
|
|
69
63
|
},
|
|
70
64
|
{
|
|
71
65
|
checkbox: checkboxes.severity,
|
|
72
|
-
key: getKey('severity'
|
|
66
|
+
key: getKey('severity'),
|
|
73
67
|
label: 'Severity',
|
|
74
68
|
},
|
|
75
69
|
{
|
|
76
70
|
checkbox: checkboxes.createdBy,
|
|
77
|
-
key: getKey('createdBy'
|
|
71
|
+
key: getKey('createdBy'),
|
|
78
72
|
label: 'Created by',
|
|
79
73
|
},
|
|
80
74
|
{
|
|
81
75
|
checkbox: checkboxes.createdBy,
|
|
82
|
-
key: getKey('createdDate'
|
|
76
|
+
key: getKey('createdDate'),
|
|
83
77
|
label: 'Created date',
|
|
84
78
|
transform: formatDateTime,
|
|
85
79
|
},
|
|
86
80
|
{
|
|
87
81
|
checkbox: checkboxes.accountNumber,
|
|
88
|
-
key: getKey('accountNumber'
|
|
82
|
+
key: getKey('accountNumber'),
|
|
89
83
|
label: 'Account number',
|
|
90
84
|
},
|
|
91
85
|
{
|
|
92
86
|
checkbox: checkboxes.type,
|
|
93
|
-
key: getKey(
|
|
87
|
+
key: getKey('type'),
|
|
94
88
|
label: 'Support type',
|
|
95
89
|
},
|
|
96
90
|
{
|
|
97
91
|
checkbox: checkboxes.modifiedBy,
|
|
98
|
-
key: getKey('modifiedBy'
|
|
92
|
+
key: getKey('modifiedBy'),
|
|
99
93
|
label: 'Modified by',
|
|
100
94
|
},
|
|
101
95
|
{
|
|
102
96
|
checkbox: checkboxes.modifiedBy,
|
|
103
|
-
key: getKey('modifiedDate'
|
|
97
|
+
key: getKey('modifiedDate'),
|
|
104
98
|
label: 'Modified date',
|
|
105
99
|
transform: formatDateTime,
|
|
106
100
|
},
|
|
107
101
|
{
|
|
108
102
|
checkbox: checkboxes.status,
|
|
109
|
-
key: getKey('status'
|
|
103
|
+
key: getKey('status'),
|
|
110
104
|
label: 'Status',
|
|
105
|
+
transform: mapSfdcStatusToPortalStatus,
|
|
111
106
|
},
|
|
112
107
|
{
|
|
113
108
|
checkbox: checkboxes.productVersion,
|
|
114
|
-
key: getKey('product'
|
|
109
|
+
key: getKey('product'),
|
|
115
110
|
label: 'Product',
|
|
116
111
|
},
|
|
117
112
|
{
|
|
118
113
|
checkbox: checkboxes.productVersion,
|
|
119
|
-
key: getKey('version'
|
|
114
|
+
key: getKey('version'),
|
|
120
115
|
label: 'Version',
|
|
121
116
|
},
|
|
122
117
|
{
|
|
123
118
|
checkbox: checkboxes.alternateId,
|
|
124
|
-
key: getKey('alternateId'
|
|
119
|
+
key: getKey('alternateId'),
|
|
125
120
|
label: 'Alternate ID',
|
|
126
121
|
},
|
|
127
122
|
{
|
|
128
123
|
checkbox: checkboxes.caseClosedDate,
|
|
129
|
-
key: getKey('caseClosedDate'
|
|
124
|
+
key: getKey('caseClosedDate'),
|
|
130
125
|
label: 'Closed date',
|
|
131
126
|
transform: formatDateTime,
|
|
132
127
|
},
|
|
133
128
|
{
|
|
134
129
|
checkbox: checkboxes.group,
|
|
135
|
-
key: getKey('groupName'
|
|
130
|
+
key: getKey('groupName'),
|
|
136
131
|
label: 'Group',
|
|
137
132
|
},
|
|
138
|
-
|
|
133
|
+
{
|
|
134
|
+
checkbox: checkboxes.caseLabel,
|
|
135
|
+
key: getKey('caseLabel'),
|
|
136
|
+
label: 'Case labels',
|
|
137
|
+
transform: (labels) => (Array.isArray(labels) ? labels.join(', ') : labels || ''),
|
|
138
|
+
},
|
|
139
|
+
], [checkboxes]);
|
|
139
140
|
const getHeaders = () => {
|
|
140
|
-
const updatedCsvHeaders =
|
|
141
|
+
const updatedCsvHeaders = [...csvHeaders];
|
|
141
142
|
headerDefinitions.forEach((headerDefinition) => {
|
|
142
143
|
const { checkbox, key, label, transform } = headerDefinition;
|
|
143
144
|
const index = updatedCsvHeaders.findIndex((header) => header.key === key);
|
|
@@ -154,9 +155,8 @@ export default function DownloadCSVFileModal(props) {
|
|
|
154
155
|
});
|
|
155
156
|
return updatedCsvHeaders;
|
|
156
157
|
};
|
|
157
|
-
const isFetchingCSVData = isFetching
|
|
158
|
-
const
|
|
159
|
-
const splitExtensionName = downloadCSVFileName.split('.')[0].replace(/ +/g, ''); // To split and trim value before saving PDF
|
|
158
|
+
const isFetchingCSVData = isFetching;
|
|
159
|
+
const splitExtensionName = downloadCSVFileName.split('.')[0].replace(/ +/g, '');
|
|
160
160
|
const onCancel = () => {
|
|
161
161
|
onClose && onClose();
|
|
162
162
|
setIsSavedClicked(false);
|
|
@@ -173,15 +173,16 @@ export default function DownloadCSVFileModal(props) {
|
|
|
173
173
|
};
|
|
174
174
|
const checkboxValues = Object.values(checkboxes).slice(1); // as we don't want selectAll value
|
|
175
175
|
const allCheckBoxNotSelected = checkboxValues.includes(false);
|
|
176
|
-
// For SOLR
|
|
177
176
|
const onExportCSVClick = () => __awaiter(this, void 0, void 0, function* () {
|
|
178
177
|
try {
|
|
179
178
|
setIsSavedClicked(true);
|
|
180
179
|
if (!isEmpty(splitExtensionName)) {
|
|
181
|
-
|
|
182
|
-
const
|
|
183
|
-
|
|
184
|
-
const
|
|
180
|
+
setIsFetching(true);
|
|
181
|
+
const hasSelectedCases = selectedCases.length > 0;
|
|
182
|
+
const csvLimit = hasSelectedCases ? selectedCases.length : 1000;
|
|
183
|
+
const result = yield getCaseListFromGraphQL(filterState, apolloClient, csvLimit, undefined, hasSelectedCases ? selectedCases : undefined, includeSecureSupportCases);
|
|
184
|
+
setIsFetching(false);
|
|
185
|
+
const updatedCsvData = result.caseListResponse.response.docs.map((row) => (Object.assign(Object.assign({}, row), { case_type: toNewCaseTypeSwitcher(row.case_type), case_link: `https://${window.location.host}${window.location.pathname}/#/case/${row.case_number}` })));
|
|
185
186
|
downloadCSV(updatedCsvData, getHeaders(), splitExtensionName ? `${splitExtensionName}.csv` : 'CaseList.csv');
|
|
186
187
|
onCancel();
|
|
187
188
|
ToastNotification.addSuccessMessage(t('File downloaded successfully!'));
|
|
@@ -189,33 +190,11 @@ export default function DownloadCSVFileModal(props) {
|
|
|
189
190
|
}
|
|
190
191
|
}
|
|
191
192
|
catch (e) {
|
|
193
|
+
setIsFetching(false);
|
|
192
194
|
onCancel();
|
|
193
195
|
ToastNotification.addDangerMessage(t('File could not be downloaded. Please try again! '));
|
|
194
196
|
}
|
|
195
197
|
});
|
|
196
|
-
// For SFDC
|
|
197
|
-
const onExportCSVClickSecureSupport = () => __awaiter(this, void 0, void 0, function* () {
|
|
198
|
-
try {
|
|
199
|
-
setIsSavedClicked(true);
|
|
200
|
-
if (!isEmpty(splitExtensionName)) {
|
|
201
|
-
const sfdcFilter = createQueryForCSVDownload(filterState, loggedInUserRights.data, loggedInUsersAccount.data, selectedCases);
|
|
202
|
-
setIsFetchingSFDC(true);
|
|
203
|
-
const sfdcResponse = yield publicApi.caseList.getCaseListFromSFDC(sfdcFilter, false, true);
|
|
204
|
-
setIsFetchingSFDC(false);
|
|
205
|
-
// To map the values in csv to new support type
|
|
206
|
-
const updatedCsvData = sfdcResponse.cases.map((row) => (Object.assign(Object.assign({}, row), { caseType: toNewCaseTypeSwitcher(row.caseType), case_link: `https://${window.location.host}${window.location.pathname}/#/case/${row.caseNumber}` })));
|
|
207
|
-
downloadCSV(updatedCsvData, getHeaders(), splitExtensionName ? `${splitExtensionName}.csv` : 'CaseList.csv');
|
|
208
|
-
onCancel();
|
|
209
|
-
ToastNotification.addSuccessMessage(t('File downloaded successfully!'));
|
|
210
|
-
setIsSavedClicked(false);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
catch (e) {
|
|
214
|
-
setIsFetchingSFDC(false);
|
|
215
|
-
onCancel();
|
|
216
|
-
ToastNotification.addDangerMessage(t('Could not export CSV'));
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
198
|
const handleSelectAll = () => {
|
|
220
199
|
const newSelectAllState = !checkboxes.selectAll;
|
|
221
200
|
const updatedCheckboxes = {
|
|
@@ -230,6 +209,7 @@ export default function DownloadCSVFileModal(props) {
|
|
|
230
209
|
type: newSelectAllState,
|
|
231
210
|
caseClosedDate: newSelectAllState,
|
|
232
211
|
group: newSelectAllState,
|
|
212
|
+
caseLabel: newSelectAllState,
|
|
233
213
|
};
|
|
234
214
|
setCheckboxes((prevCheckboxes) => (Object.assign({ selectAll: !prevCheckboxes.selectAll }, updatedCheckboxes)));
|
|
235
215
|
};
|
|
@@ -247,6 +227,7 @@ export default function DownloadCSVFileModal(props) {
|
|
|
247
227
|
{ label: 'Product and version', key: 'productVersion' },
|
|
248
228
|
{ label: 'Personal reference number', key: 'alternateId' },
|
|
249
229
|
{ label: 'Closed date', key: 'caseClosedDate' },
|
|
230
|
+
{ label: 'Case labels', key: 'caseLabel' },
|
|
250
231
|
];
|
|
251
232
|
const generateCheckboxes = (fieldDefinitions) => {
|
|
252
233
|
return fieldDefinitions.map((field) => (React.createElement(Checkbox, { key: field.key, className: "nested", label: t(field.label), isChecked: checkboxes[field.key], onChange: () => {
|
|
@@ -294,6 +275,6 @@ export default function DownloadCSVFileModal(props) {
|
|
|
294
275
|
React.createElement("p", null, downloadCSVModalDescription(selectedCases.length || filteredCaseCount)),
|
|
295
276
|
downloadCSVModalBody()),
|
|
296
277
|
React.createElement(ModalFooter, null,
|
|
297
|
-
React.createElement(Button, { key: "submit", icon: isFetchingCSVData ? React.createElement(Spinner, { size: "md", "aria-label": "loading" }) : React.createElement(DownloadIcon, null), variant: "primary", "data-tracking-id": "download-csv-modal-submit", onClick:
|
|
278
|
+
React.createElement(Button, { key: "submit", icon: isFetchingCSVData ? React.createElement(Spinner, { size: "md", "aria-label": "loading" }) : React.createElement(DownloadIcon, null), variant: "primary", "data-tracking-id": "download-csv-modal-submit", onClick: onExportCSVClick, isDisabled: (isSaveClicked && isEmpty(splitExtensionName)) || isDisabled || isFetchingCSVData }, t('Download')),
|
|
298
279
|
React.createElement(Button, { key: "back", variant: "secondary", onClick: onCancel, isDisabled: isDisabled || isFetchingCSVData, "data-tracking-id": "download-csv-modal-cancel" }, t('Cancel')))));
|
|
299
280
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportCaseListCSV.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/ExportCaseListCSV.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ExportCaseListCSV.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/ExportCaseListCSV.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAA+B,MAAM,OAAO,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,UAAU,MAAM;IACZ,uBAAuB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,EAAE,uBAAuB,EAAE,aAAa,EAAE,mBAAmB,EAAE,EAAE,MAAM,qBAoDxG"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
import { Button
|
|
2
|
-
import { useFetch } from '@rh-support/components';
|
|
3
|
-
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
1
|
+
import { Button } from '@patternfly/react-core';
|
|
4
2
|
import React, { useContext, useState } from 'react';
|
|
5
3
|
import { Trans, useTranslation } from 'react-i18next';
|
|
6
|
-
import { getCaseListFromSolr } from '../../../utils/caseListUtils';
|
|
7
4
|
import { CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
8
5
|
import DownloadCSVFileModal from './DownloadCSVFileModal';
|
|
9
6
|
const MAX_LIMIT = 1000;
|
|
@@ -13,14 +10,10 @@ export function ExportCaseListCSV({ currentFilteredCaseList, selectedCases, isEx
|
|
|
13
10
|
const btnToolTip = t('Export the current list of cases to CSV. Please note that exporting a large number of cases may take a while.');
|
|
14
11
|
const maxLengthTooltip = t('Export the current list of cases to CSV. Please note that only the top {{limit}} cases will be exported and that it may take awhile.', { limit: MAX_LIMIT });
|
|
15
12
|
const currentFilteredCaseCount = (_a = currentFilteredCaseList === null || currentFilteredCaseList === void 0 ? void 0 : currentFilteredCaseList.numFound) !== null && _a !== void 0 ? _a : 0;
|
|
16
|
-
const { isFetching } = useFetch(getCaseListFromSolr, { propgateErrors: true });
|
|
17
13
|
const [openUpdateSeverityModal, setOpenUpdateSeverityModal] = useState(false);
|
|
18
|
-
const
|
|
19
|
-
const isBtnDisabled = isFetchingCSVData || currentFilteredCaseCount === 0;
|
|
14
|
+
const isBtnDisabled = currentFilteredCaseCount === 0;
|
|
20
15
|
let btnTitle = currentFilteredCaseCount >= MAX_LIMIT ? maxLengthTooltip : btnToolTip;
|
|
21
16
|
const filterState = useContext(CaseListFilterStateContext);
|
|
22
|
-
const { globalMetadataState: { loggedInUserRights, loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
|
|
23
|
-
// To show tooltip if export csv is disabled when SOLR is down
|
|
24
17
|
const getTooltipContent = () => {
|
|
25
18
|
let tooltipText = t('Export Cases');
|
|
26
19
|
if (isExportCsvDisabled) {
|
|
@@ -28,15 +21,12 @@ export function ExportCaseListCSV({ currentFilteredCaseList, selectedCases, isEx
|
|
|
28
21
|
}
|
|
29
22
|
return tooltipText;
|
|
30
23
|
};
|
|
31
|
-
// To check if export csv button is disabled
|
|
32
24
|
const isExportButtonDisabled = isBtnDisabled || isExportCsvDisabled;
|
|
33
|
-
// To toggle download csv modal
|
|
34
25
|
const toggleDownloadCSVModal = () => {
|
|
35
26
|
setOpenUpdateSeverityModal((openUpdateSeverityModal) => !openUpdateSeverityModal);
|
|
36
27
|
};
|
|
37
28
|
return (React.createElement("span", { title: (isExportCsvDisabled && getTooltipContent()) || '' },
|
|
38
|
-
React.createElement(Button, { variant: "tertiary", onClick: toggleDownloadCSVModal, title: btnTitle, "data-tracking-id": "case-list-toolbar-export-csv", isDisabled: isExportButtonDisabled },
|
|
39
|
-
React.createElement(Trans, null, "
|
|
40
|
-
|
|
41
|
-
React.createElement(DownloadCSVFileModal, { filterState: filterState, loggedInUserRights: loggedInUserRights, loggedInUsersAccount: loggedInUsersAccount, isDisabled: isExportButtonDisabled, onModalshow: openUpdateSeverityModal, onClose: toggleDownloadCSVModal, selectedCases: selectedCases, filteredCaseCount: currentFilteredCaseCount })));
|
|
29
|
+
React.createElement(Button, { variant: "tertiary", onClick: toggleDownloadCSVModal, title: btnTitle, "data-tracking-id": "case-list-toolbar-export-csv", isDisabled: isExportButtonDisabled },
|
|
30
|
+
React.createElement(Trans, null, "Export CSV")),
|
|
31
|
+
React.createElement(DownloadCSVFileModal, { filterState: filterState, isDisabled: isExportButtonDisabled, onModalshow: openUpdateSeverityModal, onClose: toggleDownloadCSVModal, selectedCases: selectedCases, filteredCaseCount: currentFilteredCaseCount })));
|
|
42
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableActionsDropdown.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/TableActionsDropdown.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAgB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAwB,MAAM,qCAAqC,CAAC;AASlG,UAAU,MAAO,SAAQ,kBAAkB,EAAE,qBAAqB;CAAG;AAErE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"TableActionsDropdown.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/TableActionsDropdown.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAG1C,OAAO,EAAE,kBAAkB,EAAgB,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,qBAAqB,EAAwB,MAAM,qCAAqC,CAAC;AASlG,UAAU,MAAO,SAAQ,kBAAkB,EAAE,qBAAqB;CAAG;AAErE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,qBA4GjD"}
|
|
@@ -3,7 +3,7 @@ import ExclamationCircleIcon from '@patternfly/react-icons/dist/js/icons/exclama
|
|
|
3
3
|
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
4
4
|
import WarningTriangleIcon from '@patternfly/react-icons/dist/js/icons/warning-triangle-icon';
|
|
5
5
|
import { SingleSelectDropdown } from '@rh-support/components';
|
|
6
|
-
import { CloseCaseModal
|
|
6
|
+
import { CloseCaseModal } from '@rh-support/react-context';
|
|
7
7
|
import React, { useContext } from 'react';
|
|
8
8
|
import { useTranslation } from 'react-i18next';
|
|
9
9
|
import { useCloseCase } from '../../../hooks/useCloseCase';
|
|
@@ -22,8 +22,7 @@ export function TableActionsDropdown(props) {
|
|
|
22
22
|
const currentFilteredCaseCount = (_a = currentFilteredCaseList === null || currentFilteredCaseList === void 0 ? void 0 : currentFilteredCaseList.numFound) !== null && _a !== void 0 ? _a : 0;
|
|
23
23
|
const filterState = useContext(CaseListFilterStateContext);
|
|
24
24
|
const { isExportButtonDisabled, openUpdateSeverityModal, showError: showExportCSVError, getTooltipContent: getExportCSVTooltipContent, toggleDownloadCSVModal, } = useExportCaseListCSV(props);
|
|
25
|
-
const {
|
|
26
|
-
const { isModalOpen, isPostingComment, showError, showWarning, getTooltipContent, onCancel, onConfirm, onBtnClick, } = useCloseCase(props);
|
|
25
|
+
const { isModalOpen, showError, showWarning, getTooltipContent, onCancel, onConfirm, onBtnClick } = useCloseCase(props);
|
|
27
26
|
let closeCaseIconStatus = 'danger';
|
|
28
27
|
if (showWarning) {
|
|
29
28
|
closeCaseIconStatus = 'warning';
|
|
@@ -69,7 +68,7 @@ export function TableActionsDropdown(props) {
|
|
|
69
68
|
}
|
|
70
69
|
};
|
|
71
70
|
return (React.createElement(React.Fragment, null,
|
|
72
|
-
isModalOpen && React.createElement(CloseCaseModal, { onClose: onCancel, onConfirm: onConfirm
|
|
73
|
-
React.createElement(DownloadCSVFileModal, { filterState: filterState,
|
|
71
|
+
isModalOpen && React.createElement(CloseCaseModal, { onClose: onCancel, onConfirm: onConfirm }),
|
|
72
|
+
React.createElement(DownloadCSVFileModal, { filterState: filterState, isDisabled: isExportButtonDisabled, onModalshow: openUpdateSeverityModal, onClose: toggleDownloadCSVModal, selectedCases: selectedCases, filteredCaseCount: currentFilteredCaseCount }),
|
|
74
73
|
React.createElement(SingleSelectDropdown, { hideToggleIcons: true, selected: { value: null, label: '' }, onSelect: onSelect, options: toolbarDropdownItems, id: "table-actions-dropdown", placeholder: t('Actions'), badge: React.createElement(Badge, null, selectedCases.length) })));
|
|
75
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableColumnSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/case-list/case-list-table/table-column-selector/TableColumnSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAC;AAWpC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,UAAU,MAAM;IACZ,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD,wBAAgB,mBAAmB,CAAC,EAAE,sBAAsB,EAAE,aAAa,EAAE,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"TableColumnSelector.d.ts","sourceRoot":"","sources":["../../../../../../src/components/case-list/case-list-table/table-column-selector/TableColumnSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,4BAA4B,CAAC;AAWpC,OAAO,KAAmB,MAAM,OAAO,CAAC;AAGxC,UAAU,MAAM;IACZ,sBAAsB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACpD,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD,wBAAgB,mBAAmB,CAAC,EAAE,sBAAsB,EAAE,aAAa,EAAE,EAAE,MAAM,qBAiGpF"}
|
package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js
CHANGED
|
@@ -38,6 +38,7 @@ export function TableColumnSelector({ onColumnSelectorChange, cachedColumns }) {
|
|
|
38
38
|
{ label: t('Product and version'), key: 'product' },
|
|
39
39
|
{ label: t('Personal reference number'), key: 'alternateCaseId' },
|
|
40
40
|
{ label: t('Closed date'), key: 'closedDate' },
|
|
41
|
+
{ label: t('Case labels'), key: 'caseLabel' },
|
|
41
42
|
];
|
|
42
43
|
const generateCheckboxes = (fieldDefinitions) => {
|
|
43
44
|
return fieldDefinitions === null || fieldDefinitions === void 0 ? void 0 : fieldDefinitions.map((field) => (React.createElement(Checkbox, { key: field.key, className: "case-column-selector", label: field.label, isChecked: cachedColumns.includes(field.key), onChange: () => {
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface IProps {
|
|
3
|
+
appliedFilterCount: number;
|
|
4
|
+
onClick: () => void;
|
|
5
|
+
}
|
|
6
|
+
export declare function AdvanceSearchToggleButton({ appliedFilterCount, onClick }: IProps): React.JSX.Element;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=AdvanceSearchToggleButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdvanceSearchToggleButton.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/AdvanceSearchToggleButton.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,MAAM;IACZ,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACvB;AAED,wBAAgB,yBAAyB,CAAC,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,MAAM,qBAehF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Button } from '@patternfly/react-core';
|
|
2
|
+
import AngleDownIcon from '@patternfly/react-icons/dist/js/icons/angle-down-icon';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Trans } from 'react-i18next';
|
|
5
|
+
export function AdvanceSearchToggleButton({ appliedFilterCount, onClick }) {
|
|
6
|
+
return (React.createElement(Button, { type: "button", variant: "secondary", onClick: onClick, className: "advance-search-toggle-btn secondary-button-pill", icon: React.createElement(AngleDownIcon, { "aria-hidden": true }), iconPosition: "end", countOptions: appliedFilterCount > 0 ? { count: appliedFilterCount } : undefined, "data-tracking-id": "case-list-adv-toggle-button" },
|
|
7
|
+
React.createElement(Trans, null, "Advanced Search")));
|
|
8
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAchE,UAAU,MAAM;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,mBAAmB,CAAC;IACvC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,qBAsUvD"}
|
|
@@ -12,6 +12,7 @@ import PencilAltIcon from '@patternfly/react-icons/dist/js/icons/pencil-alt-icon
|
|
|
12
12
|
import StarIcon from '@patternfly/react-icons/dist/js/icons/star-icon';
|
|
13
13
|
import { ConfirmationServiceProvider } from '@rh-support/components';
|
|
14
14
|
import { GlobalMetadataStateContext, UserPreferencesKeys, useUserPreferences } from '@rh-support/react-context';
|
|
15
|
+
import { getUrlParsedParams } from '@rh-support/utils';
|
|
15
16
|
import filter from 'lodash/filter';
|
|
16
17
|
import find from 'lodash/find';
|
|
17
18
|
import flatMap from 'lodash/flatMap';
|
|
@@ -19,8 +20,10 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
19
20
|
import isEqual from 'lodash/isEqual';
|
|
20
21
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
21
22
|
import { Trans, useTranslation } from 'react-i18next';
|
|
23
|
+
import { useLocation } from 'react-router-dom';
|
|
22
24
|
import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
23
|
-
import {
|
|
25
|
+
import { decodeCaseListUrlFilterQuery } from '../../../utils/caseGroupDefaultFilterUtils';
|
|
26
|
+
import { createFilterStateFromAdvancedQuery, FILTER_URL_QUERY_SEARCH_PARAM } from '../../../utils/caseSearchUtils';
|
|
24
27
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialCaseFilterState, } from '../CaseListFilterContext';
|
|
25
28
|
import { isNoFilterApplied, isOnlyDefaultFilterApplied } from '../CaseListFilterHelpers';
|
|
26
29
|
import { clearFilters, updateFilterState, updateSort } from '../CaseListFilterReducer';
|
|
@@ -28,8 +31,11 @@ import { SaveCaseSearchModal } from './SaveCaseSearchModal';
|
|
|
28
31
|
import useAdvanceSearchParser from './useAdvanceSearchParser';
|
|
29
32
|
export function BookmarkedSearchesSelector(props) {
|
|
30
33
|
const { t } = useTranslation();
|
|
34
|
+
const location = useLocation();
|
|
31
35
|
const { globalMetadataState, globalMetadataState: { hydraUserPreferences }, } = useContext(GlobalMetadataStateContext);
|
|
32
36
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
37
|
+
const urlQueryParam = getUrlParsedParams(location.search)[FILTER_URL_QUERY_SEARCH_PARAM];
|
|
38
|
+
const hasUrlFilterQuery = Boolean(decodeCaseListUrlFilterQuery(urlQueryParam));
|
|
33
39
|
const [bookmarkedSearches, setBookmarkedSearches] = useState({});
|
|
34
40
|
const [mostRecentSearch, setMostRecentSearch] = useState({});
|
|
35
41
|
const [selectedSearch, setSelectedSearch] = useState('');
|
|
@@ -69,6 +75,12 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
69
75
|
const emptySearchPlaceholderText = 'Select an option';
|
|
70
76
|
const recentSearchLoaded = useRef(false);
|
|
71
77
|
useEffect(() => {
|
|
78
|
+
// Deep links (e.g. Manage → View assigned cases) encode filters in the URL query.
|
|
79
|
+
// Do not overwrite them with saved-search auto-restore.
|
|
80
|
+
if (hasUrlFilterQuery) {
|
|
81
|
+
recentSearchLoaded.current = true;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
72
84
|
switch (userPreferredSearch) {
|
|
73
85
|
case restoreLatestText:
|
|
74
86
|
if (!isEmpty(mostRecentSearch) && !recentSearchLoaded.current) {
|
|
@@ -91,7 +103,7 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
91
103
|
break;
|
|
92
104
|
}
|
|
93
105
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
94
|
-
}, [mostRecentSearch, userPreferredSearch]);
|
|
106
|
+
}, [mostRecentSearch, userPreferredSearch, hasUrlFilterQuery]);
|
|
95
107
|
useEffect(() => {
|
|
96
108
|
var _a;
|
|
97
109
|
// enable save search button as soon as user changes something in the input search box
|
|
@@ -163,6 +175,7 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
163
175
|
!isEmpty(props.defaultSavedSearchName) && setSelectedSearch(props.defaultSavedSearchName);
|
|
164
176
|
}, [props.defaultSavedSearchName]);
|
|
165
177
|
const renderSavedSearchItems = Object.keys(bookmarkedSearches)
|
|
178
|
+
.filter((key) => { var _a; return ((_a = bookmarkedSearches[key]) === null || _a === void 0 ? void 0 : _a.type) !== 'advanced'; })
|
|
166
179
|
.sort()
|
|
167
180
|
.map((bookmarkedSearch) => {
|
|
168
181
|
var _a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/CaseSearch.tsx"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"CaseSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/CaseSearch.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAgE,MAAM,OAAO,CAAC;AA8BrF,UAAU,MAAM;IACZ,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,qBA4OvC"}
|
|
@@ -2,14 +2,18 @@ import { Button, SearchInput } from '@patternfly/react-core';
|
|
|
2
2
|
import { GlobalMetadataStateContext } from '@rh-support/react-context';
|
|
3
3
|
import { AbilityContext, CaseListFields, resourceActions, resources } from '@rh-support/user-permissions';
|
|
4
4
|
import isEmpty from 'lodash/isEmpty';
|
|
5
|
-
import React, { useCallback, useContext, useEffect, useState } from 'react';
|
|
5
|
+
import React, { useCallback, useContext, useEffect, useMemo, useState } from 'react';
|
|
6
6
|
import { Trans, useTranslation } from 'react-i18next';
|
|
7
7
|
import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
8
|
+
import { createCaseListFilterStateFromAdvanceSearchForm, deriveSearchQueryType, } from '../../../utils/advanceSearchFormMapper';
|
|
9
|
+
import { getAdvanceSearchAppliedFilterCount } from '../../../utils/advanceSearchUtils';
|
|
8
10
|
import { createFilterStateFromAdvancedQuery, createUserFriendlyQueryFromFilterStateAdvancedSearch, } from '../../../utils/caseSearchUtils';
|
|
9
|
-
import { useCaseListStateContext } from '../CaseListContext';
|
|
11
|
+
// import { useCaseListStateContext } from '../CaseListContext';
|
|
10
12
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialPaginationInfo, } from '../CaseListFilterContext';
|
|
11
|
-
import { initialFilterInfo, updateFilterQuery, updateFilterState } from '../CaseListFilterReducer';
|
|
13
|
+
import { initialFilterInfo, updateFilterQuery, updateFilterState, } from '../CaseListFilterReducer';
|
|
14
|
+
import { AdvanceSearchModal } from './advance-search-modal/AdvanceSearchModal';
|
|
12
15
|
import { AdvanceSearch } from './AdvanceSearch';
|
|
16
|
+
import { AdvanceSearchToggleButton } from './AdvanceSearchToggleButton';
|
|
13
17
|
import { BookmarkedSearchesSelector } from './BookmarkedSearchesSelector';
|
|
14
18
|
export function CaseSearch(props) {
|
|
15
19
|
const { globalMetadataState } = useContext(GlobalMetadataStateContext);
|
|
@@ -20,26 +24,29 @@ export function CaseSearch(props) {
|
|
|
20
24
|
const { filterQueryInfo } = filterState;
|
|
21
25
|
const [searchVal, setSearchVal] = useState(filterQueryInfo.queryString);
|
|
22
26
|
const [isAdvancedSearchValid, setIsAdvancedSearchValid] = useState(true);
|
|
27
|
+
const [isAdvanceSearchModalOpen, setIsAdvanceSearchModalOpen] = useState(false);
|
|
23
28
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
24
|
-
const { isFetching } = useCaseListStateContext();
|
|
29
|
+
// const { isFetching } = useCaseListStateContext();
|
|
25
30
|
const getType = useCallback(() => (filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.type) || CaseSearchQueryType.BASIC, [filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.type]);
|
|
26
|
-
//
|
|
31
|
+
// Keep the keyword search input in sync with queryString only (not modal filter parsedQuery).
|
|
27
32
|
useEffect(() => {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
else {
|
|
32
|
-
const query = filterQueryInfo.queryString;
|
|
33
|
-
setSearchVal(query.endsWith('*') ? query.slice(0, -1) : query);
|
|
34
|
-
}
|
|
35
|
-
}, [filterQueryInfo, getType]);
|
|
33
|
+
const query = filterQueryInfo.queryString;
|
|
34
|
+
setSearchVal(query.endsWith('*') ? query.slice(0, -1) : query);
|
|
35
|
+
}, [filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.queryString]);
|
|
36
36
|
const onSearchValChange = (value) => {
|
|
37
37
|
setSearchVal(value === null || value === void 0 ? void 0 : value.trim());
|
|
38
38
|
};
|
|
39
39
|
const clearSearchVal = () => {
|
|
40
40
|
setSearchVal('');
|
|
41
|
-
(filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.queryString)
|
|
42
|
-
|
|
41
|
+
if (!(filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.queryString)) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
const nextFilterQueryInfo = {
|
|
45
|
+
queryString: '',
|
|
46
|
+
parsedQuery: filterQueryInfo.parsedQuery || '',
|
|
47
|
+
type: deriveSearchQueryType(Object.assign(Object.assign({}, filterState), { filterQueryInfo: Object.assign(Object.assign({}, filterQueryInfo), { queryString: '' }) })),
|
|
48
|
+
};
|
|
49
|
+
updateFilterQuery(dispatch, nextFilterQueryInfo);
|
|
43
50
|
};
|
|
44
51
|
const clearAdvancedSearchVal = () => {
|
|
45
52
|
setSearchVal('');
|
|
@@ -48,11 +55,21 @@ export function CaseSearch(props) {
|
|
|
48
55
|
queryString: '',
|
|
49
56
|
parsedQuery: '',
|
|
50
57
|
type: CaseSearchQueryType.ADVANCED,
|
|
51
|
-
}, paginationInfo: initialPaginationInfo }));
|
|
58
|
+
}, paginationInfo: initialPaginationInfo, advanceSearchDateRanges: undefined }));
|
|
52
59
|
};
|
|
53
|
-
const onCaseSearch = (parsedQuery = '', queryString = searchVal) => {
|
|
54
|
-
const
|
|
55
|
-
|
|
60
|
+
const onCaseSearch = (parsedQuery = filterQueryInfo.parsedQuery || '', queryString = searchVal) => {
|
|
61
|
+
const trimmedQuery = queryString.trim();
|
|
62
|
+
const finalQueryString = trimmedQuery ? `${trimmedQuery}*` : '';
|
|
63
|
+
const nextFilterState = Object.assign(Object.assign({}, filterState), { filterQueryInfo: {
|
|
64
|
+
queryString: finalQueryString,
|
|
65
|
+
parsedQuery,
|
|
66
|
+
type: filterQueryInfo.type,
|
|
67
|
+
} });
|
|
68
|
+
updateFilterQuery(dispatch, {
|
|
69
|
+
queryString: finalQueryString,
|
|
70
|
+
parsedQuery,
|
|
71
|
+
type: deriveSearchQueryType(nextFilterState),
|
|
72
|
+
});
|
|
56
73
|
};
|
|
57
74
|
const onCaseSearchAdvanced = (type, parsedQuery = '', queryStringInputBox = searchVal) => {
|
|
58
75
|
const newFilterState = createFilterStateFromAdvancedQuery(parsedQuery.replace(/ and /g, ' AND ').replace(/ or /g, ' OR ').replace('Bug OR defect', 'Bug or defect'), globalMetadataState, filterState, queryStringInputBox, type);
|
|
@@ -90,24 +107,38 @@ export function CaseSearch(props) {
|
|
|
90
107
|
};
|
|
91
108
|
const handleSubmit = (ev) => {
|
|
92
109
|
ev.preventDefault();
|
|
93
|
-
|
|
94
|
-
|
|
110
|
+
onCaseSearch();
|
|
111
|
+
};
|
|
112
|
+
const openAdvanceSearchModal = () => {
|
|
113
|
+
setIsAdvanceSearchModalOpen(true);
|
|
114
|
+
};
|
|
115
|
+
const closeAdvanceSearchModal = () => {
|
|
116
|
+
setIsAdvanceSearchModalOpen(false);
|
|
117
|
+
};
|
|
118
|
+
const onAdvanceSearchModalSubmit = (formState) => {
|
|
119
|
+
const newFilterState = createCaseListFilterStateFromAdvanceSearchForm(formState, filterState);
|
|
120
|
+
updateFilterState(dispatch, newFilterState);
|
|
121
|
+
closeAdvanceSearchModal();
|
|
95
122
|
};
|
|
123
|
+
const appliedAdvanceSearchFilterCount = useMemo(() => getAdvanceSearchAppliedFilterCount(filterState), [filterState]);
|
|
96
124
|
const renderBasicSearch = () => {
|
|
97
125
|
return (React.createElement(React.Fragment, null,
|
|
98
126
|
React.createElement("div", { className: "case-search-input-container" },
|
|
99
127
|
React.createElement(SearchInput, { className: "pf-v6-u-w-100 case-search-input", placeholder: t('Search by keyword or case ID'), value: searchVal === null || searchVal === void 0 ? void 0 : searchVal.trim(), "data-tracking-id": "search-cases-text-input", id: "case-search-basic", "aria-label": t('Search by keyword or case ID'), onChange: (_event, val) => onSearchValChange(val), onClear: clearSearchVal }),
|
|
100
128
|
React.createElement(Button, { variant: "primary", type: "submit", className: "search-btn", "data-tracking-id": "case-list-search-button", isDisabled: isSearchButtonDisabled },
|
|
101
129
|
React.createElement(Trans, null, "Search")),
|
|
102
|
-
canUseAdvancedSearch && (React.createElement(
|
|
103
|
-
React.createElement(
|
|
130
|
+
canUseAdvancedSearch && (React.createElement("div", { className: "advance-search-panel-container" },
|
|
131
|
+
React.createElement(AdvanceSearchToggleButton, { appliedFilterCount: appliedAdvanceSearchFilterCount, onClick: openAdvanceSearchModal }),
|
|
132
|
+
React.createElement(AdvanceSearchModal, { isOpen: isAdvanceSearchModalOpen, onClose: closeAdvanceSearchModal, onSearch: onAdvanceSearchModalSubmit }))))));
|
|
104
133
|
};
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
105
135
|
const renderAdvanceSearch = () => {
|
|
106
136
|
return canUseAdvancedSearch ? (React.createElement(React.Fragment, null,
|
|
107
137
|
React.createElement(AdvanceSearch, { isSearchDisabled: isSearchButtonDisabled, onSearchValChange: onSearchValChange, onSearchClear: clearAdvancedSearchVal, onSearchSubmit: onCaseSearchAdvanced, onSearchTypeChange: onSearchTypeChange, onAdvancedSearchValidation: (isValid) => setIsAdvancedSearchValid(isValid) }))) : (renderBasicSearch());
|
|
108
138
|
};
|
|
139
|
+
void renderAdvanceSearch;
|
|
109
140
|
return (React.createElement(React.Fragment, null,
|
|
110
141
|
React.createElement("form", { onSubmit: handleSubmit, onKeyDown: handleSearchInputKeyDown },
|
|
111
|
-
React.createElement("div", { className: "form-group case-search-form-group" },
|
|
142
|
+
React.createElement("div", { className: "form-group case-search-form-group" }, renderBasicSearch())),
|
|
112
143
|
React.createElement(BookmarkedSearchesSelector, { currentCaseSearchString: searchVal === null || searchVal === void 0 ? void 0 : searchVal.trim(), currentSearchType: getType(), isAdvancedSearchValid: isAdvancedSearchValid, defaultSavedSearchName: props.defaultSavedSearchName })));
|
|
113
144
|
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IAdvanceSearchFormState } from '../../CaseListFilterReducer';
|
|
3
|
+
interface IProps {
|
|
4
|
+
formState: IAdvanceSearchFormState;
|
|
5
|
+
onChange: (updates: Partial<IAdvanceSearchFormState>) => void;
|
|
6
|
+
canReadAccounts: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function AdvanceSearchAccountSection({ formState, onChange, canReadAccounts }: IProps): React.JSX.Element;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=AdvanceSearchAccountSection.d.ts.map
|