X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/e7916d508b495a1fd2be51bd3da2125cc8eb7467..3dd4b3bc31fea7f614290131d0ade5c0e0ffc595:/src/views-components/resource-properties-form/property-field-common.tsx diff --git a/src/views-components/resource-properties-form/property-field-common.tsx b/src/views-components/resource-properties-form/property-field-common.tsx index a90ce923..c4dc494b 100644 --- a/src/views-components/resource-properties-form/property-field-common.tsx +++ b/src/views-components/resource-properties-form/property-field-common.tsx @@ -3,16 +3,21 @@ // SPDX-License-Identifier: AGPL-3.0 import { connect } from 'react-redux'; -import { WrappedFieldMetaProps, WrappedFieldInputProps, WrappedFieldProps } from 'redux-form'; -import { Vocabulary, PropFieldSuggestion } from '~/models/vocabulary'; -import { RootState } from '~/store/store'; -import { getVocabulary } from '~/store/vocabulary/vocabulary-selectors'; +import { change, WrappedFieldMetaProps, WrappedFieldInputProps, WrappedFieldProps } from 'redux-form'; +import { Vocabulary, PropFieldSuggestion } from 'models/vocabulary'; +import { RootState } from 'store/store'; +import { getVocabulary } from 'store/vocabulary/vocabulary-selectors'; export interface VocabularyProp { vocabulary: Vocabulary; } -export const mapStateToProps = (state: RootState): VocabularyProp => ({ +export interface ValidationProp { + skipValidation?: boolean; +} + +export const mapStateToProps = (state: RootState, ownProps: ValidationProp): VocabularyProp & ValidationProp => ({ + skipValidation: ownProps.skipValidation, vocabulary: getVocabulary(state.properties), }); @@ -28,18 +33,38 @@ export const getErrorMsg = (meta: WrappedFieldMetaProps) => ? meta.error : ''; -export const handleBlur = ({ onBlur, value }: WrappedFieldInputProps) => - () => - onBlur(value); - export const buildProps = ({ input, meta }: WrappedFieldProps) => { return { value: input.value, - onChange: input.onChange, - onBlur: handleBlur(input), items: ITEMS_PLACEHOLDER, - renderSuggestion: (item:PropFieldSuggestion) => item.label, + renderSuggestion: (item: PropFieldSuggestion) => item.label, error: hasError(meta), helperText: getErrorMsg(meta), }; }; + +// Attempts to match a manually typed value label with a value ID, when the user +// doesn't select the value from the suggestions list. +export const handleBlur = ( + fieldName: string, + formName: string, + { dispatch }: WrappedFieldMetaProps, + { onBlur, value }: WrappedFieldInputProps, + fieldValue: string) => + () => { + dispatch(change(formName, fieldName, fieldValue)); + onBlur(value); + }; + +// When selecting a property value, save its ID for later usage. +export const handleSelect = ( + fieldName: string, + formName: string, + { onChange }: WrappedFieldInputProps, + { dispatch }: WrappedFieldMetaProps) => + (item: PropFieldSuggestion) => { + if (item) { + onChange(item.label); + dispatch(change(formName, fieldName, item.id)); + } + };