@rh-support/cases 2.6.173 → 2.6.181

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.
Files changed (79) hide show
  1. package/lib/esm/components/case-list/CaseList.d.ts +0 -7
  2. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  3. package/lib/esm/components/case-list/CaseList.js +143 -108
  4. package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
  5. package/lib/esm/components/case-list/CaseListContext.js +5 -2
  6. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +6 -4
  7. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
  8. package/lib/esm/components/case-list/CaseListFilterReducer.js +3 -12
  9. package/lib/esm/components/case-list/CaseListReducer.d.ts +22 -10
  10. package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
  11. package/lib/esm/components/case-list/CaseListReducer.js +25 -7
  12. package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts.map +1 -1
  13. package/lib/esm/components/case-list/case-list-filters/AccountsFilter.js +18 -11
  14. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
  15. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +4 -2
  16. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +1 -7
  17. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
  18. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +7 -15
  19. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +2 -5
  20. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
  21. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +14 -14
  22. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +1 -3
  23. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
  24. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +2 -2
  25. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +5 -4
  26. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
  27. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +15 -54
  28. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +0 -3
  29. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
  30. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +18 -44
  31. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +0 -3
  32. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
  33. package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +14 -44
  34. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +1 -3
  35. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
  36. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +61 -32
  37. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +7 -3
  38. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
  39. package/lib/esm/components/case-list/case-list-table/CaseListTable.js +69 -58
  40. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +0 -5
  41. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
  42. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +38 -68
  43. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
  44. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +5 -15
  45. package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +1 -1
  46. package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
  47. package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +2 -3
  48. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
  49. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +1 -0
  50. package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
  51. package/lib/esm/components/case-list/case-search/CaseSearch.js +6 -6
  52. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
  53. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +2 -1
  54. package/lib/esm/css/caseList.css +99 -22
  55. package/lib/esm/enums/case.d.ts +2 -1
  56. package/lib/esm/enums/case.d.ts.map +1 -1
  57. package/lib/esm/enums/case.js +14 -1
  58. package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
  59. package/lib/esm/hooks/useExportCaseListCSV.js +1 -9
  60. package/lib/esm/test-utils/mockData.js +1 -1
  61. package/lib/esm/utils/caseListGraphQLUtils.d.ts +28 -0
  62. package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -0
  63. package/lib/esm/utils/caseListGraphQLUtils.js +244 -0
  64. package/lib/esm/utils/caseListMapper.d.ts +6 -0
  65. package/lib/esm/utils/caseListMapper.d.ts.map +1 -0
  66. package/lib/esm/utils/caseListMapper.js +36 -0
  67. package/lib/esm/utils/caseListVariablesBuilder.d.ts +14 -0
  68. package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -0
  69. package/lib/esm/utils/caseListVariablesBuilder.js +193 -0
  70. package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
  71. package/lib/esm/utils/caseSearchUtils.js +26 -1
  72. package/lib/esm/utils/constants.d.ts +2 -1
  73. package/lib/esm/utils/constants.d.ts.map +1 -1
  74. package/lib/esm/utils/constants.js +14 -3
  75. package/lib/esm/utils/mockSolrResponse.js +1 -1
  76. package/lib/esm/utils/statusUtils.d.ts +3 -0
  77. package/lib/esm/utils/statusUtils.d.ts.map +1 -0
  78. package/lib/esm/utils/statusUtils.js +22 -0
  79. package/package.json +6 -5
@@ -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;AA6BlC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAKH,0BAA0B,EAI7B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,KAAkD,MAAM,OAAO,CAAC;AAEvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAK1C,OAAO,EAAgB,WAAW,EAA2B,MAAM,uBAAuB,CAAC;AAmC3F,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC3D,YAAY,EAAE,cAAc,EAAE,CAAC;CAClC;AAED,MAAM,MAAM,YAAY,GAAG,0BAA0B,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAM5F,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,qBAygBrC"}
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;AAgC1C,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,qBA0gBrC"}
@@ -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, 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, pendoTrackEvent, solrResponseToFacetFields, solrResponseToPivotFields, } from '@rh-support/utils';
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 { getCaseList } from '../../utils/caseListUtils';
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,20 +33,21 @@ 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, initialCaseFilterState, } from './CaseListFilterContext';
38
- import { eligibleSFDCFiltersMultipleValues, isNoFilterApplied, isOnlyDefaultFilterApplied, } from './CaseListFilterHelpers';
36
+ import { CaseListFilterDispatchContext, CaseListFilterStateContext } from './CaseListFilterContext';
37
+ import { isNoFilterApplied, isOnlyDefaultFilterApplied } from './CaseListFilterHelpers';
39
38
  import { updateFilterState } from './CaseListFilterReducer';
