[ARVADOS-WORKBENCH2] updated: 2.3.0-162-g1e771e80

Git user git at public.arvados.org
Mon Feb 14 21:19:11 UTC 2022


Summary of changes:
 src/models/vocabulary.test.ts                      | 36 +++++++++++-----------
 src/models/vocabulary.ts                           | 34 +++++++++++---------
 .../property-key-field.tsx                         | 11 +++++--
 .../property-value-field.tsx                       | 11 +++++--
 4 files changed, 54 insertions(+), 38 deletions(-)

       via  1e771e8083df71d11da85dae8bfd0a0cdfb1737f (commit)
      from  c72cb99d0f37aa86cd595d77d742c69c25ff2fba (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


commit 1e771e8083df71d11da85dae8bfd0a0cdfb1737f
Author: Lucas Di Pentima <lucas.dipentima at curii.com>
Date:   Mon Feb 14 17:56:42 2022 -0300

    18560: Restricts synonyms display to the ones matching the user input.
    
    Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas.dipentima at curii.com>

diff --git a/src/models/vocabulary.test.ts b/src/models/vocabulary.test.ts
index 582af0ec..761c785b 100644
--- a/src/models/vocabulary.test.ts
+++ b/src/models/vocabulary.test.ts
@@ -73,19 +73,19 @@ describe('Vocabulary', () => {
         const preferredTagKeys = Vocabulary.getPreferredTags(vocabulary);
         // Alphabetically ordered by label
         expect(preferredTagKeys).toEqual([
-            {id: "IDKEYANIMALS", label: "Animal", description: "Animal"},
-            {id: "IDKEYCOMMENT", label: "IDKEYCOMMENT"},
-            {id: "IDKEYSIZES", label: "Sizes", description: "Sizes"},
+            {id: "IDKEYANIMALS", label: "Animal", synonyms: []},
+            {id: "IDKEYCOMMENT", label: "IDKEYCOMMENT", synonyms: []},
+            {id: "IDKEYSIZES", label: "Sizes", synonyms: []},
         ]);
     });
 
-    it('returns the list of preferred tag keys with synonyms', () => {
-        const preferredTagKeys = Vocabulary.getPreferredTags(vocabulary, true);
+    it('returns the list of preferred tag keys with matching synonyms', () => {
+        const preferredTagKeys = Vocabulary.getPreferredTags(vocabulary, 'creat');
         // Alphabetically ordered by label
         expect(preferredTagKeys).toEqual([
-            {id: "IDKEYANIMALS", label: "Animal", description: "Animal (Creature, Beast)"},
-            {id: "IDKEYCOMMENT", label: "IDKEYCOMMENT"},
-            {id: "IDKEYSIZES", label: "Sizes", description: "Sizes"},
+            {id: "IDKEYANIMALS", label: "Animal", synonyms: ["Creature"]},
+            {id: "IDKEYCOMMENT", label: "IDKEYCOMMENT", synonyms: []},
+            {id: "IDKEYSIZES", label: "Sizes", synonyms: []},
         ]);
     });
 
@@ -108,21 +108,21 @@ describe('Vocabulary', () => {
         const preferredTagValues = Vocabulary.getPreferredTagValues('IDKEYSIZES', vocabulary);
         // Alphabetically ordered by label
         expect(preferredTagValues).toEqual([
-            {id: "IDVALSIZES4", label: "IDVALSIZES4"},
-            {id: "IDVALSIZES3", label: "Large", description: "Large"},
-            {id: "IDVALSIZES2", label: "Medium", description: "Medium"},
-            {id: "IDVALSIZES1", label: "Small", description: "Small"},
+            {id: "IDVALSIZES4", label: "IDVALSIZES4", synonyms: []},
+            {id: "IDVALSIZES3", label: "Large", synonyms: []},
+            {id: "IDVALSIZES2", label: "Medium", synonyms: []},
+            {id: "IDVALSIZES1", label: "Small", synonyms: []},
         ])
     });
 
-    it('returns the preferred tag values with synonyms for a given key', () => {
-        const preferredTagValues = Vocabulary.getPreferredTagValues('IDKEYSIZES', vocabulary, true);
+    it('returns the preferred tag values with matching synonyms for a given key', () => {
+        const preferredTagValues = Vocabulary.getPreferredTagValues('IDKEYSIZES', vocabulary, 'litt');
         // Alphabetically ordered by label
         expect(preferredTagValues).toEqual([
-            {id: "IDVALSIZES4", label: "IDVALSIZES4"},
-            {id: "IDVALSIZES3", label: "Large", description: "Large (L)"},
-            {id: "IDVALSIZES2", label: "Medium", description: "Medium (M)"},
-            {id: "IDVALSIZES1", label: "Small", description: "Small (S, Little)"},
+            {id: "IDVALSIZES4", label: "IDVALSIZES4", synonyms: []},
+            {id: "IDVALSIZES3", label: "Large", synonyms: []},
+            {id: "IDVALSIZES2", label: "Medium", synonyms: []},
+            {id: "IDVALSIZES1", label: "Small", synonyms: ["Little"]},
         ])
     });
 
diff --git a/src/models/vocabulary.ts b/src/models/vocabulary.ts
index 55525c22..6c629059 100644
--- a/src/models/vocabulary.ts
+++ b/src/models/vocabulary.ts
@@ -2,6 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
+import { escapeRegExp } from 'common/regexp';
 import { isObject, has, every } from 'lodash/fp';
 
 export interface Vocabulary {
@@ -27,7 +28,7 @@ export interface Tag {
 export interface PropFieldSuggestion {
     id: string;
     label: string;
-    description?: string;
+    synonyms?: string[];
 }
 
 const VOCABULARY_VALIDATORS = [
@@ -78,19 +79,22 @@ export const getTagValues = (tagKeyID: string, vocabulary: Vocabulary): PropFiel
         : [];
 };
 
-export const getPreferredTagValues = (tagKeyID: string, vocabulary: Vocabulary, withSynonyms?: boolean): PropFieldSuggestion[] => {
+export const getPreferredTagValues = (tagKeyID: string, vocabulary: Vocabulary, withMatch?: string): PropFieldSuggestion[] => {
     const tag = vocabulary.tags[tagKeyID];
+    const regex = !!withMatch ? new RegExp(escapeRegExp(withMatch), 'i') : undefined;
     return tag && tag.values
         ? Object.keys(tag.values).map(
             tagValueID => tag.values![tagValueID].labels && tag.values![tagValueID].labels.length > 0
                 ? {
                     "id": tagValueID,
                     "label": tag.values![tagValueID].labels[0].label,
-                    "description": tag.values![tagValueID].labels[0].label + (
-                        withSynonyms && tag.values![tagValueID].labels.length > 1
-                        ? ` (${tag.values![tagValueID].labels.slice(1).map(l => l.label).join(', ')})`
-                        : '')}
-                : {"id": tagValueID, "label": tagValueID})
+                    "synonyms": !!withMatch && tag.values![tagValueID].labels.length > 1
+                        ? tag.values![tagValueID].labels.slice(1)
+                            .filter(l => !!regex ? regex.test(l.label) : true)
+                            .map(l => l.label)
+                        : []
+                }
+                : {"id": tagValueID, "label": tagValueID, "synonyms": []})
             .sort(compare)
         : [];
 };
@@ -107,19 +111,21 @@ export const getTags = ({ tags }: Vocabulary): PropFieldSuggestion[] => {
         : [];
 };
 
-export const getPreferredTags = ({ tags }: Vocabulary, withSynonyms?: boolean): PropFieldSuggestion[] => {
+export const getPreferredTags = ({ tags }: Vocabulary, withMatch?: string): PropFieldSuggestion[] => {
+    const regex = !!withMatch ? new RegExp(escapeRegExp(withMatch), 'i') : undefined;
     return tags && Object.keys(tags)
         ? Object.keys(tags).map(
             tagID => tags[tagID].labels && tags[tagID].labels.length > 0
                 ? {
                     "id": tagID,
                     "label": tags[tagID].labels[0].label,
-                    "description": tags[tagID].labels[0].label + (
-                        withSynonyms && tags[tagID].labels.length > 1
-                        ? ` (${tags[tagID].labels.slice(1).map(lbl => lbl.label).join(', ')})`
-                        : ''
-                    )}
-                : {"id": tagID, "label": tagID})
+                    "synonyms": !!withMatch && tags[tagID].labels.length > 1
+                        ? tags[tagID].labels.slice(1)
+                                .filter(l => !!regex ? regex.test(l.label) : true)
+                                .map(lbl => lbl.label)
+                        : []
+                }
+                : {"id": tagID, "label": tagID, "synonyms": []})
             .sort(compare)
         : [];
 };
diff --git a/src/views-components/resource-properties-form/property-key-field.tsx b/src/views-components/resource-properties-form/property-key-field.tsx
index e566c708..0be4527a 100644
--- a/src/views-components/resource-properties-form/property-key-field.tsx
+++ b/src/views-components/resource-properties-form/property-key-field.tsx
@@ -46,7 +46,11 @@ const PropertyKeyInput = ({ vocabulary, ...props }: WrappedFieldProps & Vocabula
             {...buildProps(props)}
             label='Key'
             suggestions={getSuggestions(props.input.value, vocabulary)}
-            renderSuggestion={(s: PropFieldSuggestion) => (s.description || s.label)}
+            renderSuggestion={
+                (s: PropFieldSuggestion) => s.synonyms && s.synonyms.length > 0
+                    ? `${s.label} (${s.synonyms.join('; ')})`
+                    : s.label
+            }
             onSelect={handleSelect(PROPERTY_KEY_FIELD_ID, data.form, props.input, props.meta)}
             onBlur={() => {
                 // Case-insensitive search for the key in the vocabulary
@@ -77,8 +81,9 @@ const matchTags = (vocabulary: Vocabulary) =>
 
 const getSuggestions = (value: string, vocabulary: Vocabulary): PropFieldSuggestion[] => {
     const re = new RegExp(escapeRegExp(value), "i");
-    return getPreferredTags(vocabulary, value !== '').filter(
-        tag => re.test((tag.description || tag.label)) && tag.label !== value);
+    return getPreferredTags(vocabulary, value).filter(
+        tag => (tag.label !== value && re.test(tag.label)) ||
+            (tag.synonyms && tag.synonyms.some(s => re.test(s))));
 };
 
 const handleChange = (
diff --git a/src/views-components/resource-properties-form/property-value-field.tsx b/src/views-components/resource-properties-form/property-value-field.tsx
index 56b7fe05..b8e525bf 100644
--- a/src/views-components/resource-properties-form/property-value-field.tsx
+++ b/src/views-components/resource-properties-form/property-value-field.tsx
@@ -60,7 +60,11 @@ const PropertyValueInput = ({ vocabulary, propertyKeyId, propertyKeyName, ...pro
             label='Value'
             disabled={props.disabled}
             suggestions={getSuggestions(props.input.value, propertyKeyId, vocabulary)}
-            renderSuggestion={(s: PropFieldSuggestion) => (s.description || s.label)}
+            renderSuggestion={
+                (s: PropFieldSuggestion) => s.synonyms && s.synonyms.length > 0
+                    ? `${s.label} (${s.synonyms.join('; ')})`
+                    : s.label
+            }
             onSelect={handleSelect(PROPERTY_VALUE_FIELD_ID, data.form, props.input, props.meta)}
             onBlur={() => {
                 // Case-insensitive search for the value in the vocabulary
@@ -91,8 +95,9 @@ const matchTagValues = ({ vocabulary, propertyKeyId }: PropertyValueFieldProps)
 
 const getSuggestions = (value: string, tagName: string, vocabulary: Vocabulary) => {
     const re = new RegExp(escapeRegExp(value), "i");
-    return getPreferredTagValues(tagName, vocabulary, value !== '').filter(
-        v => re.test((v.description || v.label)) && v.label !== value);
+    return getPreferredTagValues(tagName, vocabulary, value).filter(
+        val => (val.label !== value && re.test(val.label)) ||
+            (val.synonyms && val.synonyms.some(s => re.test(s))));
 };
 
 const handleChange = (

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list