@rh-support/cases 2.6.233 → 2.6.235

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