40
- import { setCaseList, setCurrentQuery, setFilterValuesFromFacetResponse, setIsFetching, setPivotValues, } from './CaseListReducer';
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, pivotValues, isFetching, filterValuesFromFacetResponse, currentQuery } = useCaseListStateContext();
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];
@@ -55,6 +55,7 @@ export function CaseList(props) {
55
55
  const currentPageFromUrl = parseInt(searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM]);
56
56
  const searchType = searchParams[FILTER_URL_QUERY_TYPE];
57
57
  const abortControllerRef = useRef(undefined);
58
+ const lastPushedQueryRef = useRef('');
58
59
  const isXLScreen = breakPoint.xl;
59
60
  const isFirstMount = useRef(true);
60
61
  const filterSectionRef = useRef(null);
@@ -63,71 +64,83 @@ export function CaseList(props) {
63
64
  const forceUpdate = useForceUpdate();
64
65
  const isCaseListFilterPanelExanded = userPreferences.data.isCaseListFilterPanelExanded;
65
66
  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
67
  const [hasError, setHasError] = useState(null);
71
- const [isSolrSearchDown, setSolrSearchDown] = useState(false);
72
68
  const [defaultSavedSearchName, setDefaultSavedSearchName] = useState('');
73
69
  const [RHCDValue, setRHCDValue] = useState('');
74
70
  const [isRHCDAlertShown, setIsRHCDAlertShown] = useState(true);
71
+ const loadMoreTriggeredRef = useRef(false);
72
+ const { ref: sentinelRef, inView } = useInView({ rootMargin: '100px' });
73
+ useEffect(() => {
74
+ if (!inView) {
75
+ loadMoreTriggeredRef.current = false;
76
+ return;
77
+ }
78
+ if (inView && hasNextPage && !isLoadingMore && !loadMoreError && !loadMoreTriggeredRef.current) {
79
+ loadMoreTriggeredRef.current = true;
80
+ loadMore();
81
+ }
82
+ // eslint-disable-next-line react-hooks/exhaustive-deps
83
+ }, [inView, hasNextPage, isLoadingMore, loadMoreError]);
75
84
  function getCases(currentFilterState) {
76
85
  return __awaiter(this, void 0, void 0, function* () {
77
- let showError;
86
+ var _a;
78
87
  try {
79
- setIsFetching(CaseListDispatch, true);
80
- setHasError(false);
81
- if (abortControllerRef.current !== undefined) {
82
- // Cancel the previous request
88
+ if (abortControllerRef.current) {
83
89
  abortControllerRef.current.abort();
84
90
  }
85
- // recreate a new AbortController for each call
86
- let controller = new AbortController();
91
+ const controller = new AbortController();
87
92
  abortControllerRef.current = controller;
88
- const { caseListResponse, isSolrSearchDownSFDCUp, showErrorMessage } = yield getCaseList(currentFilterState, loggedInUserRights.data, loggedInUsersAccount.data, controller.signal);
89
- showError = showErrorMessage;
90
- setSolrSearchDown(isSolrSearchDownSFDCUp);
91
- setFilterValuesFromFacetResponse(CaseListDispatch, solrResponseToFacetFields(caseListResponse));
92
- setPivotValues(CaseListDispatch, solrResponseToPivotFields(caseListResponse));
93
- setCaseList(CaseListDispatch, caseListResponse.response);
93
+ setIsFetching(CaseListDispatch, true);
94
+ setHasError(false);
95
+ const result = yield getCaseListFromGraphQL(currentFilterState, apolloClient, undefined, controller.signal);
96
+ if (controller.signal.aborted) {
97
+ return;
98
+ }
99
+ setCaseList(CaseListDispatch, result.caseListResponse.response);
100
+ setCursorInfo(CaseListDispatch, result.hasNextPage, result.endCursor);
94
101
  setIsFetching(CaseListDispatch, false);
102
+ if (result.showErrorMessage) {
103
+ setHasError(true);
104
+ ToastNotification.addDangerMessage(t('There was an error loading case data. Please try again.'));
105
+ }
95
106
  }
96
107
  catch (err) {
97
- const isAbortError = err.message && err.message.toLowerCase().indexOf('abort') > -1;
98
- if (!isAbortError) {
99
- setIsFetching(CaseListDispatch, false);
100
- setHasError(true);
101
- showError && ToastNotification.addXHRErrorMessage(err);
108
+ 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'))) {
109
+ return;
102
110
  }
111
+ setIsFetching(CaseListDispatch, false);
112
+ setHasError(true);
113
+ ToastNotification.addXHRErrorMessage(err);
114
+ }
115
+ });
116
+ }
117
+ function loadMore() {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ if (isLoadingMore || !hasNextPage || !endCursor || loadMoreError)
120
+ return;
121
+ setIsLoadingMore(CaseListDispatch, true);
122
+ try {
123
+ const result = yield loadMoreCases(filterState, apolloClient, endCursor);
124
+ setLoadMoreError(CaseListDispatch, false, 0);
125
+ appendCaseList(CaseListDispatch, result.docs, result.hasNextPage, result.endCursor);
126
+ }
127
+ catch (err) {
128
+ const nextRetryCount = loadMoreRetryCount + 1;
129
+ setLoadMoreError(CaseListDispatch, true, nextRetryCount);
130
+ console.error('[CaseList] loadMore error:', err);
103
131
  }
104
132
  });
105
133
  }
