@rh-support/cases 2.6.186 → 2.6.187
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-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 +195 -113
- 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 +35 -4
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +4 -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 +6 -2
- 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 +12 -13
- 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 +116 -71
- 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 +14 -44
- 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/CaseListTable.d.ts +7 -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 +77 -60
- 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 +38 -68
- 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 +2 -3
- 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 +1 -0
- 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 +111 -22
- package/lib/esm/css/caseSearch.css +114 -0
- package/lib/esm/enums/case.d.ts +2 -1
- package/lib/esm/enums/case.d.ts.map +1 -1
- package/lib/esm/enums/case.js +14 -1
- package/lib/esm/enums/caseSearch.d.ts +1 -0
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +1 -1
- 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/test-utils/mockData.js +1 -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 +149 -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 +280 -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 +36 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +15 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -0
- package/lib/esm/utils/caseListVariablesBuilder.js +399 -0
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +26 -1
- 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 +20 -2
- package/lib/esm/utils/mockSolrResponse.js +1 -1
- package/lib/esm/utils/statusUtils.d.ts +4 -0
- package/lib/esm/utils/statusUtils.d.ts.map +1 -0
- package/lib/esm/utils/statusUtils.js +36 -0
- package/package.json +8 -8
|
@@ -1,18 +1,11 @@
|
|
|
1
1
|
import '../../css/caseList.css';
|
|
2
2
|
import '../../css/caseSearch.css';
|
|
3
|
-
import { IFacetResponse } from '@rh-support/types/shared';
|
|
4
|
-
import { ISolrResponseToPivotFields } from '@rh-support/utils';
|
|
5
3
|
import React from 'react';
|
|
6
4
|
import { RouteComponentProps } from 'react-router-dom';
|
|
7
5
|
import { ICasesRouteURLParams } from '..';
|
|
8
|
-
import { IFacetPivot } from '../../models/caseList';
|
|
9
6
|
interface IProps {
|
|
10
7
|
routeProps: RouteComponentProps<ICasesRouteURLParams>;
|
|
11
8
|
}
|
|
12
|
-
export interface IProductVersionPivotMap extends IFacetResponse {
|
|
13
|
-
case_version: IFacetResponse[];
|
|
14
|
-
}
|
|
15
|
-
export type IPivotValues = ISolrResponseToPivotFields<IFacetPivot, IProductVersionPivotMap>;
|
|
16
9
|
export interface IChipsNameSsoMap {
|
|
17
10
|
[sso: string]: IChipsNameSso;
|
|
18
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseList.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseList.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAChC,OAAO,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"CaseList.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseList.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAChC,OAAO,0BAA0B,CAAC;AAuClC,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAqC1C,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAMD,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBA8jBrC"}
|
|
@@ -9,23 +9,22 @@ 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';
|
|
12
13
|
import { Alert, AlertActionCloseButton, AlertVariant, Button } from '@patternfly/react-core';
|
|
13
14
|
import OpenDrawerRightIcon from '@patternfly/react-icons/dist/js/icons/open-drawer-right-icon';
|
|
14
|
-
import { ErrorBoundary, ToastNotification, useBreakpoint, useDocumentTitle, useForceUpdate,
|
|
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, pendoTrackEvent,
|
|
17
|
-
import get from 'lodash/get';
|
|
15
|
+
import { ErrorBoundary, ToastNotification, useBreakpoint, useDocumentTitle, useForceUpdate, } from '@rh-support/components';
|
|
16
|
+
import { CSSUserModal, fetchAllStatuses, fetchCaseGroupsForAccount, fetchCaseGroupsForSSO, fetchCaseRecordTypes, fetchCaseSeverities, fetchCaseTypes, fetchProducts, GlobalMetadataDispatchContext, GlobalMetadataStateContext, setUserPreferences, updateCaseListTraditionalSupportAgreed, updateUserPreferences, useGlobalDispatchContext, UserPreferencesKeys, } from '@rh-support/react-context';
|
|
17
|
+
import { getStringifiedParams, getUrlParsedParams, haventLoadedMetadata, haventLoadedProductsMetadata, pendoTrackEvent, } from '@rh-support/utils';
|
|
18
18
|
import isEmpty from 'lodash/isEmpty';
|
|
19
|
-
import mapValues from 'lodash/mapValues';
|
|
20
19
|
import some from 'lodash/some';
|
|
21
20
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
22
21
|
import { Trans, useTranslation } from 'react-i18next';
|
|
22
|
+
import { useInView } from 'react-intersection-observer';
|
|
23
23
|
import { useLocation } from 'react-router-dom';
|
|
24
24
|
import { CaseSearchQueryType } from '../../enums/caseSearch';
|
|
25
|
-
import { SolrPivotKeys } from '../../enums/filters';
|
|
26
25
|
import { PageTitle } from '../../enums/pageTitle';
|
|
27
26
|
import { useFilterStateOnLoad } from '../../hooks/useFilterStateOnLoad';
|
|
28
|
-
import {
|
|
27
|
+
import { clearPageCursors, getCaseListFromGraphQL, loadMoreCases, } from '../../utils/caseListGraphQLUtils';
|
|
29
28
|
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';
|
|
30
29
|
import { UpdatedCaseDataEvent } from '../../utils/constants';
|
|
31
30
|
import { NewCaseButton } from '../case/NewCaseButton';
|
|
@@ -34,27 +33,27 @@ import { CaseListFilters } from './case-list-filters/CaseListFilters';
|
|
|
34
33
|
import { CaseListTable } from './case-list-table/CaseListTable';
|
|
35
34
|
import { CaseSearch } from './case-search/CaseSearch';
|
|
36
35
|
import { useCaseListDispatchContext, useCaseListStateContext } from './CaseListContext';
|
|
37
|
-
import { CaseListFilterDispatchContext, CaseListFilterStateContext
|
|
38
|
-
import {
|
|
36
|
+
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from './CaseListFilterContext';
|
|
37
|
+
import { isNoFilterApplied, isOnlyDefaultFilterApplied } from './CaseListFilterHelpers';
|
|
39
38
|
import { updateFilterState } from './CaseListFilterReducer';
|
|
40
|
-
import { setCaseList, setCurrentQuery,
|
|
39
|
+
import { appendCaseList, setCaseList, setCurrentQuery, setCursorInfo, setIsFetching, setIsLoadingMore, setLoadMoreError, } from './CaseListReducer';
|
|
41
40
|
export function CaseList(props) {
|
|
42
41
|
var _a, _b;
|
|
43
42
|
const { t } = useTranslation();
|
|
44
43
|
useDocumentTitle(PageTitle.CASE_LIST);
|
|
45
44
|
const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
|
|
46
|
-
const { caseList,
|
|
45
|
+
const { caseList, isFetching, isLoadingMore, hasNextPage, endCursor, currentQuery, loadMoreError, loadMoreRetryCount, } = useCaseListStateContext();
|
|
47
46
|
const CaseListDispatch = useCaseListDispatchContext();
|
|
48
47
|
const breakPoint = useBreakpoint();
|
|
49
|
-
const { globalMetadataState, globalMetadataState: { caseGroups, loggedInUserJwtToken, loggedInUserRights, loggedInUsersAccount, userPreferences, managedAccounts, bookmarkedAccounts, allCaseTypes, allCaseSeverities, allCaseStatuses, allProducts, caseListTraditionalSupportAgreed, }, } = useContext(GlobalMetadataStateContext);
|
|
48
|
+
const { globalMetadataState, globalMetadataState: { caseGroups, loggedInUserJwtToken, loggedInUserRights, loggedInUsersAccount, userPreferences, managedAccounts, bookmarkedAccounts, allCaseTypes, allCaseSeverities, allCaseStatuses, allProducts, caseRecordTypes, caseListTraditionalSupportAgreed, }, } = useContext(GlobalMetadataStateContext);
|
|
50
49
|
const globalDispatchContext = useGlobalDispatchContext();
|
|
50
|
+
const apolloClient = useApolloClient();
|
|
51
51
|
const location = useLocation();
|
|
52
52
|
const searchParams = getUrlParsedParams(location.search);
|
|
53
53
|
const queryFromUrl = searchParams[FILTER_URL_QUERY_SEARCH_PARAM];
|
|
54
|
-
const pageSizeFromUrl = parseInt(searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM]);
|
|
55
|
-
const currentPageFromUrl = parseInt(searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM]);
|
|
56
54
|
const searchType = searchParams[FILTER_URL_QUERY_TYPE];
|
|
57
55
|
const abortControllerRef = useRef(undefined);
|
|
56
|
+
const lastPushedQueryRef = useRef('');
|
|
58
57
|
const isXLScreen = breakPoint.xl;
|
|
59
58
|
const isFirstMount = useRef(true);
|
|
60
59
|
const filterSectionRef = useRef(null);
|
|
@@ -63,71 +62,143 @@ export function CaseList(props) {
|
|
|
63
62
|
const forceUpdate = useForceUpdate();
|
|
64
63
|
const isCaseListFilterPanelExanded = userPreferences.data.isCaseListFilterPanelExanded;
|
|
65
64
|
const useFilterStateInit = useFilterStateOnLoad();
|
|
66
|
-
const isBasicSearchMode = filterState.filterQueryInfo.type === CaseSearchQueryType.BASIC ||
|
|
67
|
-
(filterState.filterQueryInfo.type === CaseSearchQueryType.ADVANCED && loggedInUserRights.data.isExternal());
|
|
68
|
-
const prevSearchType = usePrevious(filterState.filterQueryInfo.type);
|
|
69
|
-
let isSearchTypeChanged = filterState.filterQueryInfo.type !== prevSearchType;
|
|
70
65
|
const [hasError, setHasError] = useState(null);
|
|
71
|
-
const [isSolrSearchDown, setSolrSearchDown] = useState(false);
|
|
72
66
|
const [defaultSavedSearchName, setDefaultSavedSearchName] = useState('');
|
|
73
67
|
const [RHCDValue, setRHCDValue] = useState('');
|
|
74
68
|
const [isRHCDAlertShown, setIsRHCDAlertShown] = useState(true);
|
|
69
|
+
const loadMoreLockRef = useRef(false);
|
|
70
|
+
const sentinelElRef = useRef(null);
|
|
71
|
+
const prefetchRef = useRef({
|
|
72
|
+
cursor: '',
|
|
73
|
+
data: null,
|
|
74
|
+
loading: false,
|
|
75
|
+
});
|
|
76
|
+
const { ref: inViewRef, inView } = useInView();
|
|
77
|
+
const sentinelRef = React.useCallback((node) => {
|
|
78
|
+
sentinelElRef.current = node || null;
|
|
79
|
+
inViewRef(node);
|
|
80
|
+
}, [inViewRef]);
|
|
81
|
+
function startPrefetch(cursor) {
|
|
82
|
+
if (!cursor || prefetchRef.current.cursor === cursor)
|
|
83
|
+
return;
|
|
84
|
+
prefetchRef.current = { cursor, data: null, loading: true };
|
|
85
|
+
loadMoreCases(filterState, apolloClient, cursor)
|
|
86
|
+
.then((result) => {
|
|
87
|
+
if (prefetchRef.current.cursor === cursor) {
|
|
88
|
+
prefetchRef.current = { cursor, data: result, loading: false };
|
|
89
|
+
}
|
|
90
|
+
})
|
|
91
|
+
.catch(() => {
|
|
92
|
+
if (prefetchRef.current.cursor === cursor) {
|
|
93
|
+
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
let ticking = false;
|
|
99
|
+
const onScroll = () => {
|
|
100
|
+
if (ticking)
|
|
101
|
+
return;
|
|
102
|
+
ticking = true;
|
|
103
|
+
requestAnimationFrame(() => {
|
|
104
|
+
ticking = false;
|
|
105
|
+
if (!sentinelElRef.current)
|
|
106
|
+
return;
|
|
107
|
+
const rect = sentinelElRef.current.getBoundingClientRect();
|
|
108
|
+
if (rect.top <= window.innerHeight + 600) {
|
|
109
|
+
loadMore();
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
window.addEventListener('scroll', onScroll, true);
|
|
114
|
+
return () => window.removeEventListener('scroll', onScroll, true);
|
|
115
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
116
|
+
}, [hasNextPage, isLoadingMore, loadMoreError, endCursor]);
|
|
117
|
+
useEffect(() => {
|
|
118
|
+
if (inView && hasNextPage && !isLoadingMore && !loadMoreError) {
|
|
119
|
+
loadMore();
|
|
120
|
+
}
|
|
121
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
122
|
+
}, [inView, hasNextPage, isLoadingMore, loadMoreError]);
|
|
75
123
|
function getCases(currentFilterState) {
|
|
76
124
|
return __awaiter(this, void 0, void 0, function* () {
|
|
77
|
-
|
|
125
|
+
var _a;
|
|
78
126
|
try {
|
|
79
|
-
|
|
80
|
-
setHasError(false);
|
|
81
|
-
if (abortControllerRef.current !== undefined) {
|
|
82
|
-
// Cancel the previous request
|
|
127
|
+
if (abortControllerRef.current) {
|
|
83
128
|
abortControllerRef.current.abort();
|
|
84
129
|
}
|
|
85
|
-
|
|
86
|
-
let controller = new AbortController();
|
|
130
|
+
const controller = new AbortController();
|
|
87
131
|
abortControllerRef.current = controller;
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
132
|
+
setIsFetching(CaseListDispatch, true);
|
|
133
|
+
setHasError(false);
|
|
134
|
+
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
135
|
+
const result = yield getCaseListFromGraphQL(currentFilterState, apolloClient, undefined, controller.signal);
|
|
136
|
+
if (controller.signal.aborted) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
setCaseList(CaseListDispatch, result.caseListResponse.response);
|
|
140
|
+
setCursorInfo(CaseListDispatch, result.hasNextPage, result.endCursor);
|
|
94
141
|
setIsFetching(CaseListDispatch, false);
|
|
142
|
+
if (result.hasNextPage && result.endCursor) {
|
|
143
|
+
startPrefetch(result.endCursor);
|
|
144
|
+
}
|
|
145
|
+
if (result.showErrorMessage) {
|
|
146
|
+
setHasError(true);
|
|
147
|
+
ToastNotification.addDangerMessage(t('There was an error loading case data. Please try again.'));
|
|
148
|
+
}
|
|
95
149
|
}
|
|
96
150
|
catch (err) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
setIsFetching(CaseListDispatch, false);
|
|
100
|
-
setHasError(true);
|
|
101
|
-
showError && ToastNotification.addXHRErrorMessage(err);
|
|
151
|
+
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'))) {
|
|
152
|
+
return;
|
|
102
153
|
}
|
|
154
|
+
setIsFetching(CaseListDispatch, false);
|
|
155
|
+
setHasError(true);
|
|
156
|
+
ToastNotification.addXHRErrorMessage(err);
|
|
103
157
|
}
|
|
104
158
|
});
|
|
105
159
|
}
|
|
160
|
+
function loadMore() {
|
|
161
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
162
|
+
if (loadMoreLockRef.current || isLoadingMore || !hasNextPage || !endCursor || loadMoreError)
|
|
163
|
+
return;
|
|
164
|
+
loadMoreLockRef.current = true;
|
|
165
|
+
setIsLoadingMore(CaseListDispatch, true);
|
|
166
|
+
try {
|
|
167
|
+
let result;
|
|
168
|
+
const pf = prefetchRef.current;
|
|
169
|
+
if (pf.cursor === endCursor && pf.data) {
|
|
170
|
+
result = pf.data;
|
|
171
|
+
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
172
|
+
}
|
|
173
|
+
else {
|
|
174
|
+
prefetchRef.current = { cursor: '', data: null, loading: false };
|
|
175
|
+
result = yield loadMoreCases(filterState, apolloClient, endCursor);
|
|
176
|
+
}
|
|
177
|
+
setLoadMoreError(CaseListDispatch, false, 0);
|
|
178
|
+
appendCaseList(CaseListDispatch, result.docs, result.hasNextPage, result.endCursor);
|
|
179
|
+
if (result.hasNextPage && result.endCursor) {
|
|
180
|
+
startPrefetch(result.endCursor);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
catch (err) {
|
|
184
|
+
const nextRetryCount = loadMoreRetryCount + 1;
|
|
185
|
+
setLoadMoreError(CaseListDispatch, true, nextRetryCount);
|
|
186
|
+
console.error('[CaseList] loadMore error:', err);
|
|
187
|
+
}
|
|
188
|
+
finally {
|
|
189
|
+
loadMoreLockRef.current = false;
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
function retryLoadMore() {
|
|
194
|
+
setLoadMoreError(CaseListDispatch, false, loadMoreRetryCount);
|
|
195
|
+
}
|
|
106
196
|
const toggleFilterSection = (isExpanded) => {
|
|
107
197
|
if (!filterSectionRef.current)
|
|
108
198
|
return;
|
|
109
199
|
filterSectionRef.current.expanded = isExpanded;
|
|
110
200
|
forceUpdate();
|
|
111
201
|
};
|
|
112
|
-
function saveFilterQueryInUserPreferences() {
|
|
113
|
-
if (isNoFilterApplied(filterState))
|
|
114
|
-
return;
|
|
115
|
-
const type = filterState.filterQueryInfo.type;
|
|
116
|
-
const recentSerach = {
|
|
117
|
-
filterState: type === CaseSearchQueryType.BASIC ? filterState.filterInfo : {},
|
|
118
|
-
sortState: filterState.sortInfo,
|
|
119
|
-
queryString: type === CaseSearchQueryType.BASIC
|
|
120
|
-
? filterState.filterQueryInfo.queryString
|
|
121
|
-
: filterState.filterQueryInfo.parsedQuery,
|
|
122
|
-
type,
|
|
123
|
-
};
|
|
124
|
-
try {
|
|
125
|
-
updateUserPreferences(dispatchToGlobalMetadataReducer, loggedInUserRights.data.getSSOUsername(), [{ key: UserPreferencesKeys.mostRecentSearch, value: JSON.stringify(recentSerach) }], 'add');
|
|
126
|
-
}
|
|
127
|
-
catch (e) {
|
|
128
|
-
console.error('Could not save filter query in user preferences');
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
202
|
const onToggleFilterBtnClick = () => {
|
|
132
203
|
var _a, _b;
|
|
133
204
|
toggleFilterSection(!((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded));
|
|
@@ -137,8 +208,7 @@ export function CaseList(props) {
|
|
|
137
208
|
};
|
|
138
209
|
const checkNewCases = () => __awaiter(this, void 0, void 0, function* () {
|
|
139
210
|
try {
|
|
140
|
-
const { caseListResponse
|
|
141
|
-
setSolrSearchDown(isSolrSearchDownSFDCUp);
|
|
211
|
+
const { caseListResponse } = yield getCaseListFromGraphQL(filterState, apolloClient);
|
|
142
212
|
let changed = false;
|
|
143
213
|
if (caseListResponse.response.numFound <= filterState.paginationInfo.pageSize &&
|
|
144
214
|
caseListResponse.response.numFound !== caseList.numFound) {
|
|
@@ -180,67 +250,84 @@ export function CaseList(props) {
|
|
|
180
250
|
}
|
|
181
251
|
}, [caseGroups, dispatchToGlobalMetadataReducer, loggedInUserJwtToken, loggedInUsersAccount.data]);
|
|
182
252
|
useEffect(() => {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
253
|
+
const loadMetadata = () => __awaiter(this, void 0, void 0, function* () {
|
|
254
|
+
if (haventLoadedMetadata(caseRecordTypes)) {
|
|
255
|
+
yield fetchCaseRecordTypes(dispatchToGlobalMetadataReducer, apolloClient);
|
|
256
|
+
}
|
|
257
|
+
if (haventLoadedMetadata(allCaseTypes)) {
|
|
258
|
+
fetchCaseTypes(dispatchToGlobalMetadataReducer, apolloClient);
|
|
259
|
+
}
|
|
188
260
|
if (haventLoadedMetadata(allCaseSeverities)) {
|
|
189
|
-
fetchCaseSeverities(dispatchToGlobalMetadataReducer,
|
|
261
|
+
fetchCaseSeverities(dispatchToGlobalMetadataReducer, apolloClient);
|
|
190
262
|
}
|
|
191
263
|
if (haventLoadedMetadata(allCaseStatuses)) {
|
|
192
|
-
fetchAllStatuses(dispatchToGlobalMetadataReducer,
|
|
264
|
+
fetchAllStatuses(dispatchToGlobalMetadataReducer, apolloClient);
|
|
193
265
|
}
|
|
194
266
|
if (haventLoadedProductsMetadata(allProducts)) {
|
|
195
|
-
fetchProducts(dispatchToGlobalMetadataReducer);
|
|
267
|
+
fetchProducts(dispatchToGlobalMetadataReducer, apolloClient);
|
|
196
268
|
}
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
//@ts-ignore
|
|
200
|
-
if (eligibleSFDCFiltersMultipleValues.includes(key))
|
|
201
|
-
return value;
|
|
202
|
-
return value[0] ? [value[0]] : [];
|
|
203
|
-
});
|
|
204
|
-
updateFilterState(filterDispatch, {
|
|
205
|
-
//@ts-ignore
|
|
206
|
-
filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), sfdcFilterState),
|
|
207
|
-
});
|
|
208
|
-
}
|
|
269
|
+
});
|
|
270
|
+
loadMetadata();
|
|
209
271
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
210
272
|
}, [
|
|
211
273
|
allCaseTypes,
|
|
212
274
|
allCaseSeverities,
|
|
213
275
|
allCaseStatuses,
|
|
214
276
|
allProducts,
|
|
277
|
+
caseRecordTypes,
|
|
215
278
|
dispatchToGlobalMetadataReducer,
|
|
216
|
-
|
|
217
|
-
isSolrSearchDown,
|
|
279
|
+
apolloClient,
|
|
218
280
|
]);
|
|
281
|
+
function saveFilterQueryInUserPreferences() {
|
|
282
|
+
if (isNoFilterApplied(filterState))
|
|
283
|
+
return;
|
|
284
|
+
const type = filterState.filterQueryInfo.type;
|
|
285
|
+
const recentSearch = {
|
|
286
|
+
filterState: type === CaseSearchQueryType.BASIC ? filterState.filterInfo : {},
|
|
287
|
+
sortState: filterState.sortInfo,
|
|
288
|
+
queryString: type === CaseSearchQueryType.BASIC
|
|
289
|
+
? filterState.filterQueryInfo.queryString
|
|
290
|
+
: filterState.filterQueryInfo.parsedQuery,
|
|
291
|
+
type,
|
|
292
|
+
};
|
|
293
|
+
try {
|
|
294
|
+
updateUserPreferences(dispatchToGlobalMetadataReducer, loggedInUserRights.data.getSSOUsername(), [{ key: UserPreferencesKeys.mostRecentSearch, value: JSON.stringify(recentSearch) }], 'add');
|
|
295
|
+
}
|
|
296
|
+
catch (e) {
|
|
297
|
+
console.error('Could not save filter query in user preferences');
|
|
298
|
+
}
|
|
299
|
+
}
|
|
219
300
|
// effect to update url query and call get case api whenever filter state changes
|
|
220
301
|
useEffect(() => {
|
|
221
|
-
var _a, _b, _c;
|
|
302
|
+
var _a, _b, _c, _d;
|
|
222
303
|
if (!isFirstMount.current) {
|
|
223
304
|
const urlQuery = (isNoFilterApplied(filterState) || isOnlyDefaultFilterApplied(filterState)) &&
|
|
224
305
|
!((_a = filterState.filterQueryInfo) === null || _a === void 0 ? void 0 : _a.queryString) &&
|
|
225
306
|
!filterState.sortInfo.column
|
|
226
307
|
? ''
|
|
227
308
|
: createURLQueryFromFilterState(filterState);
|
|
309
|
+
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}`;
|
|
310
|
+
const advanceSearchKey = [
|
|
311
|
+
((_d = filterState.filterQueryInfo) === null || _d === void 0 ? void 0 : _d.parsedQuery) || '',
|
|
312
|
+
JSON.stringify(filterState.advanceSearchDateRanges || null),
|
|
313
|
+
].join('|');
|
|
314
|
+
const fullQueryKey = `${urlQuery}_${paginationKey}_${advanceSearchKey}`;
|
|
315
|
+
if (fullQueryKey === lastPushedQueryRef.current) {
|
|
316
|
+
return;
|
|
317
|
+
}
|
|
318
|
+
if (urlQuery !== lastPushedQueryRef.current) {
|
|
319
|
+
clearPageCursors();
|
|
320
|
+
}
|
|
228
321
|
setCurrentQuery(CaseListDispatch, urlQuery);
|
|
322
|
+
lastPushedQueryRef.current = urlQuery;
|
|
229
323
|
searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = encodeURIComponent(urlQuery);
|
|
230
|
-
searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM] = (_b = filterState.paginationInfo) === null || _b === void 0 ? void 0 : _b.currentPage.toString();
|
|
231
|
-
searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM] = (_c = filterState.paginationInfo) === null || _c === void 0 ? void 0 : _c.pageSize.toString();
|
|
232
324
|
searchParams[FILTER_URL_QUERY_TYPE] = filterState.filterQueryInfo.type;
|
|
325
|
+
delete searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM];
|
|
326
|
+
delete searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM];
|
|
233
327
|
props.routeProps.history.push({
|
|
234
328
|
search: getStringifiedParams(searchParams),
|
|
235
329
|
});
|
|
236
330
|
saveFilterQueryInUserPreferences();
|
|
237
|
-
// so that we don't call get cases every time user switches between basic and advanced without any filters applied
|
|
238
|
-
if (isSearchTypeChanged &&
|
|
239
|
-
!filterState.filterQueryInfo.queryString &&
|
|
240
|
-
isNoFilterApplied(filterState) &&
|
|
241
|
-
filterValuesFromFacetResponse // if this is null, it means it is the first page load so get cases anyway
|
|
242
|
-
)
|
|
243
|
-
return;
|
|
244
331
|
getCases(filterState);
|
|
245
332
|
}
|
|
246
333
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -250,12 +337,14 @@ export function CaseList(props) {
|
|
|
250
337
|
if (bookmarkedAccounts.isFetching ||
|
|
251
338
|
managedAccounts.isFetching ||
|
|
252
339
|
caseGroups.isFetching ||
|
|
253
|
-
caseGroups.data === undefined
|
|
340
|
+
caseGroups.data === undefined ||
|
|
341
|
+
caseRecordTypes.isFetching ||
|
|
342
|
+
isEmpty(caseRecordTypes.data))
|
|
254
343
|
return;
|
|
255
344
|
// when user manually changes url and hit enter, new result is fetched without refreshing the page
|
|
256
345
|
if (!isFirstMount.current) {
|
|
257
|
-
if (queryFromUrl !== currentQuery) {
|
|
258
|
-
const filterStateFromQueryUrl = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState,
|
|
346
|
+
if (queryFromUrl !== currentQuery && queryFromUrl !== lastPushedQueryRef.current) {
|
|
347
|
+
const filterStateFromQueryUrl = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, undefined, 1, searchType);
|
|
259
348
|
updateFilterState(filterDispatch, filterStateFromQueryUrl);
|
|
260
349
|
}
|
|
261
350
|
return;
|
|
@@ -268,8 +357,6 @@ export function CaseList(props) {
|
|
|
268
357
|
if (currentQuery) {
|
|
269
358
|
const navObj = {
|
|
270
359
|
[FILTER_URL_QUERY_SEARCH_PARAM]: encodeURIComponent(currentQuery),
|
|
271
|
-
[FILTER_URL_PAGE_SIZE_SEARCH_PARAM]: filterState.paginationInfo.pageSize,
|
|
272
|
-
[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM]: filterState.paginationInfo.currentPage,
|
|
273
360
|
[FILTER_URL_QUERY_TYPE]: filterState.filterQueryInfo.type,
|
|
274
361
|
};
|
|
275
362
|
props.routeProps.history.replace({ search: getStringifiedParams(navObj) });
|
|
@@ -283,7 +370,10 @@ export function CaseList(props) {
|
|
|
283
370
|
setRHCDValue(searchParams.rhcd);
|
|
284
371
|
}
|
|
285
372
|
// set filter state based on url or default saved search
|
|
286
|
-
|
|
373
|
+
// Remove when we get OFFSET field from SCT
|
|
374
|
+
// Always reset to page 1 on fresh load — cursor-based pagination
|
|
375
|
+
// has no stored cursors after refresh, so page > 1 would cause a mismatch
|
|
376
|
+
const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodeURIComponent(queryFromUrl), undefined, 1, searchType);
|
|
287
377
|
// to set default saved search name
|
|
288
378
|
setDefaultSavedSearchName(defaultSearchName);
|
|
289
379
|
// set default params when they are empty
|
|
@@ -296,14 +386,12 @@ export function CaseList(props) {
|
|
|
296
386
|
updateFilterState(filterDispatch, initFilterState);
|
|
297
387
|
}
|
|
298
388
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
299
|
-
}, [managedAccounts, bookmarkedAccounts, caseGroups,
|
|
300
|
-
// effect to initially set the filter state to expanded
|
|
389
|
+
}, [managedAccounts, bookmarkedAccounts, caseGroups, caseRecordTypes, queryFromUrl]);
|
|
390
|
+
// effect to initially set the filter state to expanded on load
|
|
301
391
|
useEffect(() => {
|
|
302
|
-
|
|
303
|
-
// also we only use the standalone panel and manually change the panel state on toggle btn click
|
|
304
|
-
isCaseListFilterPanelExanded && isXLScreen && isBasicSearchMode && toggleFilterSection(true);
|
|
392
|
+
isCaseListFilterPanelExanded && isXLScreen && toggleFilterSection(true);
|
|
305
393
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
306
|
-
}, [
|
|
394
|
+
}, []);
|
|
307
395
|
const onConfirmTraditionalSupportAgreement = () => {
|
|
308
396
|
updateCaseListTraditionalSupportAgreed(globalDispatchContext, true);
|
|
309
397
|
};
|
|
@@ -329,12 +417,6 @@ export function CaseList(props) {
|
|
|
329
417
|
return (React.createElement(React.Fragment, null,
|
|
330
418
|
React.createElement(CSSUserModal, { onConfirmTraditionalSupportAgreement: onConfirmTraditionalSupportAgreement, display: !caseListTraditionalSupportAgreed }),
|
|
331
419
|
React.createElement("article", { id: "rh-support-cases", className: "cases-main" },
|
|
332
|
-
isSolrSearchDown && (React.createElement(Alert, { isInline: true, variant: AlertVariant.warning, component: "p", title: React.createElement(Trans, null,
|
|
333
|
-
"Case search is working with limited functionality. Please check",
|
|
334
|
-
' ',
|
|
335
|
-
React.createElement("a", { href: "https://status.redhat.com", target: "_blank", rel: "noreferrer", "data-tracking-id": "caselist-redirect-status-page" }, "status page"),
|
|
336
|
-
' ',
|
|
337
|
-
"for details.") })),
|
|
338
420
|
React.createElement("section", { className: "case-search-top" },
|
|
339
421
|
!isEmpty(RHCDValue) && isRHCDAlertShown && React.createElement("div", { className: "push-bottom" }, displayRHCDAlert()),
|
|
340
422
|
React.createElement("div", { className: "search-wrapper" },
|
|
@@ -342,17 +424,17 @@ export function CaseList(props) {
|
|
|
342
424
|
React.createElement(NewCaseButton, { routeProps: props.routeProps })),
|
|
343
425
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading case search input') } },
|
|
344
426
|
React.createElement(CaseSearch, { defaultSavedSearchName: defaultSavedSearchName }))),
|
|
345
|
-
|
|
346
|
-
React.createElement(CaseListFilterChips,
|
|
427
|
+
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
|
|
428
|
+
React.createElement(CaseListFilterChips, null))),
|
|
347
429
|
React.createElement("section", { className: "case-search-bottom" },
|
|
348
|
-
|
|
430
|
+
React.createElement("aside", { className: `case-search-filters ${((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded) ? '' : 'collapsed'}` },
|
|
349
431
|
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,
|
|
350
432
|
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" }) },
|
|
351
433
|
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")))),
|
|
352
434
|
React.createElement("div", { className: "filter-wrapper" },
|
|
353
435
|
React.createElement("pfe-collapse-panel", { id: "case-filters-panel", "pfe-animation": "false", ref: filterSectionRef },
|
|
354
436
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filters') } },
|
|
355
|
-
React.createElement(CaseListFilters, {
|
|
437
|
+
React.createElement(CaseListFilters, { allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts }))))),
|
|
356
438
|
React.createElement("section", { className: "case-search-table pf-v6-u-display-flex pf-v6-u-flex-direction-column" },
|
|
357
|
-
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo,
|
|
439
|
+
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo, isCaseListPageLoading: isFetching, hasError: hasError, hasNextPage: hasNextPage, isLoadingMore: isLoadingMore, loadMoreError: loadMoreError, loadMoreRetryCount: loadMoreRetryCount, onRetryLoadMore: retryLoadMore, sentinelRef: sentinelRef }))))));
|
|
358
440
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListContext.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAmB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE1F,eAAO,MAAM,oBAAoB,EAAE,
|
|
1
|
+
{"version":3,"file":"CaseListContext.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAqB,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAE,oBAAoB,EAAmB,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE1F,eAAO,MAAM,oBAAoB,EAAE,cAclC,CAAC;AAIF,QAAA,MAAM,oBAAoB,+BAA4C,CAAC;AAEvE,QAAA,MAAM,uBAAuB,qCAAmE,CAAC;AAEjG,QAAA,MAAM,uBAAuB,sBAAyC,CAAC;AACvE,QAAA,MAAM,0BAA0B,4BAA4C,CAAC;AAE7E,iBAAS,gBAAgB,CAAC,EAAE,QAAQ,EAAE;;CAAA,qBAOrC;AAED,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,uBAAuB,EACvB,0BAA0B,GAC7B,CAAC"}
|
|
@@ -7,9 +7,12 @@ export const initialCaseListState = {
|
|
|
7
7
|
start: 0,
|
|
8
8
|
},
|
|
9
9
|
isFetching: false,
|
|
10
|
+
isLoadingMore: false,
|
|
11
|
+
hasNextPage: false,
|
|
12
|
+
endCursor: undefined,
|
|
13
|
+
loadMoreError: false,
|
|
14
|
+
loadMoreRetryCount: 0,
|
|
10
15
|
chipsNameSsoMap: {},
|
|
11
|
-
filterValuesFromFacetResponse: null,
|
|
12
|
-
pivotValues: null,
|
|
13
16
|
currentQuery: undefined,
|
|
14
17
|
};
|
|
15
18
|
const initalDispatchContext = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListFilterContext.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACH,0BAA0B,EAE1B,oBAAoB,EAGpB,eAAe,EACf,SAAS,EACZ,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"CaseListFilterContext.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EACH,0BAA0B,EAE1B,oBAAoB,EAGpB,eAAe,EACf,SAAS,EACZ,MAAM,yBAAyB,CAAC;AAIjC,QAAA,MAAM,qBAAqB,EAAE,eAG5B,CAAC;AAEF,QAAA,MAAM,eAAe,EAAE,SAGtB,CAAC;AAQF,eAAO,MAAM,sBAAsB,EAAE,oBAKpC,CAAC;AAIF,QAAA,MAAM,0BAA0B,qCAA8C,CAAC;AAC/E,QAAA,MAAM,6BAA6B,2CAAyE,CAAC;AAE7G,iBAAS,sBAAsB,CAAC,EAAE,QAAQ,EAAE;;CAAA,qBAO3C;AAED,OAAO,EACH,0BAA0B,EAC1B,6BAA6B,EAC7B,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,GAClB,CAAC"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { CaseSearchQueryType } from '../../enums/caseSearch';
|
|
3
3
|
import { caseListFilterReducer, initialFilterInfo, } from './CaseListFilterReducer';
|
|
4
|
+
const SMALL_SCREEN_THRESHOLD = 900;
|
|
4
5
|
const initialPaginationInfo = {
|
|
5
|
-
pageSize: 10,
|
|
6
|
+
pageSize: typeof window !== 'undefined' && window.innerHeight < SMALL_SCREEN_THRESHOLD ? 10 : 20,
|
|
6
7
|
currentPage: 1,
|
|
7
8
|
};
|
|
8
9
|
const initialSortInfo = {
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { SolrKeys, SolrPivotKeys } from '../../enums/filters';
|
|
2
2
|
import { ICaseListFilterState, IFilterInfo } from './CaseListFilterReducer';
|
|
3
|
-
declare
|
|
3
|
+
declare const hasAdvanceSearchDateRanges: (filterState: ICaseListFilterState) => boolean;
|
|
4
4
|
declare const isNoFilterApplied: (filterState: ICaseListFilterState) => boolean;
|
|
5
|
+
declare function isArrayHashMapEmpty(hashMap?: {}): boolean;
|
|
5
6
|
declare const isOnlyDefaultFilterApplied: (filterState: ICaseListFilterState) => boolean;
|
|
6
7
|
declare const isStatusFilterWithSFDCSupportedValues: ({ case_status }: Partial<IFilterInfo>) => boolean;
|
|
7
8
|
declare const isOnlyGroupFilterApplied: (filterInfo: Partial<IFilterInfo>) => boolean;
|
|
@@ -11,5 +12,5 @@ declare const eligibleSFDCFiltersWithLengthOne: (SolrKeys | SolrPivotKeys)[];
|
|
|
11
12
|
declare const eligibleSFDCFiltersMultipleValues: SolrKeys[];
|
|
12
13
|
declare const visibleFilterChipsWhenSolrDownSfdcUp: (SolrKeys | SolrPivotKeys)[];
|
|
13
14
|
declare function canDoSfdcSearch(filterState: ICaseListFilterState): boolean;
|
|
14
|
-
export { isNoFilterApplied, isOnlyDefaultFilterApplied, isOnlyGroupFilterApplied, isSearchSupportedBySFDC, isOnlyStatusFilter, isStatusFilterWithSFDCSupportedValues, canDoSfdcSearch, visibleFilterChipsWhenSolrDownSfdcUp, eligibleSFDCFiltersWithLengthOne, eligibleSFDCFiltersMultipleValues, isArrayHashMapEmpty, };
|
|
15
|
+
export { hasAdvanceSearchDateRanges, isNoFilterApplied, isOnlyDefaultFilterApplied, isOnlyGroupFilterApplied, isSearchSupportedBySFDC, isOnlyStatusFilter, isStatusFilterWithSFDCSupportedValues, canDoSfdcSearch, visibleFilterChipsWhenSolrDownSfdcUp, eligibleSFDCFiltersWithLengthOne, eligibleSFDCFiltersMultipleValues, isArrayHashMapEmpty, };
|
|
15
16
|
//# sourceMappingURL=CaseListFilterHelpers.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListFilterHelpers.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterHelpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,
|
|
1
|
+
{"version":3,"file":"CaseListFilterHelpers.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterHelpers.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAGH,oBAAoB,EACpB,WAAW,EAEd,MAAM,yBAAyB,CAAC;AAMjC,QAAA,MAAM,0BAA0B,GAAI,aAAa,oBAAoB,KAAG,OAWvE,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAI,aAAa,oBAAoB,YAE3D,CAAC;AAWF,iBAAS,mBAAmB,CAAC,OAAO,KAAK,WAExC;AAED,QAAA,MAAM,0BAA0B,GAAI,aAAa,oBAAoB,YAKpE,CAAC;AAEF,QAAA,MAAM,qCAAqC,GAAI,iBAAsB,OAAO,CAAC,WAAW,CAAC,YAGxF,CAAC;AAaF,QAAA,MAAM,wBAAwB,GAAI,YAAY,OAAO,CAAC,WAAW,CAAC,YAMjE,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,YAAY,OAAO,CAAC,WAAW,CAAC,YAG3D,CAAC;AAEF,QAAA,MAAM,uBAAuB,GAAI,aAAa,oBAAoB,YAOjE,CAAC;AAEF,QAAA,MAAM,gCAAgC,8BAAsE,CAAC;AAC7G,QAAA,MAAM,iCAAiC,YAAmB,CAAC;AAE3D,QAAA,MAAM,oCAAoC,8BAGzC,CAAC;AAIF,iBAAS,eAAe,CAAC,WAAW,EAAE,oBAAoB,WAiBzD;AAED,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,0BAA0B,EAC1B,wBAAwB,EACxB,uBAAuB,EACvB,kBAAkB,EAClB,qCAAqC,EACrC,eAAe,EACf,oCAAoC,EACpC,gCAAgC,EAChC,iCAAiC,EACjC,mBAAmB,GACtB,CAAC"}
|
|
@@ -14,7 +14,22 @@ import isEqual from 'lodash/isEqual';
|
|
|
14
14
|
import sortBy from 'lodash/sortBy';
|
|
15
15
|
import { CaseStatus } from '../../enums/case';
|
|
16
16
|
import { SolrKeys, SolrPivotKeys } from '../../enums/filters';
|
|
17
|
-
import { emptyFilters, initialFilterInfo } from './CaseListFilterReducer';
|
|
17
|
+
import { emptyFilters, initialFilterInfo, } from './CaseListFilterReducer';
|
|
18
|
+
function isDateRangeActive(range) {
|
|
19
|
+
return Boolean((range === null || range === void 0 ? void 0 : range.startDate) || (range === null || range === void 0 ? void 0 : range.endDate));
|
|
20
|
+
}
|
|
21
|
+
const hasAdvanceSearchDateRanges = (filterState) => {
|
|
22
|
+
const ranges = filterState.advanceSearchDateRanges;
|
|
23
|
+
if (!ranges) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return (isDateRangeActive(ranges.createdDateRange) ||
|
|
27
|
+
isDateRangeActive(ranges.lastModifiedDateRange) ||
|
|
28
|
+
isDateRangeActive(ranges.closedDateRange));
|
|
29
|
+
};
|
|
30
|
+
const isNoFilterApplied = (filterState) => {
|
|
31
|
+
return isEqual(filterState.filterInfo, emptyFilters) && !hasAdvanceSearchDateRanges(filterState);
|
|
32
|
+
};
|
|
18
33
|
function sortArrayHashMap(hashMap = {}) {
|
|
19
34
|
const sortedHashMap = Object.keys(hashMap).reduce((acc, currKey) => {
|
|
20
35
|
const rawVal = hashMap[currKey];
|
|
@@ -26,11 +41,9 @@ function sortArrayHashMap(hashMap = {}) {
|
|
|
26
41
|
function isArrayHashMapEmpty(hashMap = {}) {
|
|
27
42
|
return Object.entries(hashMap).every(([, val]) => (val || []).length < 1);
|
|
28
43
|
}
|
|
29
|
-
const isNoFilterApplied = (filterState) => {
|
|
30
|
-
return isEqual(filterState.filterInfo, emptyFilters);
|
|
31
|
-
};
|
|
32
44
|
const isOnlyDefaultFilterApplied = (filterState) => {
|
|
33
|
-
return isEqual(sortArrayHashMap(filterState.filterInfo), sortArrayHashMap(initialFilterInfo))
|
|
45
|
+
return (isEqual(sortArrayHashMap(filterState.filterInfo), sortArrayHashMap(initialFilterInfo)) &&
|
|
46
|
+
!hasAdvanceSearchDateRanges(filterState));
|
|
34
47
|
};
|
|
35
48
|
const isStatusFilterWithSFDCSupportedValues = ({ case_status = [] }) => {
|
|
36
49
|
const statusLength = case_status.length;
|
|
@@ -86,4 +99,4 @@ function canDoSfdcSearch(filterState) {
|
|
|
86
99
|
}
|
|
87
100
|
});
|
|
88
101
|
}
|
|
89
|
-
export { isNoFilterApplied, isOnlyDefaultFilterApplied, isOnlyGroupFilterApplied, isSearchSupportedBySFDC, isOnlyStatusFilter, isStatusFilterWithSFDCSupportedValues, canDoSfdcSearch, visibleFilterChipsWhenSolrDownSfdcUp, eligibleSFDCFiltersWithLengthOne, eligibleSFDCFiltersMultipleValues, isArrayHashMapEmpty, };
|
|
102
|
+
export { hasAdvanceSearchDateRanges, isNoFilterApplied, isOnlyDefaultFilterApplied, isOnlyGroupFilterApplied, isSearchSupportedBySFDC, isOnlyStatusFilter, isStatusFilterWithSFDCSupportedValues, canDoSfdcSearch, visibleFilterChipsWhenSolrDownSfdcUp, eligibleSFDCFiltersWithLengthOne, eligibleSFDCFiltersMultipleValues, isArrayHashMapEmpty, };
|