@rh-support/cases 0.2.40 → 0.2.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
- package/lib/esm/components/case-list/CaseList.js +3 -4
- package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts +1 -0
- package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/AdvanceSearch.js +2 -0
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts +1 -0
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +18 -13
- package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/CaseSearch.js +5 -4
- package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts +3 -1
- package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.js +67 -43
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
- package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +6 -1
- package/lib/esm/enums/caseSearch.d.ts +2 -1
- package/lib/esm/enums/caseSearch.d.ts.map +1 -1
- package/lib/esm/enums/caseSearch.js +2 -2
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
- package/lib/esm/hooks/useFilterStateOnLoad.js +9 -14
- package/lib/esm/utils/caseSearchUtils.js +4 -4
- package/package.json +8 -8
|
@@ -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;AA4BlC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAKH,0BAA0B,EAI7B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,mBAAmB,EAAe,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAM1C,OAAO,EAAgB,WAAW,EAA2B,MAAM,uBAAuB,CAAC;AA2B3F,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC3D,YAAY,EAAE,cAAc,EAAE,CAAC;CAClC;AAED,oBAAY,YAAY,GAAG,0BAA0B,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAM5F,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;AA4BlC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAKH,0BAA0B,EAI7B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,mBAAmB,EAAe,MAAM,cAAc,CAAC;AAEhE,OAAO,EAAE,oBAAoB,EAAE,MAAM,IAAI,CAAC;AAM1C,OAAO,EAAgB,WAAW,EAA2B,MAAM,uBAAuB,CAAC;AA2B3F,UAAU,MAAM;IACZ,UAAU,EAAE,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,uBAAwB,SAAQ,cAAc;IAC3D,YAAY,EAAE,cAAc,EAAE,CAAC;CAClC;AAED,oBAAY,YAAY,GAAG,0BAA0B,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC;AAM5F,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,eA4brC"}
|
|
@@ -258,16 +258,15 @@ export function CaseList(props) {
|
|
|
258
258
|
// move saved user data in localstorage to user preferences db - needs to be removed after a while
|
|
259
259
|
useMoveCache.save();
|
|
260
260
|
// set filter state based on url or default saved search
|
|
261
|
-
useFilterStateInit.set(queryFromUrl, pageSizeFromUrl, currentPageFromUrl, searchType);
|
|
261
|
+
const initFilterState = useFilterStateInit.set(queryFromUrl, pageSizeFromUrl, currentPageFromUrl, searchType);
|
|
262
262
|
// set default params when they are empty
|
|
263
263
|
if (!queryFromUrl) {
|
|
264
264
|
searchParams[FILTER_URL_QUERY_SEARCH_PARAM] = ' orderBy lastModifiedDate desc';
|
|
265
265
|
}
|
|
266
|
-
props.routeProps.history.replace({
|
|
267
|
-
search: getStringifiedParams(searchParams),
|
|
268
|
-
});
|
|
269
266
|
setCurrentQuery(CaseListDispatch, queryFromUrl);
|
|
270
267
|
isFirstMount.current = false;
|
|
268
|
+
// we only update the state without api call as we fetch result in another useEffect that observes the state
|
|
269
|
+
updateFilterState(filterDispatch, initFilterState);
|
|
271
270
|
}
|
|
272
271
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
273
272
|
}, [
|
|
@@ -4,6 +4,7 @@ interface IProps {
|
|
|
4
4
|
onSearchTypeChange?: (newType: CaseSearchQueryType) => void;
|
|
5
5
|
onSearchClear?: () => void;
|
|
6
6
|
onSearchSubmit: (parsedQuery: string) => void;
|
|
7
|
+
onAdvancedSearchValidation: (validation: boolean) => void;
|
|
7
8
|
}
|
|
8
9
|
export declare function AdvanceSearch(props: IProps): JSX.Element;
|
|
9
10
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdvanceSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/AdvanceSearch.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAMhE,UAAU,MAAM;IACZ,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"AdvanceSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/AdvanceSearch.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAMhE,UAAU,MAAM;IACZ,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,cAAc,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,0BAA0B,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,eAwV1C"}
|
|
@@ -23,6 +23,7 @@ export function AdvanceSearch(props) {
|
|
|
23
23
|
try {
|
|
24
24
|
parse(queryString);
|
|
25
25
|
setIsParsingSuccessful(true);
|
|
26
|
+
props.onAdvancedSearchValidation(true);
|
|
26
27
|
try {
|
|
27
28
|
// to trigger the autocomplete on a valid selection
|
|
28
29
|
parse(queryString + ' ');
|
|
@@ -34,6 +35,7 @@ export function AdvanceSearch(props) {
|
|
|
34
35
|
}
|
|
35
36
|
catch (e) {
|
|
36
37
|
setIsParsingSuccessful(false);
|
|
38
|
+
props.onAdvancedSearchValidation(false);
|
|
37
39
|
parserErrorRef.current = e;
|
|
38
40
|
autoCompleteSetup(e.expected, queryString.substring(e.location.start.offset, queryString.length));
|
|
39
41
|
}
|
|
@@ -2,6 +2,7 @@ import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
|
2
2
|
interface IProps {
|
|
3
3
|
currentCaseSearchString: string;
|
|
4
4
|
currentSearchType: CaseSearchQueryType;
|
|
5
|
+
isAdvancedSearchValid: boolean;
|
|
5
6
|
}
|
|
6
7
|
export declare function BookmarkedSearchesSelector(props: IProps): JSX.Element;
|
|
7
8
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BookmarkedSearchesSelector.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/BookmarkedSearchesSelector.tsx"],"names":[],"mappings":"AAwBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWhE,UAAU,MAAM;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,mBAAmB,CAAC;IACvC,qBAAqB,EAAE,OAAO,CAAC;CAClC;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,eAqNvD"}
|
|
@@ -3,13 +3,15 @@ import PencilAltIcon from '@patternfly/react-icons/dist/js/icons/pencil-alt-icon
|
|
|
3
3
|
import StarIcon from '@patternfly/react-icons/dist/js/icons/star-icon';
|
|
4
4
|
import { ConfirmationServiceProvider } from '@rh-support/components';
|
|
5
5
|
import { GlobalMetadataStateContext, UserPreferencesKeys } from '@rh-support/react-context';
|
|
6
|
+
import filter from 'lodash/filter';
|
|
6
7
|
import find from 'lodash/find';
|
|
7
8
|
import flatMap from 'lodash/flatMap';
|
|
8
9
|
import isEmpty from 'lodash/isEmpty';
|
|
9
10
|
import isEqual from 'lodash/isEqual';
|
|
10
11
|
import React, { useContext, useEffect, useRef, useState } from 'react';
|
|
11
12
|
import { Trans, useTranslation } from 'react-i18next';
|
|
12
|
-
import {
|
|
13
|
+
import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
14
|
+
import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialCaseFilterState, } from '../CaseListFilterContext';
|
|
13
15
|
import { isNoFilterApplied, isOnlyDefaultFilterApplied } from '../CaseListFilterHelpers';
|
|
14
16
|
import { clearFilters, updateFilterQuery, updateFilterState, updateSort } from '../CaseListFilterReducer';
|
|
15
17
|
import { SaveCaseSearchModal } from './SaveCaseSearchModal';
|
|
@@ -21,7 +23,7 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
21
23
|
const [mostRecentSearch, setMostRecentSearch] = useState({});
|
|
22
24
|
const [selectedSearch, setSelectedSearch] = useState('');
|
|
23
25
|
const filterState = useContext(CaseListFilterStateContext);
|
|
24
|
-
const { filterQueryInfo, filterInfo
|
|
26
|
+
const { filterQueryInfo, filterInfo } = filterState;
|
|
25
27
|
const [isSaveSearchModalOpen, setIsSaveSearchModalOpen] = useState(false);
|
|
26
28
|
const [isMenuOpen, toggleMenu] = useState(false);
|
|
27
29
|
const isUpdatingFilters = useRef(false);
|
|
@@ -46,16 +48,17 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
46
48
|
}, [props.currentCaseSearchString]);
|
|
47
49
|
useEffect(() => {
|
|
48
50
|
if (selectedSearch && bookmarkedSearches[selectedSearch] && !isUpdatingFilters.current) {
|
|
49
|
-
const { filterState:
|
|
51
|
+
const { filterState: savedSearchFilterInfo, type: savedSearchType } = bookmarkedSearches[selectedSearch];
|
|
50
52
|
// if selected bookmark search is equal to the current filter state
|
|
51
|
-
const isFilterStatesEqual = isEqual(
|
|
52
|
-
// if
|
|
53
|
-
|
|
53
|
+
const isFilterStatesEqual = isEqual(filter(savedSearchFilterInfo, (i) => i.length !== 0), filter(filterInfo, (i) => i.length !== 0));
|
|
54
|
+
// if selected saved search and current selected filters are not equal, we need to enable saved
|
|
55
|
+
// search button and we need to give user ability to bookmark another search
|
|
56
|
+
if (!isFilterStatesEqual || savedSearchType !== filterQueryInfo.type) {
|
|
54
57
|
setSelectedSearch('');
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
|
-
}, [filterInfo, filterQueryInfo
|
|
61
|
+
}, [filterInfo, filterQueryInfo]);
|
|
59
62
|
const onMenuToggle = () => {
|
|
60
63
|
toggleMenu(!isMenuOpen);
|
|
61
64
|
};
|
|
@@ -66,8 +69,8 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
66
69
|
setSelectedSearch(selectedItem);
|
|
67
70
|
const { filterState: filterStateSaved, queryString, type, sortState } = searchQuery;
|
|
68
71
|
// update filters with new value
|
|
69
|
-
|
|
70
|
-
|
|
72
|
+
updateFilterQuery(dispatch, { queryString: queryString || '', type: type || CaseSearchQueryType.BASIC });
|
|
73
|
+
updateFilterState(dispatch, { filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), filterStateSaved) });
|
|
71
74
|
sortState && updateSort(dispatch, sortState);
|
|
72
75
|
doToggle && toggleMenu(!isMenuOpen);
|
|
73
76
|
isUpdatingFilters.current = false;
|
|
@@ -77,6 +80,7 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
77
80
|
toggleMenu(false);
|
|
78
81
|
};
|
|
79
82
|
const onEditSavedSearchClick = (searchName) => (e) => {
|
|
83
|
+
e.preventDefault();
|
|
80
84
|
e.stopPropagation();
|
|
81
85
|
setSelectedSearchNameToEdit(searchName);
|
|
82
86
|
setIsAddingBookmarkSearch(false);
|
|
@@ -111,15 +115,16 @@ export function BookmarkedSearchesSelector(props) {
|
|
|
111
115
|
...(renderSavedSearchItems.length !== 0 ? [React.createElement(DropdownSeparator, { key: "separator" })] : []),
|
|
112
116
|
...(!isEmpty(mostRecentSearch) ? renderMostRecentSearch : []),
|
|
113
117
|
];
|
|
118
|
+
const advancedSearchPhraseIsNotValid = filterState.filterQueryInfo.type === CaseSearchQueryType.ADVANCED && !props.isAdvancedSearchValid;
|
|
119
|
+
const noFilterOrSearchQueryApplied = !props.currentCaseSearchString && (isOnlyDefaultFilterApplied(filterState) || isNoFilterApplied(filterState));
|
|
114
120
|
return (React.createElement(React.Fragment, null,
|
|
115
121
|
React.createElement("div", { className: "bookmark-search-dropdown-wrapper" },
|
|
116
122
|
React.createElement(Dropdown, { className: "bookmark-search-dropdown", isOpen: isMenuOpen, dropdownItems: renderListItems, toggle: React.createElement(DropdownToggle, { splitButtonItems: [
|
|
117
123
|
React.createElement(DropdownToggleAction, { onClick: onSaveForLaterClick, key: "action", isDisabled: !!selectedSearch ||
|
|
118
|
-
|
|
119
|
-
|
|
124
|
+
noFilterOrSearchQueryApplied ||
|
|
125
|
+
advancedSearchPhraseIsNotValid, "data-tracking-id": "case-list-bookmark-search-trigger" }, selectedSearch ? selectedSearch : React.createElement(Trans, null, "Save for later")),
|
|
120
126
|
], splitButtonVariant: "action", onToggle: onMenuToggle, "aria-label": t(`${isMenuOpen ? 'Close' : 'Open'} bookmarked searches selector'`), isDisabled: !bookmarkedSearches }), disabled: hydraUserPreferences.isFetching || hydraUserPreferences.isError }),
|
|
121
127
|
flatMap(filterInfo).length === 0 && (React.createElement(Button, { variant: "link", onClick: onBookmarkSelectorChange('', mostRecentSearch, false), "data-tracking-id": "case-most-recent-search-button", className: "most-recent-search-button" },
|
|
122
128
|
React.createElement(Trans, null, "Restore most recent filters")))),
|
|
123
|
-
React.createElement(ConfirmationServiceProvider, null,
|
|
124
|
-
React.createElement(SaveCaseSearchModal, { isModalOpen: isSaveSearchModalOpen, modalToggle: modalToggle, isAdding: isAddingBookmarkSearch, selectedSearchNameToEdit: selectedSearchNameToEdit }))));
|
|
129
|
+
React.createElement(ConfirmationServiceProvider, null, isSaveSearchModalOpen && (React.createElement(SaveCaseSearchModal, { currentCaseSearchString: props.currentCaseSearchString, currentSearchType: props.currentSearchType, isModalOpen: isSaveSearchModalOpen, modalToggle: modalToggle, isAdding: isAddingBookmarkSearch, selectedSearchNameToEdit: selectedSearchNameToEdit })))));
|
|
125
130
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CaseSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/CaseSearch.tsx"],"names":[],"mappings":"AAeA,wBAAgB,UAAU,
|
|
1
|
+
{"version":3,"file":"CaseSearch.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/CaseSearch.tsx"],"names":[],"mappings":"AAeA,wBAAgB,UAAU,gBAoJzB"}
|
|
@@ -19,6 +19,7 @@ export function CaseSearch() {
|
|
|
19
19
|
const { filterQueryInfo } = filterState;
|
|
20
20
|
const [searchVal, setSearchVal] = useState(filterQueryInfo.queryString);
|
|
21
21
|
const [searchType, setSearchType] = useState(CaseSearchQueryType.BASIC);
|
|
22
|
+
const [isAdvancedSearchValid, setIsAdvancedSearchValid] = useState(true);
|
|
22
23
|
const dispatch = useContext(CaseListFilterDispatchContext);
|
|
23
24
|
const { isFetching } = useCaseListStateContext();
|
|
24
25
|
useEffect(() => {
|
|
@@ -65,7 +66,7 @@ export function CaseSearch() {
|
|
|
65
66
|
setSearchType(newType);
|
|
66
67
|
};
|
|
67
68
|
// To check is Search Button is disabled or not
|
|
68
|
-
const isSearchButtonDisabled = isEmpty(filterQueryInfo.queryString) && isEmpty(searchVal.trim());
|
|
69
|
+
const isSearchButtonDisabled = isEmpty(filterQueryInfo.queryString) && isEmpty(searchVal === null || searchVal === void 0 ? void 0 : searchVal.trim());
|
|
69
70
|
// To handle return or enter keydown event when search button is disabled
|
|
70
71
|
const handleSearchInputKeyDown = (e) => {
|
|
71
72
|
const key = e.which;
|
|
@@ -82,7 +83,7 @@ export function CaseSearch() {
|
|
|
82
83
|
const renderBasicSearch = () => {
|
|
83
84
|
return (React.createElement(React.Fragment, null,
|
|
84
85
|
React.createElement("div", { className: "case-search-input-container" },
|
|
85
|
-
React.createElement(SearchInput, { className: "pf-u-w-100", placeholder: t('Search by keyword or case ID'), value: searchVal.trim(), "data-tracking-id": "search-cases-text-input", id: "case-search-basic", "aria-label": t('Search by keyword or case ID'), onChange: onSearchValChange, onClear: clearSearchVal }),
|
|
86
|
+
React.createElement(SearchInput, { className: "pf-u-w-100", placeholder: t('Search by keyword or case ID'), value: searchVal === null || searchVal === void 0 ? void 0 : searchVal.trim(), "data-tracking-id": "search-cases-text-input", id: "case-search-basic", "aria-label": t('Search by keyword or case ID'), onChange: onSearchValChange, onClear: clearSearchVal }),
|
|
86
87
|
React.createElement(Button, { variant: "primary", type: "submit", className: "search-btn", "data-tracking-id": "case-list-search-button", isDisabled: isSearchButtonDisabled },
|
|
87
88
|
React.createElement(Trans, null, "Search")),
|
|
88
89
|
canUseAdvancedSearch && (React.createElement(Button, { variant: "link", onClick: () => onSearchTypeChange(CaseSearchQueryType.ADVANCED), isDisabled: isFetching, "data-tracking-id": "case-list-adv-toggle-button" },
|
|
@@ -90,10 +91,10 @@ export function CaseSearch() {
|
|
|
90
91
|
};
|
|
91
92
|
const renderAdvanceSearch = () => {
|
|
92
93
|
return canUseAdvancedSearch ? (React.createElement(React.Fragment, null,
|
|
93
|
-
React.createElement(AdvanceSearch, { onSearchValChange: onSearchValChange, onSearchClear: clearSearchVal, onSearchSubmit: onCaseSearch, onSearchTypeChange: onSearchTypeChange }))) : (React.createElement(React.Fragment, null));
|
|
94
|
+
React.createElement(AdvanceSearch, { onSearchValChange: onSearchValChange, onSearchClear: clearSearchVal, onSearchSubmit: onCaseSearch, onSearchTypeChange: onSearchTypeChange, onAdvancedSearchValidation: (isValid) => setIsAdvancedSearchValid(isValid) }))) : (React.createElement(React.Fragment, null));
|
|
94
95
|
};
|
|
95
96
|
return (React.createElement(React.Fragment, null,
|
|
96
97
|
React.createElement("form", { onSubmit: handleSubmit, onKeyDown: handleSearchInputKeyDown },
|
|
97
98
|
React.createElement("div", { className: "form-group case-search-form-group" }, CaseSearchQueryType.BASIC === searchType ? renderBasicSearch() : renderAdvanceSearch())),
|
|
98
|
-
React.createElement(BookmarkedSearchesSelector, { currentCaseSearchString: searchVal.trim(), currentSearchType: searchType })));
|
|
99
|
+
React.createElement(BookmarkedSearchesSelector, { currentCaseSearchString: searchVal === null || searchVal === void 0 ? void 0 : searchVal.trim(), currentSearchType: searchType, isAdvancedSearchValid: isAdvancedSearchValid })));
|
|
99
100
|
}
|
|
@@ -3,7 +3,9 @@ interface IProps {
|
|
|
3
3
|
modalToggle: () => void;
|
|
4
4
|
isAdding: boolean;
|
|
5
5
|
selectedSearchNameToEdit: string;
|
|
6
|
+
currentCaseSearchString: string;
|
|
7
|
+
currentSearchType: string;
|
|
6
8
|
}
|
|
7
|
-
export declare function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit }: IProps): JSX.Element;
|
|
9
|
+
export declare function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit, currentCaseSearchString, currentSearchType, }: IProps): JSX.Element;
|
|
8
10
|
export {};
|
|
9
11
|
//# sourceMappingURL=SaveCaseSearchModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SaveCaseSearchModal.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/SaveCaseSearchModal.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SaveCaseSearchModal.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/SaveCaseSearchModal.tsx"],"names":[],"mappings":"AA4BA,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;IACjC,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,mBAAmB,CAAC,EAChC,WAAW,EACX,WAAW,EACX,QAAQ,EACR,wBAAwB,EACxB,uBAAuB,EACvB,iBAAiB,GACpB,EAAE,MAAM,eAwQR"}
|
|
@@ -13,23 +13,28 @@ import { GlobalMetadataDispatchContext, GlobalMetadataStateContext, updateUserPr
|
|
|
13
13
|
import find from 'lodash/find';
|
|
14
14
|
import findKey from 'lodash/findKey';
|
|
15
15
|
import isEmpty from 'lodash/isEmpty';
|
|
16
|
+
import pickBy from 'lodash/pickBy';
|
|
16
17
|
import React, { useContext, useEffect, useState } from 'react';
|
|
17
18
|
import { Trans, useTranslation } from 'react-i18next';
|
|
19
|
+
import { CaseSearchQueryType } from '../../../enums/caseSearch';
|
|
18
20
|
import { createUserFriendlyQueryFromFilterState } from '../../../utils/caseSearchUtils';
|
|
19
21
|
import { CaseListFilterStateContext } from '../CaseListFilterContext';
|
|
20
|
-
export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit }) {
|
|
22
|
+
export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit, currentCaseSearchString, currentSearchType, }) {
|
|
21
23
|
const { t } = useTranslation();
|
|
22
24
|
const [localSavedSearchName, setLocalSavedSearchName] = useState('');
|
|
23
25
|
const [localDefaultChecked, setLocalDefaultChecked] = useState(false);
|
|
24
26
|
const [isUpdating, setIsUpdating] = useState(false);
|
|
25
|
-
const confirmRemove = useConfirmation();
|
|
26
27
|
const [isDuplicateNameError, setIsDuplicateNameError] = useState(false);
|
|
27
|
-
const
|
|
28
|
+
const [saveButtonIsClicked, setSaveButtonIsClicked] = useState(false);
|
|
29
|
+
const filterState = useContext(CaseListFilterStateContext);
|
|
30
|
+
const { filterQueryInfo, filterInfo, sortInfo } = filterState;
|
|
31
|
+
const { globalMetadataState } = useContext(GlobalMetadataStateContext);
|
|
32
|
+
const { hydraUserPreferences, loggedInUserRights } = globalMetadataState;
|
|
33
|
+
const confirmRemove = useConfirmation();
|
|
28
34
|
const dispatchToGlobalMetadataReducer = useContext(GlobalMetadataDispatchContext);
|
|
29
|
-
const { filterInfo, sortInfo, filterQueryInfo } = useContext(CaseListFilterStateContext);
|
|
30
35
|
const handleSaveSearchNameChange = (value) => {
|
|
31
36
|
setLocalSavedSearchName(value);
|
|
32
|
-
if (previousBookmarkedSearchesObj[value]) {
|
|
37
|
+
if (previousBookmarkedSearchesObj[value] && selectedSearchNameToEdit !== value) {
|
|
33
38
|
setIsDuplicateNameError(true);
|
|
34
39
|
}
|
|
35
40
|
else {
|
|
@@ -55,46 +60,41 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
|
|
|
55
60
|
previousBookmarkedSearchesObj[defaultSavedSearchKey].defaultChecked = false;
|
|
56
61
|
}
|
|
57
62
|
};
|
|
58
|
-
const
|
|
63
|
+
const save = () => __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
setSaveButtonIsClicked(true);
|
|
65
|
+
if (isEmpty(localSavedSearchName.trim()) || isDuplicateNameError)
|
|
66
|
+
return;
|
|
59
67
|
try {
|
|
60
68
|
setIsUpdating(true);
|
|
61
|
-
previousBookmarkedSearchesObj[localSavedSearchName] = Object.assign({ filterState: filterInfo, sortState: sortInfo, defaultChecked: localDefaultChecked }, filterQueryInfo);
|
|
62
69
|
// if new added search has 'set default' true,
|
|
63
70
|
// need to remove old default search if there is any
|
|
64
71
|
localDefaultChecked && setDefaultSearchToFalse();
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
localDefaultChecked && setDefaultSearchToFalse();
|
|
82
|
-
// add new member to obj
|
|
83
|
-
previousBookmarkedSearchesObj[localSavedSearchName] = Object.assign(Object.assign({}, previousBookmarkedSearchesObj[selectedSearchNameToEdit]), { defaultChecked: localDefaultChecked });
|
|
84
|
-
// name changed, need to deleted old obj member
|
|
85
|
-
if (localSavedSearchName !== selectedSearchNameToEdit) {
|
|
86
|
-
delete previousBookmarkedSearchesObj[selectedSearchNameToEdit];
|
|
72
|
+
if (isAdding) {
|
|
73
|
+
previousBookmarkedSearchesObj[localSavedSearchName] = {
|
|
74
|
+
filterState: pickBy(filterState.filterInfo, (value) => value.length !== 0),
|
|
75
|
+
sortState: sortInfo,
|
|
76
|
+
type: currentSearchType,
|
|
77
|
+
queryString: currentCaseSearchString,
|
|
78
|
+
defaultChecked: localDefaultChecked,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// user can only edit saved search name and `set default` checkbox
|
|
83
|
+
previousBookmarkedSearchesObj[localSavedSearchName] = Object.assign(Object.assign({}, previousBookmarkedSearchesObj[selectedSearchNameToEdit]), { defaultChecked: localDefaultChecked });
|
|
84
|
+
// Because saved search name changed, need to deleted old name obj
|
|
85
|
+
if (localSavedSearchName !== selectedSearchNameToEdit) {
|
|
86
|
+
delete previousBookmarkedSearchesObj[selectedSearchNameToEdit];
|
|
87
|
+
}
|
|
87
88
|
}
|
|
88
89
|
yield preferencesApiCall(previousBookmarkedSearchesObj);
|
|
89
90
|
setIsUpdating(false);
|
|
90
91
|
ToastNotification.addSuccessMessage(t('Saved search has been updated successfully'));
|
|
91
|
-
modalToggle();
|
|
92
92
|
}
|
|
93
93
|
catch (e) {
|
|
94
94
|
setIsUpdating(false);
|
|
95
95
|
ToastNotification.addDangerMessage(t('Saved search failed to update'));
|
|
96
|
-
modalToggle();
|
|
97
96
|
}
|
|
97
|
+
closeModal();
|
|
98
98
|
});
|
|
99
99
|
const deleteSavedSearch = () => __awaiter(this, void 0, void 0, function* () {
|
|
100
100
|
try {
|
|
@@ -103,6 +103,8 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
|
|
|
103
103
|
catchOnCancel: true,
|
|
104
104
|
title: t(`Delete saved search?`),
|
|
105
105
|
description: React.createElement(Trans, null, "This will permanently remove it from your list of saved searches."),
|
|
106
|
+
confirmText: t('Delete'),
|
|
107
|
+
confirmButtonVariant: ButtonVariant.danger,
|
|
106
108
|
});
|
|
107
109
|
try {
|
|
108
110
|
delete previousBookmarkedSearchesObj[localSavedSearchName];
|
|
@@ -118,16 +120,38 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
|
|
|
118
120
|
// on confirm modal, cancel button is clicked
|
|
119
121
|
}
|
|
120
122
|
});
|
|
123
|
+
const closeModal = () => {
|
|
124
|
+
setSaveButtonIsClicked(false);
|
|
125
|
+
setLocalSavedSearchName('');
|
|
126
|
+
modalToggle();
|
|
127
|
+
};
|
|
128
|
+
const getQueryStr = () => {
|
|
129
|
+
let queryStr = '';
|
|
130
|
+
if (isAdding) {
|
|
131
|
+
queryStr =
|
|
132
|
+
currentSearchType === CaseSearchQueryType.BASIC
|
|
133
|
+
? createUserFriendlyQueryFromFilterState(filterInfo, currentCaseSearchString)
|
|
134
|
+
: currentCaseSearchString;
|
|
135
|
+
}
|
|
136
|
+
else if (selectedSearchNameToEdit && previousBookmarkedSearchesObj[selectedSearchNameToEdit]) {
|
|
137
|
+
queryStr = createUserFriendlyQueryFromFilterState(previousBookmarkedSearchesObj[selectedSearchNameToEdit].filterState, previousBookmarkedSearchesObj[selectedSearchNameToEdit].queryString);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
queryStr = previousBookmarkedSearchesObj[localSavedSearchName] || '';
|
|
141
|
+
}
|
|
142
|
+
return queryStr || '';
|
|
143
|
+
};
|
|
121
144
|
useEffect(() => {
|
|
122
145
|
var _a;
|
|
123
146
|
setLocalSavedSearchName(selectedSearchNameToEdit);
|
|
124
147
|
setLocalDefaultChecked(((_a = previousBookmarkedSearchesObj[selectedSearchNameToEdit]) === null || _a === void 0 ? void 0 : _a.defaultChecked) || false);
|
|
125
148
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
126
|
-
}, [selectedSearchNameToEdit]);
|
|
127
|
-
return (React.createElement(Modal, { variant: ModalVariant.medium, title: isAdding ? t('Save search and filters') : t('Edit saved search and filters'), isOpen: isModalOpen, onClose:
|
|
128
|
-
React.createElement(Button, { key: "save", variant: ButtonVariant.primary, isLoading: isUpdating, spinnerAriaValueText: hydraUserPreferences.isFetching ? 'Saving' : undefined, isDisabled:
|
|
149
|
+
}, [filterInfo, filterQueryInfo.queryString, isAdding, selectedSearchNameToEdit, currentCaseSearchString]);
|
|
150
|
+
return (React.createElement(Modal, { variant: ModalVariant.medium, title: isAdding ? t('Save search and filters') : t('Edit saved search and filters'), isOpen: isModalOpen, onClose: closeModal, style: { overflow: 'visible' }, actions: [
|
|
151
|
+
React.createElement(Button, { key: "save", variant: ButtonVariant.primary, isLoading: isUpdating, spinnerAriaValueText: hydraUserPreferences.isFetching ? 'Saving' : undefined, isDisabled: hydraUserPreferences.isFetching ||
|
|
152
|
+
(saveButtonIsClicked && (isEmpty(localSavedSearchName.trim()) || isDuplicateNameError)), "data-tracking-id": isAdding ? 'case-list-bookmark-search-saved' : 'case-list-bookmark-search-edited', onClick: save },
|
|
129
153
|
React.createElement(Trans, null, "Save")),
|
|
130
|
-
React.createElement(Button, { key: "cancel", variant: ButtonVariant.secondary, "data-tracking-id": "case-list-bookmark-search-canceled", onClick:
|
|
154
|
+
React.createElement(Button, { key: "cancel", variant: ButtonVariant.secondary, "data-tracking-id": "case-list-bookmark-search-canceled", onClick: closeModal },
|
|
131
155
|
React.createElement(Trans, null, "Cancel")),
|
|
132
156
|
React.createElement(React.Fragment, null,
|
|
133
157
|
React.createElement(Checkbox, { className: "pf-u-ml-md save-search-set-default", key: "set-as-default", "aria-label": t('Set as default'), id: "case-list-bookmark-search-set-as-default", "data-tracking-id": "case-list-bookmark-search-set-as-default", isChecked: localDefaultChecked, onChange: (checkbox, e) => {
|
|
@@ -140,12 +164,12 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
|
|
|
140
164
|
React.createElement(Trans, null, "Remove")))),
|
|
141
165
|
] },
|
|
142
166
|
React.createElement(Form, null,
|
|
143
|
-
React.createElement(FormGroup, { label: t('Name'), isRequired: true, fieldId: "save-search-name", validated: isDuplicateNameError ? 'error' : 'default', helperTextInvalid: t('Filter with same name already exists. Please enter a unique name.'), className: "form-group pull-bottom-narrow" },
|
|
144
|
-
React.createElement(TextInput, { isRequired: true, type: "text", placeholder: t('Enter a unique name to reference in the future'), id: "save-search-name", name: "save-search-name", "aria-describedby": "save-search-name-helper", value: localSavedSearchName, onChange: handleSaveSearchNameChange, className: `form-control${isDuplicateNameError ||
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
?
|
|
148
|
-
:
|
|
149
|
-
|
|
150
|
-
|
|
167
|
+
React.createElement(FormGroup, { label: t('Name'), isRequired: true, fieldId: "save-search-name", validated: saveButtonIsClicked && isDuplicateNameError ? 'error' : 'default', helperTextInvalid: t('Filter with same name already exists. Please enter a unique name.'), className: "form-group pull-bottom-narrow" },
|
|
168
|
+
React.createElement(TextInput, { isRequired: true, type: "text", placeholder: t('Enter a unique name to reference in the future'), id: "save-search-name", name: "save-search-name", "aria-describedby": "save-search-name-helper", value: localSavedSearchName, onChange: handleSaveSearchNameChange, className: `form-control${saveButtonIsClicked && (isDuplicateNameError || isEmpty(localSavedSearchName.trim()))
|
|
169
|
+
? ' form-invalid'
|
|
170
|
+
: ''}`, validated: saveButtonIsClicked && (isDuplicateNameError || isEmpty(localSavedSearchName.trim()))
|
|
171
|
+
? 'error'
|
|
172
|
+
: 'default' })),
|
|
173
|
+
React.createElement(FormGroup, { label: t('Search and filter query'), isRequired: true, fieldId: "filter-query", className: "form-group pf-u-mt-lg", validated: saveButtonIsClicked ? 'error' : 'default' },
|
|
174
|
+
React.createElement(TextArea, { isRequired: true, type: "text", id: "filter-query", name: "filter-query", "aria-describedby": "filter-query-helper", value: getQueryStr(), className: "form-control", isDisabled: true })))));
|
|
151
175
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAdvanceSearchParser.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/useAdvanceSearchParser.tsx"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,MAAM,EAAE;;CAAA;yBASzB,MAAM;6BASF,MAAM;;
|
|
1
|
+
{"version":3,"file":"useAdvanceSearchParser.d.ts","sourceRoot":"","sources":["../../../../../src/components/case-list/case-search/useAdvanceSearchParser.tsx"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,UAAU,sBAAsB,CAAC,EAAE,MAAM,EAAE;;CAAA;yBASzB,MAAM;6BASF,MAAM;;EA4EzC"}
|
|
@@ -26,7 +26,12 @@ export default function useAdvanceSearchParser({ onInit }) {
|
|
|
26
26
|
return '';
|
|
27
27
|
};
|
|
28
28
|
const initParser = () => {
|
|
29
|
-
|
|
29
|
+
try {
|
|
30
|
+
parserRef.current = PEG.generate(grammerStringRef.current);
|
|
31
|
+
}
|
|
32
|
+
catch (_a) {
|
|
33
|
+
parserRef.current = null;
|
|
34
|
+
}
|
|
30
35
|
};
|
|
31
36
|
// write products, severity and status to grammar string once we have the values from facets
|
|
32
37
|
useEffect(() => {
|
|
@@ -20,7 +20,6 @@ export declare const advanceSearchFieldNameToSolrFieldMapping: {
|
|
|
20
20
|
case_24_7: string;
|
|
21
21
|
case_is_cep: string;
|
|
22
22
|
case_accountNumber: string;
|
|
23
|
-
case_type: string;
|
|
24
23
|
case_number: string;
|
|
25
24
|
case_owner_sso_username: string;
|
|
26
25
|
case_lastModifiedByName: string;
|
|
@@ -32,11 +31,13 @@ export declare const advanceSearchFieldNameToSolrFieldMapping: {
|
|
|
32
31
|
case_createdDate: string;
|
|
33
32
|
case_description: string;
|
|
34
33
|
case_summary: string;
|
|
34
|
+
case_alternate_id: string;
|
|
35
35
|
case_product: string;
|
|
36
36
|
case_status: string;
|
|
37
37
|
case_folderNumber: string;
|
|
38
38
|
case_severity: string;
|
|
39
39
|
case_customer_escalation: string;
|
|
40
40
|
case_version: string;
|
|
41
|
+
case_type: string;
|
|
41
42
|
};
|
|
42
43
|
//# sourceMappingURL=caseSearch.d.ts.map
|
|
@@ -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;;;;;;;;;;;;CAYvC,CAAC;AAEF,eAAO,MAAM,wCAAwC
|
|
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;;;;;;;;;;;;CAYvC,CAAC;AAEF,eAAO,MAAM,wCAAwC;;;;;;;;;;;;;;;;;;;;;;;CAiBpD,CAAC"}
|
|
@@ -16,6 +16,6 @@ export const fieldNameToSolrFieldMapping = {
|
|
|
16
16
|
[SolrKeys.version]: 'productVersion',
|
|
17
17
|
[SolrKeys.caseContactSSO]: 'ownedByMe',
|
|
18
18
|
[SolrKeys.createdBySsoUsername]: 'createdBySsoUsername',
|
|
19
|
-
[SolrKeys.type]: '
|
|
19
|
+
[SolrKeys.type]: 'caseType',
|
|
20
20
|
};
|
|
21
|
-
export const advanceSearchFieldNameToSolrFieldMapping = Object.assign(Object.assign({}, fieldNameToSolrFieldMapping), { [SolrKeys.fts]: 'FTS', [SolrKeys.cep]: 'CEP', [SolrKeys.accountNumber]: 'accountNumber', [SolrKeys.
|
|
21
|
+
export const advanceSearchFieldNameToSolrFieldMapping = Object.assign(Object.assign({}, fieldNameToSolrFieldMapping), { [SolrKeys.fts]: 'FTS', [SolrKeys.cep]: 'CEP', [SolrKeys.accountNumber]: 'accountNumber', [SolrKeys.caseNumber]: 'caseNumber', [SolrKeys.caseOwner]: 'ownerSSO', [SolrKeys.modifiedBy]: 'lastModifiedByName', [SolrKeys.createdBySsoUsername]: 'createdBySSO', [SolrKeys.createdBy]: 'createdByName', [SolrKeys.contactName]: 'contactName', [SolrKeys.caseContactSSO]: 'contactSSO', [SolrKeys.modifiedDate]: 'lastModifiedDate', [SolrKeys.createdDate]: 'createdDate', [SolrKeys.description]: 'description', [SolrKeys.caseSummary]: 'summary', [SolrKeys.alternateId]: 'alternateId' });
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CaseSearchQueryType } from '../enums/caseSearch';
|
|
2
2
|
export declare function useFilterStateOnLoad(): {
|
|
3
|
-
set: (queryFromUrl: string, pageSizeFromUrl: number, currentPageFromUrl: number, searchType: CaseSearchQueryType) =>
|
|
3
|
+
set: (queryFromUrl: string, pageSizeFromUrl: number, currentPageFromUrl: number, searchType: CaseSearchQueryType) => any;
|
|
4
4
|
};
|
|
5
5
|
//# sourceMappingURL=useFilterStateOnLoad.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFilterStateOnLoad.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFilterStateOnLoad.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useFilterStateOnLoad.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFilterStateOnLoad.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D,wBAAgB,oBAAoB;wBAkBd,MAAM,mBACH,MAAM,sBACH,MAAM,cACd,mBAAmB;EAsDtC"}
|
|
@@ -3,41 +3,36 @@ import find from 'lodash/find';
|
|
|
3
3
|
import findKey from 'lodash/findKey';
|
|
4
4
|
import isEmpty from 'lodash/isEmpty';
|
|
5
5
|
import { useContext, useMemo } from 'react';
|
|
6
|
-
import {
|
|
6
|
+
import { CaseListFilterStateContext, initialCaseFilterState } from '../components/case-list/CaseListFilterContext';
|
|
7
7
|
import { isArrayHashMapEmpty } from '../components/case-list/CaseListFilterHelpers';
|
|
8
|
-
import { updateFilterState } from '../components/case-list/CaseListFilterReducer';
|
|
9
8
|
import { SolrKeys } from '../enums/filters';
|
|
10
9
|
import { createFilterStateFromUrlQuery } from '../utils/caseSearchUtils';
|
|
11
10
|
export function useFilterStateOnLoad() {
|
|
12
11
|
const { globalMetadataState, globalMetadataState: { caseGroups, hydraUserPreferences }, } = useContext(GlobalMetadataStateContext);
|
|
13
12
|
const filterState = useContext(CaseListFilterStateContext);
|
|
14
|
-
const filterDispatch = useContext(CaseListFilterDispatchContext);
|
|
15
13
|
const savesSearches = find(hydraUserPreferences.data, (pref) => pref.key === UserPreferencesKeys.caseSavedSearchFilters);
|
|
16
14
|
const savedSearchesObj = useMemo(() => ((savesSearches === null || savesSearches === void 0 ? void 0 : savesSearches.value) ? JSON.parse(savesSearches.value) : {}), [savesSearches]);
|
|
17
15
|
const set = (queryFromUrl, pageSizeFromUrl, currentPageFromUrl, searchType) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const hasFilterStateFromQuery = !isArrayHashMapEmpty(filterStateFromQuery.filterInfo) &&
|
|
22
|
-
!isEmpty(filterStateFromQuery.filterQueryInfo.queryString);
|
|
16
|
+
const filterStateFromURL = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, pageSizeFromUrl, currentPageFromUrl, searchType);
|
|
17
|
+
const hasFilterStateFromURL = !isArrayHashMapEmpty(filterStateFromURL.filterInfo) &&
|
|
18
|
+
!isEmpty(filterStateFromURL.filterQueryInfo.queryString);
|
|
23
19
|
let savedSearchFilterState = null;
|
|
24
20
|
const defaultSavedSearchKey = findKey(savedSearchesObj, { defaultChecked: true });
|
|
25
21
|
if (defaultSavedSearchKey) {
|
|
26
22
|
const { filterState: filterStateSaved, queryString, type, sortState, } = savedSearchesObj[defaultSavedSearchKey];
|
|
27
|
-
savedSearchFilterState = Object.assign(Object.assign({}, filterState), { sortInfo: sortState, filterQueryInfo: Object.assign(Object.assign({}, filterState.filterQueryInfo), { queryString, type }), filterInfo: filterStateSaved });
|
|
23
|
+
savedSearchFilterState = Object.assign(Object.assign({}, filterState), { sortInfo: sortState, filterQueryInfo: Object.assign(Object.assign({}, filterState.filterQueryInfo), { queryString, type }), filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), filterStateSaved) });
|
|
28
24
|
}
|
|
29
|
-
defaultFilterState =
|
|
30
|
-
?
|
|
25
|
+
let defaultFilterState = hasFilterStateFromURL
|
|
26
|
+
? filterStateFromURL
|
|
31
27
|
: savedSearchFilterState
|
|
32
28
|
? savedSearchFilterState
|
|
33
|
-
:
|
|
29
|
+
: filterState;
|
|
34
30
|
const defaultGroup = (caseGroups.data || []).find((group) => group.isDefault);
|
|
35
31
|
if (defaultGroup) {
|
|
36
32
|
const updatedFilterInfo = Object.assign(Object.assign({}, filterState.filterInfo), { [SolrKeys.group]: [{ key: defaultGroup.groupNum, value: defaultGroup.name }] });
|
|
37
33
|
defaultFilterState = Object.assign(Object.assign({}, filterState), { filterInfo: updatedFilterInfo });
|
|
38
34
|
}
|
|
39
|
-
|
|
40
|
-
updateFilterState(filterDispatch, defaultFilterState);
|
|
35
|
+
return defaultFilterState;
|
|
41
36
|
};
|
|
42
37
|
return {
|
|
43
38
|
set,
|
|
@@ -303,11 +303,11 @@ function createFilterStateFromUrlQuery(urlQuery, globalMetadataState, pageSize,
|
|
|
303
303
|
}
|
|
304
304
|
function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, currentFilterState) {
|
|
305
305
|
const filterObj = parseSolrQuery(queryString);
|
|
306
|
-
const
|
|
306
|
+
const newFilterInfo = {};
|
|
307
307
|
let advanceToBasicQuery = [];
|
|
308
308
|
Object.keys(filterObj || {}).forEach((_key) => {
|
|
309
309
|
if (_key === SolrKeys.product) {
|
|
310
|
-
|
|
310
|
+
newFilterInfo[SolrPivotKeys.product_version] = generateProductVersionPivotValue(filterObj[_key]);
|
|
311
311
|
}
|
|
312
312
|
// if it's an unnamed field we should add it to free text querystring
|
|
313
313
|
else if (_key === '<implicit>') {
|
|
@@ -316,7 +316,7 @@ function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, cu
|
|
|
316
316
|
else {
|
|
317
317
|
// if field is present in this map, it means field is supported in basic search mode too
|
|
318
318
|
if (fieldNameToSolrFieldMapping[_key]) {
|
|
319
|
-
|
|
319
|
+
newFilterInfo[_key] = generateFilterValue(_key, filterObj[_key], globalMetadataState);
|
|
320
320
|
}
|
|
321
321
|
else {
|
|
322
322
|
// if it's supported in basic search mode then add it as a query string in the search input
|
|
@@ -327,7 +327,7 @@ function createFilterStateFromAdvancedQuery(queryString, globalMetadataState, cu
|
|
|
327
327
|
}
|
|
328
328
|
}
|
|
329
329
|
});
|
|
330
|
-
const filterState = Object.assign(Object.assign({}, currentFilterState), { filterQueryInfo: Object.assign(Object.assign({}, currentFilterState.filterQueryInfo), { queryString: advanceToBasicQuery.join(' AND '), type: CaseSearchQueryType.BASIC }), filterInfo: Object.assign(Object.assign({},
|
|
330
|
+
const filterState = Object.assign(Object.assign({}, currentFilterState), { filterQueryInfo: Object.assign(Object.assign({}, currentFilterState.filterQueryInfo), { queryString: advanceToBasicQuery.join(' AND '), type: CaseSearchQueryType.BASIC }), filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), newFilterInfo) });
|
|
331
331
|
return filterState;
|
|
332
332
|
}
|
|
333
333
|
function generateFilterValue(solrFieldName, value, globalMetadataState) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rh-support/cases",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.46",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"registry": "https://registry.npmjs.org"
|
|
@@ -52,12 +52,12 @@
|
|
|
52
52
|
"@patternfly/pfe-collapse": "1.12.3",
|
|
53
53
|
"@patternfly/react-core": "4.194.0",
|
|
54
54
|
"@patternfly/react-table": "4.63.0",
|
|
55
|
-
"@rh-support/api": "0.3.
|
|
56
|
-
"@rh-support/components": "1.1.
|
|
57
|
-
"@rh-support/react-context": "0.2.
|
|
58
|
-
"@rh-support/types": "0.2.
|
|
59
|
-
"@rh-support/user-permissions": "0.2.
|
|
60
|
-
"@rh-support/utils": "0.2.
|
|
55
|
+
"@rh-support/api": "^0.3.12",
|
|
56
|
+
"@rh-support/components": "^1.1.31",
|
|
57
|
+
"@rh-support/react-context": "^0.2.34",
|
|
58
|
+
"@rh-support/types": "^0.2.2",
|
|
59
|
+
"@rh-support/user-permissions": "^0.2.25",
|
|
60
|
+
"@rh-support/utils": "^0.2.23",
|
|
61
61
|
"i18next": "^19.0.1",
|
|
62
62
|
"localforage": "^1.7.3",
|
|
63
63
|
"lodash": "^4.17.15",
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"not ie <= 11",
|
|
102
102
|
"not op_mini all"
|
|
103
103
|
],
|
|
104
|
-
"gitHead": "
|
|
104
|
+
"gitHead": "70f8095b855f531eb814e85cb5a77908405fff5f"
|
|
105
105
|
}
|