X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/37ef971c0db3e1989dcab9268337bc92aa950499..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 5c935854..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 } 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,30 +33,38 @@ export const getErrorMsg = (meta: WrappedFieldMetaProps) => ? meta.error : ''; -export const handleBlur = ({ onBlur, value }: WrappedFieldInputProps) => - () => - onBlur(value); - -export const handleSelect = ({ onChange }: WrappedFieldInputProps) => { - return (item:PropFieldSuggestion) => { - onChange(item.id); - }; -}; - export const buildProps = ({ input, meta }: WrappedFieldProps) => { return { value: input.value, - onChange: input.onChange, - onBlur: handleBlur(input), items: ITEMS_PLACEHOLDER, - onSelect: handleSelect(input), - renderSuggestion: (item:PropFieldSuggestion) => item.label, + renderSuggestion: (item: PropFieldSuggestion) => item.label, error: hasError(meta), helperText: getErrorMsg(meta), }; }; -export interface PropFieldSuggestion { - "id": string; - "label": string; -} +// 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)); + } + };