134
+ function retryLoadMore() {
135
+ loadMoreTriggeredRef.current = false;
136
+ setLoadMoreError(CaseListDispatch, false, loadMoreRetryCount);
137
+ }
106
138
  const toggleFilterSection = (isExpanded) => {
107
139
  if (!filterSectionRef.current)
108
140
  return;
109
141
  filterSectionRef.current.expanded = isExpanded;
110
142
  forceUpdate();
111
143
  };
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
144
  const onToggleFilterBtnClick = () => {
132
145
  var _a, _b;
133
146
  toggleFilterSection(!((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded));
@@ -137,8 +150,7 @@ export function CaseList(props) {
137
150
  };
138
151
  const checkNewCases = () => __awaiter(this, void 0, void 0, function* () {
139
152
  try {
140
- const { caseListResponse, isSolrSearchDownSFDCUp } = yield getCaseList(filterState, loggedInUserRights.data, loggedInUsersAccount.data, null);
141
- setSolrSearchDown(isSolrSearchDownSFDCUp);
153
+ const { caseListResponse } = yield getCaseListFromGraphQL(filterState, apolloClient);
142
154
  let changed = false;
143
155
  if (caseListResponse.response.numFound <= filterState.paginationInfo.pageSize &&
144
156
  caseListResponse.response.numFound !== caseList.numFound) {
@@ -180,67 +192,83 @@ export function CaseList(props) {
180
192
  }
181
193
  }, [caseGroups, dispatchToGlobalMetadataReducer, loggedInUserJwtToken, loggedInUsersAccount.data]);
182
194
  useEffect(() => {
183
- if (haventLoadedMetadata(allCaseTypes)) {
184
- fetchCaseTypes(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
185
- }
186
- // when solr is down, we use hydra metadata api to populated filter dropdowns
187
- if (isSolrSearchDown) {
195
+ const loadMetadata = () => __awaiter(this, void 0, void 0, function* () {
196
+ if (haventLoadedMetadata(caseRecordTypes)) {
197
+ yield fetchCaseRecordTypes(dispatchToGlobalMetadataReducer, apolloClient);
198
+ }
199
+ if (haventLoadedMetadata(allCaseTypes)) {
200
+ fetchCaseTypes(dispatchToGlobalMetadataReducer, apolloClient);
201
+ }
188
202
  if (haventLoadedMetadata(allCaseSeverities)) {
189
- fetchCaseSeverities(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
203
+ fetchCaseSeverities(dispatchToGlobalMetadataReducer, apolloClient);
190
204
  }
191
205
  if (haventLoadedMetadata(allCaseStatuses)) {
192
- fetchAllStatuses(dispatchToGlobalMetadataReducer, loggedInUsersAccount.data.secureSupport);
206
+ fetchAllStatuses(dispatchToGlobalMetadataReducer, apolloClient);
193
207
  }
194
208
  if (haventLoadedProductsMetadata(allProducts)) {
195
- fetchProducts(dispatchToGlobalMetadataReducer);
209
+ fetchProducts(dispatchToGlobalMetadataReducer, apolloClient);
196
210
  }
197
- // on sfdc fields that only one value is allowed, set filter to first item
198
- const sfdcFilterState = mapValues(filterState.filterInfo, (value, key) => {
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
- }
211
+ });
212
+ loadMetadata();
209
213
  // eslint-disable-next-line react-hooks/exhaustive-deps
210
214
  }, [
211
215
  allCaseTypes,
212
216
  allCaseSeverities,
213
217
  allCaseStatuses,
214
218
  allProducts,
219
+ caseRecordTypes,
215
220
  dispatchToGlobalMetadataReducer,
216
- loggedInUsersAccount.data.secureSupport,
217
- isSolrSearchDown,
221
+ apolloClient,
218
222
  ]);
223
+ function saveFilterQueryInUserPreferences() {
224
+ if (isNoFilterApplied(filterState))
225
+ return;
226
+ const type = filterState.filterQueryInfo.type;
227
+ const recentSearch = {
228
+ filterState: type === CaseSearchQueryType.BASIC ? filterState.filterInfo : {},
229
+ sortState: filterState.sortInfo,
230
+ queryString: type === CaseSearchQueryType.BASIC
231
+ ? filterState.filterQueryInfo.queryString
232
+ : filterState.filterQueryInfo.parsedQuery,
233
+ type,
234
+ };
235
+ try {
236
+ updateUserPreferences(dispatchToGlobalMetadataReducer, loggedInUserRights.data.getSSOUsername(), [{ key: UserPreferencesKeys.mostRecentSearch, value: JSON.stringify(recentSearch) }], 'add');
237
+ }
238
+ catch (e) {
239
+ console.error('Could not save filter query in user preferences');
240
+ }
241
+ }
219
242
  // effect to update url query and call get case api whenever filter state changes
220
243
  useEffect(() => {
221
- var _a, _b, _c;
244
+ var _a, _b, _c, _d, _e, _f, _g;
222
245
  if (!isFirstMount.current) {
223
246
  const urlQuery = (isNoFilterApplied(filterState) || isOnlyDefaultFilterApplied(filterState)) &&
224
247
  !((_a = filterState.filterQueryInfo) === null || _a === void 0 ? void 0 : _a.queryString) &&
225
248
  !filterState.sortInfo.column
226
249
  ? ''
227
250
  : createURLQueryFromFilterState(filterState);
251
+ 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}`;
252
+ const fullQueryKey = `${urlQuery}_${paginationKey}`;
253
+ if (fullQueryKey === lastPushedQueryRef.current) {
254
+ return;
255
+ }
256
+ const prevQueryKey = lastPushedQueryRef.current;
257
+ const prevBaseQuery = prevQueryKey.substring(0, prevQueryKey.lastIndexOf('_p'));
258
+ const prevPageSize = (_d = prevQueryKey.match(/_s(\d+)$/)) === null || _d === void 0 ? void 0 : _d[1];
259
+ if (urlQuery !== prevBaseQuery || String((_e = filterState.paginationInfo) === null || _e === void 0 ? void 0 : _e.pageSize) !== prevPageSize) {
260
+ clearPageCursors();
261
+ }
228
262
  setCurrentQuery(CaseListDispatch, urlQuery);
263
+ lastPushedQueryRef.current = fullQueryKey;
229
264
  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();
265
+ searchParams[FILTER_URL_CURRENT_PAGE_SEARCH_PARAM] = (_f = filterState.paginationInfo) === null || _f === void 0 ? void 0 : _f.currentPage.toString();
266
+ searchParams[FILTER_URL_PAGE_SIZE_SEARCH_PARAM] = (_g = filterState.paginationInfo) === null || _g === void 0 ? void 0 : _g.pageSize.toString();
232
267
  searchParams[FILTER_URL_QUERY_TYPE] = filterState.filterQueryInfo.type;
233
268
  props.routeProps.history.push({
234
269
  search: getStringifiedParams(searchParams),
235
270
  });
236
271
  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
272
  getCases(filterState);
245
273
  }
246
274
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -250,11 +278,13 @@ export function CaseList(props) {
250
278
  if (bookmarkedAccounts.isFetching ||
251
279
  managedAccounts.isFetching ||
252
280
  caseGroups.isFetching ||
253
- caseGroups.data === undefined)
281
+ caseGroups.data === undefined ||
282
+ caseRecordTypes.isFetching ||
283
+ isEmpty(caseRecordTypes.data))
254
284
  return;
255
285
  // when user manually changes url and hit enter, new result is fetched without refreshing the page
256
286
  if (!isFirstMount.current) {
257
- if (queryFromUrl !== currentQuery) {
287
+ if (queryFromUrl !== currentQuery && queryFromUrl !== lastPushedQueryRef.current) {
258
288
  const filterStateFromQueryUrl = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, pageSizeFromUrl, currentPageFromUrl, searchType);
259
289
  updateFilterState(filterDispatch, filterStateFromQueryUrl);
260
290
  }
@@ -283,7 +313,12 @@ export function CaseList(props) {
283
313
  setRHCDValue(searchParams.rhcd);
284
314
  }
285
315
  // set filter state based on url or default saved search
286
- const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodeURIComponent(queryFromUrl), pageSizeFromUrl, currentPageFromUrl, searchType);
316
+ // Remove when we get OFFSET field from SCT
317
+ // Always reset to page 1 on fresh load — cursor-based pagination
318
+ // has no stored cursors after refresh, so page > 1 would cause a mismatch
319
+ const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodeURIComponent(queryFromUrl), pageSizeFromUrl,
320
+ // currentPageFromUrl,
321
+ 1, searchType);
287
322
  // to set default saved search name
288
323
  setDefaultSavedSearchName(defaultSearchName);
289
324
  // set default params when they are empty
@@ -296,14 +331,20 @@ export function CaseList(props) {
296
331
  updateFilterState(filterDispatch, initFilterState);
297
332
  }
298
333
  // eslint-disable-next-line react-hooks/exhaustive-deps
299
- }, [managedAccounts, bookmarkedAccounts, caseGroups, queryFromUrl, pageSizeFromUrl, currentPageFromUrl]);
300
- // effect to initially set the filter state to expanded and when we switch from advanced to basic mode
334
+ }, [
335
+ managedAccounts,
336
+ bookmarkedAccounts,
337
+ caseGroups,
338
+ caseRecordTypes,
339
+ queryFromUrl,
340
+ pageSizeFromUrl,
341
+ currentPageFromUrl,
342
+ ]);
343
+ // effect to initially set the filter state to expanded on load
301
344
  useEffect(() => {
302
- // currently there is no easy way to set the panel as expanded on initial load
303
- // also we only use the standalone panel and manually change the panel state on toggle btn click
304
- isCaseListFilterPanelExanded && isXLScreen && isBasicSearchMode && toggleFilterSection(true);
345
+ isCaseListFilterPanelExanded && isXLScreen && toggleFilterSection(true);
305
346
  // eslint-disable-next-line react-hooks/exhaustive-deps
306
- }, [isBasicSearchMode]);
347
+ }, []);
307
348
  const onConfirmTraditionalSupportAgreement = () => {
308
349
  updateCaseListTraditionalSupportAgreed(globalDispatchContext, true);
309
350
  };
@@ -329,12 +370,6 @@ export function CaseList(props) {
329
370
  return (React.createElement(React.Fragment, null,
330
371
  React.createElement(CSSUserModal, { onConfirmTraditionalSupportAgreement: onConfirmTraditionalSupportAgreement, display: !caseListTraditionalSupportAgreed }),
331
372
  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
373
  React.createElement("section", { className: "case-search-top" },
339
374
  !isEmpty(RHCDValue) && isRHCDAlertShown && React.createElement("div", { className: "push-bottom" }, displayRHCDAlert()),
340
375
  React.createElement("div", { className: "search-wrapper" },
@@ -342,17 +377,17 @@ export function CaseList(props) {
342
377
  React.createElement(NewCaseButton, { routeProps: props.routeProps })),
343
378
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading case search input') } },
344
379
  React.createElement(CaseSearch, { defaultSavedSearchName: defaultSavedSearchName }))),
345
- isBasicSearchMode && (React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
346
- React.createElement(CaseListFilterChips, { productVersionPivotValues: get(pivotValues, SolrPivotKeys.product_version, []), isSolrSearchDown: isSolrSearchDown })))),
380
+ React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
381
+ React.createElement(CaseListFilterChips, null))),
347
382
  React.createElement("section", { className: "case-search-bottom" },
348
- isBasicSearchMode && (React.createElement("aside", { className: `case-search-filters ${((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded) ? '' : 'collapsed'}` },
383
+ React.createElement("aside", { className: `case-search-filters ${((_a = filterSectionRef.current) === null || _a === void 0 ? void 0 : _a.expanded) ? '' : 'collapsed'}` },
349
384
  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
385
  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
386
  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
387
  React.createElement("div", { className: "filter-wrapper" },
353
388
  React.createElement("pfe-collapse-panel", { id: "case-filters-panel", "pfe-animation": "false", ref: filterSectionRef },
354
389
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filters') } },
355
- React.createElement(CaseListFilters, { filterValues: filterValuesFromFacetResponse, allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts, isSolrSearchDown: isSolrSearchDown })))))),
390
+ React.createElement(CaseListFilters, { allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts }))))),
356
391
  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, paginationInfo: filterState.paginationInfo, isCaseListPageLoading: isFetching, hasError: hasError, isSolrDown: isSolrSearchDown }))))));
392
+ 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
393
  }
@@ -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,cAWlC,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"}
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;
@@ -6,7 +6,6 @@ declare enum CaseListReducerEnum {
6
6
  updateFilter = "UPDATE_FILTER",
7
7
  updateFilters = "UPDATE_FILTERS",
8
8
  updateSort = "UPDATE_SORT",
9
- updatePagination = "UPDATE_PAGINATION",
10
9
  updateFilterQuery = "UPDATE_FILTER_QUERY",
11
10
  removeFilter = "REMOVE_FILTER",
12
11
  clearFilters = "CLEAR_FILTERS",
@@ -26,8 +25,12 @@ export interface IFilterQueryInfo {
26
25
  type: CaseSearchQueryType;
27
26
  parsedQuery?: string;
28
27
  }
28
+ export interface IVersionFilterValue extends IFieldValue {
29
+ productId?: string;
30
+ }
29
31
  export interface IProductFilter extends IFieldValue {
30
- [SolrKeys.version]: IFieldValue[];
32
+ [SolrKeys.version]: IVersionFilterValue[];
33
+ productId?: string;
31
34
  }
32
35
  export interface IFilterInfo {
33
36
  [SolrPivotKeys.product_version]: IProductFilter[];
@@ -57,7 +60,6 @@ type IActionType = IAction<CaseListReducerEnum, ICaseListFilterState>;
57
60
  export type CaseListFilterDispatchType = (value: IActionType) => void;
58
61
  declare const caseListFilterReducer: (pState: ICaseListFilterState, action: any) => ICaseListFilterState;
59
62
  declare function updateSort(dispatch: CaseListFilterDispatchType, sortInfo: ISortInfo): void;
60
- declare function updatePagination(dispatch: CaseListFilterDispatchType, paginationInfo: IPaginationInfo): void;
61
63
  declare function updateFilter(dispatch: CaseListFilterDispatchType, { filterKey, values }: {
62
64
  filterKey: any;
63
65
  values: any;
@@ -71,5 +73,5 @@ declare const clearFilters: (dispatch: any, clearQueryString?: boolean) => void;
71
73
  declare function resetFilterToDefaultState(dispatch: any): void;
72
74
  declare function updateFilterQuery(dispatch: CaseListFilterDispatchType, filterQueryInfo: IFilterQueryInfo): void;
73
75
  declare function updateFilterState(dispatch: CaseListFilterDispatchType, newState: Partial<ICaseListFilterState>): void;
74
- export { updateSort, updatePagination, updateFilter, updateFilters, updateFilterQuery, removeFilterItem, clearFilters, updateFilterState, caseListFilterReducer, resetFilterToDefaultState, };
76
+ export { updateSort, updateFilter, updateFilters, updateFilterQuery, removeFilterItem, clearFilters, updateFilterState, caseListFilterReducer, resetFilterToDefaultState, };
75
77
  //# sourceMappingURL=CaseListFilterReducer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CaseListFilterReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterReducer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CaseListFilterReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterReducer.tsx"],"names":[],"mappings":"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"}
@@ -18,7 +18,6 @@ var CaseListReducerEnum;
18
18
  CaseListReducerEnum["updateFilter"] = "UPDATE_FILTER";
19
19
  CaseListReducerEnum["updateFilters"] = "UPDATE_FILTERS";
20
20
  CaseListReducerEnum["updateSort"] = "UPDATE_SORT";
21
- CaseListReducerEnum["updatePagination"] = "UPDATE_PAGINATION";
22
21
  CaseListReducerEnum["updateFilterQuery"] = "UPDATE_FILTER_QUERY";
23
22
  CaseListReducerEnum["removeFilter"] = "REMOVE_FILTER";
24
23
  CaseListReducerEnum["clearFilters"] = "CLEAR_FILTERS";
@@ -54,10 +53,8 @@ const caseListFilterReducer = (pState, action) => {
54
53
  return Object.assign(Object.assign({}, pState), { filterInfo: newFilters, paginationInfo: newPaginationInfo });
55
54
  }
56
55
  case CaseListReducerEnum.updateSort: {
57
- return Object.assign(Object.assign({}, pState), { sortInfo: action.payload.sortInfo });
58
- }
59
- case CaseListReducerEnum.updatePagination: {
60
- return Object.assign(Object.assign({}, pState), { paginationInfo: action.payload.paginationInfo });
56
+ const newPaginationInfo = Object.assign(Object.assign({}, pState.paginationInfo), { currentPage: 1 });
57
+ return Object.assign(Object.assign({}, pState), { sortInfo: action.payload.sortInfo, paginationInfo: newPaginationInfo });
61
58
  }
62
59
  case CaseListReducerEnum.removeFilter: {
63
60
  const newValues = pState.filterInfo[action.payload.filterKey].filter((item) => {
@@ -89,12 +86,6 @@ function updateSort(dispatch, sortInfo) {
89
86
  payload: { sortInfo },
90
87
  });
91
88
  }
92
- function updatePagination(dispatch, paginationInfo) {
93
- dispatch({
94
- type: CaseListReducerEnum.updatePagination,
95
- payload: { paginationInfo },
96
- });
97
- }
98
89
  function updateFilter(dispatch, { filterKey, values }) {
99
90
  dispatch({
100
91
  type: CaseListReducerEnum.updateFilter,
@@ -141,4 +132,4 @@ function updateFilterState(dispatch, newState) {
141
132
  payload: newState,
142
133
  });
143
134
  }
144
- export { updateSort, updatePagination, updateFilter, updateFilters, updateFilterQuery, removeFilterItem, clearFilters, updateFilterState, caseListFilterReducer, resetFilterToDefaultState, };
135
+ export { updateSort, updateFilter, updateFilters, updateFilterQuery, removeFilterItem, clearFilters, updateFilterState, caseListFilterReducer, resetFilterToDefaultState, };
@@ -1,13 +1,14 @@
1
1
  import { IAction, ISolrResponse } from '@rh-support/types/shared';
2
- import { ISolrResponseToFacetFields, ISolrResponseToPivotFields } from '@rh-support/utils';
3
- import { ICaseListResponse, IFacetFields, IFacetPivot } from '../../models/caseList';
4
- import { IPivotValues, IProductVersionPivotMap } from './CaseList';
2
+ import { ICaseListResponse } from '../../models/caseList';
5
3
  export interface ICaseListState {
6
4
  caseList: ISolrResponse<ICaseListResponse>;
7
5
  isFetching: boolean;
6
+ isLoadingMore: boolean;
7
+ hasNextPage: boolean;
8
+ endCursor: string | undefined;
9
+ loadMoreError: boolean;
10
+ loadMoreRetryCount: number;
8
11
  chipsNameSsoMap?: IChipsNameSsoMap;
9
- filterValuesFromFacetResponse: ISolrResponseToFacetFields<IFacetFields>;
10
- pivotValues: ISolrResponseToPivotFields<IFacetPivot, IProductVersionPivotMap>;
11
12
  currentQuery: string;
12
13
  }
13
14
  export interface IChipsNameSso {
@@ -21,16 +22,27 @@ export interface IChipsNameSsoMap {
21
22
  [sso: string]: IChipsNameSso;
22
23
  }
23
24
  declare enum CaseListReducerEnum {
24
- updateState = "SET_STATE"
25
+ updateState = "SET_STATE",
26
+ appendDocs = "APPEND_DOCS"
25
27
  }
26
- type IActionType = IAction<CaseListReducerEnum, ICaseListState>;
28
+ interface IAppendDocsPayload {
29
+ docs: ICaseListResponse[];
30
+ hasNextPage: boolean;
31
+ endCursor: string | undefined;
32
+ }
33
+ type IActionType = IAction<CaseListReducerEnum, ICaseListState> | {
34
+ type: CaseListReducerEnum.appendDocs;
35
+ payload: IAppendDocsPayload;
36
+ };
27
37
  export type CaseListDispatchType = (value: IActionType) => void;
28
38
  declare const caseListReducer: (state: ICaseListState, action: IActionType) => ICaseListState;
29
39
  declare const setCaseList: (dispatch: CaseListDispatchType, caseList: ISolrResponse<ICaseListResponse>) => void;
30
40
  declare const setChipsNameSsoMap: (dispatch: CaseListDispatchType, chipsNameSsoMap: IChipsNameSsoMap) => void;
31
41
  declare const setIsFetching: (dispatch: CaseListDispatchType, isFetching: boolean) => void;
32
- declare const setFilterValuesFromFacetResponse: (dispatch: CaseListDispatchType, filterValuesFromFacetResponse: ISolrResponseToFacetFields<IFacetFields>) => void;
33
- declare const setPivotValues: (dispatch: CaseListDispatchType, pivotValues: IPivotValues) => void;
34
42
  declare const setCurrentQuery: (dispatch: CaseListDispatchType, currentQuery: string) => void;
35
- export { caseListReducer, setCaseList, setChipsNameSsoMap, setIsFetching, setFilterValuesFromFacetResponse, setPivotValues, setCurrentQuery, };
43
+ declare const setIsLoadingMore: (dispatch: CaseListDispatchType, isLoadingMore: boolean) => void;
44
+ declare const appendCaseList: (dispatch: CaseListDispatchType, docs: ICaseListResponse[], hasNextPage: boolean, endCursor: string | undefined) => void;
45
+ declare const setCursorInfo: (dispatch: CaseListDispatchType, hasNextPage: boolean, endCursor: string | undefined) => void;
46
+ declare const setLoadMoreError: (dispatch: CaseListDispatchType, loadMoreError: boolean, loadMoreRetryCount: number) => void;
47
+ export { caseListReducer, setCaseList, setChipsNameSsoMap, setIsFetching, setCurrentQuery, setIsLoadingMore, appendCaseList, setCursorInfo, setLoadMoreError, };
36
48
  //# sourceMappingURL=CaseListReducer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CaseListReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListReducer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE3F,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,6BAA6B,EAAE,0BAA0B,CAAC,YAAY,CAAC,CAAC;IACxE,WAAW,EAAE,0BAA0B,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;IAC9E,YAAY,EAAE,MAAM,CAAC;CACxB;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,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,aAAK,mBAAmB;IACpB,WAAW,cAAc;CAC5B;AAED,KAAK,WAAW,GAAG,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC,CAAC;AAChE,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEhE,QAAA,MAAM,eAAe,GAAI,OAAO,cAAc,EAAE,QAAQ,WAAW,KAAG,cAMrE,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,UAAU,oBAAoB,EAAE,UAAU,aAAa,CAAC,iBAAiB,CAAC,SAK9F,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,UAAU,oBAAoB,EAAE,iBAAiB,gBAAgB,SAK5F,CAAC;AACF,QAAA,MAAM,aAAa,GAAI,UAAU,oBAAoB,EAAE,YAAY,OAAO,SAKzE,CAAC;AACF,QAAA,MAAM,gCAAgC,GAClC,UAAU,oBAAoB,EAC9B,+BAA+B,0BAA0B,CAAC,YAAY,CAAC,SAM1E,CAAC;AACF,QAAA,MAAM,cAAc,GAAI,UAAU,oBAAoB,EAAE,aAAa,YAAY,SAKhF,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,UAAU,oBAAoB,EAAE,cAAc,MAAM,SAK5E,CAAC;AAEF,OAAO,EACH,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,gCAAgC,EAChC,cAAc,EACd,eAAe,GAClB,CAAC"}
1
+ {"version":3,"file":"CaseListReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListReducer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC3B,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3C,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;CACxB;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,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,aAAK,mBAAmB;IACpB,WAAW,cAAc;IACzB,UAAU,gBAAgB;CAC7B;AAED,UAAU,kBAAkB;IACxB,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,KAAK,WAAW,GACV,OAAO,CAAC,mBAAmB,EAAE,cAAc,CAAC,GAC5C;IAAE,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAC5E,MAAM,MAAM,oBAAoB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAEhE,QAAA,MAAM,eAAe,GAAI,OAAO,cAAc,EAAE,QAAQ,WAAW,KAAG,cAmBrE,CAAC;AAEF,QAAA,MAAM,WAAW,GAAI,UAAU,oBAAoB,EAAE,UAAU,aAAa,CAAC,iBAAiB,CAAC,SAK9F,CAAC;AAEF,QAAA,MAAM,kBAAkB,GAAI,UAAU,oBAAoB,EAAE,iBAAiB,gBAAgB,SAK5F,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,UAAU,oBAAoB,EAAE,YAAY,OAAO,SAKzE,CAAC;AAEF,QAAA,MAAM,eAAe,GAAI,UAAU,oBAAoB,EAAE,cAAc,MAAM,SAK5E,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,UAAU,oBAAoB,EAAE,eAAe,OAAO,SAK/E,CAAC;AAEF,QAAA,MAAM,cAAc,GAChB,UAAU,oBAAoB,EAC9B,MAAM,iBAAiB,EAAE,EACzB,aAAa,OAAO,EACpB,WAAW,MAAM,GAAG,SAAS,SAMhC,CAAC;AAEF,QAAA,MAAM,aAAa,GAAI,UAAU,oBAAoB,EAAE,aAAa,OAAO,EAAE,WAAW,MAAM,GAAG,SAAS,SAKzG,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAAI,UAAU,oBAAoB,EAAE,eAAe,OAAO,EAAE,oBAAoB,MAAM,SAK3G,CAAC;AAEF,OAAO,EACH,eAAe,EACf,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,GACnB,CAAC"}