@rh-support/cases 2.6.208 → 2.6.209

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 (29) hide show
  1. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  2. package/lib/esm/components/case-list/CaseList.js +49 -17
  3. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +1 -0
  4. package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
  5. package/lib/esm/components/case-list/CaseListFilterReducer.js +2 -0
  6. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +3 -0
  7. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -0
  8. package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +177 -0
  9. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
  10. package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +2 -0
  11. package/lib/esm/enums/caseSearch.d.ts +2 -0
  12. package/lib/esm/enums/caseSearch.d.ts.map +1 -1
  13. package/lib/esm/enums/caseSearch.js +1 -0
  14. package/lib/esm/enums/filters.d.ts +3 -1
  15. package/lib/esm/enums/filters.d.ts.map +1 -1
  16. package/lib/esm/enums/filters.js +2 -0
  17. package/lib/esm/hooks/useCaseLabels.d.ts +14 -0
  18. package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -0
  19. package/lib/esm/hooks/useCaseLabels.js +55 -0
  20. package/lib/esm/utils/advanceSearchUtils.d.ts.map +1 -1
  21. package/lib/esm/utils/advanceSearchUtils.js +1 -0
  22. package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -1
  23. package/lib/esm/utils/caseListVariablesBuilder.js +127 -9
  24. package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
  25. package/lib/esm/utils/caseSearchUtils.js +13 -1
  26. package/lib/esm/utils/constants.d.ts +1 -0
  27. package/lib/esm/utils/constants.d.ts.map +1 -1
  28. package/lib/esm/utils/constants.js +3 -0
  29. 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;AAsClC,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAqC1C,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAMD,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBA0lBrC"}
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;AAsClC,OAAO,KAAkD,MAAM,OAAO,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAe,MAAM,kBAAkB,CAAC;AAEpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAqC1C,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAMD,MAAM,WAAW,gBAAgB;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAAC;CAChC;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,qBAkpBrC"}
@@ -38,14 +38,14 @@ import { isNoFilterApplied, isOnlyDefaultFilterApplied } from './CaseListFilterH
38
38
  import { updateFilterState } from './CaseListFilterReducer';
39
39
  import { appendCaseList, setCaseList, setCurrentQuery, setCursorInfo, setIsFetching, setIsLoadingMore, setLoadMoreError, } from './CaseListReducer';
40
40
  export function CaseList(props) {
41
- var _a, _b, _c;
41
+ var _a, _b, _c, _d, _e;
42
42
  const { t } = useTranslation();
43
43
  useDocumentTitle(PageTitle.CASE_LIST);
44
44
  const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
45
45
  const { caseList, isFetching, isLoadingMore, hasNextPage, endCursor, currentQuery, loadMoreError, loadMoreRetryCount, } = useCaseListStateContext();
46
46
  const CaseListDispatch = useCaseListDispatchContext();
47
47
  const breakPoint = useBreakpoint();
48
- const { globalMetadataState, globalMetadataState: { caseGroups, loggedInUserRights, loggedInUsersAccount, userPreferences, managedAccounts, bookmarkedAccounts, allCaseTypes, allCaseSeverities, allCaseStatuses, allProducts, caseRecordTypes, caseListTraditionalSupportAgreed, }, } = useContext(GlobalMetadataStateContext);
48
+ const { globalMetadataState, globalMetadataState: { caseGroups, loggedInUser, loggedInUserRights, loggedInUsersAccount, userPreferences, managedAccounts, bookmarkedAccounts, allCaseTypes, allCaseSeverities, allCaseStatuses, allProducts, caseRecordTypes, caseListTraditionalSupportAgreed, }, } = useContext(GlobalMetadataStateContext);
49
49
  const globalDispatchContext = useGlobalDispatchContext();
50
50
  const apolloClient = useApolloClient();
51
51
  const location = useLocation();
@@ -271,19 +271,29 @@ export function CaseList(props) {
271
271
  }
272
272
  });
