Merge branch 'master' into 15067-tag-editing-by-ids
authorLucas Di Pentima <lucas@di-pentima.com.ar>
Tue, 12 Nov 2019 12:44:03 +0000 (09:44 -0300)
committerLucas Di Pentima <lucas@di-pentima.com.ar>
Tue, 12 Nov 2019 12:44:03 +0000 (09:44 -0300)
1  2 
src/common/config.ts
src/views-components/resource-properties-form/property-key-field.tsx
src/views-components/resource-properties-form/property-value-field.tsx

index e755f0daae243ac064abe723f2f2368ed1476465,7d974342a704198686b8e20a959e537c0e03a73c..cbac7b1984aa5bbfc286060c61ee0bd6b52574f0
@@@ -102,20 -125,8 +125,11 @@@ remove the entire ${varName} entry fro
                  else {
                      vocabularyUrl = clusterConfigJSON.Workbench.VocabularyURL || "/vocabulary-example.json";
                  }
 +                // FIXME: The following line is for dev testing purposes
 +                vocabularyUrl = "/vocabulary-example.json";
 +
                  config.vocabularyUrl = vocabularyUrl;
  
-                 config.rootUrl = clusterConfigJSON.Services.Controller.ExternalURL;
-                 config.baseUrl = `${config.rootUrl}/${ARVADOS_API_PATH}`;
-                 config.uuidPrefix = clusterConfigJSON.ClusterID;
-                 config.websocketUrl = clusterConfigJSON.Services.Websocket.ExternalURL;
-                 config.workbench2Url = clusterConfigJSON.Services.Workbench2.ExternalURL;
-                 config.workbenchUrl = clusterConfigJSON.Services.Workbench1.ExternalURL;
-                 config.keepWebServiceUrl = clusterConfigJSON.Services.WebDAV.ExternalURL;
-                 mapRemoteHosts(clusterConfigJSON, config);
                  return { config, apiHost: workbenchConfig.API_HOST };
              });
          });
index ff665df231a96b81a9fb853deabb0d45ace4704b,686c858ec75ea8ba5c2104ac9f62383c3c37eb50..f91b6a621a81f48f8e2a3a6c56430b6eee0f37b9
@@@ -3,16 -3,15 +3,17 @@@
  // SPDX-License-Identifier: AGPL-3.0
  
  import * as React from 'react';
 -import { WrappedFieldProps, Field } from 'redux-form';
 +import { change, WrappedFieldProps, WrappedFieldMetaProps, WrappedFieldInputProps, Field } from 'redux-form';
  import { memoize } from 'lodash';
  import { Autocomplete } from '~/components/autocomplete/autocomplete';
 -import { Vocabulary } from '~/models/vocabulary';
 +import { Vocabulary, getTags, getTagKeyID, PropFieldSuggestion } from '~/models/vocabulary';
  import { connectVocabulary, VocabularyProp, buildProps } from '~/views-components/resource-properties-form/property-field-common';
  import { TAG_KEY_VALIDATION } from '~/validators/validators';
 +import { COLLECTION_TAG_FORM_NAME } from '~/store/collection-panel/collection-panel-action';
