Add query name showing on save query checked only
authorDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 27 Nov 2018 14:22:58 +0000 (15:22 +0100)
committerDaniel Kos <daniel.kos@contractors.roche.com>
Tue, 27 Nov 2018 14:22:58 +0000 (15:22 +0100)
Feature #14280

Arvados-DCO-1.1-Signed-off-by: Daniel Kos <daniel.kos@contractors.roche.com>

src/store/search-bar/search-bar-actions.test.ts
src/store/search-bar/search-bar-actions.ts
src/views-components/search-bar/search-bar-advanced-view.tsx
src/views-components/search-bar/search-bar-view.tsx
src/views-components/search-bar/search-bar.tsx

index d936caf528c7f66b4e7dbc4143a49396f45db9f1..aa6e4759e0f6d7d4f015624c08c2945a4bf9a307 100644 (file)
@@ -2,15 +2,15 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { getAdvancedDataFromQuery, getQueryFromAdvancedData, parseQuery } from "~/store/search-bar/search-bar-actions";
+import { getAdvancedDataFromQuery, getQueryFromAdvancedData, parseSearchQuery } from "~/store/search-bar/search-bar-actions";
 import { ResourceKind } from "~/models/resource";
 import { ClusterObjectType } from "~/models/search-bar";
 
 describe('search-bar-actions', () => {
-    describe('parseQuery', () => {
+    describe('parseSearchQuery', () => {
         it('should correctly parse query #1', () => {
             const q = 'val0 is:trashed val1';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val1']);
             expect(r.properties).toEqual({
@@ -20,7 +20,7 @@ describe('search-bar-actions', () => {
 
         it('should correctly parse query #2 (value with keyword should be ignored)', () => {
             const q = 'val0 is:from:trashed val1';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val1']);
             expect(r.properties).toEqual({
@@ -30,7 +30,7 @@ describe('search-bar-actions', () => {
 
         it('should correctly parse query #3 (many keywords)', () => {
             const q = 'val0 is:trashed val2 from:2017-04-01 val1';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val2', 'val1']);
             expect(r.properties).toEqual({
@@ -41,7 +41,7 @@ describe('search-bar-actions', () => {
 
         it('should correctly parse query #4 (no duplicated values)', () => {
             const q = 'val0 is:trashed val2 val2 val0';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val2']);
             expect(r.properties).toEqual({
@@ -51,7 +51,7 @@ describe('search-bar-actions', () => {
 
         it('should correctly parse query #5 (properties)', () => {
             const q = 'val0 has:filesize:100mb val2 val2 val0';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val2']);
             expect(r.properties).toEqual({
@@ -61,7 +61,7 @@ describe('search-bar-actions', () => {
 
         it('should correctly parse query #6 (multiple properties, multiple is)', () => {
             const q = 'val0 has:filesize:100mb val2 has:user:daniel is:starred val2 val0 is:trashed';
-            const r = parseQuery(q);
+            const r = parseSearchQuery(q);
             expect(r.hasKeywords).toBeTruthy();
             expect(r.values).toEqual(['val0', 'val2']);
             expect(r.properties).toEqual({
index 2bac245145eb5ba6c146163bf9f18011c662dc2d..a2eed93a2149c3a33feffc18b2c2fc7faa55b654 100644 (file)
@@ -285,7 +285,15 @@ export const getQueryFromAdvancedData = (data: SearchBarAdvanceFormData, prevDat
     return value;
 };
 
-export const parseQuery: (query: string) => { hasKeywords: boolean; values: string[]; properties: any } = (searchValue: string) => {
+export interface ParsedSearchQuery {
+    hasKeywords: boolean;
+    values: string[];
+    properties: {
+        [key: string]: string
+    };
+}
+
+export const parseSearchQuery: (query: string) => { hasKeywords: boolean; values: string[]; properties: any } = (searchValue: string): ParsedSearchQuery => {
     const keywords = [
         'type:',
         'cluster:',
@@ -341,7 +349,7 @@ export const parseQuery: (query: string) => { hasKeywords: boolean; values: stri
 };
 
 export const getAdvancedDataFromQuery = (query: string): SearchBarAdvanceFormData => {
-    const r = parseQuery(query);
+    const r = parseSearchQuery(query);
 
     const getFirstProp = (name: string) => r.properties[name] && r.properties[name][0];
     const getPropValue = (name: string, value: string) => r.properties[name] && r.properties[name].find((v: string) => v === value);
@@ -375,7 +383,7 @@ export const getAdvancedDataFromQuery = (query: string): SearchBarAdvanceFormDat
 export const getFilters = (filterName: string, searchValue: string): string => {
     const filter = new FilterBuilder();
 
-    const pq = parseQuery(searchValue);
+    const pq = parseSearchQuery(searchValue);
 
     if (!pq.hasKeywords) {
         filter
index f620f45dfc6b3c0565fa2e1470e9f8f328fdecf3..f0dffa5518e1b7e02a454a742ea39e102bccc562 100644 (file)
@@ -7,7 +7,7 @@ import { reduxForm, InjectedFormProps, reset } from 'redux-form';
 import { compose, Dispatch } from 'redux';
 import { Paper, StyleRulesCallback, withStyles, WithStyles, Button, Grid, IconButton, CircularProgress } from '@material-ui/core';
 import {
-    SEARCH_BAR_ADVANCE_FORM_NAME,
+    SEARCH_BAR_ADVANCE_FORM_NAME, SEARCH_BAR_ADVANCE_FORM_PICKER_ID,
     searchAdvanceData,
     setSearchValueFromAdvancedData
 } from '~/store/search-bar/search-bar-actions';
@@ -19,6 +19,7 @@ import {
     SearchBarDateFromField, SearchBarDateToField, SearchBarPropertiesField,
     SearchBarSaveSearchField, SearchBarQuerySearchField
 } from '~/views-components/form-fields/search-bar-form-fields';
+import { treePickerActions } from "~/store/tree-picker/tree-picker-actions";
 
 type CssRules = 'container' | 'closeIcon' | 'label' | 'buttonWrapper'
     | 'button' | 'circularProgress' | 'searchView' | 'selectGrid';
@@ -73,6 +74,7 @@ interface SearchBarAdvancedViewFormDataProps {
 // ToDo: maybe we should remove tags
 export interface SearchBarAdvancedViewDataProps {
     tags: any;
+    saveQuery: boolean;
 }
 
 export interface SearchBarAdvancedViewActionProps {
@@ -103,13 +105,14 @@ export const SearchBarAdvancedView = compose(
         onSubmit: (data: SearchBarAdvanceFormData, dispatch: Dispatch) => {
             dispatch<any>(searchAdvanceData(data));
             dispatch(reset(SEARCH_BAR_ADVANCE_FORM_NAME));
+            dispatch(treePickerActions.ACTIVATE_TREE_PICKER_NODE({ pickerId: SEARCH_BAR_ADVANCE_FORM_PICKER_ID, id: "" }));
         },
         onChange: (data: SearchBarAdvanceFormData, dispatch: Dispatch, props: any, prevData: SearchBarAdvanceFormData) => {
             dispatch<any>(setSearchValueFromAdvancedData(data, prevData));
         }
     }),
     withStyles(styles))(
-        ({ classes, closeAdvanceView, handleSubmit, submitting, invalid, pristine, tags }: SearchBarAdvancedViewFormProps) =>
+        ({ classes, closeAdvanceView, handleSubmit, submitting, invalid, pristine, tags, saveQuery }: SearchBarAdvancedViewFormProps) =>
             <Paper className={classes.searchView}>
                 <form onSubmit={handleSubmit}>
                     <Grid container direction="column" justify="flex-start" alignItems="flex-start">
@@ -159,7 +162,7 @@ export const SearchBarAdvancedView = compose(
                                     <SearchBarSaveSearchField />
                                 </Grid>
                                 <Grid item xs={4}>
-                                    <SearchBarQuerySearchField />
+                                    {saveQuery && <SearchBarQuerySearchField />}
                                 </Grid>
                             </Grid>
                             <Grid container item xs={12} justify='flex-end'>
index beaad493d51f3a4162e712f08e101c685884dc90..51ea3fa14793fe9ff3fe19b939b867c3db52a497 100644 (file)
@@ -198,7 +198,8 @@ const getView = (props: SearchBarViewProps) => {
         case SearchView.ADVANCED:
             return <SearchBarAdvancedView
                 closeAdvanceView={props.closeAdvanceView}
-                tags={props.tags} />;
+                tags={props.tags}
+                saveQuery={props.saveQuery} />;
         default:
             return <SearchBarBasicView
                 onSetView={props.onSetView}
index 3107ad7315308545d4a7b219da508a4f28f5a36a..41cf291688dc2d53ef7534ee8048a2d9b2629f99 100644 (file)
@@ -29,7 +29,10 @@ const mapStateToProps = ({ searchBar, form }: RootState): SearchBarDataProps =>
         searchResults: searchBar.searchResults,
         selectedItem: searchBar.selectedItem,
         savedQueries: searchBar.savedQueries,
-        tags: form.searchBarAdvanceFormName
+        tags: form.searchBarAdvanceFormName,
+        saveQuery: form.searchBarAdvanceFormName &&
+            form.searchBarAdvanceFormName.values &&
+            form.searchBarAdvanceFormName.values.saveQuery
     };
 };