@rh-support/cases 2.6.229 → 2.6.233
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-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +7 -1
- 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 +16 -4
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +2 -1
- 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 +13 -9
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +1 -1
- package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +2 -0
- 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 +13 -2
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +14 -2
- package/lib/esm/css/caseList.css +5 -1
- package/lib/esm/enums/filters.d.ts +2 -0
- 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.map +1 -1
- package/lib/esm/hooks/useCaseLabels.js +3 -9
- package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseListGraphQLUtils.js +37 -13
- package/lib/esm/utils/caseListVariablesBuilder.d.ts +2 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -1
- package/lib/esm/utils/caseListVariablesBuilder.js +31 -22
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseList.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseList.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAChC,OAAO,0BAA0B,CAAC;AAwClC,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"CaseList.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseList.tsx"],"names":[],"mappings":"AAAA,OAAO,wBAAwB,CAAC;AAChC,OAAO,0BAA0B,CAAC;AAwClC,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAwC1C,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAMD,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBA8xBrC"}
|
|
@@ -25,6 +25,7 @@ import { useLocation } from 'react-router-dom';
|
|
|
25
25
|
import { CaseSearchQueryType } from '../../enums/caseSearch';
|
|
26
26
|
import { SolrKeys } from '../../enums/filters';
|
|
27
27
|
import { PageTitle } from '../../enums/pageTitle';
|
|
28
|
+
import { useCaseLabels } from '../../hooks/useCaseLabels';
|
|
28
29
|
import { useFilterStateOnLoad } from '../../hooks/useFilterStateOnLoad';
|
|
29
30
|
import { getDefaultGroupFilterSelection, shouldApplyDefaultGroupFilter } from '../../utils/caseGroupDefaultFilterUtils';
|
|
30
31
|
import { clearPageCursors, getCaseListFromGraphQL, loadMoreCases, } from '../../utils/caseListGraphQLUtils';
|
|
@@ -315,6 +316,11 @@ export function CaseList(props) {
|
|
|
315
316
|
}
|
|
316
317
|
});
|
|
317
318
|
const salesforceAccountId = (_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
|
|
319
|
+
const { error: caseLabelsFetchError, refetch: refetchCaseLabels } = useCaseLabels(salesforceAccountId);
|
|
320
|
+
const retryCaseListFetch = () => {
|
|
321
|
+
refetchCaseLabels();
|
|
322
|
+
getCases(filterState);
|
|
323
|
+
};
|
|
318
324
|
const loggedInContactId = (_b = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _b === void 0 ? void 0 : _b.id;
|
|
319
325
|
const loggedInIsOrgAdmin = (_c = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _c === void 0 ? void 0 : _c.isOrgAdmin;
|
|
320
326
|
const defaultCaseGroupId = (_e = (_d = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _d === void 0 ? void 0 : _d.defaultCaseGroup) !== null && _e !== void 0 ? _e : null;
|
|
@@ -583,5 +589,5 @@ export function CaseList(props) {
|
|
|
583
589
|
React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filters') } },
|
|
584
590
|
React.createElement(CaseListFilters, { allCaseTypes: allCaseTypes, allCaseStatuses: allCaseStatuses, allCaseSeverities: allCaseSeverities, allProducts: allProducts }))))),
|
|
585
591
|
React.createElement("section", { className: "case-search-table pf-v6-u-display-flex pf-v6-u-flex-direction-column" },
|
|
586
|
-
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo, isCaseListPageLoading: isFetching, hasError: hasError, hasNextPage: hasNextPage, isLoadingMore: isLoadingMore, loadMoreError: loadMoreError, loadMoreRetryCount: loadMoreRetryCount, onRetryLoadMore: retryLoadMore, onCasesCloseSuccess: () => getCases(filterState), sentinelRef: sentinelRef }))))));
|
|
592
|
+
React.createElement(CaseListTable, { caseList: caseList, caseGroups: caseGroups.data || [], loggedInUserRights: loggedInUserRights.data, sortInfo: filterState.sortInfo, isCaseListPageLoading: isFetching, hasError: hasError, hasNextPage: hasNextPage, isLoadingMore: isLoadingMore, loadMoreError: loadMoreError, loadMoreRetryCount: loadMoreRetryCount, onRetryLoadMore: retryLoadMore, onRetryFetch: retryCaseListFetch, caseLabelsFetchError: caseLabelsFetchError, onCasesCloseSuccess: () => getCases(filterState), sentinelRef: sentinelRef }))))));
|
|
587
593
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdditionalFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/AdditionalFilters.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAO/D,wBAAgB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"AdditionalFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/AdditionalFilters.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAO/D,wBAAgB,iBAAiB,sBA6HhC"}
|
|
@@ -4,11 +4,12 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
4
4
|
import isEqual from 'lodash/isEqual';
|
|
5
5
|
import React, { useContext, useEffect, useState } from 'react';
|
|
6
6
|
import { Trans, useTranslation } from 'react-i18next';
|
|
7
|
-
import { AdditionalFilterLabels, SolrKeys } from '../../../enums/filters';
|
|
7
|
+
import { AdditionalFilterLabels, ARCHIVED_STATUS, SolrKeys } from '../../../enums/filters';
|
|
8
8
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
9
9
|
import { updateFilter } from '../CaseListFilterReducer';
|
|
10
10
|
export function AdditionalFilters() {
|
|
11
11
|
const [escalated, setIsEscalated] = useState(false);
|
|
12
|
+
const [isArchived, setIsArchived] = useState(false);
|
|
12
13
|
const [isPrivate, setIsPrivate] = useState(false);
|
|
13
14
|
const { t } = useTranslation();
|
|
14
15
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
@@ -16,7 +17,16 @@ export function AdditionalFilters() {
|
|
|
16
17
|
const canAccessPrivateCaseFilter = ability.can(resourceActions.PATCH, resources.CASE_LIST, CaseListFields.PRIVATE_CASE_FILTER);
|
|
17
18
|
//canAccessPrivateCaseFilter is not used anywhere, so we need to void it to avoid linting error
|
|
18
19
|
void canAccessPrivateCaseFilter;
|
|
19
|
-
const { filterInfo: { case_customer_escalation, case_private }, } = useContext(CaseListFilterStateContext);
|
|
20
|
+
const { filterInfo: { case_customer_escalation, case_private, case_status = [] }, } = useContext(CaseListFilterStateContext);
|
|
21
|
+
const getSelectableStatuses = () => case_status.filter((status) => status !== ARCHIVED_STATUS);
|
|
22
|
+
const onArchivedChange = (checked) => {
|
|
23
|
+
const nextStatuses = checked ? [...getSelectableStatuses(), ARCHIVED_STATUS] : getSelectableStatuses();
|
|
24
|
+
updateFilter(dispatch, {
|
|
25
|
+
filterKey: SolrKeys.status,
|
|
26
|
+
values: nextStatuses,
|
|
27
|
+
});
|
|
28
|
+
setIsArchived(checked);
|
|
29
|
+
};
|
|
20
30
|
const onEscalatedChange = (checked) => {
|
|
21
31
|
updateFilter(dispatch, {
|
|
22
32
|
filterKey: SolrKeys.escalation,
|
|
@@ -60,15 +70,17 @@ export function AdditionalFilters() {
|
|
|
60
70
|
if (!isEmpty(case_customer_escalation)) {
|
|
61
71
|
isEqual((_a = case_customer_escalation[0]) === null || _a === void 0 ? void 0 : _a.key, 'true') ? setIsEscalated(true) : setIsEscalated(false);
|
|
62
72
|
}
|
|
73
|
+
setIsArchived(case_status.includes(ARCHIVED_STATUS));
|
|
63
74
|
isEmpty(case_private) && isPrivate && setIsPrivate(false);
|
|
64
75
|
if (!isEmpty(case_private)) {
|
|
65
76
|
isEqual((_b = case_private[0]) === null || _b === void 0 ? void 0 : _b.key, 'true') ? setIsPrivate(true) : setIsPrivate(false);
|
|
66
77
|
}
|
|
67
78
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
68
|
-
}, [case_customer_escalation, case_private]);
|
|
79
|
+
}, [case_customer_escalation, case_private, case_status]);
|
|
69
80
|
return (React.createElement(React.Fragment, null,
|
|
70
81
|
React.createElement("div", { className: "additional-filters" },
|
|
71
82
|
React.createElement("h3", null,
|
|
72
83
|
React.createElement(Trans, null, "More")),
|
|
73
|
-
React.createElement(Checkbox, { label: t(AdditionalFilterLabels[SolrKeys.escalation]), isChecked: escalated, onChange: (_event, checked) => onEscalatedChange(checked), "aria-label": t(AdditionalFilterLabels[SolrKeys.escalation]), id: "escalated", name: "escalated", "data-tracking-id": "escalated-filter-selector" })
|
|
84
|
+
React.createElement(Checkbox, { label: t(AdditionalFilterLabels[SolrKeys.escalation]), isChecked: escalated, onChange: (_event, checked) => onEscalatedChange(checked), "aria-label": t(AdditionalFilterLabels[SolrKeys.escalation]), id: "escalated", name: "escalated", "data-tracking-id": "escalated-filter-selector" }),
|
|
85
|
+
React.createElement(Checkbox, { label: t(AdditionalFilterLabels.archived), isChecked: isArchived, onChange: (_event, checked) => onArchivedChange(checked), "aria-label": t(AdditionalFilterLabels.archived), id: "archived", name: "archived", "data-tracking-id": "archived-filter-selector" }))));
|
|
74
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseLabelsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseLabelsFilter.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAYhF,wBAAgB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"CaseLabelsFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseLabelsFilter.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAA2D,MAAM,OAAO,CAAC;AAYhF,wBAAgB,gBAAgB,sBAgQ/B"}
|
|
@@ -122,7 +122,8 @@ export function CaseLabelsFilter() {
|
|
|
122
122
|
useEffect(() => {
|
|
123
123
|
let newSelectOptions = list;
|
|
124
124
|
if (inputValue) {
|
|
125
|
-
|
|
125
|
+
const normalizedInput = inputValue.toLowerCase();
|
|
126
|
+
newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().includes(normalizedInput));
|
|
126
127
|
if (!newSelectOptions.length) {
|
|
127
128
|
newSelectOptions = [{ isDisabled: false, children: `No results found` }];
|
|
128
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/StatusFilter.tsx"],"names":[],"mappings":"AAWA,OAAO,KAA0C,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusFilter.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/StatusFilter.tsx"],"names":[],"mappings":"AAWA,OAAO,KAA0C,MAAM,OAAO,CAAC;AAY/D,UAAU,MAAM;IACZ,eAAe,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,qBA8KzC"}
|
|
@@ -3,8 +3,8 @@ import { useSelectKeyboardNavigator } from '@rh-support/components';
|
|
|
3
3
|
import isEmpty from 'lodash/isEmpty';
|
|
4
4
|
import React, { useContext, useEffect, useState } from 'react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
|
-
import { SolrKeys } from '../../../enums/filters';
|
|
7
|
-
import { filterNamesMap,
|
|
6
|
+
import { ARCHIVED_STATUS, SolrKeys } from '../../../enums/filters';
|
|
7
|
+
import { filterNamesMap, PORTAL_OPEN_DISPLAY_STATUSES, PORTAL_USER_SELECTABLE_STATUSES, } from '../../../utils/constants';
|
|
8
8
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
9
9
|
import { updateFilter } from '../CaseListFilterReducer';
|
|
10
10
|
export function StatusFilter(props) {
|
|
@@ -13,7 +13,12 @@ export function StatusFilter(props) {
|
|
|
13
13
|
const { filterInfo } = useContext(CaseListFilterStateContext);
|
|
14
14
|
const [isOpen, setIsOpen] = useState(false);
|
|
15
15
|
const [selectedItems, setSelectedItems] = useState({});
|
|
16
|
-
const list =
|
|
16
|
+
const list = PORTAL_USER_SELECTABLE_STATUSES.map((status) => ({
|
|
17
|
+
value: status,
|
|
18
|
+
key: status,
|
|
19
|
+
}));
|
|
20
|
+
const getArchivedStatuses = () => ((filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) || []).filter((status) => status === ARCHIVED_STATUS);
|
|
21
|
+
const getSelectableStatuses = () => ((filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) || []).filter((status) => status !== ARCHIVED_STATUS);
|
|
17
22
|
const onToggleClick = (e) => {
|
|
18
23
|
setIsOpen(!isOpen);
|
|
19
24
|
};
|
|
@@ -30,7 +35,7 @@ export function StatusFilter(props) {
|
|
|
30
35
|
}
|
|
31
36
|
updateFilter(dispatch, {
|
|
32
37
|
filterKey: SolrKeys.status,
|
|
33
|
-
values: prevSelectedStatuses,
|
|
38
|
+
values: [...getArchivedStatuses(), ...prevSelectedStatuses],
|
|
34
39
|
});
|
|
35
40
|
};
|
|
36
41
|
// Use the keyboard navigator hook
|
|
@@ -45,7 +50,7 @@ export function StatusFilter(props) {
|
|
|
45
50
|
setSelectedItems({});
|
|
46
51
|
updateFilter(dispatch, {
|
|
47
52
|
filterKey: SolrKeys.status,
|
|
48
|
-
values:
|
|
53
|
+
values: getArchivedStatuses(),
|
|
49
54
|
});
|
|
50
55
|
};
|
|
51
56
|
const getBtnPlaceholder = (btnPlaceholder, selectedValues, type, totalLength, totalLengthString) => {
|
|
@@ -70,18 +75,17 @@ export function StatusFilter(props) {
|
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
};
|
|
73
|
-
const placeholder = getBtnPlaceholder(t('Select a status'), (
|
|
78
|
+
const placeholder = getBtnPlaceholder(t('Select a status'), getSelectableStatuses(), ' ', list.length, t('All selected'));
|
|
74
79
|
const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "default", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true, onKeyDown: onInputKeyDown },
|
|
75
80
|
placeholder,
|
|
76
81
|
Object.keys(selectedItems).filter((key) => selectedItems[key] === true).length > 0 && (React.createElement(Button, { icon: "", variant: "plain", onClick: onClick, "aria-label": "Clear selection", className: "pf-v6-c-select__toggle-clear" }))));
|
|
77
82
|
const dropdownOptions = list.map((option, index) => !isEmpty(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: selectedItems[option.value], isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-status-${option.value.replace(' ', '-')}` }, option.value)));
|
|
78
83
|
useEffect(() => {
|
|
79
|
-
|
|
80
|
-
if (isEmpty(filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status])) {
|
|
84
|
+
if (isEmpty(getSelectableStatuses())) {
|
|
81
85
|
setSelectedItems({});
|
|
82
86
|
}
|
|
83
87
|
else {
|
|
84
|
-
const selectedStatuses = (
|
|
88
|
+
const selectedStatuses = getSelectableStatuses().reduce((selection, status) => {
|
|
85
89
|
selection[status] = true;
|
|
86
90
|
return selection;
|
|
87
91
|
}, {});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ArchivedCaseLabel.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/ArchivedCaseLabel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,OAAO,UAAU,iBAAiB,
|
|
1
|
+
{"version":3,"file":"ArchivedCaseLabel.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/ArchivedCaseLabel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,OAAO,UAAU,iBAAiB,sBAYxC"}
|
|
@@ -3,6 +3,6 @@ import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-ic
|
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { Trans } from 'react-i18next';
|
|
5
5
|
export default function ArchivedCaseLabel() {
|
|
6
|
-
return (React.createElement(Label, { className: "pf-v6-u-mt-xs", color: "purple", "data-testid": "archived-case-label", icon: React.createElement(InfoCircleIcon, null) },
|
|
6
|
+
return (React.createElement(Label, { className: "pf-v6-u-mt-xs archived-case-label", variant: "outline", color: "purple", "data-testid": "archived-case-label", icon: React.createElement(InfoCircleIcon, null) },
|
|
7
7
|
React.createElement(Trans, null, "Archived")));
|
|
8
8
|
}
|
|
@@ -16,6 +16,8 @@ interface IProps {
|
|
|
16
16
|
loadMoreError: boolean;
|
|
17
17
|
loadMoreRetryCount: number;
|
|
18
18
|
onRetryLoadMore: () => void;
|
|
19
|
+
onRetryFetch?: () => void;
|
|
20
|
+
caseLabelsFetchError?: Error | null;
|
|
19
21
|
onCasesCloseSuccess?: () => void;
|
|
20
22
|
sentinelRef?: (node?: Element | null) => void;
|
|
21
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseListTable.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAsB3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAQxD,OAAO,KAAkD,MAAM,OAAO,CAAC;AAIvE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAgB,SAAS,EAAc,MAAM,0BAA0B,CAAC;AA8B/E,UAAU,MAAM;IACZ,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3C,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"CaseListTable.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-table/CaseListTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,+CAA+C,CAAC;AAsB3E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAQxD,OAAO,KAAkD,MAAM,OAAO,CAAC;AAIvE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAgB,SAAS,EAAc,MAAM,0BAA0B,CAAC;AA8B/E,UAAU,MAAM;IACZ,QAAQ,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAC3C,UAAU,EAAE,UAAU,EAAE,CAAC;IACzB,kBAAkB,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,oBAAoB,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACpC,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;IACjC,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAC;CACjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qBAkkB1C"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Alert, AlertVariant, Bullseye, Button, EmptyState, EmptyStateBody, EmptyStateFooter, EmptyStateVariant, Spinner, } from '@patternfly/react-core';
|
|
2
2
|
import SearchIcon from '@patternfly/react-icons/dist/js/icons/search-icon';
|
|
3
3
|
import { Table, TableVariant, Tbody, Td, Th, Thead, Tr, Visibility } from '@patternfly/react-table';
|
|
4
|
-
import { TableComponent } from '@rh-support/components';
|
|
4
|
+
import { CaseLabelLoadErrorModal, TableComponent } from '@rh-support/components';
|
|
5
5
|
import { GlobalMetadataDispatchContext, updateUserPreferences, useGlobalStateContext, UserPreferencesKeys, } from '@rh-support/react-context';
|
|
6
6
|
import { formatDate, mapSfdcStatusToPortalStatus, toNewCaseTypeSwitcher } from '@rh-support/utils';
|
|
7
7
|
import find from 'lodash/find';
|
|
@@ -41,6 +41,7 @@ export function CaseListTable(props) {
|
|
|
41
41
|
const [selectedColumns, setSelectedColumns] = useState([]);
|
|
42
42
|
const { t } = useTranslation();
|
|
43
43
|
const [selectedCases, setSelectedCases] = useState([]);
|
|
44
|
+
const [isCaseLabelErrorModalDismissed, setIsCaseLabelErrorModalDismissed] = useState(false);
|
|
44
45
|
const caseListData = props.isCaseListPageLoading ? [] : (_b = (_a = props.caseList) === null || _a === void 0 ? void 0 : _a.docs) !== null && _b !== void 0 ? _b : [];
|
|
45
46
|
const isColumnVisible = (columnId) => {
|
|
46
47
|
return includes(selectedColumns, columnId);
|
|
@@ -343,6 +344,15 @@ export function CaseListTable(props) {
|
|
|
343
344
|
setSortedCaseListData(sortedRows);
|
|
344
345
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
345
346
|
}, [activeSortDirection, activeSortIndex]);
|
|
347
|
+
const showCaseLabelColumn = isColumnVisible(CaseListColumnIds.caseLabel);
|
|
348
|
+
const showCaseLabelLoadError = showCaseLabelColumn && Boolean(props.caseLabelsFetchError) && !isCaseLabelErrorModalDismissed;
|
|
349
|
+
const handleRetryCaseLabels = () => {
|
|
350
|
+
var _a;
|
|
351
|
+
setIsCaseLabelErrorModalDismissed(false);
|
|
352
|
+
(_a = props.onRetryFetch) === null || _a === void 0 ? void 0 : _a.call(props);
|
|
353
|
+
};
|
|
354
|
+
const initialLoadingSkeletonRows = Array.from({ length: 5 }).map((_, index) => (React.createElement(CaseListTableSkeletonRow, { key: `initial-skeleton-${index}`, visibleCaseListColumns: visibleCaseListColumns })));
|
|
355
|
+
const loadingTableContent = showCaseLabelColumn ? React.createElement(React.Fragment, null, initialLoadingSkeletonRows) : loadingRowDefault;
|
|
346
356
|
const showSkeletonLoaderRow = props.hasNextPage || props.isLoadingMore || props.loadMoreError;
|
|
347
357
|
const hasNoCaseListData = (caseListData || []).length < 1;
|
|
348
358
|
const renderCaseListRows = () => (React.createElement(React.Fragment, null, sortedCaseListData === null || sortedCaseListData === void 0 ? void 0 :
|
|
@@ -353,11 +363,12 @@ export function CaseListTable(props) {
|
|
|
353
363
|
return noResultFoundRow;
|
|
354
364
|
}
|
|
355
365
|
if (props.isCaseListPageLoading) {
|
|
356
|
-
return
|
|
366
|
+
return loadingTableContent;
|
|
357
367
|
}
|
|
358
368
|
return renderCaseListRows();
|
|
359
369
|
};
|
|
360
370
|
return (React.createElement(React.Fragment, null,
|
|
371
|
+
React.createElement(CaseLabelLoadErrorModal, { isOpen: showCaseLabelLoadError, onRetry: handleRetryCaseLabels, onClose: () => setIsCaseLabelErrorModalDismissed(true) }),
|
|
361
372
|
React.createElement(TableComponent, { columns: columns, data: caseListData, selectedColumns: selectedColumns },
|
|
362
373
|
React.createElement("div", { className: "case-list-table-toolbar pf-v6-l-flex", ref: tableToolbarRef },
|
|
363
374
|
React.createElement("div", { className: "toolbar-actions pf-v6-l-flex" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAIvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAchE,UAAU,MAAM;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,mBAAmB,CAAC;IACvC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,qBAsUvD"}
|
|
@@ -12,6 +12,7 @@ import PencilAltIcon from '@patternfly/react-icons/dist/js/icons/pencil-alt-icon
|
|
|
12
12
|
import StarIcon from '@patternfly/react-icons/dist/js/icons/star-icon';
|
|
13
13
|
import { ConfirmationServiceProvider } from '@rh-support/components';
|
|
14
14
|
import { GlobalMetadataStateContext, UserPreferencesKeys, useUserPreferences } from '@rh-support/react-context';
|
|
15
|
+
import { getUrlParsedParams } from '@rh-support/utils';
|
|
15
16
|
import filter from 'lodash/filter';
|
|
16
17
|
import find from 'lodash/find';
|
|
17
18
|
import flatMap from 'lodash/flatMap';
|
|
@@ -19,8 +20,10 @@ import isEmpty from 'lodash/isEmpty';
|
|
|
19
20
|
import isEqual from 'lodash/isEqual';
|
|
20
21
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
21
22
|
import { Trans, useTranslation } from 'react-i18next';
|
|
23
|
+
import { useLocation } from 'react-router-dom';
|
|
22
24
|
import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
23
|
-
import {
|
|
25
|
+
import { decodeCaseListUrlFilterQuery } from '../../../utils/caseGroupDefaultFilterUtils';
|
|
26
|
+
import { createFilterStateFromAdvancedQuery, FILTER_URL_QUERY_SEARCH_PARAM } from '../../../utils/caseSearchUtils';
|
|
24
27
|
import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialCaseFilterState, } from '../CaseListFilterContext';
|
|
25
28
|
import { isNoFilterApplied, isOnlyDefaultFilterApplied } from '../CaseListFilterHelpers';
|
|
26
29
|
import { clearFilters, updateFilterState, updateSort } from '../CaseListFilterReducer';
|
|
@@ -28,8 +31,11 @@ import { SaveCaseSearchModal } from './SaveCaseSearchModal';
|
|
|
28
31
|
import useAdvanceSearchParser from './useAdvanceSearchParser';
|
|
29
32
|
export function BookmarkedSearchesSelector(props) {
|
|
30
33
|
const { t } = useTranslation();
|
|
34
|
+
const location = useLocation();
|
|
31
35
|
const { globalMetadataState, globalMetadataState: { hydraUserPreferences }, } = useContext(GlobalMetadataStateContext);
|
|
32
36
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
37
|
+
const urlQueryParam = getUrlParsedParams(location.search)[FILTER_URL_QUERY_SEARCH_PARAM];
|
|
38
|
+
const hasUrlFilterQuery = Boolean(decodeCaseListUrlFilterQuery(urlQueryParam));
|
|
33
39
|
const [bookmarkedSearches, setBookmarkedSearches] = useState({});
|
|
34
40
|
const [mostRecentSearch, setMostRecentSearch] = useState({});
|
|
35
41
|
const [selectedSearch, setSelectedSearch] = useState('');
|
|
@@ -69,6 +75,12 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
69
75
|
const emptySearchPlaceholderText = 'Select an option';
|
|
70
76
|
const recentSearchLoaded = useRef(false);
|
|
71
77
|
useEffect(() => {
|
|
78
|
+
// Deep links (e.g. Manage → View assigned cases) encode filters in the URL query.
|
|
79
|
+
// Do not overwrite them with saved-search auto-restore.
|
|
80
|
+
if (hasUrlFilterQuery) {
|
|
81
|
+
recentSearchLoaded.current = true;
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
72
84
|
switch (userPreferredSearch) {
|
|
73
85
|
case restoreLatestText:
|
|
74
86
|
if (!isEmpty(mostRecentSearch) && !recentSearchLoaded.current) {
|
|
@@ -91,7 +103,7 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
91
103
|
break;
|
|
92
104
|
}
|
|
93
105
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
94
|
-
}, [mostRecentSearch, userPreferredSearch]);
|
|
106
|
+
}, [mostRecentSearch, userPreferredSearch, hasUrlFilterQuery]);
|
|
95
107
|
useEffect(() => {
|
|
96
108
|
var _a;
|
|
97
109
|
// enable save search button as soon as user changes something in the input search box
|
package/lib/esm/css/caseList.css
CHANGED
|
@@ -248,10 +248,14 @@
|
|
|
248
248
|
border-bottom: 1px solid var(--pf-t--global--border--color--100);
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
.case-list-table .pf-v6-c-label .pf-v6-c-label__content .pf-v6-c-label__icon {
|
|
251
|
+
.case-list-table td[data-label='Case labels'] .pf-v6-c-label .pf-v6-c-label__content .pf-v6-c-label__icon {
|
|
252
252
|
display: none;
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
+
.case-number-section .archived-case-label.pf-m-purple .pf-v6-c-label__icon {
|
|
256
|
+
color: #5e40be;
|
|
257
|
+
}
|
|
258
|
+
|
|
255
259
|
.case-list-table th#caseLabel,
|
|
256
260
|
.case-list-table td[data-label='Case labels'] {
|
|
257
261
|
width: 20rem;
|
|
@@ -127,8 +127,10 @@ export declare const sfdcFieldToSolrMap: {
|
|
|
127
127
|
caseType: SolrKeys;
|
|
128
128
|
lastClosedAt: SolrKeys;
|
|
129
129
|
};
|
|
130
|
+
export declare const ARCHIVED_STATUS = "Archived";
|
|
130
131
|
export declare const AdditionalFilterLabels: {
|
|
131
132
|
case_customer_escalation: string;
|
|
132
133
|
case_private: string;
|
|
134
|
+
archived: string;
|
|
133
135
|
};
|
|
134
136
|
//# sourceMappingURL=filters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/enums/filters.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAChB,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;CACpB;AAED,oBAAY,QAAQ;IAChB,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,OAAO,iBAAiB;IACxB,MAAM,gBAAgB;IACtB,aAAa,uBAAuB;IACpC,KAAK,sBAAsB;IAC3B,SAAS,oBAAoB;IAC7B,QAAQ,kBAAkB;IAC1B,SAAS,4BAA4B;IACrC,SAAS,eAAe;IACxB,WAAW,qBAAqB;IAChC,cAAc,8BAA8B;IAC5C,UAAU,6BAA6B;IACvC,OAAO,iBAAiB;IACxB,SAAS,uBAAuB;IAChC,oBAAoB,gCAAgC;IACpD,WAAW,qBAAqB;IAChC,UAAU,4BAA4B;IACtC,YAAY,0BAA0B;IACtC,oBAAoB,iCAAiC;IACrD,sBAAsB,+BAA+B;IACrD,WAAW,qBAAqB;IAChC,GAAG,QAAQ;IACX,GAAG,cAAc;IACjB,IAAI,cAAc;IAClB,GAAG,gBAAgB;IACnB,WAAW,sBAAsB;IACjC,WAAW,sBAAsB;IACjC,cAAc,oBAAoB;IAClC,kBAAkB,8BAA8B;IAChD,SAAS,iBAAiB;IAC1B,SAAS,eAAe;CAC3B;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC7B,CAAC;AAGF,oBAAY,aAAa;IACrB,eAAe,8BAA8B;CAChD;AAED,eAAO,MAAM,iBAAiB,8BAA4C,CAAC;AAC3E,oBAAY,QAAQ;IAChB,UAAU,eAAe;IACzB,WAAW,YAAY;IACvB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,aAAa,qBAAqB;IAClC,QAAQ,aAAa;IACrB,SAAS,YAAY;IACrB,WAAW,gBAAgB;IAC3B,SAAS,mBAAmB;IAC5B,UAAU,uBAAuB;IACjC,OAAO,YAAY;IACnB,SAAS,gBAAgB;IACzB,oBAAoB,gCAAgC;IACpD,WAAW,gBAAgB;IAC3B,UAAU,qBAAqB;IAC/B,YAAY,qBAAqB;IACjC,oBAAoB,qBAAqB;IACzC,sBAAsB,qBAAqB;IAC3C,WAAW,gBAAgB;IAC3B,GAAG,QAAQ;IACX,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,cAAc,iBAAiB;CAClC;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;CAsB9B,CAAC;AAEF,eAAO,MAAM,sBAAsB
|
|
1
|
+
{"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../../src/enums/filters.ts"],"names":[],"mappings":"AAAA,oBAAY,QAAQ;IAChB,SAAS,cAAc;IACvB,QAAQ,aAAa;IACrB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,UAAU,eAAe;IACzB,MAAM,WAAW;CACpB;AAED,oBAAY,QAAQ;IAChB,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,OAAO,iBAAiB;IACxB,MAAM,gBAAgB;IACtB,aAAa,uBAAuB;IACpC,KAAK,sBAAsB;IAC3B,SAAS,oBAAoB;IAC7B,QAAQ,kBAAkB;IAC1B,SAAS,4BAA4B;IACrC,SAAS,eAAe;IACxB,WAAW,qBAAqB;IAChC,cAAc,8BAA8B;IAC5C,UAAU,6BAA6B;IACvC,OAAO,iBAAiB;IACxB,SAAS,uBAAuB;IAChC,oBAAoB,gCAAgC;IACpD,WAAW,qBAAqB;IAChC,UAAU,4BAA4B;IACtC,YAAY,0BAA0B;IACtC,oBAAoB,iCAAiC;IACrD,sBAAsB,+BAA+B;IACrD,WAAW,qBAAqB;IAChC,GAAG,QAAQ;IACX,GAAG,cAAc;IACjB,IAAI,cAAc;IAClB,GAAG,gBAAgB;IACnB,WAAW,sBAAsB;IACjC,WAAW,sBAAsB;IACjC,cAAc,oBAAoB;IAClC,kBAAkB,8BAA8B;IAChD,SAAS,iBAAiB;IAC1B,SAAS,eAAe;CAC3B;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC7B,CAAC;AAGF,oBAAY,aAAa;IACrB,eAAe,8BAA8B;CAChD;AAED,eAAO,MAAM,iBAAiB,8BAA4C,CAAC;AAC3E,oBAAY,QAAQ;IAChB,UAAU,eAAe;IACzB,WAAW,YAAY;IACvB,OAAO,YAAY;IACnB,MAAM,WAAW;IACjB,aAAa,qBAAqB;IAClC,QAAQ,aAAa;IACrB,SAAS,YAAY;IACrB,WAAW,gBAAgB;IAC3B,SAAS,mBAAmB;IAC5B,UAAU,uBAAuB;IACjC,OAAO,YAAY;IACnB,SAAS,gBAAgB;IACzB,oBAAoB,gCAAgC;IACpD,WAAW,gBAAgB;IAC3B,UAAU,qBAAqB;IAC/B,YAAY,qBAAqB;IACjC,oBAAoB,qBAAqB;IACzC,sBAAsB,qBAAqB;IAC3C,WAAW,gBAAgB;IAC3B,GAAG,QAAQ;IACX,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,QAAQ,aAAa;IACrB,cAAc,iBAAiB;CAClC;AAED,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;CAsB9B,CAAC;AAEF,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C,eAAO,MAAM,sBAAsB;;;;CAIlC,CAAC"}
|
package/lib/esm/enums/filters.js
CHANGED
|
@@ -132,7 +132,9 @@ export const sfdcFieldToSolrMap = {
|
|
|
132
132
|
[SFDCKeys.caseType]: SolrKeys.type,
|
|
133
133
|
[SFDCKeys.caseClosedDate]: SolrKeys.caseClosedDate,
|
|
134
134
|
};
|
|
135
|
+
export const ARCHIVED_STATUS = 'Archived';
|
|
135
136
|
export const AdditionalFilterLabels = {
|
|
136
137
|
[SolrKeys.escalation]: 'Escalated cases',
|
|
137
138
|
[SolrKeys.isPrivate]: 'Private cases',
|
|
139
|
+
archived: ARCHIVED_STATUS,
|
|
138
140
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCaseLabels.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCaseLabels.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useCaseLabels.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCaseLabels.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,gBAAgB;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CAChB;AAOD,UAAU,mBAAmB;IACzB,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,+EAA+E;AAC/E,wBAAgB,aAAa,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,mBAAmB,CA8BrE"}
|
|
@@ -8,7 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
10
|
import { useApolloClient } from '@apollo/client/react';
|
|
11
|
-
import {
|
|
11
|
+
import { fetchAllAccountCaseLabels } from '@rh-support/utils';
|
|
12
12
|
import unescape from 'lodash/unescape';
|
|
13
13
|
import { useCallback, useEffect, useState } from 'react';
|
|
14
14
|
const mapCaseLabelNode = (node) => {
|
|
@@ -25,7 +25,6 @@ export function useCaseLabels(accountId) {
|
|
|
25
25
|
const [loading, setLoading] = useState(false);
|
|
26
26
|
const [error, setError] = useState(undefined);
|
|
27
27
|
const fetchLabels = useCallback(() => __awaiter(this, void 0, void 0, function* () {
|
|
28
|
-
var _a, _b, _c, _d;
|
|
29
28
|
if (!accountId) {
|
|
30
29
|
setLabels([]);
|
|
31
30
|
return;
|
|
@@ -33,13 +32,8 @@ export function useCaseLabels(accountId) {
|
|
|
33
32
|
setLoading(true);
|
|
34
33
|
setError(undefined);
|
|
35
34
|
try {
|
|
36
|
-
const
|
|
37
|
-
|
|
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));
|
|
35
|
+
const labelNodes = yield fetchAllAccountCaseLabels(client, accountId);
|
|
36
|
+
setLabels(labelNodes.map(mapCaseLabelNode).filter((label) => label.id && label.name));
|
|
43
37
|
}
|
|
44
38
|
catch (e) {
|
|
45
39
|
setError(e);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caseListGraphQLUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseListGraphQLUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAKH,aAAa,EAEhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAkB,MAAM,+CAA+C,CAAC;AASrG,MAAM,WAAW,wBAAwB;IACrC,gBAAgB,EAAE;QACd,QAAQ,EAAE;YACN,IAAI,EAAE,aAAa,EAAE,CAAC;YACtB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;SACjB,CAAC;KACL,CAAC;IACF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAwDD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAkFD,wBAAsB,sBAAsB,CACxC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAC9B,yBAAyB,UAAQ,GAClC,OAAO,CAAC,wBAAwB,CAAC,
|
|
1
|
+
{"version":3,"file":"caseListGraphQLUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseListGraphQLUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAKH,aAAa,EAEhB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,oBAAoB,EAAkB,MAAM,+CAA+C,CAAC;AASrG,MAAM,WAAW,wBAAwB;IACrC,gBAAgB,EAAE;QACd,QAAQ,EAAE;YACN,IAAI,EAAE,aAAa,EAAE,CAAC;YACtB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;SACjB,CAAC;KACL,CAAC;IACF,gBAAgB,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAwDD,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AAkFD,wBAAsB,sBAAsB,CACxC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,aAAa,CAAC,EAAE,MAAM,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,EAC9B,yBAAyB,UAAQ,GAClC,OAAO,CAAC,wBAAwB,CAAC,CAuGnC;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAC/B,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,EACpB,yBAAyB,UAAQ,GAClC,OAAO,CAAC,eAAe,CAAC,CAwD1B"}
|
|
@@ -7,6 +7,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
11
|
+
var t = {};
|
|
12
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
13
|
+
t[p] = s[p];
|
|
14
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
15
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
16
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
17
|
+
t[p[i]] = s[p[i]];
|
|
18
|
+
}
|
|
19
|
+
return t;
|
|
20
|
+
};
|
|
10
21
|
import { GET_CASES_BY_FILTERS, GET_GROUP_IDS_BY_NAME, GET_PRODUCTS, GET_USER_IDS_BY_FEDERATION, } from '@rh-support/utils';
|
|
11
22
|
import { SolrKeys, SolrPivotKeys } from '../enums/filters';
|
|
12
23
|
import { mapGraphQLResponseToCaseList } from './caseListMapper';
|
|
@@ -161,30 +172,39 @@ export function getCaseListFromGraphQL(filterState_1, apolloClient_1, limitOverr
|
|
|
161
172
|
resolvedUserIds = { ownerUserIds };
|
|
162
173
|
}
|
|
163
174
|
const variables = yield createGraphQLVariablesFromFilterState(filterState, apolloClient, resolvedUserIds, includeSecureSupportCases);
|
|
175
|
+
const { forceEmptyResult } = variables, caseQueryVariables = __rest(variables, ["forceEmptyResult"]);
|
|
164
176
|
if (limitOverride) {
|
|
165
|
-
|
|
177
|
+
caseQueryVariables.first = limitOverride;
|
|
178
|
+
}
|
|
179
|
+
if (forceEmptyResult) {
|
|
180
|
+
return {
|
|
181
|
+
caseListResponse: { response: { docs: [], numFound: 0, start: 0 } },
|
|
182
|
+
showErrorMessage: false,
|
|
183
|
+
hasNextPage: false,
|
|
184
|
+
endCursor: undefined,
|
|
185
|
+
};
|
|
166
186
|
}
|
|
167
187
|
const currentPage = ((_a = filterState.paginationInfo) === null || _a === void 0 ? void 0 : _a.currentPage) || 1;
|
|
168
188
|
if (selectedCaseNumbers === null || selectedCaseNumbers === void 0 ? void 0 : selectedCaseNumbers.length) {
|
|
169
189
|
const caseNumberFilter = { CaseNumber__c: { in: selectedCaseNumbers } };
|
|
170
|
-
|
|
171
|
-
if ((_b =
|
|
172
|
-
|
|
190
|
+
caseQueryVariables.first = selectedCaseNumbers.length;
|
|
191
|
+
if ((_b = caseQueryVariables.where) === null || _b === void 0 ? void 0 : _b.and) {
|
|
192
|
+
caseQueryVariables.where.and.push(caseNumberFilter);
|
|
173
193
|
}
|
|
174
|
-
else if (
|
|
175
|
-
|
|
194
|
+
else if (caseQueryVariables.where) {
|
|
195
|
+
caseQueryVariables.where = { and: [caseQueryVariables.where, caseNumberFilter] };
|
|
176
196
|
}
|
|
177
197
|
else {
|
|
178
|
-
|
|
198
|
+
caseQueryVariables.where = caseNumberFilter;
|
|
179
199
|
}
|
|
180
|
-
|
|
200
|
+
caseQueryVariables.after = undefined;
|
|
181
201
|
}
|
|
182
202
|
else {
|
|
183
|
-
|
|
203
|
+
caseQueryVariables.after = getCursorForPage(currentPage);
|
|
184
204
|
}
|
|
185
205
|
const { data, error } = yield apolloClient.query({
|
|
186
206
|
query: GET_CASES_BY_FILTERS,
|
|
187
|
-
variables,
|
|
207
|
+
variables: caseQueryVariables,
|
|
188
208
|
fetchPolicy: 'network-only',
|
|
189
209
|
context: signal ? { fetchOptions: { signal } } : undefined,
|
|
190
210
|
});
|
|
@@ -250,11 +270,15 @@ export function loadMoreCases(filterState_1, apolloClient_1, afterCursor_1, sign
|
|
|
250
270
|
resolvedUserIds = { ownerUserIds };
|
|
251
271
|
}
|
|
252
272
|
const variables = yield createGraphQLVariablesFromFilterState(filterState, apolloClient, resolvedUserIds, includeSecureSupportCases);
|
|
253
|
-
variables
|
|
254
|
-
|
|
273
|
+
const { forceEmptyResult } = variables, caseQueryVariables = __rest(variables, ["forceEmptyResult"]);
|
|
274
|
+
if (forceEmptyResult) {
|
|
275
|
+
return { docs: [], hasNextPage: false, endCursor: undefined };
|
|
276
|
+
}
|
|
277
|
+
caseQueryVariables.first = 20;
|
|
278
|
+
caseQueryVariables.after = afterCursor;
|
|
255
279
|
const { data } = yield apolloClient.query({
|
|
256
280
|
query: GET_CASES_BY_FILTERS,
|
|
257
|
-
variables,
|
|
281
|
+
variables: caseQueryVariables,
|
|
258
282
|
fetchPolicy: 'no-cache',
|
|
259
283
|
context: Object.assign({ queryDeduplication: false }, (signal ? { fetchOptions: { signal } } : undefined)),
|
|
260
284
|
});
|
|
@@ -6,6 +6,8 @@ export interface IGraphQLCaseListVariables {
|
|
|
6
6
|
first: number;
|
|
7
7
|
where?: Record<string, unknown>;
|
|
8
8
|
orderBy?: Record<string, unknown>;
|
|
9
|
+
/** When true, filters resolve to zero cases (e.g. label with no linked cases) — skip the cases query. */
|
|
10
|
+
forceEmptyResult?: boolean;
|
|
9
11
|
}
|
|
10
12
|
export interface IResolvedUserIds {
|
|
11
13
|
/** Pre-resolved OwnerId values (RedHatSupportUser or RedHatSupportGroup). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caseListVariablesBuilder.d.ts","sourceRoot":"","sources":["../../../src/utils/caseListVariablesBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnD,OAAO,EAEH,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAMvD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAM1F;AAED,MAAM,WAAW,yBAAyB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"caseListVariablesBuilder.d.ts","sourceRoot":"","sources":["../../../src/utils/caseListVariablesBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAcnD,OAAO,EAEH,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAMvD,wBAAgB,8BAA8B,CAAC,WAAW,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAM1F;AAED,MAAM,WAAW,yBAAyB;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,yGAAyG;IACzG,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAgB;IAC7B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAicD,wBAAsB,qCAAqC,CACvD,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,eAAe,CAAC,EAAE,gBAAgB,EAClC,yBAAyB,UAAQ,GAClC,OAAO,CAAC,yBAAyB,CAAC,CA0IpC"}
|
|
@@ -161,35 +161,41 @@ function resolveGroupIds(groups, apolloClient) {
|
|
|
161
161
|
}
|
|
162
162
|
/**
|
|
163
163
|
* Resolve case numbers for selected label Ids via RedHatSupportCaseLabelLink__c
|
|
164
|
-
* (Label__r.Id filter → Case__r.CaseNumber__c)
|
|
164
|
+
* (Label__r.Id filter → Case__r.CaseNumber__c). Multiple labels use OR semantics:
|
|
165
|
+
* return cases that have any of the selected labels.
|
|
165
166
|
*/
|
|
166
|
-
function
|
|
167
|
+
function fetchCaseNumbersForLabelLinkWhere(where, apolloClient) {
|
|
167
168
|
return __awaiter(this, void 0, void 0, function* () {
|
|
168
169
|
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
170
|
const PAGE_SIZE = 2000;
|
|
174
171
|
const allCaseNumbers = [];
|
|
175
172
|
let hasNextPage = true;
|
|
176
173
|
let afterCursor;
|
|
174
|
+
while (hasNextPage) {
|
|
175
|
+
const { data } = yield apolloClient.query({
|
|
176
|
+
query: GET_CASE_NUMBERS_BY_CASE_LABEL,
|
|
177
|
+
variables: Object.assign({ where, first: PAGE_SIZE }, (afterCursor ? { after: afterCursor } : {})),
|
|
178
|
+
fetchPolicy: 'network-only',
|
|
179
|
+
});
|
|
180
|
+
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;
|
|
181
|
+
const edges = (_c = connection === null || connection === void 0 ? void 0 : connection.edges) !== null && _c !== void 0 ? _c : [];
|
|
182
|
+
allCaseNumbers.push(...edges
|
|
183
|
+
.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; })
|
|
184
|
+
.filter((caseNumber) => Boolean(caseNumber)));
|
|
185
|
+
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;
|
|
186
|
+
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;
|
|
187
|
+
}
|
|
188
|
+
return allCaseNumbers;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
function resolveCaseNumbersByLabelIds(labelIds, apolloClient) {
|
|
192
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
193
|
+
if (!labelIds.length) {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
177
196
|
try {
|
|
178
|
-
|
|
179
|
-
|
|
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)];
|
|
197
|
+
const caseNumberSets = yield Promise.all(labelIds.map((labelId) => fetchCaseNumbersForLabelLinkWhere({ Label__r: { Id: { eq: labelId } } }, apolloClient)));
|
|
198
|
+
return [...new Set(caseNumberSets.flat())];
|
|
193
199
|
}
|
|
194
200
|
catch (error) {
|
|
195
201
|
console.error('[GraphQL] Failed to resolve case numbers by case label:', error);
|
|
@@ -496,7 +502,10 @@ export function createGraphQLVariablesFromFilterState(filterState_1, apolloClien
|
|
|
496
502
|
const labelIds = (_a = caseLabels === null || caseLabels === void 0 ? void 0 : caseLabels.map((label) => label.key).filter(Boolean)) !== null && _a !== void 0 ? _a : [];
|
|
497
503
|
if (labelIds.length) {
|
|
498
504
|
const caseNumbers = yield resolveCaseNumbersByLabelIds(labelIds, apolloClient);
|
|
499
|
-
|
|
505
|
+
if (!caseNumbers.length) {
|
|
506
|
+
return { first, orderBy, forceEmptyResult: true };
|
|
507
|
+
}
|
|
508
|
+
const caseLabelFilter = buildCaseNumberInFilter(caseNumbers);
|
|
500
509
|
if (caseLabelFilter)
|
|
501
510
|
andConditions.push(caseLabelFilter);
|
|
502
511
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rh-support/cases",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.233",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org"
|
|
@@ -38,11 +38,11 @@
|
|
|
38
38
|
"@patternfly/patternfly": "6.2.1",
|
|
39
39
|
"@patternfly/react-core": "6.2.1",
|
|
40
40
|
"@patternfly/react-table": "6.2.1",
|
|
41
|
-
"@rh-support/components": "2.5.
|
|
42
|
-
"@rh-support/react-context": "2.5.
|
|
41
|
+
"@rh-support/components": "2.5.230",
|
|
42
|
+
"@rh-support/react-context": "2.5.325",
|
|
43
43
|
"@rh-support/types": "2.0.26",
|
|
44
|
-
"@rh-support/user-permissions": "2.5.
|
|
45
|
-
"@rh-support/utils": "2.5.
|
|
44
|
+
"@rh-support/user-permissions": "2.5.178",
|
|
45
|
+
"@rh-support/utils": "2.5.157",
|
|
46
46
|
"localforage": "^1.10.0",
|
|
47
47
|
"lodash": "^4.17.21",
|
|
48
48
|
"pegjs": "^0.10.0",
|
|
@@ -94,5 +94,5 @@
|
|
|
94
94
|
"defaults and supports es6-module",
|
|
95
95
|
"maintained node versions"
|
|
96
96
|
],
|
|
97
|
-
"gitHead": "
|
|
97
|
+
"gitHead": "78790ed8b35b8acbc7a3a4a182d212499a0cd181"
|
|
98
98
|
}
|