+ import { escapeRegExp } from '~/common/regexp.ts';
  
  export const PROPERTY_KEY_FIELD_NAME = 'key';
 +export const PROPERTY_KEY_FIELD_ID = 'keyID';
  
  export const PropertyKeyField = connectVocabulary(
      ({ vocabulary }: VocabularyProp) =>
@@@ -50,26 -40,10 +51,28 @@@ const matchTags = (vocabulary: Vocabula
              ? undefined
              : 'Incorrect key';
  
- const getSuggestions = (value: string, vocabulary: Vocabulary) =>
-     getTags(vocabulary).filter(tag => tag.label.toLowerCase().includes(value.toLowerCase()));
+ const getSuggestions = (value: string, vocabulary: Vocabulary) => {
+     const re = new RegExp(escapeRegExp(value), "i");
 -    return getTagsList(vocabulary).filter(tag => re.test(tag) && tag !== value);
++    return getTags(vocabulary).filter(tag => re.test(tag.label) && tag.label !== value);
+ };
  
 -const getTagsList = ({ tags }: Vocabulary) =>
 -    Object.keys(tags);
 +// Attempts to match a manually typed key label with a key ID, when the user
 +// doesn't select the key from the suggestions list.
 +const handleBlur = (
 +    { dispatch }: WrappedFieldMetaProps,
 +    { onBlur, value }: WrappedFieldInputProps,
 +    vocabulary: Vocabulary) =>
 +    () => {
 +        dispatch(change(COLLECTION_TAG_FORM_NAME, PROPERTY_KEY_FIELD_ID, getTagKeyID(value, vocabulary)));
 +        onBlur(value);
 +    };
 +
 +// When selecting a property key, save its ID for later usage.
 +const handleSelect = (
 +    { onChange }: WrappedFieldInputProps,
 +    { dispatch }: WrappedFieldMetaProps) => {
 +        return (item:PropFieldSuggestion) => {
 +            onChange(item.label);
 +            dispatch(change(COLLECTION_TAG_FORM_NAME, PROPERTY_KEY_FIELD_ID, item.id));
 +    };
 +};
index 32109ef441b0b74d8fa50a7e3afd13055a4baeef,c8634acf4e386c071f684064197a53521e389c7f..959b98ec87280ebc4d7bd496729ae051000ccdb5
@@@ -3,14 -3,14 +3,15 @@@
  // SPDX-License-Identifier: AGPL-3.0
  
  import * as React from 'react';
 -import { WrappedFieldProps, Field, formValues } from 'redux-form';
 +import { change, WrappedFieldProps, WrappedFieldMetaProps, WrappedFieldInputProps, Field, formValues } from 'redux-form';
  import { compose } from 'redux';
  import { Autocomplete } from '~/components/autocomplete/autocomplete';
 -import { Vocabulary } from '~/models/vocabulary';
 -import { PROPERTY_KEY_FIELD_NAME } from '~/views-components/resource-properties-form/property-key-field';
 +import { Vocabulary, getTagValueID, isStrictTag, getTagValues, PropFieldSuggestion } from '~/models/vocabulary';
 +import { PROPERTY_KEY_FIELD_ID } from '~/views-components/resource-properties-form/property-key-field';
  import { VocabularyProp, connectVocabulary, buildProps } from '~/views-components/resource-properties-form/property-field-common';
  import { TAG_VALUE_VALIDATION } from '~/validators/validators';
 +import { COLLECTION_TAG_FORM_NAME } from '~/store/collection-panel/collection-panel-action';
+ import { escapeRegExp } from '~/common/regexp.ts';
  
  interface PropertyKeyProp {
      propertyKey: string;
@@@ -59,27 -49,17 +60,29 @@@ const matchTagValues = ({ vocabulary, p
              ? undefined
              : 'Incorrect value';
  
- const getSuggestions = (value: string, tagKey: string, vocabulary: Vocabulary) =>
-     getTagValues(tagKey, vocabulary).filter(v => v.label.toLowerCase().includes(value.toLowerCase()));
+ const getSuggestions = (value: string, tagName: string, vocabulary: Vocabulary) => {
+     const re = new RegExp(escapeRegExp(value), "i");
 -    return getTagValues(tagName, vocabulary).filter(v => re.test(v) && v !== value);
++    return getTagValues(tagName, vocabulary).filter(v => re.test(v.label) && v.label !== value);
+ };
  
 -const isStrictTag = (tagName: string, vocabulary: Vocabulary) => {
 -    const tag = vocabulary.tags[tagName];
 -    return tag ? tag.strict : false;
 -};
 +// Attempts to match a manually typed value label with a value ID, when the user
 +// doesn't select the value from the suggestions list.
 +const handleBlur = (
 +    { dispatch }: WrappedFieldMetaProps,
 +    { onBlur, value }: WrappedFieldInputProps,
 +    vocabulary: Vocabulary,
 +    tagKeyID: string) =>
 +        () => {
 +            dispatch(change(COLLECTION_TAG_FORM_NAME, PROPERTY_VALUE_FIELD_ID, getTagValueID(tagKeyID, value, vocabulary)));
 +            onBlur(value);
 +        };
  
 -const getTagValues = (tagName: string, vocabulary: Vocabulary) => {
 -    const tag = vocabulary.tags[tagName];
 -    return tag && tag.values ? tag.values : [];
 +// When selecting a property value, save its ID for later usage.
 +const handleSelect = (
 +    { onChange }: WrappedFieldInputProps,
 +    { dispatch }: WrappedFieldMetaProps) => {
 +        return (item:PropFieldSuggestion) => {
 +            onChange(item.label);
 +            dispatch(change(COLLECTION_TAG_FORM_NAME, PROPERTY_VALUE_FIELD_ID, item.id));
 +    };
  };