@rh-support/cases 2.6.201 → 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.
- package/lib/esm/components/case/NewCaseButton.js +1 -1
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +49 -17
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts +1 -0
- package/lib/esm/components/case-list/CaseListFilterReducer.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseListFilterReducer.js +2 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts +3 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.d.ts.map +1 -0
- package/lib/esm/components/case-list/case-list-filters/CaseLabelsFilter.js +177 -0
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-list-filters/CaseListFilters.js +2 -0
- package/lib/esm/enums/caseSearch.d.ts +2 -0
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +1 -0
- package/lib/esm/enums/filters.d.ts +3 -1
- package/lib/esm/enums/filters.d.ts.map +1 -1
- package/lib/esm/enums/filters.js +2 -0
- package/lib/esm/hooks/useCaseLabels.d.ts +14 -0
- package/lib/esm/hooks/useCaseLabels.d.ts.map +1 -0
- package/lib/esm/hooks/useCaseLabels.js +55 -0
- package/lib/esm/index.js +1 -0
- package/lib/esm/utils/advanceSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/advanceSearchUtils.js +1 -0
- package/lib/esm/utils/caseListVariablesBuilder.d.ts.map +1 -1
- package/lib/esm/utils/caseListVariablesBuilder.js +127 -9
- package/lib/esm/utils/caseSearchUtils.d.ts.map +1 -1
- package/lib/esm/utils/caseSearchUtils.js +13 -1
- package/lib/esm/utils/constants.d.ts +1 -0
- package/lib/esm/utils/constants.d.ts.map +1 -1
- package/lib/esm/utils/constants.js +3 -0
- package/package.json +6 -6
|
@@ -6,7 +6,7 @@ import { Trans, useTranslation } from 'react-i18next';
|
|
|
6
6
|
export function NewCaseButton(props) {
|
|
7
7
|
const { t } = useTranslation();
|
|
8
8
|
const canCreateCase = useCanCreateCase();
|
|
9
|
-
//
|
|
9
|
+
//Handle onClick of Get support button
|
|
10
10
|
const onNewCase = () => {
|
|
11
11
|
if (canCreateCase.alert()) {
|
|
12
12
|
return;
|
|
@@ -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,
|
|
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
|
-
}, [
|
|
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 (
|
|
371
|
-
|
|
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(
|
|
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 (!
|
|
436
|
+
if (!decodedQueryFromUrl) {
|
|
405
437
|
searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = ' orderBy lastModifiedDate desc';
|
|
406
438
|
}
|
|
407
|
-
setCurrentQuery(CaseListDispatch,
|
|
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 ${((
|
|
455
|
-
React.createElement("h2", { className: "filter-header pf-v6-u-display-flex" }, ((
|
|
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":"AAAA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAE9D,eAAO,MAAM,iBAAiB,EAAE,OAAO,CAAC,WAAW,
|
|
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 @@
|
|
|
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;
|
|
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
|
|
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;
|
|
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"}
|
package/lib/esm/enums/filters.js
CHANGED
|
@@ -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
|
+
}
|
package/lib/esm/index.js
CHANGED
|
@@ -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,
|
|
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;
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
|
|
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 (
|
|
90
|
-
return { Group__c: { eq:
|
|
94
|
+
if (validIds.length === 1) {
|
|
95
|
+
return { Group__c: { eq: validIds[0] } };
|
|
91
96
|
}
|
|
92
|
-
return { Group__c: { in:
|
|
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
|
|
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;
|
|
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
|
-
|
|
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
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rh-support/cases",
|
|
3
|
-
"version": "2.6.
|
|
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.
|
|
42
|
-
"@rh-support/react-context": "2.5.
|
|
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.
|
|
45
|
-
"@rh-support/utils": "2.5.
|
|
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": "
|
|
97
|
+
"gitHead": "f1130350456adacf617ce9d7829c300d8e63bded"
|
|
98
98
|
}
|