@rh-support/cases 2.6.227 → 2.6.229

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 +0 -7
  3. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  4. package/lib/esm/components/case-list/CaseList.js +368 -137
  5. package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
  6. package/lib/esm/components/case-list/CaseListContext.js +5 -2
  7. package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
  8. package/lib/esm/components/case-list/CaseListFilterContext.js +2 -1
  9. package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts +3 -2
  10. package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
  11. package/lib/esm/components/case-list/CaseListFilterHelpers.js +19 -6
  12. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +36 -4
  13. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
  14. package/lib/esm/components/case-list/CaseListFilterReducer.js +6 -12
  15. package/lib/esm/components/case-list/CaseListReducer.d.ts +22 -10
  16. package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
  17. package/lib/esm/components/case-list/CaseListReducer.js +25 -7
  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 +18 -11
  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 +6 -2
  22. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +3 -0
  23. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -0
  24. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +177 -0
  25. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +1 -7
  26. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
  27. package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +12 -16
  28. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +2 -5
  29. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
  30. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +14 -13
  31. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
  32. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +21 -14
  33. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
  34. package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +3 -0
  35. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +11 -1
  36. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
  37. package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +90 -70
  38. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +1 -3
  39. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
  40. package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +2 -2
  41. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +5 -4
  42. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
  43. package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +15 -54
  44. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +0 -3
  45. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
  46. package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +18 -44
  47. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +0 -3
  48. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
  49. package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +14 -44
  50. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +1 -3
  51. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
  52. package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +60 -59
  53. package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts +3 -0
  54. package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +1 -0
  55. package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +8 -0
  56. package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts +9 -0
  57. package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts.map +1 -0
  58. package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.js +105 -0
  59. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +8 -3
  60. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
  61. package/lib/esm/components/case-list/case-list-table/CaseListTable.js +87 -84
  62. package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts +33 -0
  63. package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts.map +1 -0
  64. package/lib/esm/components/case-list/case-list-table/CaseListTableRow.js +51 -0
  65. package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts +9 -0
  66. package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts.map +1 -0
  67. package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.js +10 -0
  68. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +0 -5
  69. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
  70. package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +51 -70
  71. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
  72. package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +5 -15
  73. package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +1 -1
  74. package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
  75. package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +2 -3
  76. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts.map +1 -1
  77. package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +1 -0
  78. package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts +8 -0
  79. package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts.map +1 -0
  80. package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.js +8 -0
  81. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
  82. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +1 -0
  83. package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
  84. package/lib/esm/components/case-list/case-search/CaseSearch.js +55 -24
  85. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts +10 -0
  86. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts.map +1 -0
  87. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.js +29 -0
  88. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts +10 -0
  89. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts.map +1 -0
  90. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.js +16 -0
  91. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts +9 -0
  92. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts.map +1 -0
  93. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.js +21 -0
  94. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts +12 -0
  95. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts.map +1 -0
  96. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.js +31 -0
  97. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts +10 -0
  98. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts.map +1 -0
  99. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.js +10 -0
  100. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts +10 -0
  101. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts.map +1 -0
  102. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.js +92 -0
  103. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts +9 -0
  104. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts.map +1 -0
  105. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.js +20 -0
  106. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts +9 -0
  107. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts.map +1 -0
  108. package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.js +28 -0
  109. package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts +9 -0
  110. package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts.map +1 -0
  111. package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.js +241 -0
  112. package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts +11 -0
  113. package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts.map +1 -0
  114. package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.js +23 -0
  115. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
  116. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +2 -1
  117. package/lib/esm/css/caseList.css +183 -22
  118. package/lib/esm/css/caseSearch.css +114 -0
  119. package/lib/esm/enums/case.d.ts +13 -5
  120. package/lib/esm/enums/case.d.ts.map +1 -1
  121. package/lib/esm/enums/case.js +23 -3
  122. package/lib/esm/enums/caseSearch.d.ts +3 -0
  123. package/lib/esm/enums/caseSearch.d.ts.map +1 -1
  124. package/lib/esm/enums/caseSearch.js +2 -1
  125. package/lib/esm/enums/filters.d.ts +3 -1
  126. package/lib/esm/enums/filters.d.ts.map +1 -1
  127. package/lib/esm/enums/filters.js +2 -0
  128. package/lib/esm/hooks/useCaseLabels.d.ts +14 -0
  129. package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -0
  130. package/lib/esm/hooks/useCaseLabels.js +56 -0
  131. package/lib/esm/hooks/useCloseCase.d.ts.map +1 -1
  132. package/lib/esm/hooks/useCloseCase.js +38 -21
  133. package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
  134. package/lib/esm/hooks/useExportCaseListCSV.js +1 -9
  135. package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
  136. package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
  137. package/lib/esm/hooks/useFilterStateOnLoad.js +7 -5
  138. package/lib/esm/index.js +1 -0
  139. package/lib/esm/models/caseList.d.ts +1 -0
  140. package/lib/esm/models/caseList.d.ts.map +1 -1
  141. package/lib/esm/test-utils/mockData.d.ts +1 -0
  142. package/lib/esm/test-utils/mockData.d.ts.map +1 -1
  143. package/lib/esm/test-utils/mockData.js +2 -1
  144. package/lib/esm/utils/advanceSearchFormMapper.d.ts +11 -0
  145. package/lib/esm/utils/advanceSearchFormMapper.d.ts.map +1 -0
  146. package/lib/esm/utils/advanceSearchFormMapper.js +71 -0
  147. package/lib/esm/utils/advanceSearchUtils.d.ts +24 -0
  148. package/lib/esm/utils/advanceSearchUtils.d.ts.map +1 -0
  149. package/lib/esm/utils/advanceSearchUtils.js +150 -0
  150. package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts +12 -0
  151. package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts.map +1 -0
  152. package/lib/esm/utils/caseGroupDefaultFilterUtils.js +34 -0
  153. package/lib/esm/utils/caseGroupDefaultUtils.d.ts +10 -0
  154. package/lib/esm/utils/caseGroupDefaultUtils.d.ts.map +1 -0
  155. package/lib/esm/utils/caseGroupDefaultUtils.js +20 -0
  156. package/lib/esm/utils/caseListGraphQLUtils.d.ts +28 -0
  157. package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -0
  158. package/lib/esm/utils/caseListGraphQLUtils.js +280 -0
  159. package/lib/esm/utils/caseListMapper.d.ts +6 -0
  160. package/lib/esm/utils/caseListMapper.d.ts.map +1 -0
  161. package/lib/esm/utils/caseListMapper.js +47 -0
  162. package/lib/esm/utils/caseListVariablesBuilder.d.ts +15 -0
  163. package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -0
  164. package/lib/esm/utils/caseListVariablesBuilder.js +526 -0
  165. package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
  166. package/lib/esm/utils/caseSearchUtils.js +39 -2
  167. package/lib/esm/utils/constants.d.ts +5 -1
  168. package/lib/esm/utils/constants.d.ts.map +1 -1
  169. package/lib/esm/utils/constants.js +10 -2
  170. package/lib/esm/utils/mockSolrResponse.js +1 -1
  171. package/package.json +10 -8
