@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.
Files changed (23) hide show
  1. package/lib/esm/components/case-list/CaseList.d.ts.map +1 -1
  2. package/lib/esm/components/case-list/CaseList.js +3 -4
  3. package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts +1 -0
  4. package/lib/esm/components/case-list/case-search/AdvanceSearch.d.ts.map +1 -1
  5. package/lib/esm/components/case-list/case-search/AdvanceSearch.js +2 -0
  6. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts +1 -0
  7. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.d.ts.map +1 -1
  8. package/lib/esm/components/case-list/case-search/BookmarkedSearchesSelector.js +18 -13
  9. package/lib/esm/components/case-list/case-search/CaseSearch.d.ts.map +1 -1
  10. package/lib/esm/components/case-list/case-search/CaseSearch.js +5 -4
  11. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts +3 -1
  12. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.d.ts.map +1 -1
  13. package/lib/esm/components/case-list/case-search/SaveCaseSearchModal.js +67 -43
  14. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.d.ts.map +1 -1
  15. package/lib/esm/components/case-list/case-search/useAdvanceSearchParser.js +6 -1
  16. package/lib/esm/enums/caseSearch.d.ts +2 -1
  17. package/lib/esm/enums/caseSearch.d.ts.map +1 -1
  18. package/lib/esm/enums/caseSearch.js +2 -2
  19. package/lib/esm/hooks/useFilterStateOnLoad.d.ts +1 -1
  20. package/lib/esm/hooks/useFilterStateOnLoad.d.ts.map +1 -1
  21. package/lib/esm/hooks/useFilterStateOnLoad.js +9 -14
  22. package/lib/esm/utils/caseSearchUtils.js +4 -4
  23. 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,eAubrC"}
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;CACjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,eAsV1C"}
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":"AAuBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAOhE,UAAU,MAAM;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,eAyMvD"}
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 { CaseListFilterDispatchContext, CaseListFilterStateContext } from '../CaseListFilterContext';
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, sortInfo } = filterState;
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: filterStateSaved, queryString, type, sortState } = bookmarkedSearches[selectedSearch];
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({ filterInfo: filterStateSaved, sortInfo: sortState, filterQueryInfo: { queryString, type } }, { filterInfo, filterQueryInfo, sortInfo });
52
- // if they are not means filters have changed and we should give user a chance to bookmark another search
53
- if (!isFilterStatesEqual) {
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, sortInfo]);
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
- queryString && updateFilterQuery(dispatch, { queryString, type });
70
- filterState && updateFilterState(dispatch, { filterInfo: Object.assign(Object.assign({}, filterState.filterInfo), filterStateSaved) });
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
- (!props.currentCaseSearchString &&
119
- (isOnlyDefaultFilterApplied(filterState) || isNoFilterApplied(filterState))), "data-tracking-id": "case-list-bookmark-search-trigger" }, selectedSearch ? selectedSearch : React.createElement(Trans, null, "Save for later")),
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,gBA8IzB"}
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":"AA2BA,UAAU,MAAM;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,wBAAwB,EAAE,MAAM,CAAC;CACpC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,wBAAwB,EAAE,EAAE,MAAM,eAuP3G"}
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 { globalMetadataState: { loggedInUserRights, hydraUserPreferences }, } = useContext(GlobalMetadataStateContext);
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 addSavedSearch = () => __awaiter(this, void 0, void 0, function* () {
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
- yield preferencesApiCall(previousBookmarkedSearchesObj);
66
- setIsUpdating(false);
67
- ToastNotification.addSuccessMessage(t('Saved search has been updated successfully'));
68
- modalToggle();
69
- }
70
- catch (e) {
71
- setIsUpdating(false);
72
- ToastNotification.addDangerMessage(t('Saved search failed to update'));
73
- modalToggle();
74
- }
75
- });
76
- const onSearchEdit = () => __awaiter(this, void 0, void 0, function* () {
77
- try {
78
- setIsUpdating(true);
79
- // if editted search has 'set default' true,
80
- // need to remove old default search if there is any
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: modalToggle, actions: [
128
- React.createElement(Button, { key: "save", variant: ButtonVariant.primary, isLoading: isUpdating, spinnerAriaValueText: hydraUserPreferences.isFetching ? 'Saving' : undefined, isDisabled: isEmpty(localSavedSearchName.trim()) || isDuplicateNameError || hydraUserPreferences.isFetching, "data-tracking-id": isAdding ? 'case-list-bookmark-search-saved' : 'case-list-bookmark-search-edited', onClick: isAdding ? addSavedSearch : onSearchEdit },
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: modalToggle },
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 || !localSavedSearchName ? ' form-invalid' : ''}` })),
145
- React.createElement(FormGroup, { label: t('Search and filter query'), isRequired: true, fieldId: "filter-query", className: "form-group pf-u-mt-lg" },
146
- React.createElement(TextArea, { isRequired: true, type: "text", id: "filter-query", name: "filter-query", "aria-describedby": "filter-query-helper", value: isAdding
147
- ? createUserFriendlyQueryFromFilterState(filterInfo, filterQueryInfo.queryString)
148
- : selectedSearchNameToEdit && previousBookmarkedSearchesObj[selectedSearchNameToEdit]
149
- ? createUserFriendlyQueryFromFilterState(previousBookmarkedSearchesObj[selectedSearchNameToEdit].filterState, previousBookmarkedSearchesObj[selectedSearchNameToEdit].queryString)
150
- : '', className: "form-control", isDisabled: true })))));
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;;EAwEzC"}
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
- parserRef.current = PEG.generate(grammerStringRef.current);
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;;;;;;;;;;;;;;;;;;;;;;CAiBpD,CAAC"}
1
+ {"version":3,"file":"caseSearch.d.ts","sourceRoot":"","sources":["../../../src/enums/caseSearch.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,oBAAY,mBAAmB;IAC3B,KAAK,UAAU;IACf,QAAQ,aAAa;CACxB;AAED,eAAO,MAAM,2BAA2B;;;;;;;;;;;;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]: '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.type]: 'caseType', [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' });
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) => void;
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":"AAaA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAI1D,wBAAgB,oBAAoB;wBAmBd,MAAM,mBACH,MAAM,sBACH,MAAM,cACd,mBAAmB;EA0DtC"}
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 { CaseListFilterDispatchContext, CaseListFilterStateContext, } from '../components/case-list/CaseListFilterContext';
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
- // set state from url
19
- let defaultFilterState = filterState;
20
- const filterStateFromQuery = createFilterStateFromUrlQuery(queryFromUrl, globalMetadataState, pageSizeFromUrl, currentPageFromUrl, searchType);
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 = hasFilterStateFromQuery
30
- ? filterStateFromQuery
25
+ let defaultFilterState = hasFilterStateFromURL
26
+ ? filterStateFromURL
31
27
  : savedSearchFilterState
32
28
  ? savedSearchFilterState
33
- : defaultFilterState;
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
- // we only update the state without api call as we fetch result in another useEffect that observes the state
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 filterInfo = {};
306
+ const newFilterInfo = {};
307
307
  let advanceToBasicQuery = [];
308
308
  Object.keys(filterObj || {}).forEach((_key) => {
309
309
  if (_key === SolrKeys.product) {
310
- filterInfo[SolrPivotKeys.product_version] = generateProductVersionPivotValue(filterObj[_key]);
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
- filterInfo[_key] = generateFilterValue(_key, filterObj[_key], globalMetadataState);
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({}, currentFilterState.filterInfo), filterInfo) });
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.40",
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.10",
56
- "@rh-support/components": "1.1.28",
57
- "@rh-support/react-context": "0.2.31",
58
- "@rh-support/types": "0.2.0",
59
- "@rh-support/user-permissions": "0.2.22",
60
- "@rh-support/utils": "0.2.20",
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": "888b282fb16eda05ab2c622c298164921d22bcbc"
104
+ "gitHead": "70f8095b855f531eb814e85cb5a77908405fff5f"
105
105
  }