@rh-support/cases 2.6.233 → 2.6.235
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 +7 -0
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +137 -374
- package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListContext.js +2 -5
- package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterContext.js +1 -2
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts +2 -3
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.js +6 -19
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +4 -36
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +12 -6
- package/lib/esm/components/case-list/CaseListReducer.d.ts +10 -22
- package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListReducer.js +7 -25
- 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 +11 -18
- 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 +4 -20
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +7 -1
- 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 +16 -12
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +5 -2
- 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 +13 -14
- 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 +14 -21
- 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 +0 -3
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +1 -11
- 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 +70 -90
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +3 -1
- 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 +4 -5
- 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 +54 -15
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +3 -0
- 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 +44 -18
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +3 -0
- 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 +49 -23
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +3 -1
- 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 +59 -60
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +3 -10
- 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 +84 -98
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +5 -0
- 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 +70 -51
- 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 +15 -5
- 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 +3 -2
- 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 +0 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +2 -15
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +24 -55
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +1 -2
- package/lib/esm/css/caseList.css +23 -188
- package/lib/esm/css/caseSearch.css +0 -114
- package/lib/esm/enums/case.d.ts +5 -13
- package/lib/esm/enums/case.d.ts.map +1 -1
- package/lib/esm/enums/case.js +3 -23
- package/lib/esm/enums/caseSearch.d.ts +0 -3
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +1 -2
- package/lib/esm/enums/filters.d.ts +1 -5
- package/lib/esm/enums/filters.d.ts.map +1 -1
- package/lib/esm/enums/filters.js +0 -4
- package/lib/esm/hooks/useCloseCase.d.ts.map +1 -1
- package/lib/esm/hooks/useCloseCase.js +21 -38
- package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/hooks/useExportCaseListCSV.js +9 -1
- 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 +5 -7
- package/lib/esm/index.js +0 -1
- package/lib/esm/models/caseList.d.ts +0 -1
- package/lib/esm/models/caseList.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.d.ts +0 -1
- package/lib/esm/test-utils/mockData.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.js +1 -2
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +2 -39
- package/lib/esm/utils/constants.d.ts +1 -5
- package/lib/esm/utils/constants.d.ts.map +1 -1
- package/lib/esm/utils/constants.js +2 -10
- package/lib/esm/utils/mockSolrResponse.js +1 -1
- package/package.json +8 -10
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +0 -178
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +0 -8
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts +0 -9
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.js +0 -105
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts +0 -33
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.js +0 -51
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts +0 -9
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.js +0 -10
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts +0 -8
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.js +0 -8
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.js +0 -29
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.js +0 -16
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.js +0 -21
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts +0 -12
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.js +0 -31
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.js +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts +0 -10
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.js +0 -92
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.js +0 -20
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.js +0 -28
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts +0 -9
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.js +0 -241
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts +0 -11
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts.map +0 -1
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.js +0 -23
- package/lib/esm/hooks/useCaseLabels.d.ts +0 -14
- package/lib/esm/hooks/useCaseLabels.d.ts.map +0 -1
- package/lib/esm/hooks/useCaseLabels.js +0 -50
- package/lib/esm/utils/advanceSearchFormMapper.d.ts +0 -11
- package/lib/esm/utils/advanceSearchFormMapper.d.ts.map +0 -1
- package/lib/esm/utils/advanceSearchFormMapper.js +0 -71
- package/lib/esm/utils/advanceSearchUtils.d.ts +0 -24
- package/lib/esm/utils/advanceSearchUtils.d.ts.map +0 -1
- package/lib/esm/utils/advanceSearchUtils.js +0 -150
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts +0 -12
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseGroupDefaultFilterUtils.js +0 -34
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts +0 -10
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseGroupDefaultUtils.js +0 -20
- package/lib/esm/utils/caseListGraphQLUtils.d.ts +0 -28
- package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +0 -1
- package/lib/esm/utils/caseListGraphQLUtils.js +0 -304
- package/lib/esm/utils/caseListMapper.d.ts +0 -6
- package/lib/esm/utils/caseListMapper.d.ts.map +0 -1
- package/lib/esm/utils/caseListMapper.js +0 -47
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +0 -17
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +0 -1
- package/lib/esm/utils/caseListVariablesBuilder.js +0 -535
|
@@ -9,273 +9,124 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import '../../css/caseList.css';
|
|
11
11
|
import '../../css/caseSearch.css';
|
|
12
|
-
import { useApolloClient } from '@apollo/client/react';
|
|
13
12
|
import { Alert, AlertActionCloseButton, AlertVariant, Button } from '@patternfly/react-core';
|
|
14
13
|
import OpenDrawerRightIcon from '@patternfly/react-icons/dist/js/icons/open-drawer-right-icon';
|
|
15
|
-
import { ErrorBoundary, ToastNotification, useBreakpoint, useDocumentTitle, useForceUpdate, } from '@rh-support/components';
|
|
16
|
-
import { CSSUserModal, fetchAllStatuses, fetchCaseGroupsForAccount, fetchCaseGroupsForSSO, fetchCaseSeverities, fetchCaseTypes, fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext,
|
|
17
|
-
import { getStringifiedParams, getUrlParsedParams, haventLoadedMetadata, haventLoadedProductsMetadata,
|
|
14
|
+
import { ErrorBoundary, ToastNotification, useBreakpoint, useDocumentTitle, useForceUpdate, usePrevious, } from '@rh-support/components';
|
|
15
|
+
import { CSSUserModal, fetchAllStatuses, fetchCaseGroupsForAccount, fetchCaseGroupsForSSO, fetchCaseSeverities, fetchCaseTypes, fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext, setUserPreferences, updateCaseListTraditionalSupportAgreed, updateUserPreferences, useGlobalDispatchContext, UserPreferencesKeys, } from '@rh-support/react-context';
|
|
16
|
+
import { getStringifiedParams, getUrlParsedParams, haventLoadedMetadata, haventLoadedProductsMetadata, solrResponseToFacetFields, solrResponseToPivotFields, } from '@rh-support/utils';
|
|
17
|
+
import get from 'lodash/get';
|
|
18
18
|
import isEmpty from 'lodash/isEmpty';
|
|
19
|
-
import
|
|
19
|
+
import mapValues from 'lodash/mapValues';
|
|
20
20
|
import some from 'lodash/some';
|
|
21
21
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
22
22
|
import { Trans, useTranslation } from 'react-i18next';
|
|
23
|
-
import { useInView } from 'react-intersection-observer';
|
|
24
23
|
import { useLocation } from 'react-router-dom';
|
|
25
24
|
import { CaseSearchQueryType } from '../../enums/caseSearch';
|
|
26
|
-
import {
|
|
25
|
+
import { SolrPivotKeys } from '../../enums/filters';
|
|
27
26
|
import { PageTitle } from '../../enums/pageTitle';
|
|
28
|
-
import { useCaseLabels } from '../../hooks/useCaseLabels';
|
|
29
27
|
import { useFilterStateOnLoad } from '../../hooks/useFilterStateOnLoad';
|
|
30
|
-
import {
|
|
31
|
-
import { clearPageCursors, getCaseListFromGraphQL, loadMoreCases, } from '../../utils/caseListGraphQLUtils';
|
|
28
|
+
import { getCaseList } from '../../utils/caseListUtils';
|
|
32
29
|
import { createFilterStateFromUrlQuery, createURLQueryFromFilterState, FILTER_URL_CURRENT_PAGE_SEARCH_PARAM, FILTER_URL_PAGE_SIZE_SEARCH_PARAM, FILTER_URL_QUERY_SEARCH_PARAM, FILTER_URL_QUERY_TYPE, } from '../../utils/caseSearchUtils';
|
|
33
|
-
import { UpdatedCaseDataEvent } from '../../utils/constants';
|
|
34
30
|
import { NewCaseButton } from '../case/NewCaseButton';
|
|
35
31
|
import { CaseListFilterChips } from './case-list-filters/CaseListFilterChips';
|
|
36
32
|
import { CaseListFilters } from './case-list-filters/CaseListFilters';
|
|
37
33
|
import { CaseListTable } from './case-list-table/CaseListTable';
|
|
38
34
|
import { CaseSearch } from './case-search/CaseSearch';
|
|
39
35
|
import { useCaseListDispatchContext, useCaseListStateContext } from './CaseListContext';
|
|
40
|
-
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from './CaseListFilterContext';
|
|
41
|
-
import { isNoFilterApplied, isOnlyDefaultFilterApplied,
|
|
36
|
+
import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialCaseFilterState, } from './CaseListFilterContext';
|
|
37
|
+
import { eligibleSFDCFiltersMultipleValues, isNoFilterApplied, isOnlyDefaultFilterApplied, } from './CaseListFilterHelpers';
|
|
42
38
|
import { updateFilterState } from './CaseListFilterReducer';
|
|
43
|
-
import {
|
|
39
|
+
import { setCaseList, setCurrentQuery, setFilterValuesFromFacetResponse, setIsFetching, setPivotValues, } from './CaseListReducer';
|
|
44
40
|
export function CaseList(props) {
|
|
45
|
-
var _a, _b
|
|
41
|
+
var _a, _b;
|
|
46
42
|
const { t } = useTranslation();
|
|
47
43
|
useDocumentTitle(PageTitle.CASE_LIST);
|
|
48
44
|
const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
|
|
49
|
-
const { caseList,
|
|
45
|
+
const { caseList, pivotValues, isFetching, filterValuesFromFacetResponse, currentQuery } = useCaseListStateContext();
|
|
50
46
|
const CaseListDispatch = useCaseListDispatchContext();
|
|
51
47
|
const breakPoint = useBreakpoint();
|
|
52
|
-
const { globalMetadataState, globalMetadataState: { caseGroups,
|
|
48
|
+
const { globalMetadataState, globalMetadataState: { caseGroups, loggedInUserJwtToken, loggedInUserRights, loggedInUsersAccount, userPreferences, managedAccounts, bookmarkedAccounts, allCaseTypes, allCaseSeverities, allCaseStatuses, allProducts, caseListTraditionalSupportAgreed, }, } = useContext(GlobalMetadataStateContext);
|
|
53
49
|
const globalDispatchContext = useGlobalDispatchContext();
|
|
54
|
-
const apolloClient = useApolloClient();
|
|
55
|
-
const includeSecureSupportCases = Boolean(loggedInUsersAccount.data.secureSupport);
|
|
56
50
|
const location = useLocation();
|
|
57
51
|
const searchParams = getUrlParsedParams(location.search);
|
|
58
52
|
const queryFromUrl = searchParams[FILTER_URL_QUERY_SEARCH_PARAM];
|
|
53
|
+
const pageSizeFromUrl = parseInt(searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM]);
|
|
54
|
+
const currentPageFromUrl = parseInt(searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM]);
|
|
59
55
|
const searchType = searchParams[FILTER_URL_QUERY_TYPE];
|
|
60
56
|
const abortControllerRef = useRef(undefined);
|
|
61
|
-
const lastPushedQueryRef = useRef('');
|
|
62
57
|
const isXLScreen = breakPoint.xl;
|
|
63
58
|
const isFirstMount = useRef(true);
|
|
64
|
-
const userDismissedDefaultGroupRef = useRef(false);
|
|
65
|
-
const prevGroupFilterRef = useRef(undefined);
|
|
66
59
|
const filterSectionRef = useRef(null);
|
|
67
60
|
const filterState = useContext(CaseListFilterStateContext);
|
|
68
61
|
const filterDispatch = useContext(CaseListFilterDispatchContext);
|
|
69
62
|
const forceUpdate = useForceUpdate();
|
|
70
63
|
const isCaseListFilterPanelExanded = userPreferences.data.isCaseListFilterPanelExanded;
|
|
71
64
|
const useFilterStateInit = useFilterStateOnLoad();
|
|
65
|
+
const isBasicSearchMode = filterState.filterQueryInfo.type === CaseSearchQueryType.BASIC ||
|
|
66
|
+
(filterState.filterQueryInfo.type === CaseSearchQueryType.ADVANCED && loggedInUserRights.data.isExternal());
|
|
67
|
+
const prevSearchType = usePrevious(filterState.filterQueryInfo.type);
|
|
68
|
+
let isSearchTypeChanged = filterState.filterQueryInfo.type !== prevSearchType;
|
|
72
69
|
const [hasError, setHasError] = useState(null);
|
|
70
|
+
const [isSolrSearchDown, setSolrSearchDown] = useState(false);
|
|
73
71
|
const [defaultSavedSearchName, setDefaultSavedSearchName] = useState('');
|
|
74
72
|
const [RHCDValue, setRHCDValue] = useState('');
|
|
75
73
|
const [isRHCDAlertShown, setIsRHCDAlertShown] = useState(true);
|
|
76
|
-
const loadMoreLockRef = useRef(false);
|
|
77
|
-
const loadMoreFnRef = useRef(() => { });
|
|
78
|
-
const loadMoreCooldownRef = useRef(false);
|
|
79
|
-
const loadMoreAbortRef = useRef(null);
|
|
80
|
-
const activeFilterStateRef = useRef(filterState);
|
|
81
|
-
const sentinelElRef = useRef(null);
|
|
82
|
-
const prefetchRef = useRef({
|
|
83
|
-
cursor: '',
|
|
84
|
-
data: null,
|
|
85
|
-
loading: false,
|
|
86
|
-
});
|
|
87
|
-
const { ref: inViewRef, inView } = useInView();
|
|
88
|
-
const sentinelRef = React.useCallback((node) => {
|
|
89
|
-
sentinelElRef.current = node || null;
|
|
90
|
-
inViewRef(node);
|
|
91
|
-
}, [inViewRef]);
|
|
92
|
-
function startPrefetch(cursor) {
|
|
93
|
-
if (!cursor || prefetchRef.current.cursor === cursor)
|
|
94
|
-
return;
|
|
95
|
-
prefetchRef.current = { cursor, data: null, loading: true };
|
|
96
|
-
loadMoreCases(activeFilterStateRef.current, apolloClient, cursor, undefined, includeSecureSupportCases)
|
|
97
|
-
.then((result) => {
|
|
98
|
-
if (prefetchRef.current.cursor === cursor) {
|
|
99
|
-
prefetchRef.current = { cursor, data: result, loading: false };
|
|
100
|
-
}
|
|
101
|
-
})
|
|
102
|
-
.catch(() => {
|
|
103
|
-
if (prefetchRef.current.cursor === cursor) {
|
|
104
|
-
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
useEffect(() => {
|
|
109
|
-
let ticking = false;
|
|
110
|
-
let triggered = false;
|
|
111
|
-
const onScroll = () => {
|
|
112
|
-
if (ticking)
|
|
113
|
-
return;
|
|
114
|
-
ticking = true;
|
|
115
|
-
requestAnimationFrame(() => {
|
|
116
|
-
ticking = false;
|
|
117
|
-
if (!sentinelElRef.current)
|
|
118
|
-
return;
|
|
119
|
-
const rect = sentinelElRef.current.getBoundingClientRect();
|
|
120
|
-
const isNear = rect.top <= window.innerHeight + 600;
|
|
121
|
-
if (!isNear) {
|
|
122
|
-
triggered = false;
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
if (!triggered && !loadMoreLockRef.current) {
|
|
126
|
-
triggered = true;
|
|
127
|
-
loadMoreFnRef.current();
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
};
|
|
131
|
-
window.addEventListener('scroll', onScroll, true);
|
|
132
|
-
return () => window.removeEventListener('scroll', onScroll, true);
|
|
133
|
-
}, []);
|
|
134
|
-
useEffect(() => {
|
|
135
|
-
if (inView && hasNextPage && !isLoadingMore && !loadMoreError) {
|
|
136
|
-
loadMore();
|
|
137
|
-
}
|
|
138
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
139
|
-
}, [inView]);
|
|
140
|
-
useEffect(() => {
|
|
141
|
-
if (!isLoadingMore)
|
|
142
|
-
return;
|
|
143
|
-
const handleOffline = () => {
|
|
144
|
-
if (loadMoreAbortRef.current) {
|
|
145
|
-
loadMoreAbortRef.current.abort();
|
|
146
|
-
loadMoreAbortRef.current = null;
|
|
147
|
-
}
|
|
148
|
-
loadMoreLockRef.current = false;
|
|
149
|
-
setLoadMoreError(CaseListDispatch, true, loadMoreRetryCount + 1);
|
|
150
|
-
};
|
|
151
|
-
if (!navigator.onLine) {
|
|
152
|
-
handleOffline();
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
window.addEventListener('offline', handleOffline);
|
|
156
|
-
return () => window.removeEventListener('offline', handleOffline);
|
|
157
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
158
|
-
}, [isLoadingMore]);
|
|
159
|
-
useEffect(() => {
|
|
160
|
-
const onClick = (e) => {
|
|
161
|
-
const anchor = e.target.closest('a.btn_slideto[href="#masthead"]');
|
|
162
|
-
if (anchor) {
|
|
163
|
-
e.preventDefault();
|
|
164
|
-
window.scrollTo({ top: 0, behavior: 'smooth' });
|
|
165
|
-
}
|
|
166
|
-
};
|
|
167
|
-
document.addEventListener('click', onClick, true);
|
|
168
|
-
return () => document.removeEventListener('click', onClick, true);
|
|
169
|
-
}, []);
|
|
170
74
|
function getCases(currentFilterState) {
|
|
171
75
|
return __awaiter(this, void 0, void 0, function* () {
|
|
172
|
-
|
|
76
|
+
let showError;
|
|
173
77
|
try {
|
|
174
|
-
if (abortControllerRef.current) {
|
|
175
|
-
abortControllerRef.current.abort();
|
|
176
|
-
}
|
|
177
|
-
const controller = new AbortController();
|
|
178
|
-
abortControllerRef.current = controller;
|
|
179
78
|
setIsFetching(CaseListDispatch, true);
|
|
180
79
|
setHasError(false);
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
const result = yield getCaseListFromGraphQL(currentFilterState, apolloClient, undefined, controller.signal, undefined, includeSecureSupportCases);
|
|
185
|
-
if (controller.signal.aborted) {
|
|
186
|
-
return;
|
|
187
|
-
}
|
|
188
|
-
setCaseList(CaseListDispatch, result.caseListResponse.response);
|
|
189
|
-
setCursorInfo(CaseListDispatch, result.hasNextPage, result.endCursor);
|
|
190
|
-
setIsFetching(CaseListDispatch, false);
|
|
191
|
-
setTimeout(() => {
|
|
192
|
-
loadMoreCooldownRef.current = false;
|
|
193
|
-
}, 500);
|
|
194
|
-
if (result.hasNextPage && result.endCursor) {
|
|
195
|
-
startPrefetch(result.endCursor);
|
|
196
|
-
}
|
|
197
|
-
if (result.showErrorMessage) {
|
|
198
|
-
setHasError(true);
|
|
199
|
-
ToastNotification.addDangerMessage(t('There was an error loading case data. Please try again.'));
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
catch (err) {
|
|
203
|
-
if ((err === null || err === void 0 ? void 0 : err.name) === 'AbortError' || ((_a = err === null || err === void 0 ? void 0 : err.message) === null || _a === void 0 ? void 0 : _a.includes('aborted'))) {
|
|
204
|
-
return;
|
|
80
|
+
if (abortControllerRef.current !== undefined) {
|
|
81
|
+
// Cancel the previous request
|
|
82
|
+
abortControllerRef.current.abort();
|
|
205
83
|
}
|
|
84
|
+
// recreate a new AbortController for each call
|
|
85
|
+
let controller = new AbortController();
|
|
86
|
+
abortControllerRef.current = controller;
|
|
87
|
+
const { caseListResponse, isSolrSearchDownSFDCUp, showErrorMessage } = yield getCaseList(currentFilterState, loggedInUserRights.data, loggedInUsersAccount.data, controller.signal);
|
|
88
|
+
showError = showErrorMessage;
|
|
89
|
+
setSolrSearchDown(isSolrSearchDownSFDCUp);
|
|
90
|
+
setFilterValuesFromFacetResponse(CaseListDispatch, solrResponseToFacetFields(caseListResponse));
|
|
91
|
+
setPivotValues(CaseListDispatch, solrResponseToPivotFields(caseListResponse));
|
|
92
|
+
setCaseList(CaseListDispatch, caseListResponse.response);
|
|
206
93
|
setIsFetching(CaseListDispatch, false);
|
|
207
|
-
setHasError(true);
|
|
208
|
-
ToastNotification.addXHRErrorMessage(err);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
function loadMore() {
|
|
213
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
var _a;
|
|
215
|
-
if (loadMoreCooldownRef.current ||
|
|
216
|
-
loadMoreLockRef.current ||
|
|
217
|
-
isLoadingMore ||
|
|
218
|
-
!hasNextPage ||
|
|
219
|
-
!endCursor ||
|
|
220
|
-
loadMoreError)
|
|
221
|
-
return;
|
|
222
|
-
loadMoreLockRef.current = true;
|
|
223
|
-
if (loadMoreAbortRef.current) {
|
|
224
|
-
loadMoreAbortRef.current.abort();
|
|
225
|
-
}
|
|
226
|
-
const controller = new AbortController();
|
|
227
|
-
loadMoreAbortRef.current = controller;
|
|
228
|
-
setIsLoadingMore(CaseListDispatch, true);
|
|
229
|
-
try {
|
|
230
|
-
let result;
|
|
231
|
-
const pf = prefetchRef.current;
|
|
232
|
-
if (pf.cursor === endCursor && pf.data) {
|
|
233
|
-
result = pf.data;
|
|
234
|
-
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
235
|
-
}
|
|
236
|
-
else {
|
|
237
|
-
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
238
|
-
result = yield loadMoreCases(activeFilterStateRef.current, apolloClient, endCursor, controller.signal, includeSecureSupportCases);
|
|
239
|
-
}
|
|
240
|
-
if (controller.signal.aborted)
|
|
241
|
-
return;
|
|
242
|
-
setLoadMoreError(CaseListDispatch, false, 0);
|
|
243
|
-
appendCaseList(CaseListDispatch, result.docs, result.hasNextPage, result.endCursor);
|
|
244
|
-
if (result.hasNextPage && result.endCursor) {
|
|
245
|
-
startPrefetch(result.endCursor);
|
|
246
|
-
}
|
|
247
94
|
}
|
|
248
95
|
catch (err) {
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
console.error('[CaseList] loadMore error:', err);
|
|
255
|
-
}
|
|
256
|
-
finally {
|
|
257
|
-
if (!controller.signal.aborted) {
|
|
258
|
-
loadMoreLockRef.current = false;
|
|
96
|
+
const isAbortError = err.message && err.message.toLowerCase().indexOf('abort') > -1;
|
|
97
|
+
if (!isAbortError) {
|
|
98
|
+
setIsFetching(CaseListDispatch, false);
|
|
99
|
+
setHasError(true);
|
|
100
|
+
showError && ToastNotification.addXHRErrorMessage(err);
|
|
259
101
|
}
|
|
260
102
|
}
|
|
261
103
|
});
|
|
262
104
|
}
|
|
263
|
-
loadMoreFnRef.current = loadMore;
|
|
264
|
-
function retryLoadMore() {
|
|
265
|
-
if (loadMoreAbortRef.current) {
|
|
266
|
-
loadMoreAbortRef.current.abort();
|
|
267
|
-
loadMoreAbortRef.current = null;
|
|
268
|
-
}
|
|
269
|
-
loadMoreLockRef.current = false;
|
|
270
|
-
setLoadMoreError(CaseListDispatch, false, loadMoreRetryCount);
|
|
271
|
-
setTimeout(() => loadMoreFnRef.current(), 0);
|
|
272
|
-
}
|
|
273
105
|
const toggleFilterSection = (isExpanded) => {
|
|
274
106
|
if (!filterSectionRef.current)
|
|
275
107
|
return;
|
|
276
108
|
filterSectionRef.current.expanded = isExpanded;
|
|
277
109
|
forceUpdate();
|
|
278
110
|
};
|
|
111
|
+
function saveFilterQueryInUserPreferences() {
|
|
112
|
+
if (isNoFilterApplied(filterState))
|
|
113
|
+
return;
|
|
114
|
+
const type = filterState.filterQueryInfo.type;
|
|
115
|
+
const recentSerach = {
|
|
116
|
+
filterState: type === CaseSearchQueryType.BASIC ? filterState.filterInfo : {},
|
|
117
|
+
sortState: filterState.sortInfo,
|
|
118
|
+
queryString: type === CaseSearchQueryType.BASIC
|
|
119
|
+
? filterState.filterQueryInfo.queryString
|
|
120
|
+
: filterState.filterQueryInfo.parsedQuery,
|
|
121
|
+
type,
|
|
122
|
+
};
|
|
123
|
+
try {
|
|
124
|
+
updateUserPreferences(dispatchToGlobalMetadataReducer, loggedInUserRights.data.getSSOUsername(), [{ key: UserPreferencesKeys.mostRecentSearch, value: JSON.stringify(recentSerach) }], 'add');
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
console.error('Could not save filter query in user preferences');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
279
130
|
const onToggleFilterBtnClick = () => {
|
|
280
131
|
var _a, _b;
|
|
281
132
|
toggleFilterSection(!((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded));
|
|
@@ -285,7 +136,8 @@ export function CaseList(props) {
|
|
|
285
136
|
};
|
|
286
137
|
const checkNewCases = () => __awaiter(this, void 0, void 0, function* () {
|
|
287
138
|
try {
|
|
288
|
-
const { caseListResponse } = yield
|
|
139
|
+
const { caseListResponse, isSolrSearchDownSFDCUp } = yield getCaseList(filterState, loggedInUserRights.data, loggedInUsersAccount.data, null);
|
|
140
|
+
setSolrSearchDown(isSolrSearchDownSFDCUp);
|
|
289
141
|
let changed = false;
|
|
290
142
|
if (caseListResponse.response.numFound <= filterState.paginationInfo.pageSize &&
|
|
291
143
|
caseListResponse.response.numFound !== caseList.numFound) {
|
|
@@ -307,7 +159,6 @@ export function CaseList(props) {
|
|
|
307
159
|
}
|
|
308
160
|
if (changed && location.pathname === '/case/list') {
|
|
309
161
|
setCaseList(CaseListDispatch, caseListResponse.response);
|
|
310
|
-
pendoTrackEvent(UpdatedCaseDataEvent);
|
|
311
162
|
ToastNotification.addSuccessMessage(t('Case data has been updated'));
|
|
312
163
|
}
|
|
313
164
|
}
|
|
@@ -315,150 +166,79 @@ export function CaseList(props) {
|
|
|
315
166
|
console.log(err);
|
|
316
167
|
}
|
|
317
168
|
});
|
|
318
|
-
const salesforceAccountId = (_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
|
|
319
|
-
const { error: caseLabelsFetchError, refetch: refetchCaseLabels } = useCaseLabels(salesforceAccountId);
|
|
320
|
-
const retryCaseListFetch = () => {
|
|
321
|
-
refetchCaseLabels();
|
|
322
|
-
getCases(filterState);
|
|
323
|
-
};
|
|
324
|
-
const loggedInContactId = (_b = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _b === void 0 ? void 0 : _b.id;
|
|
325
|
-
const loggedInIsOrgAdmin = (_c = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _c === void 0 ? void 0 : _c.isOrgAdmin;
|
|
326
|
-
const defaultCaseGroupId = (_e = (_d = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _d === void 0 ? void 0 : _d.defaultCaseGroup) !== null && _e !== void 0 ? _e : null;
|
|
327
|
-
const prevDefaultCaseGroupIdRef = useRef(defaultCaseGroupId);
|
|
328
169
|
useEffect(() => {
|
|
329
170
|
var _a;
|
|
330
|
-
if (
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
currentGroupFilter.length === 0) {
|
|
338
|
-
userDismissedDefaultGroupRef.current = true;
|
|
171
|
+
if (haventLoadedMetadata(caseGroups, (data) => data === undefined)) {
|
|
172
|
+
if ((_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.isInternal) {
|
|
173
|
+
fetchCaseGroupsForAccount(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.accountNumber);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
fetchCaseGroupsForSSO(dispatchToGlobalMetadataReducer, loggedInUserJwtToken.preferred_username);
|
|
177
|
+
}
|
|
339
178
|
}
|
|
340
|
-
|
|
341
|
-
}, [filterState.filterInfo, defaultCaseGroupId]);
|
|
179
|
+
}, [caseGroups, dispatchToGlobalMetadataReducer, loggedInUserJwtToken, loggedInUsersAccount.data]);
|
|
342
180
|
useEffect(() => {
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
return;
|
|
346
|
-
if (!haventLoadedMetadata(caseGroups, (data) => data === undefined))
|
|
347
|
-
return;
|
|
348
|
-
if ((_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.isInternal) {
|
|
349
|
-
fetchCaseGroupsForAccount(dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId, defaultCaseGroupId, loggedInContactId, loggedInIsOrgAdmin);
|
|
181
|
+
if (haventLoadedMetadata(allCaseTypes)) {
|
|
182
|
+
fetchCaseTypes(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
|
|
350
183
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
}
|
|
354
|
-
}, [
|
|
355
|
-
apolloClient,
|
|
356
|
-
caseGroups,
|
|
357
|
-
dispatchToGlobalMetadataReducer,
|
|
358
|
-
defaultCaseGroupId,
|
|
359
|
-
loggedInContactId,
|
|
360
|
-
loggedInIsOrgAdmin,
|
|
361
|
-
loggedInUser.isFetching,
|
|
362
|
-
(_f = loggedInUsersAccount.data) === null || _f === void 0 ? void 0 : _f.isInternal,
|
|
363
|
-
salesforceAccountId,
|
|
364
|
-
]);
|
|
365
|
-
useEffect(() => {
|
|
366
|
-
if (location.pathname !== '/case/list')
|
|
367
|
-
return;
|
|
368
|
-
if (loggedInUser.isFetching || caseGroups.isFetching || caseGroups.data === undefined)
|
|
369
|
-
return;
|
|
370
|
-
if (!shouldApplyDefaultGroupFilter(queryFromUrl, hydraUserPreferences.data))
|
|
371
|
-
return;
|
|
372
|
-
const canAutoSync = isNoFilterApplied(filterState) ||
|
|
373
|
-
isOnlyDefaultFilterApplied(filterState) ||
|
|
374
|
-
isOnlyGroupFilterApplied(filterState.filterInfo);
|
|
375
|
-
if (!canAutoSync)
|
|
376
|
-
return;
|
|
377
|
-
const nextGroupFilter = getDefaultGroupFilterSelection(caseGroups.data, loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data);
|
|
378
|
-
const currentGroupFilter = filterState.filterInfo[SolrKeys.group] || [];
|
|
379
|
-
if (userDismissedDefaultGroupRef.current && currentGroupFilter.length === 0) {
|
|
380
|
-
return;
|
|
381
|
-
}
|
|
382
|
-
if (isEqual(currentGroupFilter, nextGroupFilter))
|
|
383
|
-
return;
|
|
384
|
-
updateFilterState(filterDispatch, Object.assign(Object.assign({}, filterState), { filterInfo: Object.assign(Object.assign({}, filterState.filterInfo), { [SolrKeys.group]: nextGroupFilter }) }));
|
|
385
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
386
|
-
}, [
|
|
387
|
-
defaultCaseGroupId,
|
|
388
|
-
caseGroups.data,
|
|
389
|
-
caseGroups.isFetching,
|
|
390
|
-
loggedInUser.isFetching,
|
|
391
|
-
location.pathname,
|
|
392
|
-
queryFromUrl,
|
|
393
|
-
]);
|
|
394
|
-
useEffect(() => {
|
|
395
|
-
const loadMetadata = () => __awaiter(this, void 0, void 0, function* () {
|
|
396
|
-
if (haventLoadedMetadata(allCaseTypes)) {
|
|
397
|
-
fetchCaseTypes(dispatchToGlobalMetadataReducer, apolloClient);
|
|
398
|
-
}
|
|
184
|
+
// when solr is down, we use hydra metadata api to populated filter dropdowns
|
|
185
|
+
if (isSolrSearchDown) {
|
|
399
186
|
if (haventLoadedMetadata(allCaseSeverities)) {
|
|
400
|
-
fetchCaseSeverities(dispatchToGlobalMetadataReducer,
|
|
187
|
+
fetchCaseSeverities(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
|
|
401
188
|
}
|
|
402
189
|
if (haventLoadedMetadata(allCaseStatuses)) {
|
|
403
|
-
fetchAllStatuses(dispatchToGlobalMetadataReducer,
|
|
190
|
+
fetchAllStatuses(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
|
|
404
191
|
}
|
|
405
192
|
if (haventLoadedProductsMetadata(allProducts)) {
|
|
406
|
-
fetchProducts(dispatchToGlobalMetadataReducer
|
|
193
|
+
fetchProducts(dispatchToGlobalMetadataReducer);
|
|
407
194
|
}
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
queryString: type === CaseSearchQueryType.BASIC
|
|
420
|
-
? filterState.filterQueryInfo.queryString
|
|
421
|
-
: filterState.filterQueryInfo.parsedQuery,
|
|
422
|
-
type,
|
|
423
|
-
};
|
|
424
|
-
try {
|
|
425
|
-
updateUserPreferences(dispatchToGlobalMetadataReducer, loggedInUserRights.data.getSSOUsername(), [{ key: UserPreferencesKeys.mostRecentSearch, value: JSON.stringify(recentSearch) }], 'add');
|
|
426
|
-
}
|
|
427
|
-
catch (e) {
|
|
428
|
-
console.error('Could not save filter query in user preferences');
|
|
195
|
+
// on sfdc fields that only one value is allowed, set filter to first item
|
|
196
|
+
const sfdcFilterState = mapValues(filterState.filterInfo, (value, key) => {
|
|
197
|
+
//@ts-ignore
|
|
198
|
+
if (eligibleSFDCFiltersMultipleValues.includes(key))
|
|
199
|
+
return value;
|
|
200
|
+
return value[0] ? [value[0]] : [];
|
|
201
|
+
});
|
|
202
|
+
updateFilterState(filterDispatch, {
|
|
203
|
+
//@ts-ignore
|
|
204
|
+
filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), sfdcFilterState),
|
|
205
|
+
});
|
|
429
206
|
}
|
|
430
|
-
|
|
207
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
208
|
+
}, [
|
|
209
|
+
allCaseTypes,
|
|
210
|
+
allCaseSeverities,
|
|
211
|
+
allCaseStatuses,
|
|
212
|
+
allProducts,
|
|
213
|
+
dispatchToGlobalMetadataReducer,
|
|
214
|
+
loggedInUsersAccount.data.secureSupport,
|
|
215
|
+
isSolrSearchDown,
|
|
216
|
+
]);
|
|
431
217
|
// effect to update url query and call get case api whenever filter state changes
|
|
432
218
|
useEffect(() => {
|
|
433
|
-
var _a, _b, _c
|
|
219
|
+
var _a, _b, _c;
|
|
434
220
|
if (!isFirstMount.current) {
|
|
435
221
|
const urlQuery = (isNoFilterApplied(filterState) || isOnlyDefaultFilterApplied(filterState)) &&
|
|
436
222
|
!((_a = filterState.filterQueryInfo) === null || _a === void 0 ? void 0 : _a.queryString) &&
|
|
437
223
|
!filterState.sortInfo.column
|
|
438
224
|
? ''
|
|
439
225
|
: createURLQueryFromFilterState(filterState);
|
|
440
|
-
const paginationKey = `p${(_b = filterState.paginationInfo) === null || _b === void 0 ? void 0 : _b.currentPage}_s${(_c = filterState.paginationInfo) === null || _c === void 0 ? void 0 : _c.pageSize}`;
|
|
441
|
-
const advanceSearchKey = [
|
|
442
|
-
((_d = filterState.filterQueryInfo) === null || _d === void 0 ? void 0 : _d.parsedQuery) || '',
|
|
443
|
-
JSON.stringify(filterState.advanceSearchDateRanges || null),
|
|
444
|
-
].join('|');
|
|
445
|
-
const fullQueryKey = `${urlQuery}_${paginationKey}_${advanceSearchKey}`;
|
|
446
|
-
if (fullQueryKey === lastPushedQueryRef.current) {
|
|
447
|
-
return;
|
|
448
|
-
}
|
|
449
|
-
if (urlQuery !== lastPushedQueryRef.current) {
|
|
450
|
-
clearPageCursors();
|
|
451
|
-
}
|
|
452
226
|
setCurrentQuery(CaseListDispatch, urlQuery);
|
|
453
|
-
lastPushedQueryRef.current = urlQuery;
|
|
454
227
|
searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = encodeURIComponent(urlQuery);
|
|
228
|
+
searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM] = (_b = filterState.paginationInfo) === null || _b === void 0 ? void 0 : _b.currentPage.toString();
|
|
229
|
+
searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM] = (_c = filterState.paginationInfo) === null || _c === void 0 ? void 0 : _c.pageSize.toString();
|
|
455
230
|
searchParams[FILTER_URL_QUERY_TYPE] = filterState.filterQueryInfo.type;
|
|
456
|
-
delete searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM];
|
|
457
|
-
delete searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM];
|
|
458
231
|
props.routeProps.history.push({
|
|
459
232
|
search: getStringifiedParams(searchParams),
|
|
460
233
|
});
|
|
461
234
|
saveFilterQueryInUserPreferences();
|
|
235
|
+
// so that we don't call get cases every time user switches between basic and advanced without any filters applied
|
|
236
|
+
if (isSearchTypeChanged &&
|
|
237
|
+
!filterState.filterQueryInfo.queryString &&
|
|
238
|
+
isNoFilterApplied(filterState) &&
|
|
239
|
+
filterValuesFromFacetResponse // if this is null, it means it is the first page load so get cases anyway
|
|
240
|
+
)
|
|
241
|
+
return;
|
|
462
242
|
getCases(filterState);
|
|
463
243
|
}
|
|
464
244
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -468,46 +248,17 @@ export function CaseList(props) {
|
|
|
468
248
|
if (bookmarkedAccounts.isFetching ||
|
|
469
249
|
managedAccounts.isFetching ||
|
|
470
250
|
caseGroups.isFetching ||
|
|
471
|
-
caseGroups.data === undefined
|
|
472
|
-
caseRecordTypes.isFetching ||
|
|
473
|
-
isEmpty(caseRecordTypes.data))
|
|
251
|
+
caseGroups.data === undefined)
|
|
474
252
|
return;
|
|
475
|
-
const decodedQueryFromUrl = (() => {
|
|
476
|
-
if (!queryFromUrl || queryFromUrl === 'undefined') {
|
|
477
|
-
return '';
|
|
478
|
-
}
|
|
479
|
-
try {
|
|
480
|
-
return decodeURIComponent(queryFromUrl);
|
|
481
|
-
}
|
|
482
|
-
catch (_a) {
|
|
483
|
-
return queryFromUrl;
|
|
484
|
-
}
|
|
485
|
-
})();
|
|
486
253
|
// when user manually changes url and hit enter, new result is fetched without refreshing the page
|
|
487
254
|
if (!isFirstMount.current) {
|
|
488
|
-
if (
|
|
489
|
-
|
|
490
|
-
decodedQueryFromUrl !== lastPushedQueryRef.current) {
|
|
491
|
-
const filterStateFromQueryUrl = createFilterStateFromUrlQuery(decodedQueryFromUrl, globalMetadataState, undefined, 1, searchType);
|
|
255
|
+
if (queryFromUrl !== currentQuery) {
|
|
256
|
+
const filterStateFromQueryUrl = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, pageSizeFromUrl, currentPageFromUrl, searchType);
|
|
492
257
|
updateFilterState(filterDispatch, filterStateFromQueryUrl);
|
|
493
258
|
}
|
|
494
259
|
return;
|
|
495
260
|
}
|
|
496
261
|
if (isFirstMount.current) {
|
|
497
|
-
if (searchParams.rhcd) {
|
|
498
|
-
// this is to check if rhcd is passed on first load
|
|
499
|
-
setRHCDValue(searchParams.rhcd);
|
|
500
|
-
}
|
|
501
|
-
const hasExplicitUrlQuery = Boolean(decodedQueryFromUrl.trim());
|
|
502
|
-
if (hasExplicitUrlQuery && decodedQueryFromUrl !== currentQuery) {
|
|
503
|
-
const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodedQueryFromUrl, undefined, 1, searchType);
|
|
504
|
-
setDefaultSavedSearchName(defaultSearchName);
|
|
505
|
-
setCurrentQuery(CaseListDispatch, decodedQueryFromUrl);
|
|
506
|
-
lastPushedQueryRef.current = decodedQueryFromUrl;
|
|
507
|
-
isFirstMount.current = false;
|
|
508
|
-
updateFilterState(filterDispatch, initFilterState);
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
262
|
// user came to page from another tab - second time on page as currentQuery is set
|
|
512
263
|
// - keep state and show the result that we already have in state
|
|
513
264
|
// - update url to reflect filter state
|
|
@@ -515,6 +266,8 @@ export function CaseList(props) {
|
|
|
515
266
|
if (currentQuery) {
|
|
516
267
|
const navObj = {
|
|
517
268
|
[FILTER_URL_QUERY_SEARCH_PARAM]: encodeURIComponent(currentQuery),
|
|
269
|
+
[FILTER_URL_PAGE_SIZE_SEARCH_PARAM]: filterState.paginationInfo.pageSize,
|
|
270
|
+
[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM]: filterState.paginationInfo.currentPage,
|
|
518
271
|
[FILTER_URL_QUERY_TYPE]: filterState.filterQueryInfo.type,
|
|
519
272
|
};
|
|
520
273
|
props.routeProps.history.replace({ search: getStringifiedParams(navObj) });
|
|
@@ -522,31 +275,35 @@ export function CaseList(props) {
|
|
|
522
275
|
isFirstMount.current = false;
|
|
523
276
|
return;
|
|
524
277
|
}
|
|
278
|
+
/*** user comes to this point on first time app load landing on case list ***/
|
|
279
|
+
if (searchParams.rhcd) {
|
|
280
|
+
// this is to check if rhcd is passed on first load
|
|
281
|
+
setRHCDValue(searchParams.rhcd);
|
|
282
|
+
}
|
|
525
283
|
// set filter state based on url or default saved search
|
|
526
|
-
|
|
527
|
-
// Always reset to page 1 on fresh load — cursor-based pagination
|
|
528
|
-
// has no stored cursors after refresh, so page > 1 would cause a mismatch
|
|
529
|
-
const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodedQueryFromUrl, undefined, 1, searchType);
|
|
284
|
+
const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodeURIComponent(queryFromUrl), pageSizeFromUrl, currentPageFromUrl, searchType);
|
|
530
285
|
// to set default saved search name
|
|
531
286
|
setDefaultSavedSearchName(defaultSearchName);
|
|
532
287
|
// set default params when they are empty
|
|
533
|
-
if (!
|
|
288
|
+
if (!queryFromUrl) {
|
|
534
289
|
searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = ' orderBy lastModifiedDate desc';
|
|
535
290
|
}
|
|
536
|
-
setCurrentQuery(CaseListDispatch,
|
|
291
|
+
setCurrentQuery(CaseListDispatch, queryFromUrl);
|
|
537
292
|
isFirstMount.current = false;
|
|
538
293
|
// we only update the state without api call as we fetch result in another useEffect that observes the state
|
|
539
294
|
updateFilterState(filterDispatch, initFilterState);
|
|
540
295
|
}
|
|
541
296
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
542
|
-
}, [managedAccounts, bookmarkedAccounts, caseGroups,
|
|
543
|
-
// effect to initially set the filter state to expanded
|
|
297
|
+
}, [managedAccounts, bookmarkedAccounts, caseGroups, queryFromUrl, pageSizeFromUrl, currentPageFromUrl]);
|
|
298
|
+
// effect to initially set the filter state to expanded and when we switch from advanced to basic mode
|
|
544
299
|
useEffect(() => {
|
|
545
|
-
|
|
300
|
+
// currently there is no easy way to set the panel as expanded on initial load
|
|
301
|
+
// also we only use the standalone panel and manually change the panel state on toggle btn click
|
|
302
|
+
isCaseListFilterPanelExanded && isXLScreen && isBasicSearchMode && toggleFilterSection(true);
|
|
546
303
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
547
|
-
}, []);
|
|
304
|
+
}, [isBasicSearchMode]);
|
|
548
305
|
const onConfirmTraditionalSupportAgreement = () => {
|
|
549
|
-
|
|
306
|
+
updateCaseListTraditionalSupportAgreed(globalDispatchContext, true);
|
|
550
307
|
};
|
|
551
308
|
const displayRHCDAlert = () => {
|
|
552
309
|
const openClosedCopy = `Only showing cases that were ${RHCDValue} during the selected time range specified in
|
|
@@ -570,6 +327,12 @@ export function CaseList(props) {
|
|
|
570
327
|
return (React.createElement(React.Fragment, null,
|
|
571
328
|
React.createElement(CSSUserModal, { onConfirmTraditionalSupportAgreement: onConfirmTraditionalSupportAgreement, display: !caseListTraditionalSupportAgreed }),
|
|
572
329
|
React.createElement("article", { id: "rh-support-cases", className: "cases-main" },
|
|
330
|
+
isSolrSearchDown && (React.createElement(Alert, { isInline: true, variant: AlertVariant.warning, component: "p", title: React.createElement(Trans, null,
|
|
331
|
+
"Case search is working with limited functionality. Please check",
|
|
332
|
+
' ',
|
|
333
|
+
React.createElement("a", { href: "https://status.redhat.com", target: "_blank", rel: "noreferrer", "data-tracking-id": "caselist-redirect-status-page" }, "status page"),
|
|
334
|
+
' ',
|
|
335
|
+
"for details.") })),
|
|
573
336
|
React.createElement("section", { className: "case-search-top" },
|
|
574
337
|
!isEmpty(RHCDValue) && isRHCDAlertShown && React.createElement("div", { className: "push-bottom" }, displayRHCDAlert()),
|
|
575
338
|
React.createElement("div", { className: "search-wrapper" },
|
|
@@ -577,17 +340,17 @@ export function CaseList(props) {
|
|
|
577
340
|
React.createElement(NewCaseButton, { routeProps: props.routeProps })),
|
|
578
341
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading case search input') } },
|
|
579
342
|
React.createElement(CaseSearch, { defaultSavedSearchName: defaultSavedSearchName }))),
|
|
580
|
-
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
|
|
581
|
-
React.createElement(CaseListFilterChips,
|
|
343
|
+
isBasicSearchMode && (React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
|
|
344
|
+
React.createElement(CaseListFilterChips, { productVersionPivotValues: get(pivotValues, SolrPivotKeys.product_version, []), isSolrSearchDown: isSolrSearchDown })))),
|
|
582
345
|
React.createElement("section", { className: "case-search-bottom" },
|
|
583
|
-
React.createElement("aside", { className: `case-search-filters ${((
|
|
584
|
-
React.createElement("h2", { className: "filter-header pf-v6-u-display-flex" }, ((
|
|
346
|
+
isBasicSearchMode && (React.createElement("aside", { className: `case-search-filters ${((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded) ? '' : 'collapsed'}` },
|
|
347
|
+
React.createElement("h2", { className: "filter-header pf-v6-u-display-flex" }, ((_b = filterSectionRef.current) === null || _b === void 0 ? void 0 : _b.expanded) ? (React.createElement(React.Fragment, null,
|
|
585
348
|
React.createElement(Button, { isInline: true, className: "pf-v6-u-flex-shrink-0 pf-v6-u-flex-none case-search-filter-text-button", variant: "link", title: t('Collapse filter section'), "data-tracking-id": "collapse-case-list-filter", onClick: onToggleFilterBtnClick, iconPosition: "right", icon: React.createElement(OpenDrawerRightIcon, { className: "mirrored" }) },
|
|
586
349
|
React.createElement(Trans, null, "Filters")))) : (React.createElement(Button, { isInline: true, className: "pf-v6-c-button pf-m-link pf-m-inline pf-v6-u-flex-shrink-0 pf-v6-u-flex-none pf-v6-u-display-flex pf-v6-u-align-items-center pf-v6-u-justify-content-center pf-v6-u-px-lg", variant: "link", title: t('Expand filter section'), "data-tracking-id": "expand-case-list-filter", onClick: onToggleFilterBtnClick, iconPosition: "right", icon: React.createElement(OpenDrawerRightIcon, null) }, isXLScreen ? null : React.createElement(Trans, null, "Filters")))),
|
|
587
350
|
React.createElement("div", { className: "filter-wrapper" },
|
|
588
351
|
React.createElement("pfe-collapse-panel", { id: "case-filters-panel", "pfe-animation": "false", ref: filterSectionRef },
|
|
589
352
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filters') } },
|
|
590
|
-
React.createElement(CaseListFilters, { allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts }))))),
|
|
353
|
+
React.createElement(CaseListFilters, { filterValues: filterValuesFromFacetResponse, allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts, isSolrSearchDown: isSolrSearchDown })))))),
|
|
591
354
|
React.createElement("section", { className: "case-search-table pf-v6-u-display-flex pf-v6-u-flex-direction-column" },
|
|
592
|
-
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo, isCaseListPageLoading: isFetching, hasError: hasError,
|
|
355
|
+
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo, paginationInfo: filterState.paginationInfo, isCaseListPageLoading: isFetching, hasError: hasError, isSolrDown: isSolrSearchDown }))))));
|
|
593
356
|
}
|