X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/36b4e36f75ea0035b6b0de6aaaad4edd3231371c..6e0bfefd885bb7ebb445f60f3985bbbfca361935:/src/views-components/search-bar/search-bar-advanced-properties-view.tsx diff --git a/src/views-components/search-bar/search-bar-advanced-properties-view.tsx b/src/views-components/search-bar/search-bar-advanced-properties-view.tsx index 01fc6a1a..6ebef156 100644 --- a/src/views-components/search-bar/search-bar-advanced-properties-view.tsx +++ b/src/views-components/search-bar/search-bar-advanced-properties-view.tsx @@ -2,21 +2,25 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as React from 'react'; -import { Dispatch } from 'redux'; +import React from 'react'; +import { Dispatch, compose } from 'redux'; import { connect } from 'react-redux'; import { InjectedFormProps, formValueSelector } from 'redux-form'; import { Grid, withStyles, StyleRulesCallback, WithStyles, Button } from '@material-ui/core'; -import { RootState } from '~/store/store'; -import { - SEARCH_BAR_ADVANCE_FORM_NAME, - changeAdvanceFormProperty, - updateAdvanceFormProperties -} from '~/store/search-bar/search-bar-actions'; -import { PropertyValues } from '~/models/search-bar'; -import { ArvadosTheme } from '~/common/custom-theme'; -import { SearchBarKeyField, SearchBarValueField } from '~/views-components/form-fields/search-bar-form-fields'; -import { Chips } from '~/components/chips/chips'; +import { RootState } from 'store/store'; +import { + SEARCH_BAR_ADVANCED_FORM_NAME, + changeAdvancedFormProperty, + resetAdvancedFormProperty +} from 'store/search-bar/search-bar-actions'; +import { PropertyValue } from 'models/search-bar'; +import { ArvadosTheme } from 'common/custom-theme'; +import { SearchBarKeyField, SearchBarValueField } from 'views-components/form-fields/search-bar-form-fields'; +import { Chips } from 'components/chips/chips'; +import { formatPropertyValue } from "common/formatters"; +import { Vocabulary } from 'models/vocabulary'; +import { connectVocabulary } from '../resource-properties-form/property-field-common'; +import { isEqual } from 'lodash'; type CssRules = 'label' | 'button'; @@ -35,44 +39,61 @@ interface SearchBarAdvancedPropertiesViewDataProps { submitting: boolean; invalid: boolean; pristine: boolean; - propertyValues: PropertyValues; - fields: PropertyValues[]; + propertyValues: PropertyValue; + fields: PropertyValue[]; + vocabulary: Vocabulary; } interface SearchBarAdvancedPropertiesViewActionProps { setProps: () => void; - addProp: (propertyValues: PropertyValues) => void; - getAllFields: (propertyValues: PropertyValues[]) => PropertyValues[] | []; + addProp: (propertyValues: PropertyValue, properties: PropertyValue[]) => void; + getAllFields: (propertyValues: PropertyValue[]) => PropertyValue[] | []; } -type SearchBarAdvancedPropertiesViewProps = SearchBarAdvancedPropertiesViewDataProps - & SearchBarAdvancedPropertiesViewActionProps +type SearchBarAdvancedPropertiesViewProps = SearchBarAdvancedPropertiesViewDataProps + & SearchBarAdvancedPropertiesViewActionProps & InjectedFormProps & WithStyles; -const selector = formValueSelector(SEARCH_BAR_ADVANCE_FORM_NAME); +const selector = formValueSelector(SEARCH_BAR_ADVANCED_FORM_NAME); const mapStateToProps = (state: RootState) => { return { - propertyValues: selector(state, 'key', 'value') + propertyValues: selector(state, 'key', 'value', 'keyID', 'valueID') }; }; const mapDispatchToProps = (dispatch: Dispatch) => ({ - setProps: (propertyValues: PropertyValues[]) => { - dispatch(changeAdvanceFormProperty('properties', propertyValues)); + setProps: (propertyValues: PropertyValue[]) => { + dispatch(changeAdvancedFormProperty('properties', propertyValues)); }, - addProp: (propertyValues: PropertyValues) => { - dispatch(updateAdvanceFormProperties(propertyValues)); - dispatch(changeAdvanceFormProperty('key')); - dispatch(changeAdvanceFormProperty('value')); + addProp: (propertyValue: PropertyValue, properties: PropertyValue[]) => { + // Remove potential duplicates + properties = properties.filter(x => ! isEqual( + { + key: x.keyID || x.key, + value: x.valueID || x.value + }, { + key: propertyValue.keyID || propertyValue.key, + value: propertyValue.valueID || propertyValue.value + })); + dispatch(changeAdvancedFormProperty( + 'properties', + [...properties, propertyValue] + )); + dispatch(resetAdvancedFormProperty('key')); + dispatch(resetAdvancedFormProperty('value')); + dispatch(resetAdvancedFormProperty('keyID')); + dispatch(resetAdvancedFormProperty('valueID')); }, getAllFields: (fields: any) => { return fields.getAll() || []; } }); -export const SearchBarAdvancedPropertiesView = connect(mapStateToProps, mapDispatchToProps)( +export const SearchBarAdvancedPropertiesView = compose( + connectVocabulary, + connect(mapStateToProps, mapDispatchToProps))( withStyles(styles)( - ({ classes, fields, propertyValues, setProps, addProp, getAllFields }: SearchBarAdvancedPropertiesViewProps) => + ({ classes, fields, propertyValues, setProps, addProp, getAllFields, vocabulary }: SearchBarAdvancedPropertiesViewProps) => Properties @@ -82,20 +103,21 @@ export const SearchBarAdvancedPropertiesView = connect(mapStateToProps, mapDispa - - `${field.key}: ${field.value}`} /> + onChange={setProps} + getLabel={(field: PropertyValue) => formatPropertyValue(field, vocabulary)} /> ) -); \ No newline at end of file +);