From 81546d30cd19cd98939e56e1b01b5c9684941f98 Mon Sep 17 00:00:00 2001 From: Michal Klobukowski Date: Tue, 27 Nov 2018 22:32:46 +0100 Subject: [PATCH] Create PropertyValueField Feature #14393 Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski --- .../property-value-field.tsx | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/views-components/resource-properties-form/property-value-field.tsx diff --git a/src/views-components/resource-properties-form/property-value-field.tsx b/src/views-components/resource-properties-form/property-value-field.tsx new file mode 100644 index 00000000..eed8e75b --- /dev/null +++ b/src/views-components/resource-properties-form/property-value-field.tsx @@ -0,0 +1,74 @@ +// Copyright (C) The Arvados Authors. All rights reserved. +// +// SPDX-License-Identifier: AGPL-3.0 + +import * as React from 'react'; +import { WrappedFieldProps, Field } from 'redux-form'; +import { connect } from 'react-redux'; +import { identity } from 'lodash'; +import { RootState } from '~/store/store'; +import { getVocabulary } from '~/store/vocabulary/vocabulary-selctors'; +import { Autocomplete } from '~/components/autocomplete/autocomplete'; +import { Vocabulary } from '~/models/vocabulary'; +import { require } from '~/validators/require'; + +interface VocabularyProp { + vocabulary: Vocabulary; +} + +interface PropertyKeyProp { + propertyKey: string; +} + +type PropertyValueFieldProps = VocabularyProp & PropertyKeyProp; + +const mapStateToProps = (state: RootState): VocabularyProp => ({ + vocabulary: getVocabulary(state.properties), +}); + +export const PropertyValueField = connect(mapStateToProps)( + (props: PropertyValueFieldProps) => + ); + +const PropertyValueInput = ({ input, meta, vocabulary, propertyKey }: WrappedFieldProps & PropertyValueFieldProps) => + ; + +const getValidation = (props: PropertyValueFieldProps) => + isStrictTag(props.propertyKey, props.vocabulary) + ? [require, matchTagValues(props)] + : [require]; + +const matchTagValues = ({ vocabulary, propertyKey }: PropertyValueFieldProps) => + (value: string) => + getTagValues(propertyKey, vocabulary).find(v => v.includes(value)) + ? undefined + : 'Incorrect value'; + +const getSuggestions = (value: string, tagName: string, vocabulary: Vocabulary) => + getTagValues(tagName, vocabulary).filter(v => v.includes(value) && v !== value); + +const isStrictTag = (tagName: string, vocabulary: Vocabulary) => { + const tag = vocabulary.tags[tagName]; + return tag ? tag.strict : false; +}; + +const getTagValues = (tagName: string, vocabulary: Vocabulary) => { + const tag = vocabulary.tags[tagName]; + return tag ? tag.values : []; +}; + +const ITEMS_PLACEHOLDER: string[] = []; -- 2.30.2