@@ -0,0 +1,56 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { useApolloClient } from '@apollo/client/react';
11
+ import { GET_CASE_LABELS, } from '@rh-support/utils';
12
+ import unescape from 'lodash/unescape';
13
+ import { useCallback, useEffect, useState } from 'react';
14
+ const mapCaseLabelNode = (node) => {
15
+ var _a, _b;
16
+ return ({
17
+ id: node.Id,
18
+ name: unescape((_b = (_a = node.Name) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : ''),
19
+ });
20
+ };
21
+ /** Fetches account-scoped case labels for the Case List Case labels filter. */
22
+ export function useCaseLabels(accountId) {
23
+ const client = useApolloClient();
24
+ const [labels, setLabels] = useState([]);
25
+ const [loading, setLoading] = useState(false);
26
+ const [error, setError] = useState(undefined);
27
+ const fetchLabels = useCallback(() => __awaiter(this, void 0, void 0, function* () {
28
+ var _a, _b, _c, _d;
29
+ if (!accountId) {
30
+ setLabels([]);
31
+ return;
32
+ }
33
+ setLoading(true);
34
+ setError(undefined);
35
+ try {
36
+ const { data } = yield client.query({
37
+ query: GET_CASE_LABELS,
38
+ variables: { where: { Account__c: { eq: accountId } } },
39
+ fetchPolicy: 'cache-first',
40
+ });
41
+ const edges = (_d = (_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.redhat_support_uiapi) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.RedHatSupportCaseLabel__c) === null || _c === void 0 ? void 0 : _c.edges) !== null && _d !== void 0 ? _d : [];
42
+ setLabels(edges.map(({ node }) => mapCaseLabelNode(node)).filter((label) => label.id && label.name));
43
+ }
44
+ catch (e) {
45
+ setError(e);
46
+ setLabels([]);
47
+ }
48
+ finally {
49
+ setLoading(false);
50
+ }
51
+ }), [accountId, client]);
52
+ useEffect(() => {
53
+ fetchLabels();
54
+ }, [fetchLabels]);
55
+ return { labels, loading, error, refetch: fetchLabels };
56
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"useCloseCase.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCloseCase.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB;;;;;;;;;;;;;EAoGrD"}
1
+ {"version":3,"file":"useCloseCase.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCloseCase.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,iBAAiB,IAAI,CAAC;AACnC,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CACpC;AAQD,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB;;;;;;;;;;;;;EAyHrD"}
@@ -7,10 +7,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { publicApi } from '@cee-eng/hydrajs';
11
- import { ToastNotification, useFetch } from '@rh-support/components';
10
+ import { useApolloClient } from '@apollo/client/react';
11
+ import { ToastNotification } from '@rh-support/components';
12
12
  import { useCanCreateCase } from '@rh-support/react-context';
13
- import { dtmTrackEventCaseStepEncountered } from '@rh-support/utils';
13
+ import { CREATE_CASE_COMMENT, dtmTrackEventCaseStepEncountered, sanitizeForSalesforce, updateCaseDetailsByGraphQL, } from '@rh-support/utils';
14
14
  import filter from 'lodash/filter';
15
15
  import find from 'lodash/find';
16
16
  import includes from 'lodash/includes';
