@rh-support/cases 2.6.229 → 2.6.230

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  2. package/lib/esm/components/case-list/CaseList.js +7 -1
  3. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.d.ts.map +1 -1
  4. package/lib/esm/components/case-list/case-list-filters/AdditionalFilters.js +16 -4
  5. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -1
  6. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +2 -1
  7. package/lib/esm/components/case-list/case-list-filters/StatusFilter.d.ts.map +1 -1
  8. package/lib/esm/components/case-list/case-list-filters/StatusFilter.js +13 -9
  9. package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.d.ts.map +1 -1
  10. package/lib/esm/components/case-list/case-list-table/ArchivedCaseLabel.js +1 -1
  11. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts +2 -0
  12. package/lib/esm/components/case-list/case-list-table/CaseListTable.d.ts.map +1 -1
  13. package/lib/esm/components/case-list/case-list-table/CaseListTable.js +13 -2
  14. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
  15. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +14 -2
  16. package/lib/esm/css/caseList.css +5 -1
  17. package/lib/esm/enums/filters.d.ts +2 -0
  18. package/lib/esm/enums/filters.d.ts.map +1 -1
  19. package/lib/esm/enums/filters.js +2 -0
  20. package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -1
  21. package/lib/esm/hooks/useCaseLabels.js +3 -9
  22. package/lib/esm/utils/caseListGraphQLUtils.d.ts.map +1 -1
  23. package/lib/esm/utils/caseListGraphQLUtils.js +37 -13
  24. package/lib/esm/utils/caseListVariablesBuilder.d.ts +2 -0
  25. package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -1
  26. package/lib/esm/utils/caseListVariablesBuilder.js +31 -22
  27. 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;AAuC1C,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,qBAsxBrC"}
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,sBAqGhC"}
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,sBAiQ/B"}
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
- newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().startsWith(inputValue.toLowerCase()));
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;AAQ/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,qBAqKzC"}
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, PORTAL_DISPLAY_STATUSES, PORTAL_OPEN_DISPLAY_STATUSES } from '../../../utils/constants';
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 = PORTAL_DISPLAY_STATUSES.map((status) => ({ value: status, key: status }));
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'), (filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) || [], ' ', list.length, t('All selected'));
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
- var _a;
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 = (_a = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.status]) === null || _a === void 0 ? void 0 : _a.reduce((selection, status) => {
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,sBAMxC"}
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,qBA6iB1C"}
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 loadingRowDefault;
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":"AAsBA,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAahE,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,qBA0TvD"}
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 { createFilterStateFromAdvancedQuery } from '../../../utils/caseSearchUtils';
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
@@ -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;;;CAGlC,CAAC"}
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"}
@@ -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":"AAUA,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,CAmCrE"}
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 { GET_CASE_LABELS, } from '@rh-support/utils';
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 { data } = yield client.query({
37
- query: GET_CASE_LABELS,
38
- variables: { where: { Account__c: { eq: accountId } } },
39
- fetchPolicy: 'cache-first',
40
- });
41
- const edges = (_d = (_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.redhat_support_uiapi) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.RedHatSupportCaseLabel__c) === null || _c === void 0 ? void 0 : _c.edges) !== null && _d !== void 0 ? _d : [];
42
- setLabels(edges.map(({ node }) => mapCaseLabelNode(node)).filter((label) => label.id && label.name));
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,CA6FnC;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,CAoD1B"}
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
- variables.first = limitOverride;
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
- variables.first = selectedCaseNumbers.length;
171
- if ((_b = variables.where) === null || _b === void 0 ? void 0 : _b.and) {
172
- variables.where.and.push(caseNumberFilter);
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 (variables.where) {
175
- variables.where = { and: [variables.where, caseNumberFilter] };
194
+ else if (caseQueryVariables.where) {
195
+ caseQueryVariables.where = { and: [caseQueryVariables.where, caseNumberFilter] };
176
196
  }
177
197
  else {
178
- variables.where = caseNumberFilter;
198
+ caseQueryVariables.where = caseNumberFilter;
179
199
  }
180
- variables.after = undefined;
200
+ caseQueryVariables.after = undefined;
181
201
  }
182
202
  else {
183
- variables.after = getCursorForPage(currentPage);
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.first = 20;
254
- variables.after = afterCursor;
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;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC7B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAsbD,wBAAsB,qCAAqC,CACvD,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,eAAe,CAAC,EAAE,gBAAgB,EAClC,yBAAyB,UAAQ,GAClC,OAAO,CAAC,yBAAyB,CAAC,CAuIpC"}
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), matching the working UIAPI query.
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 resolveCaseNumbersByLabelIds(labelIds, apolloClient) {
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
- 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)];
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
- const caseLabelFilter = buildCaseNumberInFilter(caseNumbers, true);
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.229",
3
+ "version": "2.6.230",
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.225",
42
- "@rh-support/react-context": "2.5.321",
41
+ "@rh-support/components": "2.5.226",
42
+ "@rh-support/react-context": "2.5.322",
43
43
  "@rh-support/types": "2.0.26",
44
- "@rh-support/user-permissions": "2.5.173",
45
- "@rh-support/utils": "2.5.152",
44
+ "@rh-support/user-permissions": "2.5.174",
45
+ "@rh-support/utils": "2.5.153",
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": "4cb198056cdf53141dcdf4d9b55d9cbb36940e05"
97
+ "gitHead": "7e9d99cabdfd48a98e1fda53bd6747c1797c548c"
98
98
  }