@rh-support/cases 0.2.41 → 0.2.55

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/README.md CHANGED
@@ -16,3 +16,5 @@ export default function CasesApp(routeProps: RouteComponentProps<ICasesRouteURLP
16
16
  return (<Cases routeProps={routeProps} basePath="/cases" />);
17
17
  }
18
18
  ```
19
+
20
+ .
@@ -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":"AAwBA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAWhE,UAAU,MAAM;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,mBAAmB,CAAC;CAC1C;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,eA6MvD"}
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"}
@@ -10,6 +10,7 @@ import isEmpty from 'lodash/isEmpty';
10
10
  import isEqual from 'lodash/isEqual';
11
11
  import React, { useContext, useEffect, useRef, useState } from 'react';
12
12
  import { Trans, useTranslation } from 'react-i18next';
13
+ import { CaseSearchQueryType } from '../../../enums/caseSearch';
13
14
  import { CaseListFilterDispatchContext, CaseListFilterStateContext, initialCaseFilterState, } from '../CaseListFilterContext';
14
15
  import { isNoFilterApplied, isOnlyDefaultFilterApplied } from '../CaseListFilterHelpers';
15
16
  import { clearFilters, updateFilterQuery, updateFilterState, updateSort } from '../CaseListFilterReducer';
@@ -68,7 +69,7 @@ export function BookmarkedSearchesSelector(props) {
68
69
  setSelectedSearch(selectedItem);
69
70
  const { filterState: filterStateSaved, queryString, type, sortState } = searchQuery;
70
71
  // update filters with new value
71
- queryString && updateFilterQuery(dispatch, { queryString, type });
72
+ updateFilterQuery(dispatch, { queryString: queryString || '', type: type || CaseSearchQueryType.BASIC });
72
73
  updateFilterState(dispatch, { filterInfo: Object.assign(Object.assign({}, initialCaseFilterState.filterInfo), filterStateSaved) });
73
74
  sortState && updateSort(dispatch, sortState);
74
75
  doToggle && toggleMenu(!isMenuOpen);
@@ -114,14 +115,16 @@ export function BookmarkedSearchesSelector(props) {
114
115
  ...(renderSavedSearchItems.length !== 0 ? [React.createElement(DropdownSeparator, { key: "separator" })] : []),
115
116
  ...(!isEmpty(mostRecentSearch) ? renderMostRecentSearch : []),
116
117
  ];
118
+ const advancedSearchPhraseIsNotValid = filterState.filterQueryInfo.type === CaseSearchQueryType.ADVANCED && !props.isAdvancedSearchValid;
119
+ const noFilterOrSearchQueryApplied = !props.currentCaseSearchString && (isOnlyDefaultFilterApplied(filterState) || isNoFilterApplied(filterState));
117
120
  return (React.createElement(React.Fragment, null,
118
121
  React.createElement("div", { className: "bookmark-search-dropdown-wrapper" },
119
122
  React.createElement(Dropdown, { className: "bookmark-search-dropdown", isOpen: isMenuOpen, dropdownItems: renderListItems, toggle: React.createElement(DropdownToggle, { splitButtonItems: [
120
123
  React.createElement(DropdownToggleAction, { onClick: onSaveForLaterClick, key: "action", isDisabled: !!selectedSearch ||
121
- (!props.currentCaseSearchString &&
122
- (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")),
123
126
  ], splitButtonVariant: "action", onToggle: onMenuToggle, "aria-label": t(`${isMenuOpen ? 'Close' : 'Open'} bookmarked searches selector'`), isDisabled: !bookmarkedSearches }), disabled: hydraUserPreferences.isFetching || hydraUserPreferences.isError }),
124
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" },
125
128
  React.createElement(Trans, null, "Restore most recent filters")))),
126
- React.createElement(ConfirmationServiceProvider, null, isSaveSearchModalOpen && (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 })))));
127
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(() => {
@@ -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 === null || searchVal === void 0 ? void 0 : 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,eAgQ3G"}
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"}
@@ -16,9 +16,10 @@ import isEmpty from 'lodash/isEmpty';
16
16
  import pickBy from 'lodash/pickBy';
17
17
  import React, { useContext, useEffect, useState } from 'react';
18
18
  import { Trans, useTranslation } from 'react-i18next';
19
+ import { CaseSearchQueryType } from '../../../enums/caseSearch';
19
20
  import { createUserFriendlyQueryFromFilterState } from '../../../utils/caseSearchUtils';
20
21
  import { CaseListFilterStateContext } from '../CaseListFilterContext';
21
- export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit }) {
22
+ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, selectedSearchNameToEdit, currentCaseSearchString, currentSearchType, }) {
22
23
  const { t } = useTranslation();
23
24
  const [localSavedSearchName, setLocalSavedSearchName] = useState('');
24
25
  const [localDefaultChecked, setLocalDefaultChecked] = useState(false);
@@ -72,7 +73,8 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
72
73
  previousBookmarkedSearchesObj[localSavedSearchName] = {
73
74
  filterState: pickBy(filterState.filterInfo, (value) => value.length !== 0),
74
75
  sortState: sortInfo,
75
- type: filterState.filterQueryInfo.type,
76
+ type: currentSearchType,
77
+ queryString: currentCaseSearchString,
76
78
  defaultChecked: localDefaultChecked,
77
79
  };
78
80
  }