@@ -21,8 +21,9 @@ const reflect = (p) => p.then((v) => ({ v, status: 'fulfilled' }), (e) => ({ e,
21
21
  export function useCloseCase(props) {
22
22
  const { caseList, selectedCases, onCasesCloseSuccess } = props;
23
23
  const { t } = useTranslation();
24
+ const apolloClient = useApolloClient();
24
25
  const maxCasesSelected = (selectedCases || []).length > MAX_ALLOWED_CASES;
25
- const { request, isFetching } = useFetch(publicApi.kase.updateCase);
26
+ const [isFetching, setIsFetching] = useState(false);
26
27
  const closedCaseIds = filter(selectedCases, (selected) => {
27
28
  const caseDetails = find(caseList, (caseObj) => caseObj['case_number'] === selected);
28
29
  return caseDetails && caseDetails['case_status'] !== 'Closed' ? false : true;
@@ -38,10 +39,7 @@ export function useCloseCase(props) {
38
39
  isFetching;
39
40
  const [isModalOpen, setIsModalOpen] = useState(false);
40
41
  const canCreateCase = useCanCreateCase();
41
- const { request: postCommentRequest, isFetching: isPostingComment } = useFetch(publicApi.kase.postComment, {
42
- propgateErrors: true,
43
- });
44
- // To handle button click
42
+ const [isPostingComment, setIsPostingComment] = useState(false);
45
43
  const onBtnClick = () => {
46
44
  if (canCreateCase.alert()) {
47
45
  return;
@@ -53,29 +51,48 @@ export function useCloseCase(props) {
53
51
  const onConfirm = (commentBody) => __awaiter(this, void 0, void 0, function* () {
54
52
  const promiseArr = [];
55
53
  setIsModalOpen(false);
54
+ setIsFetching(true);
56
55
  const toastId = ToastNotification.addSuccessMessage(t(`Closing selected cases`));
57
- filter(selectedCases, (selected) => !includes(closedCaseIds, selected)).forEach((caseNumber, i) => {
58
- const product = caseList[i].case_product[0];
59
- const version = caseList[i].case_version;
60
- const p = request(caseNumber, { status: 'Closed' });
56
+ const casesToClose = filter(selectedCases, (selected) => !includes(closedCaseIds, selected));
57
+ casesToClose.forEach((caseNumber) => {
58
+ const caseDetails = find(caseList, (caseObj) => caseObj.case_number === caseNumber);
59
+ if (!caseDetails)
60
+ return;
61
+ const salesforceCaseId = caseDetails.id;
62
+ const product = caseDetails.case_product[0];
63
+ const version = caseDetails.case_version;
64
+ const p = updateCaseDetailsByGraphQL(apolloClient, salesforceCaseId, { Status: 'Closed' });
61
65
  promiseArr.push(p);
62
- p.then((res) => __awaiter(this, void 0, void 0, function* () {
63
- yield postCommentRequest({
64
- caseNumber,
65
- commentBody,
66
- contentType: `markdown`,
67
- doNotChangeStatus: true,
68
- });
66
+ p.then(() => __awaiter(this, void 0, void 0, function* () {
67
+ if (commentBody) {
68
+ setIsPostingComment(true);
69
+ try {
70
+ yield apolloClient.mutate({
71
+ mutation: CREATE_CASE_COMMENT,
72
+ variables: {
73
+ commentInput: {
74
+ Case__c: salesforceCaseId,
75
+ Body__c: sanitizeForSalesforce(commentBody),
76
+ Visibility__c: 'Public',
77
+ IsAssociate__c: false,
78
+ },
79
+ },
80
+ });
81
+ }
82
+ finally {
83
+ setIsPostingComment(false);
84
+ }
85
+ }
69
86
  ToastNotification.clearToast(toastId);
70
87
  ToastNotification.addSuccessMessage(t('Case {{caseNumber}} successfully closed', { caseNumber }));
71
- // Only call dtm track event only when the case has been closed successfully.
72
88
  dtmTrackEventCaseStepEncountered('close', caseNumber, product, version);
73
- }), (err) => {
89
+ }), () => {
74
90
  ToastNotification.clearToast(toastId);
75
91
  ToastNotification.addDangerMessage(t('Could not close case {{caseNumber}}', { caseNumber }));
76
92
  });
77
93
  });
78
94
  yield Promise.all(promiseArr.map(reflect));
95
+ setIsFetching(false);
79
96
  onCasesCloseSuccess && onCasesCloseSuccess();
80
97
  });
81
98
  const onCancel = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"useExportCaseListCSV.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExportCaseListCSV.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,eAAO,MAAM,SAAS,OAAO,CAAC;AAC9B,MAAM,WAAW,qBAAqB;IAClC,uBAAuB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB;;;;;;EAqChE"}
1
+ {"version":3,"file":"useExportCaseListCSV.d.ts","sourceRoot":"","sources":["../../../src/hooks/useExportCaseListCSV.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,SAAS,OAAO,CAAC;AAC9B,MAAM,WAAW,qBAAqB;IAClC,uBAAuB,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC1D,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,qBAAqB;;;;;;EA+BhE"}
@@ -1,18 +1,12 @@
1
- import { useFetch } from '@rh-support/components';
2
1
  import { useState } from 'react';
3
2
  import { useTranslation } from 'react-i18next';
4
- import { getCaseListFromSolr } from '../utils/caseListUtils';
5
3
  export const MAX_LIMIT = 1000;
6
4
  export function useExportCaseListCSV(props) {
7
5
  const { isExportCsvDisabled, selectedCases } = props;
8
6
  const { t } = useTranslation();
9
- // const currentFilteredCaseCount = currentFilteredCaseList?.numFound ?? 0;
10
- const { isFetching } = useFetch(getCaseListFromSolr, { propgateErrors: true });
11
7
  const [openUpdateSeverityModal, setOpenUpdateSeverityModal] = useState(false);
12
- const isFetchingCSVData = isFetching;
13
8
  let showError = selectedCases.length > MAX_LIMIT;
14
- const isBtnDisabled = isFetchingCSVData || showError;
15
- // To show tooltip if export csv is disabled when SOLR is down
9
+ const isBtnDisabled = showError;
16
10
  const getTooltipContent = () => {
17
11
  let tooltipText = t('Your download will include the first 1000 cases in your list.');
18
12
  if (showError) {
@@ -23,9 +17,7 @@ export function useExportCaseListCSV(props) {
23
17
  }
24
18
  return tooltipText;
25
19
  };
26
- // To check if export csv button is disabled
27
20
  const isExportButtonDisabled = isBtnDisabled || isExportCsvDisabled;
28
- // To toggle download csv modal
29
21
  const toggleDownloadCSVModal = () => {
30
22
  setOpenUpdateSeverityModal((openUpdateSeverityModal) => !openUpdateSeverityModal);
31
23
  };
@@ -1,6 +1,6 @@
1
1
  import { CaseSearchQueryType } from '../enums/caseSearch';
2
2
  export declare function useFilterStateOnLoad(): {
3
- set: (queryFromUrl: string, pageSizeFromUrl: number, currentPageFromUrl: number, searchType: CaseSearchQueryType) => {
3
+ set: (queryFromUrl: string, pageSizeFromUrl: number | undefined, currentPageFromUrl: number, searchType: CaseSearchQueryType) => {
4
4
  initFilterState: any;
5
5
  defaultSearchName: string;
6
6
  };
@@ -1 +1 @@
1
- {"version":3,"file":"useFilterStateOnLoad.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFilterStateOnLoad.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK1D,wBAAgB,oBAAoB;wBAkBd,MAAM,mBACH,MAAM,sBACH,MAAM,cACd,mBAAmB;;;;EA+DtC"}
1
+ {"version":3,"file":"useFilterStateOnLoad.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFilterStateOnLoad.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAU1D,wBAAgB,oBAAoB;wBAkBd,MAAM,mBACH,MAAM,GAAG,SAAS,sBACf,MAAM,cACd,mBAAmB;;;;EAiEtC"}
@@ -4,6 +4,7 @@ import findKey from 'lodash/findKey';
4
4
  import { useContext, useMemo } from 'react';
5
5
  import { CaseListFilterStateContext, initialCaseFilterState } from '../components/case-list/CaseListFilterContext';
6
6
  import { SolrKeys } from '../enums/filters';
7
+ import { decodeCaseListUrlFilterQuery, getDefaultGroupFilterSelection, shouldApplyDefaultGroupFilter, } from '../utils/caseGroupDefaultFilterUtils';
7
8
  import { createFilterStateFromUrlQuery } from '../utils/caseSearchUtils';
8
9
  // TODO Comment
9
10
  export function useFilterStateOnLoad() {
@@ -12,14 +13,15 @@ export function useFilterStateOnLoad() {
12
13
  const savesSearches = find(hydraUserPreferences.data, (pref) => pref.key === UserPreferencesKeys.caseSavedSearchFilters);
13
14
  const savedSearchesObj = useMemo(() => ((savesSearches === null || savesSearches === void 0 ? void 0 : savesSearches.value) ? JSON.parse(savesSearches.value) : {}), [savesSearches]);
14
15
  const set = (queryFromUrl, pageSizeFromUrl, currentPageFromUrl, searchType) => {
16
+ var _a;
15
17
  let savedSearchFilterState = null;
16
18
  const defaultSavedSearchKey = findKey(savedSearchesObj, { defaultChecked: true });
17
19
  if (defaultSavedSearchKey) {
18
20
  const { filterState: filterStateSaved, queryString, type, sortState, } = savedSearchesObj[defaultSavedSearchKey];
19
21
  savedSearchFilterState = Object.assign(Object.assign({}, filterState), { sortInfo: sortState, filterQueryInfo: Object.assign(Object.assign({}, filterState.filterQueryInfo), { queryString, type }), filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), filterStateSaved) });
20
22
  }
21
- const defaultGroup = (caseGroups.data || []).find((group) => group.isDefault);
22
- const [urlQuery] = (queryFromUrl || '').split(/ orderBy /i);
23
+ const defaultGroupFilter = getDefaultGroupFilterSelection(caseGroups.data, (_a = globalMetadataState.loggedInUser) === null || _a === void 0 ? void 0 : _a.data);
24
+ const applyDefaultGroup = shouldApplyDefaultGroupFilter(queryFromUrl, hydraUserPreferences.data);
23
25
  /**
24
26
  When user lands on page for the first time:
25
27
  If we have any query in url(for example redirect from dashboard), we apply the query, if not
@@ -27,12 +29,12 @@ export function useFilterStateOnLoad() {
27
29
  check if user has default group the apply group filter,
28
30
  non of the above, we apply default search values
29
31
  */
30
- let defaultFilterState = urlQuery && urlQuery !== 'undefined'
32
+ let defaultFilterState = decodeCaseListUrlFilterQuery(queryFromUrl)
31
33
  ? createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, pageSizeFromUrl, currentPageFromUrl, searchType)
32
34
  : defaultSavedSearchKey
33
35
  ? savedSearchFilterState
34
- : !!(defaultGroup === null || defaultGroup === void 0 ? void 0 : defaultGroup.name)
35
- ? Object.assign(Object.assign({}, filterState), { filterInfo: Object.assign(Object.assign({}, filterState.filterInfo), { [SolrKeys.group]: [{ key: defaultGroup.groupNum, value: defaultGroup.name }] }) }) : filterState;
36
+ : applyDefaultGroup && defaultGroupFilter.length > 0
37
+ ? Object.assign(Object.assign({}, filterState), { filterInfo: Object.assign(Object.assign({}, filterState.filterInfo), { [SolrKeys.group]: defaultGroupFilter }) }) : filterState;
36
38
  return {
37
39
  initFilterState: defaultFilterState,
38
40
  defaultSearchName: defaultSavedSearchKey && !queryFromUrl ? defaultSavedSearchKey : '',
package/lib/esm/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  // test
2
2
  import './scss/index.scss';
3
3
  export { Cases } from './components';
4
+ // dummy change for publish
@@ -37,6 +37,7 @@ export interface ISolrCaseListResponse {
37
37
  uri: string;
38
38
  case_closedDate: string;
39
39
  case_alternate_id: string;
40
+ case_label?: string[];
40
41
  }
41
42
  export type ISolrCaseSearchResponse = ISolrResponse<ISolrCaseListResponse, IFacetCounts>;
42
43
  export type ICaseListResponse = ISolrCaseListResponse;
@@ -1 +1 @@
1
- {"version":3,"file":"caseList.d.ts","sourceRoot":"","sources":["../../../src/models/caseList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,WAAW,WAAW;IACxB,2BAA2B,EAAE,kBAAkB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACtD,KAAK,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,CAAC,EAAE,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,OAAO,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,4BAA4B,EAAE,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,CAAC"}
1
+ {"version":3,"file":"caseList.d.ts","sourceRoot":"","sources":["../../../src/models/caseList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,WAAW,WAAW;IACxB,2BAA2B,EAAE,kBAAkB,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,kBAAmB,SAAQ,cAAc;IACtD,KAAK,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,CAAC,EAAE,EAAE,CAAC;IAClB,aAAa,CAAC,EAAE,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,qBAAqB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,wBAAwB,EAAE,OAAO,CAAC;IAClC,0BAA0B,EAAE,MAAM,CAAC;IACnC,4BAA4B,EAAE,MAAM,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,MAAM,uBAAuB,GAAG,aAAa,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAEzF,MAAM,MAAM,iBAAiB,GAAG,qBAAqB,CAAC"}
@@ -64,6 +64,7 @@ export declare const mockCaseList: {
64
64
  uri: string;
65
65
  case_owner: string;
66
66
  case_closedDate: string;
67
+ case_label: string[];
67
68
  }[];
68
69
  };
69
70
  export declare const mockManagedAccounts: {
@@ -1 +1 @@
1
- {"version":3,"file":"mockData.d.ts","sourceRoot":"","sources":["../../../src/test-utils/mockData.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;GAI1B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;GAgBlC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;GA4BvC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;GAgBnC,CAAC;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;;CAExC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;CA2BxB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;GAS/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,GAG9B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5B,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;GA6GpB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;GA4B9B,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;CA+d7C,CAAC"}
1
+ {"version":3,"file":"mockData.d.ts","sourceRoot":"","sources":["../../../src/test-utils/mockData.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc;;;;;;;GAI1B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;GAgBlC,CAAC;AAEF,eAAO,MAAM,2BAA2B;;;;;;;;GA4BvC,CAAC;AAEF,eAAO,MAAM,uBAAuB;;;;;;;;GAgBnC,CAAC;AAEF,eAAO,MAAM,4BAA4B;;;;;;;;;;CAExC,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BxB,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;GAS/B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,GAG9B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5B,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;GA6GpB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;;;;;;;GA4B9B,CAAC;AAEF,eAAO,MAAM,iCAAiC;;;;;;;;;;;;;CA+d7C,CAAC"}
@@ -94,6 +94,7 @@ export const mockCaseList = {
94
94
  uri: 'https://api.access.qa.redhat.com/rs/cases/02428475',
95
95
  case_owner: 'New Case Queue',
96
96
  case_closedDate: '2019-11-10T11:46:19Z',
97
+ case_label: ['Priority', 'Billing'],
97
98
  },
98
99
  ],
99
100
  };
@@ -740,7 +741,7 @@ export const filterValuesFromFacetResponseMock = {
740
741
  count: 111,
741
742
  },
742
743
  {
743
- value: '3 (Normal)',
744
+ value: '3 (Medium)',
744
745
  count: 12198,
745
746
  },
746
747
  {
@@ -0,0 +1,11 @@
1
+ import { IAdvanceSearchDateRanges, IAdvanceSearchFormState, ICaseListFilterState, IFilterInfo } from '../components/case-list/CaseListFilterReducer';
2
+ import { CaseSearchQueryType } from '../enums/caseSearch';
3
+ export declare const hasAdvanceSearchActiveState: (filterState: ICaseListFilterState) => boolean;
4
+ export declare const deriveSearchQueryType: (filterState: ICaseListFilterState) => CaseSearchQueryType;
5
+ export declare const toNameOrSsoFilterValues: (value: string) => string[];
6
+ export declare const mapAdvanceSearchFormToFilterInfo: (formState: IAdvanceSearchFormState) => IFilterInfo;
7
+ export declare const mergeAdvanceSearchFormIntoFilterInfo: (formState: IAdvanceSearchFormState, currentFilterInfo?: Partial<IFilterInfo>) => IFilterInfo;
8
+ export declare const buildAdvanceSearchParsedQuery: (formState: IAdvanceSearchFormState, filterInfo: Partial<IFilterInfo>) => string;
9
+ export declare const mapAdvanceSearchFormToDateRanges: (formState: IAdvanceSearchFormState) => IAdvanceSearchDateRanges;
10
+ export declare const createCaseListFilterStateFromAdvanceSearchForm: (formState: IAdvanceSearchFormState, currentFilterState: ICaseListFilterState) => ICaseListFilterState;
11
+ //# sourceMappingURL=advanceSearchFormMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanceSearchFormMapper.d.ts","sourceRoot":"","sources":["../../../src/utils/advanceSearchFormMapper.ts"],"names":[],"mappings":"AAIA,OAAO,EAGH,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,WAAW,EACd,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK1D,eAAO,MAAM,2BAA2B,GAAI,aAAa,oBAAoB,KAAG,OACwB,CAAC;AAEzG,eAAO,MAAM,qBAAqB,GAAI,aAAa,oBAAoB,KAAG,mBAC6B,CAAC;AAIxG,eAAO,MAAM,uBAAuB,GAAI,OAAO,MAAM,KAAG,MAAM,EAc7D,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAAI,WAAW,uBAAuB,KAAG,WAsBrF,CAAC;AAEF,eAAO,MAAM,oCAAoC,GAC7C,WAAW,uBAAuB,EAClC,oBAAmB,OAAO,CAAC,WAAW,CAAM,KAC7C,WAoBF,CAAC;AAmBF,eAAO,MAAM,6BAA6B,GACtC,WAAW,uBAAuB,EAClC,YAAY,OAAO,CAAC,WAAW,CAAC,KACjC,MASF,CAAC;AAEF,eAAO,MAAM,gCAAgC,GAAI,WAAW,uBAAuB,KAAG,wBAIpF,CAAC;AAEH,eAAO,MAAM,8CAA8C,GACvD,WAAW,uBAAuB,EAClC,oBAAoB,oBAAoB,KACzC,oBA0BF,CAAC"}
@@ -0,0 +1,71 @@
1
+ import { toOldCaseTypeMapper } from '@rh-support/utils';
2
+ import { initialPaginationInfo } from '../components/case-list/CaseListFilterContext';
3
+ import { hasAdvanceSearchDateRanges } from '../components/case-list/CaseListFilterHelpers';
4
+ import { emptyFilters, } from '../components/case-list/CaseListFilterReducer';
5
+ import { CaseSearchQueryType } from '../enums/caseSearch';
6
+ import { SolrKeys, SolrPivotKeys } from '../enums/filters';
7
+ import { isAdvanceSearchFormEmpty } from './advanceSearchUtils';
8
+ import { createUserFriendlyQueryFromFilterStateAdvancedSearch } from './caseSearchUtils';
9
+ export const hasAdvanceSearchActiveState = (filterState) => { var _a, _b; return Boolean((_b = (_a = filterState.filterQueryInfo) === null || _a === void 0 ? void 0 : _a.parsedQuery) === null || _b === void 0 ? void 0 : _b.trim()) || hasAdvanceSearchDateRanges(filterState); };
10
+ export const deriveSearchQueryType = (filterState) => hasAdvanceSearchActiveState(filterState) ? CaseSearchQueryType.ADVANCED : CaseSearchQueryType.BASIC;
11
+ const splitSearchTokens = (value) => value.trim().split(/\s+/).filter(Boolean);
12
+ export const toNameOrSsoFilterValues = (value) => {
13
+ const trimmed = value.trim();
14
+ if (!trimmed) {
15
+ return [];
16
+ }
17
+ if (trimmed.includes(',')) {
18
+ return trimmed
19
+ .split(',')
20
+ .map((entry) => entry.trim())
21
+ .filter(Boolean);
22
+ }
23
+ return [trimmed];
24
+ };
25
+ export const mapAdvanceSearchFormToFilterInfo = (formState) => {
26
+ const escalation = formState.showEscalatedOnly ? [{ key: 'true', value: 'true' }] : [];
27
+ return Object.assign(Object.assign({}, emptyFilters), { [SolrPivotKeys.product_version]: formState.products.map((product) => (Object.assign(Object.assign({}, product), { [SolrKeys.version]: [...(product[SolrKeys.version] || [])] }))), [SolrKeys.status]: [...formState.statuses], [SolrKeys.severity]: [...formState.severities], [SolrKeys.type]: toOldCaseTypeMapper(formState.supportTypes), [SolrKeys.escalation]: escalation, [SolrKeys.accountNumber]: [...formState.accountNumbers], [SolrKeys.alternateId]: splitSearchTokens(formState.personalReferenceNumber), [SolrKeys.openshiftClusterId]: splitSearchTokens(formState.openshiftClusterId), [SolrKeys.caseContactSSO]: toNameOrSsoFilterValues(formState.ownerNameAndSso), [SolrKeys.caseOwner]: toNameOrSsoFilterValues(formState.assignedToNameAndSso), [SolrKeys.group]: [...formState.groups], [SolrKeys.createdBySsoUsername]: toNameOrSsoFilterValues(formState.createdByNameAndSso), [SolrKeys.modifiedBy]: toNameOrSsoFilterValues(formState.lastModifiedByNameAndSso) });
28
+ };
29
+ export const mergeAdvanceSearchFormIntoFilterInfo = (formState, currentFilterInfo = {}) => {
30
+ const advanceSearchValues = mapAdvanceSearchFormToFilterInfo(formState);
31
+ return Object.assign(Object.assign(Object.assign({}, emptyFilters), currentFilterInfo), { [SolrPivotKeys.product_version]: advanceSearchValues[SolrPivotKeys.product_version], [SolrKeys.status]: advanceSearchValues[SolrKeys.status], [SolrKeys.severity]: advanceSearchValues[SolrKeys.severity], [SolrKeys.type]: advanceSearchValues[SolrKeys.type], [SolrKeys.escalation]: advanceSearchValues[SolrKeys.escalation], [SolrKeys.accountNumber]: advanceSearchValues[SolrKeys.accountNumber], [SolrKeys.alternateId]: advanceSearchValues[SolrKeys.alternateId], [SolrKeys.openshiftClusterId]: advanceSearchValues[SolrKeys.openshiftClusterId], [SolrKeys.caseContactSSO]: advanceSearchValues[SolrKeys.caseContactSSO], [SolrKeys.caseOwner]: advanceSearchValues[SolrKeys.caseOwner], [SolrKeys.group]: advanceSearchValues[SolrKeys.group], [SolrKeys.createdBySsoUsername]: advanceSearchValues[SolrKeys.createdBySsoUsername], [SolrKeys.modifiedBy]: advanceSearchValues[SolrKeys.modifiedBy] });
32
+ };
33
+ const formatDateRangeParsedQuery = (fieldLabel, range) => {
34
+ const { startDate, endDate } = range;
35
+ if (!startDate && !endDate) {
36
+ return null;
37
+ }
38
+ if (startDate && endDate) {
39
+ return `${fieldLabel}: ${startDate} to ${endDate}`;
40
+ }
41
+ if (startDate) {
42
+ return `${fieldLabel}: >= ${startDate}`;
43
+ }
44
+ return `${fieldLabel}: <= ${endDate}`;
45
+ };
46
+ export const buildAdvanceSearchParsedQuery = (formState, filterInfo) => {
47
+ const filterQueryParts = [
48
+ createUserFriendlyQueryFromFilterStateAdvancedSearch(filterInfo, ''),
49
+ formatDateRangeParsedQuery('createdDate', formState.createdDateRange),
50
+ formatDateRangeParsedQuery('lastModifiedDate', formState.lastModifiedDateRange),
51
+ formatDateRangeParsedQuery('closedDate', formState.closedDateRange),
52
+ ].filter(Boolean);
53
+ return filterQueryParts.join(' and ');
54
+ };
55
+ export const mapAdvanceSearchFormToDateRanges = (formState) => ({
56
+ createdDateRange: Object.assign({}, formState.createdDateRange),
57
+ lastModifiedDateRange: Object.assign({}, formState.lastModifiedDateRange),
58
+ closedDateRange: Object.assign({}, formState.closedDateRange),
59
+ });
60
+ export const createCaseListFilterStateFromAdvanceSearchForm = (formState, currentFilterState) => {
61
+ var _a;
62
+ const filterInfo = mergeAdvanceSearchFormIntoFilterInfo(formState, currentFilterState.filterInfo);
63
+ const hasActiveAdvanceSearch = !isAdvanceSearchFormEmpty(formState);
64
+ const parsedQuery = hasActiveAdvanceSearch ? buildAdvanceSearchParsedQuery(formState, filterInfo) : '';
65
+ const nextFilterState = Object.assign(Object.assign({}, currentFilterState), { filterInfo, filterQueryInfo: {
66
+ queryString: ((_a = currentFilterState.filterQueryInfo) === null || _a === void 0 ? void 0 : _a.queryString) || '',
67
+ parsedQuery,
68
+ type: hasActiveAdvanceSearch ? CaseSearchQueryType.ADVANCED : CaseSearchQueryType.BASIC,
69
+ }, paginationInfo: Object.assign(Object.assign({}, (currentFilterState.paginationInfo || initialPaginationInfo)), { currentPage: 1 }), advanceSearchDateRanges: hasActiveAdvanceSearch ? mapAdvanceSearchFormToDateRanges(formState) : undefined });
70
+ return Object.assign(Object.assign({}, nextFilterState), { filterQueryInfo: Object.assign(Object.assign({}, nextFilterState.filterQueryInfo), { type: deriveSearchQueryType(nextFilterState) }) });
71
+ };
@@ -0,0 +1,24 @@
1
+ import { IAdvanceSearchDateRange, IAdvanceSearchFormState, ICaseListFilterState } from '../components/case-list/CaseListFilterReducer';
2
+ /** Matches PatternFly DatePicker yyyy-MM-dd parsing and rejects impossible dates (e.g. 2024-02-31). */
3
+ export declare const parseAdvanceSearchDate: (value: string) => Date | undefined;
4
+ export declare const isValidAdvanceSearchDateInput: (value: string) => boolean;
5
+ export declare const isAdvanceSearchDateRangeValid: (range: IAdvanceSearchDateRange) => boolean;
6
+ export declare const hasInvalidAdvanceSearchDates: (ranges: {
7
+ createdDateRange: IAdvanceSearchDateRange;
8
+ lastModifiedDateRange: IAdvanceSearchDateRange;
9
+ closedDateRange: IAdvanceSearchDateRange;
10
+ }) => boolean;
11
+ export interface IAdvanceSearchDateRangeFieldErrors {
12
+ startDate?: string;
13
+ endDate?: string;
14
+ }
15
+ export declare const getAdvanceSearchDateRangeFieldErrors: (range: IAdvanceSearchDateRange, messages: {
16
+ invalidDateFormat: string;
17
+ invalidDateRange: string;
18
+ }) => IAdvanceSearchDateRangeFieldErrors;
19
+ export declare const createInitialAdvanceSearchFormState: () => IAdvanceSearchFormState;
20
+ export declare const mapFilterStateToAdvanceSearchForm: (filterState: ICaseListFilterState) => IAdvanceSearchFormState;
21
+ export declare const isAdvanceSearchFormEmpty: (formState: IAdvanceSearchFormState) => boolean;
22
+ /** Counts total applied advanced-search filter values across all fields. */
23
+ export declare const getAdvanceSearchAppliedFilterCount: (filterState: ICaseListFilterState) => number;
24
+ //# sourceMappingURL=advanceSearchUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"advanceSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/advanceSearchUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAKvD,uGAAuG;AACvG,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,IAAI,GAAG,SAsB7D,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,OAAO,MAAM,KAAG,OACE,CAAC;AAEjE,eAAO,MAAM,6BAA6B,GAAI,OAAO,uBAAuB,KAAG,OAa9E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,QAAQ;IACjD,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,qBAAqB,EAAE,uBAAuB,CAAC;IAC/C,eAAe,EAAE,uBAAuB,CAAC;CAC5C,KAAG,OAGsD,CAAC;AAE3D,MAAM,WAAW,kCAAkC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,oCAAoC,GAC7C,OAAO,uBAAuB,EAC9B,UAAU;IACN,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC5B,KACF,kCAqBF,CAAC;AAOF,eAAO,MAAM,mCAAmC,QAAO,uBAiBrD,CAAC;AAEH,eAAO,MAAM,iCAAiC,GAAI,aAAa,oBAAoB,KAAG,uBA6BrF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,WAAW,uBAAuB,KAAG,OAG7E,CAAC;AAuBF,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,GAAI,aAAa,oBAAoB,KAAG,MA0BtF,CAAC"}
@@ -0,0 +1,150 @@
1
+ import { toNewCaseTypeMapper } from '@rh-support/utils';
2
+ import isEqual from 'lodash/isEqual';
3
+ import { SolrKeys, SolrPivotKeys } from '../enums/filters';
4
+ const YYYY_MM_DD_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
5
+ /** Matches PatternFly DatePicker yyyy-MM-dd parsing and rejects impossible dates (e.g. 2024-02-31). */
6
+ export const parseAdvanceSearchDate = (value) => {
7
+ const trimmed = value.trim();
8
+ if (!trimmed) {
9
+ return undefined;
10
+ }
11
+ if (!YYYY_MM_DD_PATTERN.test(trimmed)) {
12
+ return undefined;
13
+ }
14
+ const [year, month, day] = trimmed.split('-').map(Number);
15
+ const parsedDate = new Date(`${trimmed}T00:00:00`);
16
+ if (Number.isNaN(parsedDate.getTime())) {
17
+ return undefined;
18
+ }
19
+ if (parsedDate.getFullYear() !== year || parsedDate.getMonth() + 1 !== month || parsedDate.getDate() !== day) {
20
+ return undefined;
21
+ }
22
+ return parsedDate;
23
+ };
24
+ export const isValidAdvanceSearchDateInput = (value) => !value.trim() || parseAdvanceSearchDate(value) !== undefined;
25
+ export const isAdvanceSearchDateRangeValid = (range) => {
26
+ if (!isValidAdvanceSearchDateInput(range.startDate) || !isValidAdvanceSearchDateInput(range.endDate)) {
27
+ return false;
28
+ }
29
+ const startDate = parseAdvanceSearchDate(range.startDate);
30
+ const endDate = parseAdvanceSearchDate(range.endDate);
31
+ if (startDate && endDate && startDate > endDate) {
32
+ return false;
33
+ }
34
+ return true;
35
+ };
36
+ export const hasInvalidAdvanceSearchDates = (ranges) => !isAdvanceSearchDateRangeValid(ranges.createdDateRange) ||
37
+ !isAdvanceSearchDateRangeValid(ranges.lastModifiedDateRange) ||
38
+ !isAdvanceSearchDateRangeValid(ranges.closedDateRange);
39
+ export const getAdvanceSearchDateRangeFieldErrors = (range, messages) => {
40
+ const errors = {};
41
+ if (!isValidAdvanceSearchDateInput(range.startDate)) {
42
+ errors.startDate = messages.invalidDateFormat;
43
+ }
44
+ if (!isValidAdvanceSearchDateInput(range.endDate)) {
45
+ errors.endDate = messages.invalidDateFormat;
46
+ }
47
+ if (!errors.startDate && !errors.endDate) {
48
+ const startDate = parseAdvanceSearchDate(range.startDate);
49
+ const endDate = parseAdvanceSearchDate(range.endDate);
50
+ if (startDate && endDate && startDate > endDate) {
51
+ errors.endDate = messages.invalidDateRange;
52
+ }
53
+ }
54
+ return errors;
55
+ };
56
+ const emptyDateRange = () => ({
57
+ startDate: '',
58
+ endDate: '',
59
+ });
60
+ export const createInitialAdvanceSearchFormState = () => ({
61
+ statuses: [],
62
+ severities: [],
63
+ supportTypes: [],
64
+ showEscalatedOnly: false,
65
+ accountNumbers: [],
66
+ personalReferenceNumber: '',
67
+ openshiftClusterId: '',
68
+ ownerNameAndSso: '',
69
+ assignedToNameAndSso: '',
70
+ groups: [],
71
+ createdByNameAndSso: '',
72
+ lastModifiedByNameAndSso: '',
73
+ createdDateRange: emptyDateRange(),
74
+ lastModifiedDateRange: emptyDateRange(),
75
+ closedDateRange: emptyDateRange(),
76
+ products: [],
77
+ });
78
+ export const mapFilterStateToAdvanceSearchForm = (filterState) => {
79
+ var _a, _b, _c;
80
+ const { filterInfo } = filterState;
81
+ if (!filterInfo) {
82
+ return createInitialAdvanceSearchFormState();
83
+ }
84
+ const escalationValues = filterInfo[SolrKeys.escalation] || [];
85
+ return {
86
+ statuses: [...(filterInfo[SolrKeys.status] || [])],
87
+ severities: [...(filterInfo[SolrKeys.severity] || [])],
88
+ supportTypes: toNewCaseTypeMapper(filterInfo[SolrKeys.type] || []),
89
+ showEscalatedOnly: escalationValues.some((item) => item.key === 'true'),
90
+ accountNumbers: [...(filterInfo[SolrKeys.accountNumber] || [])],
91
+ personalReferenceNumber: (filterInfo[SolrKeys.alternateId] || []).join(' '),
92
+ openshiftClusterId: (filterInfo[SolrKeys.openshiftClusterId] || []).join(' '),
93
+ ownerNameAndSso: (filterInfo[SolrKeys.caseContactSSO] || []).join(', '),
94
+ assignedToNameAndSso: (filterInfo[SolrKeys.caseOwner] || []).join(', '),
95
+ groups: [...(filterInfo[SolrKeys.group] || [])],
96
+ createdByNameAndSso: (filterInfo[SolrKeys.createdBySsoUsername] || []).join(', '),
97
+ lastModifiedByNameAndSso: (filterInfo[SolrKeys.modifiedBy] || []).join(', '),
98
+ createdDateRange: Object.assign({}, (((_a = filterState.advanceSearchDateRanges) === null || _a === void 0 ? void 0 : _a.createdDateRange) || emptyDateRange())),
99
+ lastModifiedDateRange: Object.assign({}, (((_b = filterState.advanceSearchDateRanges) === null || _b === void 0 ? void 0 : _b.lastModifiedDateRange) || emptyDateRange())),
100
+ closedDateRange: Object.assign({}, (((_c = filterState.advanceSearchDateRanges) === null || _c === void 0 ? void 0 : _c.closedDateRange) || emptyDateRange())),
101
+ products: (filterInfo[SolrPivotKeys.product_version] || []).map((product) => (Object.assign(Object.assign({}, product), { [SolrKeys.version]: [...(product[SolrKeys.version] || [])] }))),
102
+ };
103
+ };
104
+ export const isAdvanceSearchFormEmpty = (formState) => {
105
+ const initialState = createInitialAdvanceSearchFormState();
106
+ return isEqual(formState, initialState);
107
+ };
108
+ const countDateRangeValues = (range) => {
109
+ if (!range) {
110
+ return 0;
111
+ }
112
+ let count = 0;
113
+ if (range.startDate.trim()) {
114
+ count++;
115
+ }
116
+ if (range.endDate.trim()) {
117
+ count++;
118
+ }
119
+ return count;
120
+ };
121
+ const countProductFilterValues = (products) => products.reduce((total, product) => {
122
+ const versions = product[SolrKeys.version] || [];
123
+ return total + (versions.length > 0 ? versions.length : 1);
124
+ }, 0);
125
+ /** Counts total applied advanced-search filter values across all fields. */
126
+ export const getAdvanceSearchAppliedFilterCount = (filterState) => {
127
+ const { filterInfo, advanceSearchDateRanges } = filterState;
128
+ if (!filterInfo) {
129
+ return 0;
130
+ }
131
+ let count = 0;
132
+ count += (filterInfo[SolrKeys.status] || []).length;
133
+ count += (filterInfo[SolrKeys.severity] || []).length;
134
+ count += (filterInfo[SolrKeys.type] || []).length;
135
+ count += (filterInfo[SolrKeys.escalation] || []).length;
136
+ count += (filterInfo[SolrKeys.accountNumber] || []).length;
137
+ count += (filterInfo[SolrKeys.alternateId] || []).length;
138
+ count += (filterInfo[SolrKeys.openshiftClusterId] || []).length;
139
+ count += (filterInfo[SolrKeys.caseContactSSO] || []).length;
140
+ count += (filterInfo[SolrKeys.caseOwner] || []).length;
141
+ count += (filterInfo[SolrKeys.group] || []).length;
142
+ count += (filterInfo[SolrKeys.caseLabel] || []).length;
143
+ count += (filterInfo[SolrKeys.createdBySsoUsername] || []).length;
144
+ count += (filterInfo[SolrKeys.modifiedBy] || []).length;
145
+ count += countProductFilterValues(filterInfo[SolrPivotKeys.product_version] || []);
146
+ count += countDateRangeValues(advanceSearchDateRanges === null || advanceSearchDateRanges === void 0 ? void 0 : advanceSearchDateRanges.createdDateRange);
147
+ count += countDateRangeValues(advanceSearchDateRanges === null || advanceSearchDateRanges === void 0 ? void 0 : advanceSearchDateRanges.lastModifiedDateRange);
148
+ count += countDateRangeValues(advanceSearchDateRanges === null || advanceSearchDateRanges === void 0 ? void 0 : advanceSearchDateRanges.closedDateRange);
149
+ return count;
150
+ };
@@ -0,0 +1,12 @@
1
+ import { ICaseGroup } from '@cee-eng/hydrajs/@types/api/public/caseGroups';
2
+ import { IPreference } from '@cee-eng/hydrajs/@types/models/general';
3
+ import type { ILoggedInSsoContact } from '@rh-support/utils';
4
+ export declare function decodeCaseListUrlFilterQuery(queryFromUrl?: string): string;
5
+ export declare function hasDefaultSavedSearch(hydraUserPreferences?: IPreference[]): boolean;
6
+ /** Default group filter applies only when URL and saved-search do not own the filter state. */
7
+ export declare function shouldApplyDefaultGroupFilter(queryFromUrl?: string, hydraUserPreferences?: IPreference[]): boolean;
8
+ export declare function getDefaultGroupFilterSelection(caseGroups: ICaseGroup[] | undefined, loggedInUser?: ILoggedInSsoContact): Array<{
9
+ key: string;
10
+ value: string;
11
+ }>;
12
+ //# sourceMappingURL=caseGroupDefaultFilterUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caseGroupDefaultFilterUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseGroupDefaultFilterUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AAErE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAM7D,wBAAgB,4BAA4B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAa1E;AAED,wBAAgB,qBAAqB,CAAC,oBAAoB,GAAE,WAAW,EAAO,GAAG,OAAO,CAOvF;AAED,+FAA+F;AAC/F,wBAAgB,6BAA6B,CACzC,YAAY,CAAC,EAAE,MAAM,EACrB,oBAAoB,GAAE,WAAW,EAAO,GACzC,OAAO,CAMT;AAED,wBAAgB,8BAA8B,CAC1C,UAAU,EAAE,UAAU,EAAE,GAAG,SAAS,EACpC,YAAY,CAAC,EAAE,mBAAmB,GACnC,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAGvC"}