@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.
- package/lib/esm/components/case/NewCaseButton.js +1 -1
- package/lib/esm/components/case-list/CaseList.d.ts +0 -7
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +368 -137
- package/lib/esm/components/case-list/CaseListContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListContext.js +5 -2
- package/lib/esm/components/case-list/CaseListFilterContext.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterContext.js +2 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts +3 -2
- package/lib/esm/components/case-list/CaseListFilterHelpers.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterHelpers.js +19 -6
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +36 -4
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +6 -12
- package/lib/esm/components/case-list/CaseListReducer.d.ts +22 -10
- package/lib/esm/components/case-list/CaseListReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListReducer.js +25 -7
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AccountsFilter.js +18 -11
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +6 -2
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +177 -0
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts +1 -7
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilterChips.js +12 -16
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts +2 -5
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +14 -13
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilter.js +21 -14
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CreatorSsoNameFilterChip.js +3 -0
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts +11 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/GroupsFilter.js +90 -70
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts +1 -3
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductFilterChip.js +2 -2
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts +5 -4
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/ProductsFilter.js +15 -54
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/SeverityFilter.js +18 -44
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts +0 -3
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +14 -44
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts +1 -3
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/VersionsFilter.js +60 -59
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +8 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts +9 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListLabelGroup.js +105 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +8 -3
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTable.js +87 -84
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts +33 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableRow.js +51 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts +9 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-table/CaseListTableSkeletonRow.js +10 -0
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts +0 -5
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/DownloadCSVFileModal.js +51 -70
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/ExportCaseListCSV.js +5 -15
- package/lib/esm/components/case-list/case-list-table/SeverityLabel.js +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/TableActionsDropdown.js +2 -3
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/table-column-selector/TableColumnSelector.js +1 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts +8 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearchToggleButton.js +8 -0
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +1 -0
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +55 -24
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAccountSection.js +29 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchAuditsSection.js +16 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchCaseSection.js +21 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts +12 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchDateRangeField.js +31 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchFieldBlock.js +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts +10 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchModal.js +92 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchOwnerSection.js +20 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/AdvanceSearchProductSection.js +28 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts +9 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/ProductVersionDrilldownSelect.js +241 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts +11 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-search/advance-search-modal/SelectableLabelFilter.js +23 -0
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +2 -1
- package/lib/esm/css/caseList.css +183 -22
- package/lib/esm/css/caseSearch.css +114 -0
- package/lib/esm/enums/case.d.ts +13 -5
- package/lib/esm/enums/case.d.ts.map +1 -1
- package/lib/esm/enums/case.js +23 -3
- package/lib/esm/enums/caseSearch.d.ts +3 -0
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +2 -1
- package/lib/esm/enums/filters.d.ts +3 -1
- package/lib/esm/enums/filters.d.ts.map +1 -1
- package/lib/esm/enums/filters.js +2 -0
- package/lib/esm/hooks/useCaseLabels.d.ts +14 -0
- package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -0
- package/lib/esm/hooks/useCaseLabels.js +56 -0
- package/lib/esm/hooks/useCloseCase.d.ts.map +1 -1
- package/lib/esm/hooks/useCloseCase.js +38 -21
- package/lib/esm/hooks/useExportCaseListCSV.d.ts.map +1 -1
- package/lib/esm/hooks/useExportCaseListCSV.js +1 -9
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.js +7 -5
- package/lib/esm/index.js +1 -0
- package/lib/esm/models/caseList.d.ts +1 -0
- package/lib/esm/models/caseList.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.d.ts +1 -0
- package/lib/esm/test-utils/mockData.d.ts.map +1 -1
- package/lib/esm/test-utils/mockData.js +2 -1
- package/lib/esm/utils/advanceSearchFormMapper.d.ts +11 -0
- package/lib/esm/utils/advanceSearchFormMapper.d.ts.map +1 -0
- package/lib/esm/utils/advanceSearchFormMapper.js +71 -0
- package/lib/esm/utils/advanceSearchUtils.d.ts +24 -0
- package/lib/esm/utils/advanceSearchUtils.d.ts.map +1 -0
- package/lib/esm/utils/advanceSearchUtils.js +150 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts +12 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseGroupDefaultFilterUtils.js +34 -0
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts +10 -0
- package/lib/esm/utils/caseGroupDefaultUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseGroupDefaultUtils.js +20 -0
- package/lib/esm/utils/caseListGraphQLUtils.d.ts +28 -0
- package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -0
- package/lib/esm/utils/caseListGraphQLUtils.js +280 -0
- package/lib/esm/utils/caseListMapper.d.ts +6 -0
- package/lib/esm/utils/caseListMapper.d.ts.map +1 -0
- package/lib/esm/utils/caseListMapper.js +47 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +15 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -0
- package/lib/esm/utils/caseListVariablesBuilder.js +526 -0
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +39 -2
- package/lib/esm/utils/constants.d.ts +5 -1
- package/lib/esm/utils/constants.d.ts.map +1 -1
- package/lib/esm/utils/constants.js +10 -2
- package/lib/esm/utils/mockSolrResponse.js +1 -1
- package/package.json +10 -8
|
@@ -0,0 +1,526 @@
|
|
|
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 { buildAccessRestrictionExclusionFilter, expandStatusGroupsToApiValues, GET_CASE_GROUPS, GET_CASE_NUMBERS_BY_CASE_LABEL, GET_CONTACT_BY_SSO, GET_GROUP_IDS_BY_NAME, GET_USER_IDS_BY_FEDERATION, getTechnicalSupportRecordTypeId, } from '@rh-support/utils';
|
|
11
|
+
import { CaseListColumnIds, caseListSortColumnIdsToGraphQLMap } from '../enums/case';
|
|
12
|
+
import { CaseSearchQueryType } from '../enums/caseSearch';
|
|
13
|
+
import { SolrKeys, SolrPivotKeys } from '../enums/filters';
|
|
14
|
+
import { parseAdvanceSearchDate } from './advanceSearchUtils';
|
|
15
|
+
export function getOwnerFederationIdsToResolve(filterState) {
|
|
16
|
+
const { filterInfo } = filterState;
|
|
17
|
+
if (!filterInfo)
|
|
18
|
+
return [];
|
|
19
|
+
const ownerSso = filterInfo[SolrKeys.caseOwner];
|
|
20
|
+
return [...new Set((ownerSso || []).filter(Boolean))];
|
|
21
|
+
}
|
|
22
|
+
function buildOrderByFromSortInfo(sortInfo) {
|
|
23
|
+
var _a;
|
|
24
|
+
if (!(sortInfo === null || sortInfo === void 0 ? void 0 : sortInfo.column))
|
|
25
|
+
return { LastModifiedDate: { order: 'DESC' } };
|
|
26
|
+
const order = ((_a = sortInfo.direction) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || 'DESC';
|
|
27
|
+
if (sortInfo.column === CaseListColumnIds.group) {
|
|
28
|
+
return { Group__r: { Name: { order } } };
|
|
29
|
+
}
|
|
30
|
+
const gqlField = caseListSortColumnIdsToGraphQLMap[sortInfo.column];
|
|
31
|
+
if (!gqlField)
|
|
32
|
+
return { LastModifiedDate: { order: 'DESC' } };
|
|
33
|
+
return { [gqlField]: { order } };
|
|
34
|
+
}
|
|
35
|
+
function flattenAccountNumbers(accountFilters) {
|
|
36
|
+
const numbers = [];
|
|
37
|
+
accountFilters.forEach((item) => {
|
|
38
|
+
if (Array.isArray(item.key)) {
|
|
39
|
+
numbers.push(...item.key);
|
|
40
|
+
}
|
|
41
|
+
else if (item.key) {
|
|
42
|
+
numbers.push(item.key);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
return [...new Set(numbers)];
|
|
46
|
+
}
|
|
47
|
+
function buildStatusFilter(statuses) {
|
|
48
|
+
if (!(statuses === null || statuses === void 0 ? void 0 : statuses.length))
|
|
49
|
+
return undefined;
|
|
50
|
+
const expandedStatuses = expandStatusGroupsToApiValues(statuses);
|
|
51
|
+
return { Status: { in: expandedStatuses } };
|
|
52
|
+
}
|
|
53
|
+
function buildProductFilter(products) {
|
|
54
|
+
const conditions = [];
|
|
55
|
+
const parentProductIds = [];
|
|
56
|
+
const childProductIds = [];
|
|
57
|
+
products.forEach((product) => {
|
|
58
|
+
const versions = product[SolrKeys.version];
|
|
59
|
+
if (versions === null || versions === void 0 ? void 0 : versions.length) {
|
|
60
|
+
let hasVersionIds = false;
|
|
61
|
+
versions.forEach((version) => {
|
|
62
|
+
if (version.productId) {
|
|
63
|
+
childProductIds.push(version.productId);
|
|
64
|
+
hasVersionIds = true;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
if (!hasVersionIds && product.productId) {
|
|
68
|
+
parentProductIds.push(product.productId);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else if (product.productId) {
|
|
72
|
+
parentProductIds.push(product.productId);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
if (childProductIds.length) {
|
|
76
|
+
conditions.push({ ProductId: { in: childProductIds } });
|
|
77
|
+
}
|
|
78
|
+
if (parentProductIds.length) {
|
|
79
|
+
conditions.push({ Product: { ParentProduct__c: { in: parentProductIds } } });
|
|
80
|
+
}
|
|
81
|
+
return conditions;
|
|
82
|
+
}
|
|
83
|
+
const SALESFORCE_ID_PATTERN = /^[a-zA-Z0-9]{15}([a-zA-Z0-9]{3})?$/;
|
|
84
|
+
function buildGroupFilter(groupIds) {
|
|
85
|
+
const validIds = groupIds.filter((id) => {
|
|
86
|
+
if (SALESFORCE_ID_PATTERN.test(id))
|
|
87
|
+
return true;
|
|
88
|
+
console.warn(`[GraphQL] Dropping invalid Group__c filter value "${id}" — expected a Salesforce record ID`);
|
|
89
|
+
return false;
|
|
90
|
+
});
|
|
91
|
+
if (!validIds.length)
|
|
92
|
+
return undefined;
|
|
93
|
+
if (validIds.length === 1) {
|
|
94
|
+
return { Group__c: { eq: validIds[0] } };
|
|
95
|
+
}
|
|
96
|
+
return { Group__c: { in: validIds } };
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Fetches the Salesforce record ID for a group by its name.
|
|
100
|
+
* Used when stale saved searches or bookmarks store old numeric group numbers
|
|
101
|
+
* that predate the GraphQL migration — the group name is used to look up the
|
|
102
|
+
* current SF ID.
|
|
103
|
+
*/
|
|
104
|
+
function fetchGroupIdByName(groupName, apolloClient) {
|
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
+
var _a, _b, _c, _d, _e, _f;
|
|
107
|
+
try {
|
|
108
|
+
const { data } = yield apolloClient.query({
|
|
109
|
+
query: GET_CASE_GROUPS,
|
|
110
|
+
variables: {
|
|
111
|
+
where: { Name: { eq: groupName } },
|
|
112
|
+
first: 1,
|
|
113
|
+
},
|
|
114
|
+
fetchPolicy: 'cache-first',
|
|
115
|
+
});
|
|
116
|
+
const edges = ((_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.RedHatSupportCaseGroup__c) === null || _c === void 0 ? void 0 : _c.edges) || [];
|
|
117
|
+
return (_f = (_e = (_d = edges[0]) === null || _d === void 0 ? void 0 : _d.node) === null || _e === void 0 ? void 0 : _e.Id) !== null && _f !== void 0 ? _f : null;
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.error(`[GraphQL] Failed to fetch group by name "${groupName}":`, error);
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function resolveGroupIds(groups, apolloClient) {
|
|
126
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
127
|
+
if (!(groups === null || groups === void 0 ? void 0 : groups.length))
|
|
128
|
+
return [];
|
|
129
|
+
const validIds = [];
|
|
130
|
+
const staleGroups = [];
|
|
131
|
+
for (const group of groups) {
|
|
132
|
+
if (!group.key)
|
|
133
|
+
continue;
|
|
134
|
+
if (SALESFORCE_ID_PATTERN.test(group.key)) {
|
|
135
|
+
validIds.push(group.key);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
staleGroups.push(group);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (staleGroups.length) {
|
|
142
|
+
const resolved = yield Promise.all(staleGroups.map((group) => __awaiter(this, void 0, void 0, function* () {
|
|
143
|
+
if (!group.value) {
|
|
144
|
+
console.warn(`[GraphQL] Cannot resolve legacy group key "${group.key}" — no group name available`);
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
const sfId = yield fetchGroupIdByName(group.value, apolloClient);
|
|
148
|
+
if (sfId) {
|
|
149
|
+
return sfId;
|
|
150
|
+
}
|
|
151
|
+
console.warn(`[GraphQL] Could not find group "${group.value}" (legacy key "${group.key}") — filter will be skipped`);
|
|
152
|
+
return null;
|
|
153
|
+
})));
|
|
154
|
+
for (const sfId of resolved) {
|
|
155
|
+
if (sfId)
|
|
156
|
+
validIds.push(sfId);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return [...new Set(validIds)];
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Resolve case numbers for selected label Ids via RedHatSupportCaseLabelLink__c
|
|
164
|
+
* (Label__r.Id filter → Case__r.CaseNumber__c), matching the working UIAPI query.
|
|
165
|
+
*/
|
|
166
|
+
function resolveCaseNumbersByLabelIds(labelIds, apolloClient) {
|
|
167
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
168
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
169
|
+
if (!labelIds.length) {
|
|
170
|
+
return [];
|
|
171
|
+
}
|
|
172
|
+
const where = labelIds.length === 1 ? { Label__r: { Id: { eq: labelIds[0] } } } : { Label__r: { Id: { in: labelIds } } };
|
|
173
|
+
const PAGE_SIZE = 2000;
|
|
174
|
+
const allCaseNumbers = [];
|
|
175
|
+
let hasNextPage = true;
|
|
176
|
+
let afterCursor;
|
|
177
|
+
try {
|
|
178
|
+
while (hasNextPage) {
|
|
179
|
+
const { data } = yield apolloClient.query({
|
|
180
|
+
query: GET_CASE_NUMBERS_BY_CASE_LABEL,
|
|
181
|
+
variables: Object.assign({ where, first: PAGE_SIZE }, (afterCursor ? { after: afterCursor } : {})),
|
|
182
|
+
fetchPolicy: 'network-only',
|
|
183
|
+
});
|
|
184
|
+
const connection = (_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.RedHatSupportCaseLabelLink__c;
|
|
185
|
+
const edges = (_c = connection === null || connection === void 0 ? void 0 : connection.edges) !== null && _c !== void 0 ? _c : [];
|
|
186
|
+
allCaseNumbers.push(...edges
|
|
187
|
+
.map((edge) => { var _a, _b, _c; return (_c = (_b = (_a = edge.node) === null || _a === void 0 ? void 0 : _a.Case__r) === null || _b === void 0 ? void 0 : _b.CaseNumber__c) === null || _c === void 0 ? void 0 : _c.value; })
|
|
188
|
+
.filter((caseNumber) => Boolean(caseNumber)));
|
|
189
|
+
hasNextPage = (_e = (_d = connection === null || connection === void 0 ? void 0 : connection.pageInfo) === null || _d === void 0 ? void 0 : _d.hasNextPage) !== null && _e !== void 0 ? _e : false;
|
|
190
|
+
afterCursor = (_g = (_f = connection === null || connection === void 0 ? void 0 : connection.pageInfo) === null || _f === void 0 ? void 0 : _f.endCursor) !== null && _g !== void 0 ? _g : undefined;
|
|
191
|
+
}
|
|
192
|
+
return [...new Set(allCaseNumbers)];
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
console.error('[GraphQL] Failed to resolve case numbers by case label:', error);
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
function buildCaseNumberInFilter(caseNumbers, filterRequested = false) {
|
|
201
|
+
if (!(caseNumbers === null || caseNumbers === void 0 ? void 0 : caseNumbers.length)) {
|
|
202
|
+
// Label filter requested but no linked cases — force empty result set
|
|
203
|
+
return filterRequested ? { CaseNumber__c: { in: [] } } : undefined;
|
|
204
|
+
}
|
|
205
|
+
if (caseNumbers.length === 1) {
|
|
206
|
+
return { CaseNumber__c: { eq: caseNumbers[0] } };
|
|
207
|
+
}
|
|
208
|
+
return { CaseNumber__c: { in: caseNumbers } };
|
|
209
|
+
}
|
|
210
|
+
function buildDateTimeRangeFilter(fieldName, range) {
|
|
211
|
+
var _a, _b, _c, _d;
|
|
212
|
+
if (!range) {
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const operators = {};
|
|
216
|
+
const startTrimmed = (_b = (_a = range.startDate) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : '';
|
|
217
|
+
const endTrimmed = (_d = (_c = range.endDate) === null || _c === void 0 ? void 0 : _c.trim()) !== null && _d !== void 0 ? _d : '';
|
|
218
|
+
if (startTrimmed && parseAdvanceSearchDate(startTrimmed)) {
|
|
219
|
+
operators.gte = { value: `${startTrimmed}T00:00:00.000Z` };
|
|
220
|
+
}
|
|
221
|
+
if (endTrimmed && parseAdvanceSearchDate(endTrimmed)) {
|
|
222
|
+
operators.lte = { value: `${endTrimmed}T23:59:59.999Z` };
|
|
223
|
+
}
|
|
224
|
+
if (!Object.keys(operators).length) {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
return { [fieldName]: operators };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Builds a ContactId / OwnerId filter from looked-up IDs.
|
|
231
|
+
* Used for Owner and Assigned To — those fields need IDs, not nested name/SSO filters.
|
|
232
|
+
*/
|
|
233
|
+
function buildIdFilter(fieldName, ids, filterRequested = false) {
|
|
234
|
+
if (!(ids === null || ids === void 0 ? void 0 : ids.length)) {
|
|
235
|
+
// User searched, but nobody matched — return empty so the API finds no cases.
|
|
236
|
+
return filterRequested ? { [fieldName]: { in: [] } } : undefined;
|
|
237
|
+
}
|
|
238
|
+
const uniqueIds = [...new Set(ids)];
|
|
239
|
+
if (uniqueIds.length === 1) {
|
|
240
|
+
return { [fieldName]: { eq: uniqueIds[0] } };
|
|
241
|
+
}
|
|
242
|
+
return { [fieldName]: { in: uniqueIds } };
|
|
243
|
+
}
|
|
244
|
+
function buildRedHatSupportUserMatch(value) {
|
|
245
|
+
return {
|
|
246
|
+
or: [{ FederationIdentifier: { eq: value } }, { Name: { like: `%${value}%` } }],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
function buildRedHatSupportUserReferenceFilter(fieldName, values) {
|
|
250
|
+
if (!(values === null || values === void 0 ? void 0 : values.length)) {
|
|
251
|
+
return undefined;
|
|
252
|
+
}
|
|
253
|
+
if (values.length === 1) {
|
|
254
|
+
return { [fieldName]: buildRedHatSupportUserMatch(values[0]) };
|
|
255
|
+
}
|
|
256
|
+
return {
|
|
257
|
+
or: values.map((value) => ({
|
|
258
|
+
[fieldName]: buildRedHatSupportUserMatch(value),
|
|
259
|
+
})),
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
function buildKeywordSearchFilter(queryString) {
|
|
263
|
+
if (!queryString)
|
|
264
|
+
return undefined;
|
|
265
|
+
const keyword = queryString.replace(/\*$/g, '').trim();
|
|
266
|
+
if (!keyword)
|
|
267
|
+
return undefined;
|
|
268
|
+
const caseNumberPattern = /^\d{8}$/;
|
|
269
|
+
if (caseNumberPattern.test(keyword)) {
|
|
270
|
+
return { CaseNumber__c: { eq: keyword } };
|
|
271
|
+
}
|
|
272
|
+
const likeValue = `%${keyword}%`;
|
|
273
|
+
return {
|
|
274
|
+
or: [{ Subject: { like: likeValue } }, { CaseNumber__c: { like: likeValue } }],
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Owner (case contact): find Contact IDs by SSO or name.
|
|
279
|
+
* We need this because the case query cannot filter by contact name/SSO directly.
|
|
280
|
+
*/
|
|
281
|
+
function resolveContactIdsBySearchTerms(searchTerms, apolloClient) {
|
|
282
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
283
|
+
var _a, _b, _c;
|
|
284
|
+
if (!(searchTerms === null || searchTerms === void 0 ? void 0 : searchTerms.length)) {
|
|
285
|
+
return [];
|
|
286
|
+
}
|
|
287
|
+
const contactIds = [];
|
|
288
|
+
for (const searchTerm of searchTerms) {
|
|
289
|
+
if (!searchTerm) {
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
try {
|
|
293
|
+
const { data } = yield apolloClient.query({
|
|
294
|
+
query: GET_CONTACT_BY_SSO,
|
|
295
|
+
variables: {
|
|
296
|
+
searchTerm,
|
|
297
|
+
namePattern: `%${searchTerm}%`,
|
|
298
|
+
},
|
|
299
|
+
fetchPolicy: 'cache-first',
|
|
300
|
+
});
|
|
301
|
+
const edges = ((_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.RedHatSupportContact) === null || _c === void 0 ? void 0 : _c.edges) || [];
|
|
302
|
+
edges.forEach((edge) => {
|
|
303
|
+
var _a, _b, _c;
|
|
304
|
+
const ssoUsername = (_b = (_a = edge.node) === null || _a === void 0 ? void 0 : _a.SSOUserName__c) === null || _b === void 0 ? void 0 : _b.value;
|
|
305
|
+
if (((_c = edge.node) === null || _c === void 0 ? void 0 : _c.Id) && ssoUsername) {
|
|
306
|
+
contactIds.push(edge.node.Id);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
catch (error) {
|
|
311
|
+
console.error('[GraphQL] Failed to resolve contact IDs by SSO or name:', error);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return [...new Set(contactIds)];
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Assigned To (user): find user IDs by federation ID or name.
|
|
319
|
+
* Fallback when IDs were not already resolved earlier.
|
|
320
|
+
*/
|
|
321
|
+
function resolveOwnerUserIdsBySearchTerms(searchTerms, apolloClient) {
|
|
322
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
323
|
+
var _a, _b, _c;
|
|
324
|
+
if (!(searchTerms === null || searchTerms === void 0 ? void 0 : searchTerms.length)) {
|
|
325
|
+
return [];
|
|
326
|
+
}
|
|
327
|
+
const userIds = [];
|
|
328
|
+
for (const searchTerm of searchTerms) {
|
|
329
|
+
if (!searchTerm) {
|
|
330
|
+
continue;
|
|
331
|
+
}
|
|
332
|
+
try {
|
|
333
|
+
const { data } = yield apolloClient.query({
|
|
334
|
+
query: GET_USER_IDS_BY_FEDERATION,
|
|
335
|
+
variables: {
|
|
336
|
+
searchTerm,
|
|
337
|
+
namePattern: `%${searchTerm}%`,
|
|
338
|
+
},
|
|
339
|
+
fetchPolicy: 'cache-first',
|
|
340
|
+
});
|
|
341
|
+
const edges = ((_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.RedHatSupportUser) === null || _c === void 0 ? void 0 : _c.edges) || [];
|
|
342
|
+
edges.forEach((edge) => {
|
|
343
|
+
var _a, _b, _c;
|
|
344
|
+
const federationId = (_b = (_a = edge.node) === null || _a === void 0 ? void 0 : _a.FederationIdentifier) === null || _b === void 0 ? void 0 : _b.value;
|
|
345
|
+
if (((_c = edge.node) === null || _c === void 0 ? void 0 : _c.Id) && federationId) {
|
|
346
|
+
userIds.push(edge.node.Id);
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
catch (error) {
|
|
351
|
+
console.error('[GraphQL] Failed to resolve owner user IDs by federation ID or name:', error);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
return [...new Set(userIds)];
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Assigned To (group/queue): find group IDs by name.
|
|
359
|
+
* OwnerId can be either a user or a group.
|
|
360
|
+
*/
|
|
361
|
+
function resolveOwnerGroupIdsBySearchTerms(searchTerms, apolloClient) {
|
|
362
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
363
|
+
var _a, _b, _c;
|
|
364
|
+
if (!(searchTerms === null || searchTerms === void 0 ? void 0 : searchTerms.length)) {
|
|
365
|
+
return [];
|
|
366
|
+
}
|
|
367
|
+
const groupIds = [];
|
|
368
|
+
for (const searchTerm of searchTerms) {
|
|
369
|
+
if (!searchTerm) {
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
const { data } = yield apolloClient.query({
|
|
374
|
+
query: GET_GROUP_IDS_BY_NAME,
|
|
375
|
+
variables: {
|
|
376
|
+
namePattern: `%${searchTerm}%`,
|
|
377
|
+
},
|
|
378
|
+
fetchPolicy: 'cache-first',
|
|
379
|
+
});
|
|
380
|
+
const edges = ((_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.RedHatSupportGroup) === null || _c === void 0 ? void 0 : _c.edges) || [];
|
|
381
|
+
edges.forEach((edge) => {
|
|
382
|
+
var _a;
|
|
383
|
+
if ((_a = edge.node) === null || _a === void 0 ? void 0 : _a.Id) {
|
|
384
|
+
groupIds.push(edge.node.Id);
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
catch (error) {
|
|
389
|
+
console.error('[GraphQL] Failed to resolve owner group IDs by name:', error);
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return [...new Set(groupIds)];
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
/** Assigned To: merge user IDs and group IDs into one OwnerId list. */
|
|
396
|
+
function resolveOwnerIdsBySearchTerms(searchTerms, apolloClient) {
|
|
397
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
398
|
+
const [userIds, groupIds] = yield Promise.all([
|
|
399
|
+
resolveOwnerUserIdsBySearchTerms(searchTerms, apolloClient),
|
|
400
|
+
resolveOwnerGroupIdsBySearchTerms(searchTerms, apolloClient),
|
|
401
|
+
]);
|
|
402
|
+
return [...new Set([...userIds, ...groupIds])];
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
export function createGraphQLVariablesFromFilterState(filterState_1, apolloClient_1, resolvedUserIds_1) {
|
|
406
|
+
return __awaiter(this, arguments, void 0, function* (filterState, apolloClient, resolvedUserIds, includeSecureSupportCases = false) {
|
|
407
|
+
var _a;
|
|
408
|
+
const { paginationInfo, sortInfo, filterInfo, filterQueryInfo } = filterState;
|
|
409
|
+
const first = (paginationInfo === null || paginationInfo === void 0 ? void 0 : paginationInfo.pageSize) || 10;
|
|
410
|
+
const orderBy = buildOrderByFromSortInfo(sortInfo);
|
|
411
|
+
const andConditions = [];
|
|
412
|
+
andConditions.push(buildAccessRestrictionExclusionFilter(includeSecureSupportCases));
|
|
413
|
+
if (filterInfo) {
|
|
414
|
+
const statusFilter = buildStatusFilter(filterInfo[SolrKeys.status]);
|
|
415
|
+
if (statusFilter)
|
|
416
|
+
andConditions.push(statusFilter);
|
|
417
|
+
const severities = filterInfo[SolrKeys.severity];
|
|
418
|
+
if (severities === null || severities === void 0 ? void 0 : severities.length) {
|
|
419
|
+
andConditions.push({ Priority: { in: severities } });
|
|
420
|
+
}
|
|
421
|
+
const accounts = filterInfo[SolrKeys.accountNumber];
|
|
422
|
+
if (accounts === null || accounts === void 0 ? void 0 : accounts.length) {
|
|
423
|
+
const accountNumbers = flattenAccountNumbers(accounts);
|
|
424
|
+
if (accountNumbers.length) {
|
|
425
|
+
andConditions.push({ Account_Number__c: { in: accountNumbers } });
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
const products = filterInfo[SolrPivotKeys.product_version];
|
|
429
|
+
if (products === null || products === void 0 ? void 0 : products.length) {
|
|
430
|
+
const productConditions = buildProductFilter(products);
|
|
431
|
+
if (productConditions.length === 1) {
|
|
432
|
+
andConditions.push(productConditions[0]);
|
|
433
|
+
}
|
|
434
|
+
else if (productConditions.length > 1) {
|
|
435
|
+
andConditions.push({ or: productConditions });
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
const types = filterInfo[SolrKeys.type];
|
|
439
|
+
if (types === null || types === void 0 ? void 0 : types.length) {
|
|
440
|
+
andConditions.push({ Type: { in: types } });
|
|
441
|
+
}
|
|
442
|
+
const createdByValues = filterInfo[SolrKeys.createdBySsoUsername];
|
|
443
|
+
const contactValues = filterInfo[SolrKeys.caseContactSSO];
|
|
444
|
+
const assignedToValues = getOwnerFederationIdsToResolve(filterState);
|
|
445
|
+
const alternateIds = filterInfo[SolrKeys.alternateId];
|
|
446
|
+
const openshiftClusterIds = filterInfo[SolrKeys.openshiftClusterId];
|
|
447
|
+
const modifiedByValues = filterInfo[SolrKeys.modifiedBy];
|
|
448
|
+
// Problem: GraphQL will not let us filter cases by Owner name/SSO or Assigned To name
|
|
449
|
+
// nested under Contact/Owner. So for those fields we look up IDs first, then filter by ID.
|
|
450
|
+
// Created By / Last Modified By are fine — they support nested name filters directly.
|
|
451
|
+
const contactIds = yield resolveContactIdsBySearchTerms(contactValues, apolloClient);
|
|
452
|
+
const ownerUserIds = (resolvedUserIds === null || resolvedUserIds === void 0 ? void 0 : resolvedUserIds.ownerUserIds) ||
|
|
453
|
+
(assignedToValues.length ? yield resolveOwnerIdsBySearchTerms(assignedToValues, apolloClient) : []);
|
|
454
|
+
const contactIdFilter = buildIdFilter('ContactId', contactIds, Boolean(contactValues === null || contactValues === void 0 ? void 0 : contactValues.length));
|
|
455
|
+
const ownerIdFilter = buildIdFilter('OwnerId', ownerUserIds, assignedToValues.length > 0);
|
|
456
|
+
const createdByFilter = buildRedHatSupportUserReferenceFilter('CreatedBy', createdByValues);
|
|
457
|
+
const isAdvancedSearch = (filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.type) === CaseSearchQueryType.ADVANCED;
|
|
458
|
+
const usernameFilters = [contactIdFilter, ownerIdFilter, createdByFilter].filter(Boolean);
|
|
459
|
+
if (isAdvancedSearch) {
|
|
460
|
+
usernameFilters.forEach((filter) => andConditions.push(filter));
|
|
461
|
+
}
|
|
462
|
+
else if (usernameFilters.length === 1) {
|
|
463
|
+
andConditions.push(usernameFilters[0]);
|
|
464
|
+
}
|
|
465
|
+
else if (usernameFilters.length > 1) {
|
|
466
|
+
andConditions.push({ or: usernameFilters });
|
|
467
|
+
}
|
|
468
|
+
const lastModifiedByFilter = buildRedHatSupportUserReferenceFilter('LastModifiedBy', modifiedByValues);
|
|
469
|
+
if (lastModifiedByFilter) {
|
|
470
|
+
andConditions.push(lastModifiedByFilter);
|
|
471
|
+
}
|
|
472
|
+
if (alternateIds === null || alternateIds === void 0 ? void 0 : alternateIds.length) {
|
|
473
|
+
andConditions.push({ AlternateCaseId__c: { in: alternateIds } });
|
|
474
|
+
}
|
|
475
|
+
if (openshiftClusterIds === null || openshiftClusterIds === void 0 ? void 0 : openshiftClusterIds.length) {
|
|
476
|
+
andConditions.push({ OpenshiftClusterID__c: { in: openshiftClusterIds } });
|
|
477
|
+
}
|
|
478
|
+
const { advanceSearchDateRanges } = filterState;
|
|
479
|
+
if (advanceSearchDateRanges) {
|
|
480
|
+
const createdDateFilter = buildDateTimeRangeFilter('CreatedDate', advanceSearchDateRanges.createdDateRange);
|
|
481
|
+
const lastModifiedDateFilter = buildDateTimeRangeFilter('LastModifiedDate', advanceSearchDateRanges.lastModifiedDateRange);
|
|
482
|
+
const closedDateFilter = buildDateTimeRangeFilter('ClosedDate', advanceSearchDateRanges.closedDateRange);
|
|
483
|
+
if (createdDateFilter)
|
|
484
|
+
andConditions.push(createdDateFilter);
|
|
485
|
+
if (lastModifiedDateFilter)
|
|
486
|
+
andConditions.push(lastModifiedDateFilter);
|
|
487
|
+
if (closedDateFilter)
|
|
488
|
+
andConditions.push(closedDateFilter);
|
|
489
|
+
}
|
|
490
|
+
const groups = filterInfo[SolrKeys.group];
|
|
491
|
+
const groupIds = yield resolveGroupIds(groups, apolloClient);
|
|
492
|
+
const groupFilter = buildGroupFilter(groupIds);
|
|
493
|
+
if (groupFilter)
|
|
494
|
+
andConditions.push(groupFilter);
|
|
495
|
+
const caseLabels = filterInfo[SolrKeys.caseLabel];
|
|
496
|
+
const labelIds = (_a = caseLabels === null || caseLabels === void 0 ? void 0 : caseLabels.map((label) => label.key).filter(Boolean)) !== null && _a !== void 0 ? _a : [];
|
|
497
|
+
if (labelIds.length) {
|
|
498
|
+
const caseNumbers = yield resolveCaseNumbersByLabelIds(labelIds, apolloClient);
|
|
499
|
+
const caseLabelFilter = buildCaseNumberInFilter(caseNumbers, true);
|
|
500
|
+
if (caseLabelFilter)
|
|
501
|
+
andConditions.push(caseLabelFilter);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const escalation = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.escalation];
|
|
505
|
+
const technicalSupportId = getTechnicalSupportRecordTypeId();
|
|
506
|
+
if (technicalSupportId) {
|
|
507
|
+
andConditions.push({ RecordTypeId: { eq: technicalSupportId } });
|
|
508
|
+
}
|
|
509
|
+
if (escalation === null || escalation === void 0 ? void 0 : escalation.length) {
|
|
510
|
+
andConditions.push({ IsEscalated: { eq: true } });
|
|
511
|
+
}
|
|
512
|
+
if (filterQueryInfo === null || filterQueryInfo === void 0 ? void 0 : filterQueryInfo.queryString) {
|
|
513
|
+
const keywordFilter = buildKeywordSearchFilter(filterQueryInfo.queryString);
|
|
514
|
+
if (keywordFilter)
|
|
515
|
+
andConditions.push(keywordFilter);
|
|
516
|
+
}
|
|
517
|
+
let where;
|
|
518
|
+
if (andConditions.length === 1) {
|
|
519
|
+
where = andConditions[0];
|
|
520
|
+
}
|
|
521
|
+
else if (andConditions.length > 1) {
|
|
522
|
+
where = { and: andConditions };
|
|
523
|
+
}
|
|
524
|
+
return { first, where, orderBy };
|
|
525
|
+
});
|
|
526
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caseSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseSearchUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAkBxD,OAAO,EACH,oBAAoB,EACpB,WAAW,EAId,MAAM,+CAA+C,CAAC;AAOvD,OAAO,EAEH,mBAAmB,EAEtB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,6BAA6B,UAAU,CAAC;AACrD,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD,eAAO,MAAM,iCAAiC,SAAS,CAAC;AACxD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,aAAa,GAAE,MAAM,EAAO,OAgE/B;AAED,iBAAS,sCAAsC,CAC3C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,OAAe,UA2BnC;AAED,iBAAS,oDAAoD,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,UA+DlH;AAkBD,iBAAS,wCAAwC,CAC7C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,eAAe,QAAK,UA6BvB;AASD,iBAAS,yBAAyB,CAC9B,WAAW,EAAE,oBAAoB,EACjC,kBAAkB,EAAE,QAAQ,EAC5B,oBAAoB,KAAA,EACpB,aAAa,GAAE,MAAM,EAAO,EAC5B,UAAU,SAAI,EACd,UAAU,SAAO,OAoBpB;AAkBD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,EACtC,aAAa,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAED,iBAAS,6BAA6B,CAAC,QAAQ,GAAE,qBAAqB,EAAO,GAAG,qBAAqB,EAAE,CAEtG;AAoBD,iBAAS,6BAA6B,CAAC,WAAW,EAAE,oBAAoB,UAUvE;AAED,iBAAS,6BAA6B,CAClC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,oBAAoB,EACzC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,GAAE,mBAA+C,
|
|
1
|
+
{"version":3,"file":"caseSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseSearchUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAkBxD,OAAO,EACH,oBAAoB,EACpB,WAAW,EAId,MAAM,+CAA+C,CAAC;AAOvD,OAAO,EAEH,mBAAmB,EAEtB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,6BAA6B,UAAU,CAAC;AACrD,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD,eAAO,MAAM,iCAAiC,SAAS,CAAC;AACxD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,aAAa,GAAE,MAAM,EAAO,OAgE/B;AAED,iBAAS,sCAAsC,CAC3C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,OAAe,UA2BnC;AAED,iBAAS,oDAAoD,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,UA+DlH;AAkBD,iBAAS,wCAAwC,CAC7C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,eAAe,QAAK,UA6BvB;AASD,iBAAS,yBAAyB,CAC9B,WAAW,EAAE,oBAAoB,EACjC,kBAAkB,EAAE,QAAQ,EAC5B,oBAAoB,KAAA,EACpB,aAAa,GAAE,MAAM,EAAO,EAC5B,UAAU,SAAI,EACd,UAAU,SAAO,OAoBpB;AAkBD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,EACtC,aAAa,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAED,iBAAS,6BAA6B,CAAC,QAAQ,GAAE,qBAAqB,EAAO,GAAG,qBAAqB,EAAE,CAEtG;AAoBD,iBAAS,6BAA6B,CAAC,WAAW,EAAE,oBAAoB,UAUvE;AAED,iBAAS,6BAA6B,CAClC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,oBAAoB,EACzC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,GAAE,mBAA+C,wBA0D9D;AAGD,iBAAS,kCAAkC,CACvC,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,oBAAoB,EACzC,kBAAkB,EAAE,oBAAoB,EACxC,WAAW,GAAE,MAAW,EACxB,IAAI,GAAE,mBAA+C,wBAiExD;AAqMD,OAAO,EACH,8BAA8B,EAC9B,sCAAsC,EACtC,oDAAoD,EACpD,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,EAC7B,wCAAwC,EACxC,kCAAkC,GACrC,CAAC"}
|
|
@@ -328,6 +328,7 @@ function createURLQueryFromFilterState(filterState) {
|
|
|
328
328
|
return finalQuery;
|
|
329
329
|
}
|
|
330
330
|
function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize, currentPage, searchType = CaseSearchQueryType.BASIC) {
|
|
331
|
+
var _a;
|
|
331
332
|
const { paginationInfo: defaultPaginationInfo, sortInfo: defaultSortInfo, filterInfo: defaultFilterInfo, filterQueryInfo: defaultFilterQueryInfo, } = initialCaseFilterState;
|
|
332
333
|
const [filters = '', sortQuery] = (urlQuery || '').split(/orderBy/i);
|
|
333
334
|
const paginationInfoFromUrl = {
|
|
@@ -341,7 +342,7 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
341
342
|
sortInfo = { column, direction: direction };
|
|
342
343
|
}
|
|
343
344
|
const filterInfo = {};
|
|
344
|
-
const
|
|
345
|
+
const _b = parseSolrQuery(filters), { keyword: queryString = [''] } = _b, restFilters = __rest(_b, ["keyword"]);
|
|
345
346
|
const filterQueryInfo = merge({}, defaultFilterQueryInfo, {
|
|
346
347
|
queryString: queryString[0].replace(/\\"/g, '"'),
|
|
347
348
|
type: searchType,
|
|
@@ -358,6 +359,9 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
358
359
|
}
|
|
359
360
|
}
|
|
360
361
|
});
|
|
362
|
+
if ((_a = filterInfo[SolrPivotKeys.product_version]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
363
|
+
enrichProductFilterWithIds(filterInfo[SolrPivotKeys.product_version], globalMetadataState);
|
|
364
|
+
}
|
|
361
365
|
const parsedQuery = filterQueryInfo.type === CaseSearchQueryType.ADVANCED
|
|
362
366
|
? createUserFriendlyQueryFromFilterStateAdvancedSearch(filterInfo, filterQueryInfo.queryString)
|
|
363
367
|
: '';
|
|
@@ -371,6 +375,7 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
371
375
|
}
|
|
372
376
|
// advanced query
|
|
373
377
|
function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, currentFilterState, parsedQuery = '', type = CaseSearchQueryType.BASIC) {
|
|
378
|
+
var _a;
|
|
374
379
|
const filterObj = parseSolrQuery(queryString);
|
|
375
380
|
const newFilterInfo = {};
|
|
376
381
|
let advanceToBasicQuery = [];
|
|
@@ -423,6 +428,9 @@ function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, cu
|
|
|
423
428
|
}
|
|
424
429
|
delete newFilterInfo[SolrKeys.version];
|
|
425
430
|
}
|
|
431
|
+
if ((_a = newFilterInfo[SolrPivotKeys.product_version]) === null || _a === void 0 ? void 0 : _a.length) {
|
|
432
|
+
enrichProductFilterWithIds(newFilterInfo[SolrPivotKeys.product_version], globalMetadataState);
|
|
433
|
+
}
|
|
426
434
|
const filterState = Object.assign(Object.assign({}, currentFilterState), { filterQueryInfo: Object.assign(Object.assign({}, currentFilterState.filterQueryInfo), { queryString: advanceToBasicQuery.join(' AND '), parsedQuery,
|
|
427
435
|
type }), filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), newFilterInfo) });
|
|
428
436
|
return filterState;
|
|
@@ -446,9 +454,18 @@ function getValidValues(solrFieldName, itemValues = [], globalMetadataState) {
|
|
|
446
454
|
return acc;
|
|
447
455
|
}, {});
|
|
448
456
|
itemValues.forEach((item) => {
|
|
449
|
-
|
|
457
|
+
if (caseGroupsMap[item]) {
|
|
458
|
+
mappedValues.push({ key: item, value: caseGroupsMap[item] });
|
|
459
|
+
}
|
|
460
|
+
else if (item && /^\d+$/.test(item)) {
|
|
461
|
+
console.warn(`[CaseSearch] Ignoring stale numeric group filter "${item}" from URL/saved search — group IDs are now Salesforce record IDs`);
|
|
462
|
+
}
|
|
450
463
|
});
|
|
451
464
|
}
|
|
465
|
+
else if (solrFieldName === SolrKeys.caseLabel) {
|
|
466
|
+
// Label names are resolved later by CaseLabelsFilter once account labels load
|
|
467
|
+
mappedValues = itemValues.map((item) => ({ key: item, value: item }));
|
|
468
|
+
}
|
|
452
469
|
else if (solrFieldName === SolrKeys.accountNumber) {
|
|
453
470
|
// when we go live with grouped bookmark, bookmarkedAccounts needs to be removed
|
|
454
471
|
let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
|
|
@@ -500,6 +517,9 @@ function getValidValuesAdvancedSearch(solrFieldName, itemValues = [], globalMeta
|
|
|
500
517
|
caseGroupsMap[item] && mappedValues.push({ key: caseGroupsMap[item], value: item });
|
|
501
518
|
});
|
|
502
519
|
}
|
|
520
|
+
else if (solrFieldName === SolrKeys.caseLabel) {
|
|
521
|
+
mappedValues = itemValues.map((item) => ({ key: item, value: item }));
|
|
522
|
+
}
|
|
503
523
|
else if (solrFieldName === SolrKeys.accountNumber) {
|
|
504
524
|
let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
|
|
505
525
|
acc[accountNumber] = getLabel(accountNumber, name);
|
|
@@ -556,4 +576,21 @@ function generateProductVersionPivotValue(values) {
|
|
|
556
576
|
};
|
|
557
577
|
});
|
|
558
578
|
}
|
|
579
|
+
/**
|
|
580
|
+
* Enriches product filter objects (from URL) with their parent Product2 IDs
|
|
581
|
+
* by matching product names against the allProducts metadata loaded at startup.
|
|
582
|
+
* This allows buildProductFilter to use ParentProduct__c when version IDs aren't yet resolved.
|
|
583
|
+
*/
|
|
584
|
+
function enrichProductFilterWithIds(products, globalMetadataState) {
|
|
585
|
+
var _a, _b;
|
|
586
|
+
const allProductsList = ((_b = (_a = globalMetadataState === null || globalMetadataState === void 0 ? void 0 : globalMetadataState.allProducts) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.productsResult) || [];
|
|
587
|
+
products.forEach((prod) => {
|
|
588
|
+
if (prod.productId)
|
|
589
|
+
return;
|
|
590
|
+
const matched = allProductsList.find((p) => p.name === prod.value || p.product === prod.value);
|
|
591
|
+
if (matched === null || matched === void 0 ? void 0 : matched.productId) {
|
|
592
|
+
prod.productId = matched.productId;
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
}
|
|
559
596
|
export { createSolrQueryFromFilterState, createUserFriendlyQueryFromFilterState, createUserFriendlyQueryFromFilterStateAdvancedSearch, createQueryForCSVDownload, createSFDCQueryFromFilterState, mapSFDCCaseListToSolrCaseList, createURLQueryFromFilterState, createFilterStateFromUrlQuery, createAdvancedSearchQueryFromFilterState, createFilterStateFromAdvancedQuery, };
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
export { PORTAL_STATUS_GROUPS, PORTAL_DISPLAY_STATUSES, PORTAL_USER_SELECTABLE_STATUSES, PORTAL_OPEN_DISPLAY_STATUSES, } from '@rh-support/utils';
|
|
1
2
|
export declare const filterNamesMap: {
|
|
2
3
|
readonly case_status: any;
|
|
3
4
|
readonly case_severity: any;
|
|
4
5
|
readonly case_folderNumber: any;
|
|
6
|
+
readonly case_label: any;
|
|
5
7
|
readonly case_accountNumber: any;
|
|
6
8
|
readonly case_summary: any;
|
|
7
9
|
readonly case_customer_escalation: any;
|
|
@@ -16,7 +18,9 @@ export declare const filterNamesMap: {
|
|
|
16
18
|
readonly case_createdby_sso_username: any;
|
|
17
19
|
readonly case_contact_sso_username: any;
|
|
18
20
|
readonly case_type: any;
|
|
19
|
-
readonly
|
|
21
|
+
readonly case_alternate_id: any;
|
|
22
|
+
readonly case_openshift_cluster_id: any;
|
|
20
23
|
readonly usernameFilterTitle: any;
|
|
21
24
|
};
|
|
25
|
+
export declare const UpdatedCaseDataEvent = "PCM-Next > case-list-data-background-refresh";
|
|
22
26
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAIA,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,+BAA+B,EAC/B,4BAA4B,GAC/B,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;CAgE1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,iDAAiD,CAAC"}
|