@@ -86,16 +88,13 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
86
88
  }
87
89
  yield preferencesApiCall(previousBookmarkedSearchesObj);
88
90
  setIsUpdating(false);
89
- setSaveButtonIsClicked(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
- setSaveButtonIsClicked(false);
96
95
  ToastNotification.addDangerMessage(t('Saved search failed to update'));
97
- modalToggle();
98
96
  }
97
+ closeModal();
99
98
  });
100
99
  const deleteSavedSearch = () => __awaiter(this, void 0, void 0, function* () {
101
100
  try {
@@ -126,12 +125,28 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
126
125
  setLocalSavedSearchName('');
127
126
  modalToggle();
128
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
+ };
129
144
  useEffect(() => {
130
145
  var _a;
131
146
  setLocalSavedSearchName(selectedSearchNameToEdit);
132
147
  setLocalDefaultChecked(((_a = previousBookmarkedSearchesObj[selectedSearchNameToEdit]) === null || _a === void 0 ? void 0 : _a.defaultChecked) || false);
133
148
  // eslint-disable-next-line react-hooks/exhaustive-deps
134
- }, [filterInfo, filterQueryInfo.queryString, isAdding, selectedSearchNameToEdit]);
149
+ }, [filterInfo, filterQueryInfo.queryString, isAdding, selectedSearchNameToEdit, currentCaseSearchString]);
135
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: [
136
151
  React.createElement(Button, { key: "save", variant: ButtonVariant.primary, isLoading: isUpdating, spinnerAriaValueText: hydraUserPreferences.isFetching ? 'Saving' : undefined, isDisabled: hydraUserPreferences.isFetching ||
137
152
  (saveButtonIsClicked && (isEmpty(localSavedSearchName.trim()) || isDuplicateNameError)), "data-tracking-id": isAdding ? 'case-list-bookmark-search-saved' : 'case-list-bookmark-search-edited', onClick: save },
@@ -156,9 +171,5 @@ export function SaveCaseSearchModal({ isModalOpen, modalToggle, isAdding, select
156
171
  ? 'error'
157
172
  : 'default' })),
158
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' },
159
- React.createElement(TextArea, { isRequired: true, type: "text", id: "filter-query", name: "filter-query", "aria-describedby": "filter-query-helper", value: isAdding
160
- ? createUserFriendlyQueryFromFilterState(filterInfo, filterQueryInfo.queryString)
161
- : selectedSearchNameToEdit && previousBookmarkedSearchesObj[selectedSearchNameToEdit]
162
- ? createUserFriendlyQueryFromFilterState(previousBookmarkedSearchesObj[selectedSearchNameToEdit].filterState, previousBookmarkedSearchesObj[selectedSearchNameToEdit].queryString)
163
- : '', className: "form-control", isDisabled: true })))));
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 })))));
164
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(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rh-support/cases",
3
- "version": "0.2.41",
3
+ "version": "0.2.55",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -53,10 +53,10 @@
53
53
  "@patternfly/react-core": "4.194.0",
54
54
  "@patternfly/react-table": "4.63.0",
55
55
  "@rh-support/api": "0.3.10",
56
- "@rh-support/components": "1.1.29",
57
- "@rh-support/react-context": "0.2.32",
56
+ "@rh-support/components": "1.1.39",
57
+ "@rh-support/react-context": "0.2.40",
58
58
  "@rh-support/types": "0.2.0",
59
- "@rh-support/user-permissions": "0.2.23",
59
+ "@rh-support/user-permissions": "0.2.30",
60
60
  "@rh-support/utils": "0.2.21",
61
61
  "i18next": "^19.0.1",
62
62
  "localforage": "^1.7.3",
@@ -101,5 +101,5 @@
101
101
  "not ie <= 11",
102
102
  "not op_mini all"
103
103
  ],
104
- "gitHead": "cb0d1a0aad49e869ec8b6f6192c49d710dcf37cb"
104
+ "gitHead": "6e960efbc60f233479ef0c92bc1b3b8e2c5b8d31"
105
105
  }