15069: Use properties' key/value ids on search when possible.
authorLucas Di Pentima <ldipentima@veritasgenetics.com>
Mon, 18 Nov 2019 12:58:18 +0000 (09:58 -0300)
committerLucas Di Pentima <ldipentima@veritasgenetics.com>
Tue, 19 Nov 2019 16:14:53 +0000 (13:14 -0300)
Also, properly reset key/value fields on the advanced search UI every time
a new property is added to the search expression.

Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima@veritasgenetics.com>

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

index effaeed4c0e676882e6bccc9f445e9eb732d9483..2d181b374f008c85d210c7ffc200762da16a65ca 100644 (file)
@@ -19,5 +19,7 @@ export type SearchBarAdvanceFormData = {
 
 export interface PropertyValue {
     key: string;
+    keyID?: string;
     value: string;
+    valueID?: string;
 }
index d9238ef209677788121e50c3862fe7b1f4dce185..c4a2d45f2141cde1f90ec1535b38c0d6385a37b7 100644 (file)
@@ -5,7 +5,7 @@
 import { ofType, unionize, UnionOf } from "~/common/unionize";
 import { GroupContentsResource, GroupContentsResourcePrefix } from '~/services/groups-service/groups-service';
 import { Dispatch } from 'redux';
-import { arrayPush, change, initialize } from 'redux-form';
+import { arrayPush, change, initialize, untouch } from 'redux-form';
 import { RootState } from '~/store/store';
 import { initUserProject, treePickerActions } from '~/store/tree-picker/tree-picker-actions';
 import { ServiceRepository } from '~/services/services';
@@ -268,7 +268,7 @@ export const getQueryFromAdvancedData = (data: SearchBarAdvanceFormData, prevDat
             dateFrom: data.dateFrom,
             dateTo: data.dateTo,
         };
-        (data.properties || []).forEach(p => fo[`prop-"${p.key}"`] = `"${p.value}"`);
+        (data.properties || []).forEach(p => fo[`prop-"${p.keyID || p.key}"`] = `"${p.valueID || p.value}"`);
         return fo;
     };
 
@@ -281,7 +281,7 @@ export const getQueryFromAdvancedData = (data: SearchBarAdvanceFormData, prevDat
         ['to', 'dateTo']
     ];
     _.union(data.properties, prevData ? prevData.properties : [])
-        .forEach(p => keyMap.push([`has:"${p.key}"`, `prop-"${p.key}"`]));
+        .forEach(p => keyMap.push([`has:"${p.keyID || p.key}"`, `prop-"${p.keyID || p.key}"`]));
 
     if (prevData) {
         const obj = getModifiedKeysValues(flatData(data), flatData(prevData));
@@ -366,9 +366,15 @@ export const initAdvanceFormProjectsTree = () =>
         dispatch<any>(initUserProject(SEARCH_BAR_ADVANCE_FORM_PICKER_ID));
     };
 
-export const changeAdvanceFormProperty = (property: string, value: PropertyValue[] | string = '') =>
+export const changeAdvanceFormProperty = (propertyField: string, value: PropertyValue[] | string = '') =>
     (dispatch: Dispatch) => {
-        dispatch(change(SEARCH_BAR_ADVANCE_FORM_NAME, property, value));
+        dispatch(change(SEARCH_BAR_ADVANCE_FORM_NAME, propertyField, value));
+    };
+
+export const resetAdvanceFormProperty = (propertyField: string) =>
+    (dispatch: Dispatch) => {
+        dispatch(change(SEARCH_BAR_ADVANCE_FORM_NAME, propertyField, null));
+        dispatch(untouch(SEARCH_BAR_ADVANCE_FORM_NAME, propertyField));
     };
 
 export const updateAdvanceFormProperties = (propertyValues: PropertyValue) =>
index d4044f958d55b0d1c270232b32469c0c74fe3559..9bb6ad90a007088f86d2cced59a3a356459722c6 100644 (file)
@@ -11,6 +11,7 @@ import { RootState } from '~/store/store';
 import {
     SEARCH_BAR_ADVANCE_FORM_NAME,
     changeAdvanceFormProperty,
+    resetAdvanceFormProperty,
     updateAdvanceFormProperties
 } from '~/store/search-bar/search-bar-actions';
 import { PropertyValue } from '~/models/search-bar';
@@ -53,7 +54,7 @@ type SearchBarAdvancedPropertiesViewProps = SearchBarAdvancedPropertiesViewDataP
 const selector = formValueSelector(SEARCH_BAR_ADVANCE_FORM_NAME);
 const mapStateToProps = (state: RootState) => {
     return {
-        propertyValues: selector(state, 'key', 'value')
+        propertyValues: selector(state, 'key', 'value', 'keyID', 'valueID')
     };
 };
 
@@ -63,8 +64,10 @@ const mapDispatchToProps = (dispatch: Dispatch) => ({
     },
     addProp: (propertyValues: PropertyValue) => {
         dispatch<any>(updateAdvanceFormProperties(propertyValues));
-        dispatch<any>(changeAdvanceFormProperty('key'));
-        dispatch<any>(changeAdvanceFormProperty('value'));
+        dispatch<any>(resetAdvanceFormProperty('key'));
+        dispatch<any>(resetAdvanceFormProperty('value'));
+        dispatch<any>(resetAdvanceFormProperty('keyID'));
+        dispatch<any>(resetAdvanceFormProperty('valueID'));
     },
     getAllFields: (fields: any) => {
         return fields.getAll() || [];