2
0
Эх сурвалжийг харах

Global search fixes

* Fix error with infinite loop if whitespace on front of query
* Translate color to user's language if not found
John R. Supplee 4 жил өмнө
parent
commit
5553277a1e

+ 43 - 32
client/components/main/globalSearch.js

@@ -47,6 +47,14 @@ BlazeComponent.extendComponent({
     this.resultsCount = 0;
     this.totalHits = 0;
     this.queryErrors = null;
+    this.colorMap = null;
+    // this.colorMap = {};
+    // for (const color of Boards.simpleSchema()._schema['labels.$.color']
+    //   .allowedValues) {
+    //   this.colorMap[TAPi18n.__(`color-${color}`)] = color;
+    // }
+    // // eslint-disable-next-line no-console
+    // console.log('colorMap:', this.colorMap);
     Meteor.subscribe('setting');
     if (Session.get('globalQuery')) {
       this.searchAllBoards(Session.get('globalQuery'));
@@ -103,7 +111,15 @@ BlazeComponent.extendComponent({
         messages.push({ tag: 'list-title-not-found', value: list });
       });
       this.queryErrors.notFound.labels.forEach(label => {
-        messages.push({ tag: 'label-not-found', value: label });
+        const color = TAPi18n.__(`color-${label}`);
+        if (color) {
+          messages.push({
+            tag: 'label-color-not-found',
+            value: color,
+          });
+        } else {
+          messages.push({ tag: 'label-not-found', value: label });
+        }
       });
       this.queryErrors.notFound.users.forEach(user => {
         messages.push({ tag: 'user-username-not-found', value: user });
@@ -126,6 +142,7 @@ BlazeComponent.extendComponent({
   },
 
   searchAllBoards(query) {
+    query = query.trim();
     this.query.set(query);
 
     this.resetSearch();
@@ -134,43 +151,24 @@ BlazeComponent.extendComponent({
       return;
     }
 
-    this.searching.set(true);
-
     // eslint-disable-next-line no-console
     // console.log('query:', query);
 
+    this.searching.set(true);
+
+    if (!this.colorMap) {
+      this.colorMap = {};
+      for (const color of Boards.simpleSchema()._schema['labels.$.color']
+        .allowedValues) {
+        this.colorMap[TAPi18n.__(`color-${color}`)] = color;
+      }
+    }
+
     const reOperator1 = /^((?<operator>\w+):|(?<abbrev>[#@]))(?<value>\w+)(\s+|$)/;
     const reOperator2 = /^((?<operator>\w+):|(?<abbrev>[#@]))(?<quote>["']*)(?<value>.*?)\k<quote>(\s+|$)/;
     const reText = /^(?<text>\S+)(\s+|$)/;
     const reQuotedText = /^(?<quote>["'])(?<text>\w+)\k<quote>(\s+|$)/;
 
-    const colorMap = {};
-    colorMap[TAPi18n.__('color-black')] = 'black';
-    colorMap[TAPi18n.__('color-blue')] = 'blue';
-    colorMap[TAPi18n.__('color-crimson')] = 'crimson';
-    colorMap[TAPi18n.__('color-darkgreen')] = 'darkgreen';
-    colorMap[TAPi18n.__('color-gold')] = 'gold';
-    colorMap[TAPi18n.__('color-gray')] = 'gray';
-    colorMap[TAPi18n.__('color-green')] = 'green';
-    colorMap[TAPi18n.__('color-indigo')] = 'indigo';
-    colorMap[TAPi18n.__('color-lime')] = 'lime';
-    colorMap[TAPi18n.__('color-magenta')] = 'magenta';
-    colorMap[TAPi18n.__('color-mistyrose')] = 'mistyrose';
-    colorMap[TAPi18n.__('color-navy')] = 'navy';
-    colorMap[TAPi18n.__('color-orange')] = 'orange';
-    colorMap[TAPi18n.__('color-paleturquoise')] = 'paleturquoise';
-    colorMap[TAPi18n.__('color-peachpuff')] = 'peachpuff';
-    colorMap[TAPi18n.__('color-pink')] = 'pink';
-    colorMap[TAPi18n.__('color-plum')] = 'plum';
-    colorMap[TAPi18n.__('color-purple')] = 'purple';
-    colorMap[TAPi18n.__('color-red')] = 'red';
-    colorMap[TAPi18n.__('color-saddlebrown')] = 'saddlebrown';
-    colorMap[TAPi18n.__('color-silver')] = 'silver';
-    colorMap[TAPi18n.__('color-sky')] = 'sky';
-    colorMap[TAPi18n.__('color-slateblue')] = 'slateblue';
-    colorMap[TAPi18n.__('color-white')] = 'white';
-    colorMap[TAPi18n.__('color-yellow')] = 'yellow';
-
     const operatorMap = {};
     operatorMap[TAPi18n.__('operator-board')] = 'boards';
     operatorMap[TAPi18n.__('operator-board-abbrev')] = 'boards';
@@ -222,8 +220,8 @@ BlazeComponent.extendComponent({
         if (op in operatorMap) {
           let value = m.groups.value;
           if (operatorMap[op] === 'labels') {
-            if (value in colorMap) {
-              value = colorMap[value];
+            if (value in this.colorMap) {
+              value = this.colorMap[value];
             }
           }
           params[operatorMap[op]].push(value);
@@ -357,6 +355,14 @@ BlazeComponent.extendComponent({
     return text;
   },
 
+  labelColors() {
+    return Boards.simpleSchema()._schema['labels.$.color'].allowedValues.map(
+      color => {
+        return { color, name: TAPi18n.__(`color-${color}`) };
+      },
+    );
+  },
+
   events() {
     return [
       {
@@ -364,6 +370,11 @@ BlazeComponent.extendComponent({
           evt.preventDefault();
           this.searchAllBoards(evt.target.searchQuery.value);
         },
+        'click .js-palette-color'(evt) {
+          this.query.set(
+            `${this.query.get()} label:"${evt.currentTarget.textContent}"`,
+          );
+        },
       },
     ];
   },

+ 1 - 0
i18n/en.i18n.json

@@ -873,6 +873,7 @@
   "swimlane-title-not-found": "Swimlane '%s' not found.",
   "list-title-not-found": "List '%s' not found.",
   "label-not-found": "Label '%s' not found.",
+  "label-color-not-found": "Label color %s not found.",
   "user-username-not-found": "Username '%s' not found.",
   "globalSearch-title": "Search All Boards",
   "no-cards-found": "No Cards Found",