273
273
  const salesforceAccountId = (_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
274
+ const loggedInContactId = (_b = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _b === void 0 ? void 0 : _b.id;
275
+ const loggedInIsOrgAdmin = (_c = loggedInUser === null || loggedInUser === void 0 ? void 0 : loggedInUser.data) === null || _c === void 0 ? void 0 : _c.isOrgAdmin;
274
276
  useEffect(() => {
275
277
  var _a;
276
278
  if (!salesforceAccountId)
277
279
  return;
278
280
  if (haventLoadedMetadata(caseGroups, (data) => data === undefined)) {
279
281
  if ((_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.isInternal) {
280
- fetchCaseGroupsForAccount(dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId);
282
+ fetchCaseGroupsForAccount(dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId, undefined, loggedInContactId, loggedInIsOrgAdmin);
281
283
  }
282
284
  else {
283
- fetchCaseGroupsForSSO(dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId);
285
+ fetchCaseGroupsForSSO(dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId, undefined, loggedInContactId, loggedInIsOrgAdmin);
284
286
  }
285
287
  }
286
- }, [caseGroups, dispatchToGlobalMetadataReducer, apolloClient, salesforceAccountId, loggedInUsersAccount.data]);
288
+ }, [
289
+ caseGroups,
290
+ dispatchToGlobalMetadataReducer,
291
+ apolloClient,
292
+ salesforceAccountId,
293
+ loggedInUsersAccount.data,
294
+ loggedInContactId,
295
+ loggedInIsOrgAdmin,
296
+ ]);
287
297
  useEffect(() => {
288
298
  const loadMetadata = () => __awaiter(this, void 0, void 0, function* () {
289
299
  if (haventLoadedMetadata(allCaseTypes)) {
@@ -365,15 +375,42 @@ export function CaseList(props) {
365
375
  caseRecordTypes.isFetching ||
366
376
  isEmpty(caseRecordTypes.data))
367
377
  return;
378
+ const decodedQueryFromUrl = (() => {
379
+ if (!queryFromUrl || queryFromUrl === 'undefined') {
380
+ return '';
381
+ }
382
+ try {
383
+ return decodeURIComponent(queryFromUrl);
384
+ }
385
+ catch (_a) {
386
+ return queryFromUrl;
387
+ }
388
+ })();
368
389
  // when user manually changes url and hit enter, new result is fetched without refreshing the page
369
390
  if (!isFirstMount.current) {
370
- if (queryFromUrl !== currentQuery && queryFromUrl !== lastPushedQueryRef.current) {
371
- const filterStateFromQueryUrl = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, undefined, 1, searchType);
391
+ if (decodedQueryFromUrl &&
392
+ decodedQueryFromUrl !== currentQuery &&
393
+ decodedQueryFromUrl !== lastPushedQueryRef.current) {
394
+ const filterStateFromQueryUrl = createFilterStateFromUrlQuery(decodedQueryFromUrl, globalMetadataState, undefined, 1, searchType);
372
395
  updateFilterState(filterDispatch, filterStateFromQueryUrl);
373
396
  }
374
397
  return;
375
398
  }
376
399
  if (isFirstMount.current) {
400
+ if (searchParams.rhcd) {
401
+ // this is to check if rhcd is passed on first load
402
+ setRHCDValue(searchParams.rhcd);
403
+ }
404
+ const hasExplicitUrlQuery = Boolean(decodedQueryFromUrl.trim());
405
+ if (hasExplicitUrlQuery && decodedQueryFromUrl !== currentQuery) {
406
+ const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodedQueryFromUrl, undefined, 1, searchType);
407
+ setDefaultSavedSearchName(defaultSearchName);
408
+ setCurrentQuery(CaseListDispatch, decodedQueryFromUrl);
409
+ lastPushedQueryRef.current = decodedQueryFromUrl;
410
+ isFirstMount.current = false;
411
+ updateFilterState(filterDispatch, initFilterState);
412
+ return;
413
+ }
377
414
  // user came to page from another tab - second time on page as currentQuery is set
378
415
  // - keep state and show the result that we already have in state
379
416
  // - update url to reflect filter state
@@ -388,23 +425,18 @@ export function CaseList(props) {
388
425
  isFirstMount.current = false;
389
426
  return;
390
427
  }
391
- /*** user comes to this point on first time app load landing on case list ***/
392
- if (searchParams.rhcd) {
393
- // this is to check if rhcd is passed on first load
394
- setRHCDValue(searchParams.rhcd);
395
- }
396
428
  // set filter state based on url or default saved search
397
429
  // Remove when we get OFFSET field from SCT
398
430
  // Always reset to page 1 on fresh load — cursor-based pagination
399
431
  // has no stored cursors after refresh, so page > 1 would cause a mismatch
400
- const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodeURIComponent(queryFromUrl), undefined, 1, searchType);
432
+ const { initFilterState, defaultSearchName } = useFilterStateInit.set(decodedQueryFromUrl, undefined, 1, searchType);
401
433
  // to set default saved search name
402
434
  setDefaultSavedSearchName(defaultSearchName);
403
435
  // set default params when they are empty
404
- if (!queryFromUrl) {
436
+ if (!decodedQueryFromUrl) {
405
437
  searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = ' orderBy lastModifiedDate desc';
406
438
  }
407
- setCurrentQuery(CaseListDispatch, queryFromUrl);
439
+ setCurrentQuery(CaseListDispatch, decodedQueryFromUrl);
408
440
  isFirstMount.current = false;
409
441
  // we only update the state without api call as we fetch result in another useEffect that observes the state
410
442
  updateFilterState(filterDispatch, initFilterState);
@@ -451,8 +483,8 @@ export function CaseList(props) {
451
483
  React.createElement(ErrorBoundary, { errorMsgInfo: { message: t('There was an error loading filter chips') } },
452
484
  React.createElement(CaseListFilterChips, null))),
453
485
  React.createElement("section", { className: "case-search-bottom" },
454
- React.createElement("aside", { className: `case-search-filters ${((_b = filterSectionRef.current) === null || _b === void 0 ? void 0 : _b.expanded) ? '' : 'collapsed'}` },
455
- React.createElement("h2", { className: "filter-header pf-v6-u-display-flex" }, ((_c = filterSectionRef.current) === null || _c === void 0 ? void 0 : _c.expanded) ? (React.createElement(React.Fragment, null,
486
+ React.createElement("aside", { className: `case-search-filters ${((_d = filterSectionRef.current) === null || _d === void 0 ? void 0 : _d.expanded) ? '' : 'collapsed'}` },
487
+ React.createElement("h2", { className: "filter-header pf-v6-u-display-flex" }, ((_e = filterSectionRef.current) === null || _e === void 0 ? void 0 : _e.expanded) ? (React.createElement(React.Fragment, null,
456
488
  React.createElement(Button, { isInline: true, className: "pf-v6-u-flex-shrink-0 pf-v6-u-flex-none case-search-filter-text-button", variant: "link", title: t('Collapse filter section'), "data-tracking-id": "collapse-case-list-filter", onClick: onToggleFilterBtnClick, iconPosition: "right", icon: React.createElement(OpenDrawerRightIcon, { className: "mirrored" }) },
457
489
  React.createElement(Trans, null, "Filters")))) : (React.createElement(Button, { isInline: true, className: "pf-v6-c-button pf-m-link pf-m-inline pf-v6-u-flex-shrink-0 pf-v6-u-flex-none pf-v6-u-display-flex pf-v6-u-align-items-center pf-v6-u-justify-content-center pf-v6-u-px-lg", variant: "link", title: t('Expand filter section'), "data-tracking-id": "expand-case-list-filter", onClick: onToggleFilterBtnClick, iconPosition: "right", icon: React.createElement(OpenDrawerRightIcon, null) }, isXLScreen ? null : React.createElement(Trans, null, "Filters")))),
458
490
  React.createElement("div", { className: "filter-wrapper" },
@@ -37,6 +37,7 @@ export interface IFilterInfo {
37
37
  [SolrKeys.status]: Array<string>;
38
38
  [SolrKeys.accountNumber]: Array<IKeyValue<string>>;
39
39
  [SolrKeys.group]: Array<IKeyValue<string>>;
40
+ [SolrKeys.caseLabel]: Array<IKeyValue<string>>;
40
41
  [SolrKeys.severity]: Array<string>;
41
42
  [SolrKeys.caseOwner]: Array<string>;
42
43
  [SolrKeys.escalation]: Array<IKeyValue<string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"CaseListFilterReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterReducer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CaseListFilterReducer.d.ts","sourceRoot":"","sources":["../../../../src/components/case-list/CaseListFilterReducer.tsx"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export const initialFilterInfo = {
5
5
  [SolrKeys.status]: [],
6
6
  [SolrKeys.accountNumber]: [],
7
7
  [SolrKeys.group]: [],
8
+ [SolrKeys.caseLabel]: [],
8
9
  [SolrKeys.severity]: [],
9
10
  [SolrKeys.caseOwner]: [],
10
11
  [SolrKeys.escalation]: [],
@@ -29,6 +30,7 @@ export const emptyFilters = {
29
30
  [SolrKeys.status]: [],
30
31
  [SolrKeys.accountNumber]: [],
31
32
  [SolrKeys.group]: [],
33
+ [SolrKeys.caseLabel]: [],
32
34
  [SolrKeys.severity]: [],
33
35
  [SolrKeys.caseOwner]: [],
34
36
  [SolrKeys.escalation]: [],
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function CaseLabelsFilter(): React.JSX.Element;
3
+ //# sourceMappingURL=CaseLabelsFilter.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,177 @@
1
+ import { MenuFooter, MenuToggle, Select, SelectList, SelectOption, TextInputGroup, TextInputGroupMain, } from '@patternfly/react-core';
2
+ import { GlobalMetadataStateContext } from '@rh-support/react-context';
3
+ import { ability, resourceActions, resources } from '@rh-support/user-permissions';
4
+ import { getDropdownBtnPlaceholder } from '@rh-support/utils';
5
+ import isEmpty from 'lodash/isEmpty';
6
+ import isEqual from 'lodash/isEqual';
7
+ import isUndefined from 'lodash/isUndefined';
8
+ import React, { useContext, useEffect, useMemo, useRef, useState } from 'react';
9
+ import { Trans, useTranslation } from 'react-i18next';
10
+ import { Link } from 'react-router-dom';
11
+ import { SolrKeys } from '../../../enums/filters';
12
+ import { useCaseLabels } from '../../../hooks/useCaseLabels';
13
+ import { filterNamesMap } from '../../../utils/constants';
14
+ import { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
15
+ import { updateFilter } from '../CaseListFilterReducer';
16
+ const EMPTY_LABELS = [];
17
+ export function CaseLabelsFilter() {
18
+ var _a, _b;
19
+ const { t } = useTranslation();
20
+ const { filterInfo } = useContext(CaseListFilterStateContext);
21
+ const dispatch = useContext(CaseListFilterDispatchContext);
22
+ const { globalMetadataState: { loggedInUsersAccount }, } = useContext(GlobalMetadataStateContext);
23
+ const accountId = (_a = loggedInUsersAccount.data) === null || _a === void 0 ? void 0 : _a.salesforceAccountId;
24
+ const { labels, loading: isLoading } = useCaseLabels(accountId);
25
+ const selectedLabels = (_b = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.caseLabel]) !== null && _b !== void 0 ? _b : EMPTY_LABELS;
26
+ const [inputValue, setInputValue] = useState('');
27
+ const [focusedItemIndex, setFocusedItemIndex] = useState(null);
28
+ const [activeItem, setActiveItem] = useState(null);
29
+ const [isOpen, setIsOpen] = useState(false);
30
+ const [selectedItems, setSelectedItems] = useState({});
31
+ const textInputRef = useRef();
32
+ const list = useMemo(() => labels.map((label) => ({ value: label.name, key: label.id })), [labels]);
33
+ const [selectOptions, setSelectOptions] = useState(list);
34
+ const canViewManageTab = ability.can(resourceActions.READ, resources.MANAGE);
35
+ const applyLabelSelection = (updatedFilterValues) => {
36
+ updateFilter(dispatch, {
37
+ filterKey: SolrKeys.caseLabel,
38
+ values: updatedFilterValues,
39
+ });
40
+ };
41
+ const isOptionSelected = (option) => Boolean((option.value && selectedItems[String(option.value)]) || (option.key && selectedItems[String(option.key)]));
42
+ const onToggleClick = () => {
43
+ setIsOpen(!isOpen);
44
+ };
45
+ const onSelect = (option) => {
46
+ const selectedOption = typeof option === 'string' ? list.find((item) => item.value === option || item.key === option) : option;
47
+ const optionValue = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.value;
48
+ const optionKey = selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.key;
49
+ if (!optionValue || optionValue === 'no results' || !optionKey) {
50
+ return;
51
+ }
52
+ const currentlySelected = selectedLabels.some((label) => label.key === optionKey);
53
+ const updatedFilterValues = currentlySelected
54
+ ? selectedLabels.filter((label) => label.key !== optionKey)
55
+ : [
56
+ ...selectedLabels.filter((label) => label.key !== optionKey),
57
+ { key: String(optionKey), value: String(optionValue) },
58
+ ];
59
+ applyLabelSelection(updatedFilterValues);
60
+ };
61
+ const handleMenuArrowKeys = (key) => {
62
+ if (!isOpen || !list.length) {
63
+ return;
64
+ }
65
+ let indexToFocus = 0;
66
+ if (key === 'ArrowUp') {
67
+ if (focusedItemIndex === null || focusedItemIndex === 0) {
68
+ indexToFocus = list.length - 1;
69
+ }
70
+ else {
71
+ indexToFocus = focusedItemIndex - 1;
72
+ }
73
+ }
74
+ if (key === 'ArrowDown') {
75
+ if (focusedItemIndex === null || focusedItemIndex === list.length - 1) {
76
+ indexToFocus = 0;
77
+ }
78
+ else {
79
+ indexToFocus = focusedItemIndex + 1;
80
+ }
81
+ }
82
+ setFocusedItemIndex(indexToFocus);
83
+ const focusedItem = list[indexToFocus];
84
+ if (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value) {
85
+ setActiveItem(`select-multi-typeahead-checkbox-${String(focusedItem.value).replace(' ', '-')}`);
86
+ }
87
+ };
88
+ const onInputKeyDown = (event) => {
89
+ const focusedItem = focusedItemIndex !== null ? list[focusedItemIndex] : list[0];
90
+ switch (event.key) {
91
+ case 'Enter':
92
+ if (!isOpen) {
93
+ setIsOpen((prevIsOpen) => !prevIsOpen);
94
+ }
95
+ else if (isOpen && (focusedItem === null || focusedItem === void 0 ? void 0 : focusedItem.value) !== 'no results') {
96
+ onSelect(focusedItem);
97
+ }
98
+ break;
99
+ case 'Tab':
100
+ case 'Escape':
101
+ setIsOpen(false);
102
+ setActiveItem(null);
103
+ break;
104
+ case 'ArrowUp':
105
+ case 'ArrowDown':
106
+ event.preventDefault();
107
+ handleMenuArrowKeys(event.key);
108
+ break;
109
+ }
110
+ };
111
+ const onTextInputChange = (_event, value) => {
112
+ setInputValue(value);
113
+ };
114
+ const placeholder = getDropdownBtnPlaceholder(isLoading ? t('Loading...') : t('Select a case label'), selectedLabels.map((label) => label.value), '', labels.length || 0, t('All selected'));
115
+ const toggle = (toggleRef) => (React.createElement(MenuToggle, { variant: "typeahead", onClick: onToggleClick, innerRef: toggleRef, isExpanded: isOpen, isFullWidth: true },
116
+ React.createElement(TextInputGroup, { isPlain: true },
117
+ React.createElement(TextInputGroupMain, Object.assign({ value: inputValue, onClick: onToggleClick, onChange: onTextInputChange, onKeyDown: onInputKeyDown, id: "case-list-case-label-filter-input", autoComplete: "off", innerRef: textInputRef, placeholder: placeholder }, (activeItem && { 'aria-activedescendant': activeItem }), { role: "combobox", isExpanded: isOpen, "aria-controls": "case-list-case-label-filter-listbox" })))));
118
+ const dropdownOptions = useMemo(() => {
119
+ return (!isEmpty(selectOptions) ? selectOptions : list).map((option, index) => !isUndefined(option.value) && (React.createElement(SelectOption, { key: option.key, value: option, hasCheckbox: true, isSelected: isOptionSelected(option), isFocused: focusedItemIndex !== null && focusedItemIndex === index, id: `select-multi-typeahead-${String(option.value).replace(' ', '-')}` }, option.value)));
120
+ // eslint-disable-next-line react-hooks/exhaustive-deps
121
+ }, [selectedItems, selectedLabels, labels, selectOptions, focusedItemIndex]);
122
+ useEffect(() => {
123
+ let newSelectOptions = list;
124
+ if (inputValue) {
125
+ newSelectOptions = list.filter((option) => String(option === null || option === void 0 ? void 0 : option.value).toLowerCase().startsWith(inputValue.toLowerCase()));
126
+ if (!newSelectOptions.length) {
127
+ newSelectOptions = [{ isDisabled: false, children: `No results found` }];
128
+ }
129
+ if (!isOpen) {
130
+ setIsOpen(true);
131
+ }
132
+ }
133
+ setSelectOptions(newSelectOptions);
134
+ setFocusedItemIndex(null);
135
+ setActiveItem(null);
136
+ // eslint-disable-next-line react-hooks/exhaustive-deps
137
+ }, [inputValue, list]);
138
+ useEffect(() => {
139
+ if (isEmpty(selectedLabels)) {
140
+ setSelectedItems({});
141
+ return;
142
+ }
143
+ const nextSelectedItems = selectedLabels.reduce((selection, label) => {
144
+ if (label === null || label === void 0 ? void 0 : label.value) {
145
+ selection[label.value] = true;
146
+ }
147
+ if (label === null || label === void 0 ? void 0 : label.key) {
148
+ selection[label.key] = true;
149
+ }
150
+ return selection;
151
+ }, {});
152
+ setSelectedItems(nextSelectedItems);
153
+ }, [selectedLabels]);
154
+ // Resolve deep-linked label IDs to display names once account labels are loaded
155
+ useEffect(() => {
156
+ if (!labels.length || !selectedLabels.length) {
157
+ return;
158
+ }
159
+ const resolved = selectedLabels.map((selected) => {
160
+ const match = labels.find((label) => label.id === selected.key || label.name === selected.value);
161
+ return match ? { key: match.id, value: match.name } : selected;
162
+ });
163
+ if (!isEqual(resolved, selectedLabels)) {
164
+ applyLabelSelection(resolved);
165
+ }
166
+ // eslint-disable-next-line react-hooks/exhaustive-deps
167
+ }, [labels, selectedLabels]);
168
+ return (React.createElement("div", { className: "case-labels-filter group-filter", "data-testid": "case-labels-filter" },
169
+ React.createElement("label", { htmlFor: "case-list-case-label-filter", className: "pf-v6-u-mb-sm group-filter-label" }, t(filterNamesMap[SolrKeys.caseLabel])),
170
+ React.createElement("div", { className: "pf-v6-c-select" },
171
+ React.createElement(Select, { shouldFocusToggleOnSelect: true, shouldPreventScrollOnItemFocus: true, "data-tracking-id": "case-labels-filter", id: "case-list-case-label-filter", title: t(filterNamesMap[SolrKeys.caseLabel]), isOpen: isOpen, selected: selectedItems, onSelect: (_e, v) => onSelect(v), onOpenChange: (nextOpen) => setIsOpen(nextOpen), popperProps: { direction: 'down', enableFlip: false }, toggle: toggle, isScrollable: true },
172
+ React.createElement(SelectList, null,
173
+ dropdownOptions,
174
+ canViewManageTab && (React.createElement(MenuFooter, { className: "group-filter-manage-groups-footer" },
175
+ React.createElement(Link, { className: "cta cta-link", to: "/manage/case-labels" },
176
+ React.createElement(Trans, null, "Manage case labels")))))))));
177
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"CaseListFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseListFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAqB,MAAM,OAAO,CAAC;AAY1C,UAAU,MAAM;IACZ,YAAY,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,eAAe,GAAI,mEAAmE,MAAM,sBAgExG,CAAC"}
1
+ {"version":3,"file":"CaseListFilters.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-list-filters/CaseListFilters.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAqB,MAAM,OAAO,CAAC;AAa1C,UAAU,MAAM;IACZ,YAAY,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,eAAe,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,iBAAiB,EAAE,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;IACjD,WAAW,EAAE,mBAAmB,CAAC,4BAA4B,CAAC,CAAC;CAClE;AAED,eAAO,MAAM,eAAe,GAAI,mEAAmE,MAAM,sBAiExG,CAAC"}
@@ -3,6 +3,7 @@ import React, { useContext } from 'react';
3
3
  import { AccountsBookmarkedGroupFilter } from './AccountsBookmarkedGroupFilter';
4
4
  import { AccountsFilter } from './AccountsFilter';
5
5
  import { AdditionalFilters } from './AdditionalFilters';
6
+ import { CaseLabelsFilter } from './CaseLabelsFilter';
6
7
  import { CreatorSsoNameFilter } from './CreatorSsoNameFilter';
7
8
  import { GroupsFilter } from './GroupsFilter';
8
9
  import { ProductsFilter } from './ProductsFilter';
@@ -28,6 +29,7 @@ export const CaseListFilters = ({ allCaseTypes, allCaseSeverities, allCaseStatus
28
29
  canReadAccountFilter && React.createElement(AccountsFilter, { canReadBookmarkAccounts: canReadAccountFilter }),
29
30
  (canReadBookmarkAccounts || canAccessManagedAccounts) && (React.createElement(AccountsBookmarkedGroupFilter, { canManageBookmarkAccounts: canManageBookmarkAccounts, canReadBookmarkAccounts: canReadBookmarkAccounts, canAccessManagedAccounts: canAccessManagedAccounts })),
30
31
  canAccessGroupsFilter && React.createElement(GroupsFilter, null),
32
+ React.createElement(CaseLabelsFilter, null),
31
33
  canAccessProductsFilter && (React.createElement(ProductsFilter, { allProducts: ((_b = (_a = allProducts.data) === null || _a === void 0 ? void 0 : _a.productsResult) === null || _b === void 0 ? void 0 : _b.map((p) => ({
32
34
  name: p.product,
33
35
  productId: p.productId,
@@ -8,6 +8,7 @@ export declare const fieldNameToSolrFieldMapping: {
8
8
  case_status: string;
9
9
  case_accountNumber: string;
10
10
  case_folderNumber: string;
11
+ case_label: string;
11
12
  case_severity: string;
12
13
  case_owner_sso_username: string;
13
14
  case_customer_escalation: string;
@@ -39,6 +40,7 @@ export declare const advanceSearchFieldNameToSolrFieldMapping: {
39
40
  case_status: string;
40
41
  case_accountNumber: string;
41
42
  case_folderNumber: string;
43
+ case_label: string;
42
44
  case_severity: string;
43
45
  case_customer_escalation: string;
44
46
  case_version: string;
@@ -1 +1 @@
1
- {"version":3,"file":"caseSearch.d.ts","sourceRoot":"","sources":["../../../src/enums/caseSearch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,oBAAY,mBAAmB;IAC3B,KAAK,UAAU;IACf,QAAQ,aAAa;CACxB;AAED,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;CAavC,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBpD,CAAC"}
1
+ {"version":3,"file":"caseSearch.d.ts","sourceRoot":"","sources":["../../../src/enums/caseSearch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,oBAAY,mBAAmB;IAC3B,KAAK,UAAU;IACf,QAAQ,aAAa;CACxB;AAED,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;CAcvC,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmBpD,CAAC"}
@@ -10,6 +10,7 @@ export const fieldNameToSolrFieldMapping = {
10
10
  [SolrKeys.status]: 'status',
11
11
  [SolrKeys.accountNumber]: 'accountNumber',
12
12
  [SolrKeys.group]: 'group',
13
+ [SolrKeys.caseLabel]: 'caseLabel',
13
14
  [SolrKeys.severity]: 'severity',
14
15
  [SolrKeys.caseOwner]: 'owner',
15
16
  [SolrKeys.escalation]: 'escalated',
@@ -37,7 +37,8 @@ export declare enum SolrKeys {
37
37
  alternateId = "case_alternate_id",
38
38
  caseClosedDate = "case_closedDate",
39
39
  openshiftClusterId = "case_openshift_cluster_id",
40
- isPrivate = "case_private"
40
+ isPrivate = "case_private",
41
+ caseLabel = "case_label"
41
42
  }
42
43
  export declare const advancedSearchMap: {
43
44
  case_number: string;
@@ -47,6 +48,7 @@ export declare const advancedSearchMap: {
47
48
  case_accountNumber: string;
48
49
  case_folderNumber: string;
49
50
  case_folderName: string;
51
+ case_label: string;
50
52
  case_severity: string;
51
53
  case_owner_sso_username: string;
52
54
  case_owner: string;
@@ -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;CAC7B;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+B7B,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,sBAAsB;;;CAGlC,CAAC"}
@@ -40,6 +40,7 @@ export var SolrKeys;
40
40
  SolrKeys["caseClosedDate"] = "case_closedDate";
41
41
  SolrKeys["openshiftClusterId"] = "case_openshift_cluster_id";
42
42
  SolrKeys["isPrivate"] = "case_private";
43
+ SolrKeys["caseLabel"] = "case_label";
43
44
  })(SolrKeys || (SolrKeys = {}));
44
45
  export const advancedSearchMap = {
45
46
  case_number: 'caseNumber',
@@ -49,6 +50,7 @@ export const advancedSearchMap = {
49
50
  case_accountNumber: 'accountNumber',
50
51
  case_folderNumber: 'group',
51
52
  case_folderName: 'groupName',
53
+ case_label: 'caseLabel',
52
54
  case_severity: 'severity',
53
55
  case_owner_sso_username: 'caseOwner',
54
56
  case_owner: 'ownerName',
@@ -0,0 +1,14 @@
1
+ export interface ICaseLabelOption {
2
+ id: string;
3
+ name: string;
4
+ }
5
+ interface UseCaseLabelsResult {
6
+ labels: ICaseLabelOption[];
7
+ loading: boolean;
8
+ error: Error | undefined;
9
+ refetch: () => Promise<void>;
10
+ }
11
+ /** Fetches account-scoped case labels for the Case List Case labels filter. */
12
+ export declare function useCaseLabels(accountId?: string): UseCaseLabelsResult;
13
+ export {};
14
+ //# sourceMappingURL=useCaseLabels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCaseLabels.d.ts","sourceRoot":"","sources":["../../../src/hooks/useCaseLabels.ts"],"names":[],"mappings":"AASA,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"}
@@ -0,0 +1,55 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { useApolloClient } from '@apollo/client/react';
11
+ import { GET_CASE_LABELS, } from '@rh-support/utils';
12
+ import { useCallback, useEffect, useState } from 'react';
13
+ const mapCaseLabelNode = (node) => {
14
+ var _a, _b;
15
+ return ({
16
+ id: node.Id,
17
+ name: (_b = (_a = node.Name) === null || _a === void 0 ? void 0 : _a.value) !== null && _b !== void 0 ? _b : '',
18
+ });
19
+ };
20
+ /** Fetches account-scoped case labels for the Case List Case labels filter. */
21
+ export function useCaseLabels(accountId) {
22
+ const client = useApolloClient();
23
+ const [labels, setLabels] = useState([]);
24
+ const [loading, setLoading] = useState(false);
25
+ const [error, setError] = useState(undefined);
26
+ const fetchLabels = useCallback(() => __awaiter(this, void 0, void 0, function* () {
27
+ var _a, _b, _c, _d;
28
+ if (!accountId) {
29
+ setLabels([]);
30
+ return;
31
+ }
32
+ setLoading(true);
33
+ setError(undefined);
34
+ try {
35
+ const { data } = yield client.query({
36
+ query: GET_CASE_LABELS,
37
+ variables: { where: { Account__c: { eq: accountId } } },
38
+ fetchPolicy: 'cache-first',
39
+ });
40
+ 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 : [];
41
+ setLabels(edges.map(({ node }) => mapCaseLabelNode(node)).filter((label) => label.id && label.name));
42
+ }
43
+ catch (e) {
44
+ setError(e);
45
+ setLabels([]);
46
+ }
47
+ finally {
48
+ setLoading(false);
49
+ }
50
+ }), [accountId, client]);
51
+ useEffect(() => {
52
+ fetchLabels();
53
+ }, [fetchLabels]);
54
+ return { labels, loading, error, refetch: fetchLabels };
55
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"advanceSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/advanceSearchUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAKvD,uGAAuG;AACvG,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,IAAI,GAAG,SAsB7D,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,OAAO,MAAM,KAAG,OACE,CAAC;AAEjE,eAAO,MAAM,6BAA6B,GAAI,OAAO,uBAAuB,KAAG,OAa9E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,QAAQ;IACjD,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,qBAAqB,EAAE,uBAAuB,CAAC;IAC/C,eAAe,EAAE,uBAAuB,CAAC;CAC5C,KAAG,OAGsD,CAAC;AAE3D,MAAM,WAAW,kCAAkC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,oCAAoC,GAC7C,OAAO,uBAAuB,EAC9B,UAAU;IACN,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC5B,KACF,kCAqBF,CAAC;AAOF,eAAO,MAAM,mCAAmC,QAAO,uBAiBrD,CAAC;AAEH,eAAO,MAAM,iCAAiC,GAAI,aAAa,oBAAoB,KAAG,uBA6BrF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,WAAW,uBAAuB,KAAG,OAG7E,CAAC;AAuBF,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,GAAI,aAAa,oBAAoB,KAAG,MAyBtF,CAAC"}
1
+ {"version":3,"file":"advanceSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/advanceSearchUtils.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAKvD,uGAAuG;AACvG,eAAO,MAAM,sBAAsB,GAAI,OAAO,MAAM,KAAG,IAAI,GAAG,SAsB7D,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAI,OAAO,MAAM,KAAG,OACE,CAAC;AAEjE,eAAO,MAAM,6BAA6B,GAAI,OAAO,uBAAuB,KAAG,OAa9E,CAAC;AAEF,eAAO,MAAM,4BAA4B,GAAI,QAAQ;IACjD,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,qBAAqB,EAAE,uBAAuB,CAAC;IAC/C,eAAe,EAAE,uBAAuB,CAAC;CAC5C,KAAG,OAGsD,CAAC;AAE3D,MAAM,WAAW,kCAAkC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,oCAAoC,GAC7C,OAAO,uBAAuB,EAC9B,UAAU;IACN,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;CAC5B,KACF,kCAqBF,CAAC;AAOF,eAAO,MAAM,mCAAmC,QAAO,uBAiBrD,CAAC;AAEH,eAAO,MAAM,iCAAiC,GAAI,aAAa,oBAAoB,KAAG,uBA6BrF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,WAAW,uBAAuB,KAAG,OAG7E,CAAC;AAuBF,4EAA4E;AAC5E,eAAO,MAAM,kCAAkC,GAAI,aAAa,oBAAoB,KAAG,MA0BtF,CAAC"}
@@ -139,6 +139,7 @@ export const getAdvanceSearchAppliedFilterCount = (filterState) => {
139
139
  count += (filterInfo[SolrKeys.caseContactSSO] || []).length;
140
140
  count += (filterInfo[SolrKeys.caseOwner] || []).length;
141
141
  count += (filterInfo[SolrKeys.group] || []).length;
142
+ count += (filterInfo[SolrKeys.caseLabel] || []).length;
142
143
  count += (filterInfo[SolrKeys.createdBySsoUsername] || []).length;
143
144
  count += (filterInfo[SolrKeys.modifiedBy] || []).length;
144
145
  count += countProductFilterValues(filterInfo[SolrPivotKeys.product_version] || []);
@@ -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;AASnD,OAAO,EAEH,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAOvD,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;AA0SD,wBAAsB,qCAAqC,CACvD,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,eAAe,CAAC,EAAE,gBAAgB,GACnC,OAAO,CAAC,yBAAyB,CAAC,CA8HpC"}
1
+ {"version":3,"file":"caseListVariablesBuilder.d.ts","sourceRoot":"","sources":["../../../src/utils/caseListVariablesBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAanD,OAAO,EAEH,oBAAoB,EAEvB,MAAM,+CAA+C,CAAC;AAOvD,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;AAqaD,wBAAsB,qCAAqC,CACvD,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,YAAY,EAC1B,eAAe,CAAC,EAAE,gBAAgB,GACnC,OAAO,CAAC,yBAAyB,CAAC,CAuIpC"}
@@ -7,7 +7,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import { buildAccessRestrictionExclusionFilter, GET_CONTACT_BY_SSO, GET_GROUP_IDS_BY_NAME, GET_USER_IDS_BY_FEDERATION, getTechnicalSupportRecordTypeId, } from '@rh-support/utils';
10
+ import { buildAccessRestrictionExclusionFilter, GET_CASE_GROUPS, GET_CASE_NUMBERS_BY_CASE_LABEL, GET_CONTACT_BY_SSO, GET_GROUP_IDS_BY_NAME, GET_USER_IDS_BY_FEDERATION, getTechnicalSupportRecordTypeId, } from '@rh-support/utils';
11
11
  import { CaseListColumnIds, caseListSortColumnIdsToGraphQLMap } from '../enums/case';
12
12
  import { CaseSearchQueryType } from '../enums/caseSearch';
13
13
  import { SolrKeys, SolrPivotKeys } from '../enums/filters';
@@ -81,15 +81,123 @@ function buildProductFilter(products) {
81
81
  }
82
82
  return conditions;
83
83
  }
84
- function buildGroupFilter(groups) {
85
- var _a;
86
- const groupIds = (_a = groups === null || groups === void 0 ? void 0 : groups.map((group) => group.key).filter(Boolean)) !== null && _a !== void 0 ? _a : [];
87
- if (!groupIds.length)
84
+ const SALESFORCE_ID_PATTERN = /^[a-zA-Z0-9]{15}([a-zA-Z0-9]{3})?$/;
85
+ function buildGroupFilter(groupIds) {
86
+ const validIds = groupIds.filter((id) => {
87
+ if (SALESFORCE_ID_PATTERN.test(id))
88
+ return true;
89
+ console.warn(`[GraphQL] Dropping invalid Group__c filter value "${id}" — expected a Salesforce record ID`);
90
+ return false;
91
+ });
92
+ if (!validIds.length)
88
93
  return undefined;
89
- if (groupIds.length === 1) {
90
- return { Group__c: { eq: groupIds[0] } };
94
+ if (validIds.length === 1) {
95
+ return { Group__c: { eq: validIds[0] } };
91
96
  }
92
- return { Group__c: { in: groupIds } };
97
+ return { Group__c: { in: validIds } };
98
+ }
99
+ /**
100
+ * Fetches the Salesforce record ID for a group by its name.
101
+ * Used when stale saved searches or bookmarks store old numeric group numbers
102
+ * that predate the GraphQL migration — the group name is used to look up the
103
+ * current SF ID.
104
+ */
105
+ function fetchGroupIdByName(groupName, apolloClient) {
106
+ return __awaiter(this, void 0, void 0, function* () {
107
+ var _a, _b, _c, _d, _e, _f;
108
+ try {
109
+ const { data } = yield apolloClient.query({
110
+ query: GET_CASE_GROUPS,
111
+ variables: {
112
+ where: { Name: { eq: groupName } },
113
+ first: 1,
114
+ },
115
+ fetchPolicy: 'cache-first',
116
+ });
117
+ const edges = ((_c = (_b = (_a = data === null || data === void 0 ? void 0 : data.redhat_support_uiapi) === null || _a === void 0 ? void 0 : _a.query) === null || _b === void 0 ? void 0 : _b.RedHatSupportCaseGroup__c) === null || _c === void 0 ? void 0 : _c.edges) || [];
118
+ return (_f = (_e = (_d = edges[0]) === null || _d === void 0 ? void 0 : _d.node) === null || _e === void 0 ? void 0 : _e.Id) !== null && _f !== void 0 ? _f : null;
119
+ }
120
+ catch (error) {
121
+ console.error(`[GraphQL] Failed to fetch group by name "${groupName}":`, error);
122
+ return null;
123
+ }
124
+ });
125
+ }
126
+ function resolveGroupIds(groups, apolloClient) {
127
+ return __awaiter(this, void 0, void 0, function* () {
128
+ if (!(groups === null || groups === void 0 ? void 0 : groups.length))
129
+ return [];
130
+ const validIds = [];
131
+ const staleGroups = [];
132
+ for (const group of groups) {
133
+ if (!group.key)
134
+ continue;
135
+ if (SALESFORCE_ID_PATTERN.test(group.key)) {
136
+ validIds.push(group.key);
137
+ }
138
+ else {
139
+ staleGroups.push(group);
140
+ }
141
+ }
142
+ if (staleGroups.length) {
143
+ const resolved = yield Promise.all(staleGroups.map((group) => __awaiter(this, void 0, void 0, function* () {
144
+ if (!group.value) {
145
+ console.warn(`[GraphQL] Cannot resolve legacy group key "${group.key}" — no group name available`);
146
+ return null;
147
+ }
148
+ const sfId = yield fetchGroupIdByName(group.value, apolloClient);
149
+ if (sfId) {
150
+ return sfId;
151
+ }
152
+ console.warn(`[GraphQL] Could not find group "${group.value}" (legacy key "${group.key}") — filter will be skipped`);
153
+ return null;
154
+ })));
155
+ for (const sfId of resolved) {
156
+ if (sfId)
157
+ validIds.push(sfId);
158
+ }
159
+ }
160
+ return [...new Set(validIds)];
161
+ });
162
+ }
163
+ /**
164
+ * Resolve case numbers for selected label Ids via RedHatSupportCaseLabelLink__c
165
+ * (Label__r.Id filter → Case__r.CaseNumber__c), matching the working UIAPI query.
166
+ */
167
+ function resolveCaseNumbersByLabelIds(labelIds, apolloClient) {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ var _a, _b, _c, _d;
170
+ if (!labelIds.length) {
171
+ return [];
172
+ }
173
+ const where = labelIds.length === 1 ? { Label__r: { Id: { eq: labelIds[0] } } } : { Label__r: { Id: { in: labelIds } } };
174
+ try {
175
+ const { data } = yield apolloClient.query({
176
+ query: GET_CASE_NUMBERS_BY_CASE_LABEL,
177
+ variables: { where },
178
+ fetchPolicy: 'network-only',
179
+ });
180
+ 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.RedHatSupportCaseLabelLink__c) === null || _c === void 0 ? void 0 : _c.edges) !== null && _d !== void 0 ? _d : [];
181
+ const caseNumbers = edges
182
+ .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; })
183
+ .filter((caseNumber) => Boolean(caseNumber));
184
+ return [...new Set(caseNumbers)];
185
+ }
186
+ catch (error) {
187
+ console.error('[GraphQL] Failed to resolve case numbers by case label:', error);
188
+ return [];
189
+ }
190
+ });
191
+ }
192
+ function buildCaseNumberInFilter(caseNumbers, filterRequested = false) {
193
+ if (!(caseNumbers === null || caseNumbers === void 0 ? void 0 : caseNumbers.length)) {
194
+ // Label filter requested but no linked cases — force empty result set
195
+ return filterRequested ? { CaseNumber__c: { in: [] } } : undefined;
196
+ }
197
+ if (caseNumbers.length === 1) {
198
+ return { CaseNumber__c: { eq: caseNumbers[0] } };
199
+ }
200
+ return { CaseNumber__c: { in: caseNumbers } };
93
201
  }
94
202
  function buildDateTimeRangeFilter(fieldName, range) {
95
203
  var _a, _b, _c, _d;
@@ -288,6 +396,7 @@ function resolveOwnerIdsBySearchTerms(searchTerms, apolloClient) {
288
396
  }
289
397
  export function createGraphQLVariablesFromFilterState(filterState, apolloClient, resolvedUserIds) {
290
398
  return __awaiter(this, void 0, void 0, function* () {
399
+ var _a;
291
400
  const { paginationInfo, sortInfo, filterInfo, filterQueryInfo } = filterState;
292
401
  const first = (paginationInfo === null || paginationInfo === void 0 ? void 0 : paginationInfo.pageSize) || 10;
293
402
  const orderBy = buildOrderByFromSortInfo(sortInfo);
@@ -371,9 +480,18 @@ export function createGraphQLVariablesFromFilterState(filterState, apolloClient,
371
480
  andConditions.push(closedDateFilter);
372
481
  }
373
482
  const groups = filterInfo[SolrKeys.group];
374
- const groupFilter = buildGroupFilter(groups);
483
+ const groupIds = yield resolveGroupIds(groups, apolloClient);
484
+ const groupFilter = buildGroupFilter(groupIds);
375
485
  if (groupFilter)
376
486
  andConditions.push(groupFilter);
487
+ const caseLabels = filterInfo[SolrKeys.caseLabel];
488
+ const labelIds = (_a = caseLabels === null || caseLabels === void 0 ? void 0 : caseLabels.map((label) => label.key).filter(Boolean)) !== null && _a !== void 0 ? _a : [];
489
+ if (labelIds.length) {
490
+ const caseNumbers = yield resolveCaseNumbersByLabelIds(labelIds, apolloClient);
491
+ const caseLabelFilter = buildCaseNumberInFilter(caseNumbers, true);
492
+ if (caseLabelFilter)
493
+ andConditions.push(caseLabelFilter);
494
+ }
377
495
  }
378
496
  const escalation = filterInfo === null || filterInfo === void 0 ? void 0 : filterInfo[SolrKeys.escalation];
379
497
  const technicalSupportId = getTechnicalSupportRecordTypeId();
@@ -1 +1 @@
1
- {"version":3,"file":"caseSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseSearchUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAkBxD,OAAO,EACH,oBAAoB,EACpB,WAAW,EAId,MAAM,+CAA+C,CAAC;AAOvD,OAAO,EAEH,mBAAmB,EAEtB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,6BAA6B,UAAU,CAAC;AACrD,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD,eAAO,MAAM,iCAAiC,SAAS,CAAC;AACxD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,aAAa,GAAE,MAAM,EAAO,OAgE/B;AAED,iBAAS,sCAAsC,CAC3C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,OAAe,UA2BnC;AAED,iBAAS,oDAAoD,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,UA+DlH;AAkBD,iBAAS,wCAAwC,CAC7C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,eAAe,QAAK,UA6BvB;AASD,iBAAS,yBAAyB,CAC9B,WAAW,EAAE,oBAAoB,EACjC,kBAAkB,EAAE,QAAQ,EAC5B,oBAAoB,KAAA,EACpB,aAAa,GAAE,MAAM,EAAO,EAC5B,UAAU,SAAI,EACd,UAAU,SAAO,OAoBpB;AAkBD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,EACtC,aAAa,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAED,iBAAS,6BAA6B,CAAC,QAAQ,GAAE,qBAAqB,EAAO,GAAG,qBAAqB,EAAE,CAEtG;AAoBD,iBAAS,6BAA6B,CAAC,WAAW,EAAE,oBAAoB,UAUvE;AAED,iBAAS,6BAA6B,CAClC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,oBAAoB,EACzC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,GAAE,mBAA+C,wBA0D9D;AAGD,iBAAS,kCAAkC,CACvC,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,oBAAoB,EACzC,kBAAkB,EAAE,oBAAoB,EACxC,WAAW,GAAE,MAAW,EACxB,IAAI,GAAE,mBAA+C,wBAiExD;AA0LD,OAAO,EACH,8BAA8B,EAC9B,sCAAsC,EACtC,oDAAoD,EACpD,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,EAC7B,wCAAwC,EACxC,kCAAkC,GACrC,CAAC"}
1
+ {"version":3,"file":"caseSearchUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/caseSearchUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6CAA6C,CAAC;AACrG,OAAO,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAkBxD,OAAO,EACH,oBAAoB,EACpB,WAAW,EAId,MAAM,+CAA+C,CAAC;AAOvD,OAAO,EAEH,mBAAmB,EAEtB,MAAM,qBAAqB,CAAC;AAW7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,eAAO,MAAM,6BAA6B,UAAU,CAAC;AACrD,eAAO,MAAM,oCAAoC,MAAM,CAAC;AACxD,eAAO,MAAM,iCAAiC,SAAS,CAAC;AACxD,eAAO,MAAM,qBAAqB,eAAe,CAAC;AAElD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,aAAa,GAAE,MAAM,EAAO,OAgE/B;AAED,iBAAS,sCAAsC,CAC3C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,WAAW,EAAE,MAAM,EACnB,eAAe,GAAE,OAAe,UA2BnC;AAED,iBAAS,oDAAoD,CAAC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,WAAW,EAAE,MAAM,UA+DlH;AAkBD,iBAAS,wCAAwC,CAC7C,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,OAAO,EAAE,MAAM,EACf,eAAe,QAAK,UA6BvB;AASD,iBAAS,yBAAyB,CAC9B,WAAW,EAAE,oBAAoB,EACjC,kBAAkB,EAAE,QAAQ,EAC5B,oBAAoB,KAAA,EACpB,aAAa,GAAE,MAAM,EAAO,EAC5B,UAAU,SAAI,EACd,UAAU,SAAO,OAoBpB;AAkBD,iBAAS,8BAA8B,CACnC,WAAW,EAAE,oBAAoB,EACjC,YAAY,EAAE,QAAQ,EACtB,mBAAmB,EAAE,OAAO,CAAC,QAAQ,CAAC,EACtC,aAAa,GAAE,MAAM,EAAO,GAC7B,OAAO,CAAC,eAAe,CAAC,CAkE1B;AAED,iBAAS,6BAA6B,CAAC,QAAQ,GAAE,qBAAqB,EAAO,GAAG,qBAAqB,EAAE,CAEtG;AAoBD,iBAAS,6BAA6B,CAAC,WAAW,EAAE,oBAAoB,UAUvE;AAED,iBAAS,6BAA6B,CAClC,QAAQ,EAAE,MAAM,EAChB,mBAAmB,EAAE,oBAAoB,EACzC,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,GAAE,mBAA+C,wBA0D9D;AAGD,iBAAS,kCAAkC,CACvC,WAAW,EAAE,MAAM,EACnB,mBAAmB,EAAE,oBAAoB,EACzC,kBAAkB,EAAE,oBAAoB,EACxC,WAAW,GAAE,MAAW,EACxB,IAAI,GAAE,mBAA+C,wBAiExD;AAqMD,OAAO,EACH,8BAA8B,EAC9B,sCAAsC,EACtC,oDAAoD,EACpD,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,EAC7B,wCAAwC,EACxC,kCAAkC,GACrC,CAAC"}
@@ -454,9 +454,18 @@ function getValidValues(solrFieldName, itemValues = [], globalMetadataState) {
454
454
  return acc;
455
455
  }, {});
456
456
  itemValues.forEach((item) => {
457
- caseGroupsMap[item] && mappedValues.push({ key: item, value: caseGroupsMap[item] });
457
+ if (caseGroupsMap[item]) {
458
+ mappedValues.push({ key: item, value: caseGroupsMap[item] });
459
+ }
460
+ else if (item && /^\d+$/.test(item)) {
461
+ console.warn(`[CaseSearch] Ignoring stale numeric group filter "${item}" from URL/saved search — group IDs are now Salesforce record IDs`);
462
+ }
458
463
  });
459
464
  }
465
+ else if (solrFieldName === SolrKeys.caseLabel) {
466
+ // Label names are resolved later by CaseLabelsFilter once account labels load
467
+ mappedValues = itemValues.map((item) => ({ key: item, value: item }));
468
+ }
460
469
  else if (solrFieldName === SolrKeys.accountNumber) {
461
470
  // when we go live with grouped bookmark, bookmarkedAccounts needs to be removed
462
471
  let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
@@ -508,6 +517,9 @@ function getValidValuesAdvancedSearch(solrFieldName, itemValues = [], globalMeta
508
517
  caseGroupsMap[item] && mappedValues.push({ key: caseGroupsMap[item], value: item });
509
518
  });
510
519
  }
520
+ else if (solrFieldName === SolrKeys.caseLabel) {
521
+ mappedValues = itemValues.map((item) => ({ key: item, value: item }));
522
+ }
511
523
  else if (solrFieldName === SolrKeys.accountNumber) {
512
524
  let bookmarkedAccountsMap = (((_b = globalMetadataState.bookmarkedAccounts) === null || _b === void 0 ? void 0 : _b.data) || []).reduce((acc, { accountNumber, name }) => {
513
525
  acc[accountNumber] = getLabel(accountNumber, name);
@@ -6,6 +6,7 @@ export declare const filterNamesMap: {
6
6
  readonly case_status: any;
7
7
  readonly case_severity: any;
8
8
  readonly case_folderNumber: any;
9
+ readonly case_label: any;
9
10
  readonly case_accountNumber: any;
10
11
  readonly case_summary: any;
11
12
  readonly case_customer_escalation: any;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAoBzD,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAAoC,CAAC;AAEzE,+DAA+D;AAC/D,eAAO,MAAM,4BAA4B,UAExC,CAAC;AAIF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;CA6D1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,iDAAiD,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/utils/constants.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAoBzD,CAAC;AAEF,eAAO,MAAM,uBAAuB,UAAoC,CAAC;AAEzE,+DAA+D;AAC/D,eAAO,MAAM,4BAA4B,UAExC,CAAC;AAIF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;CAgE1B,CAAC;AAEF,eAAO,MAAM,oBAAoB,iDAAiD,CAAC"}
@@ -36,6 +36,9 @@ export const filterNamesMap = {
36
36
  get [SolrKeys.group]() {
37
37
  return i18n.t('Groups');
38
38
  },
39
+ get [SolrKeys.caseLabel]() {
40
+ return i18n.t('Case labels');
41
+ },
39
42
  get [SolrKeys.accountNumber]() {
40
43
  return i18n.t('Bookmarks');
41
44
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rh-support/cases",
3
- "version": "2.6.208",
3
+ "version": "2.6.209",
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.203",
42
- "@rh-support/react-context": "2.5.298",
41
+ "@rh-support/components": "2.5.204",
42
+ "@rh-support/react-context": "2.5.299",
43
43
  "@rh-support/types": "2.0.26",
44
- "@rh-support/user-permissions": "2.5.150",
45
- "@rh-support/utils": "2.5.132",
44
+ "@rh-support/user-permissions": "2.5.151",
45
+ "@rh-support/utils": "2.5.133",
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": "7c3e9bbcdaa616cf2174f44356011417e368911c"
97
+ "gitHead": "f1130350456adacf617ce9d7829c300d8e63bded"
98
98
  }