@rh-support/cases 2.6.186 → 2.6.187

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