ソースを参照

HUE-7669 [assist] Update the inline autocomplete on backspace

Johan Ahlen 8 年 前
コミット
b689e89

+ 73 - 77
desktop/core/src/desktop/templates/ko_components/ko_inline_autocomplete.mako

@@ -57,6 +57,11 @@ from desktop.views import _ko
         self.placeHolder = params.placeHolder || '${ _('Filter...') }';
         self.hasFocus = params.hasFocus || ko.observable();
         self.querySpec = params.querySpec;
+        self.querySpec({
+          query: '',
+          facets: {},
+          text: []
+        });
         self.autocompleteFromEntries = params.autocompleteFromEntries || function () {};
         self.facets = params.facets || [];
         self.knownFacetValues = params.knownFacetValues || {};
@@ -78,13 +83,7 @@ from desktop.views import _ko
           return self.suggestions()[self.selectedSuggestionIndex()];
         });
 
-        self.lastResult = {};
-
-        self.querySpec({
-          query: '',
-          facets: {},
-          text: []
-        });
+        self.lastParseResult = {};
 
         var querySpecSub = self.querySpec.subscribe(function (newVal) {
           if (!newVal || !newVal.query) {
@@ -114,75 +113,24 @@ from desktop.views import _ko
         }
 
         var inputSub = self.searchInput.subscribe(function (newValue) {
-          if (newValue === '' && self.querySpec() && self.querySpec().query === '') {
-            self.clearSuggestions();
+          if (self.inlineAutocomplete() === newValue) {
             return;
           }
-          if (newValue === '' && self.querySpec() && self.querySpec().query !== '') {
-            self.querySpec({
-              query: '',
-              facets: {},
-              text: []
-            });
-          } else {
-            // TODO: Get cursor position and split to before and after
-            self.lastResult = globalSearchParser.parseGlobalSearch(newValue, '');
-            if (hueDebug && hueDebug.showGlobalSearchParseResults) {
-              console.log(self.lastResult);
-            }
-            var querySpec = { query: newValue };
-            if (self.lastResult.facets) {
-
-              var knownFacetValues = ko.unwrap(self.knownFacetValues);
-              var cleanFacets = {};
-              Object.keys(self.lastResult.facets).forEach(function (facet) {
-                if (!knownFacetValues[facet]) {
-                  cleanFacets[facet] = self.lastResult.facets[facet];
-                } else {
-                  cleanFacets[facet] = {};
-                  Object.keys(self.lastResult.facets[facet]).forEach(function (value) {
-                    if (knownFacetValues[facet][value]) {
-                      cleanFacets[facet][value] = self.lastResult.facets[facet][value];
-                    } else {
-                      var found = false;
-                      // Find the closest match, i.e. type:s -> type: [string, smallint, ...]
-                      getSortedFacets(knownFacetValues[facet]).forEach(function (knownValue) {
-                        if (knownValue.toLowerCase().indexOf(value.toLowerCase()) === 0) {
-                          if (!cleanFacets[facet][knownValue]) {
-                            cleanFacets[facet][knownValue] = [];
-                          }
-                          cleanFacets[facet][knownValue] = true;
-                          found = true
-                        }
-                      });
-                      if (!found) {
-                        cleanFacets[facet][value] = self.lastResult.facets[facet][value];
-                      }
-                    }
-                  })
-                }
-              });
-              querySpec.facets = cleanFacets;
-            }
-            if (self.lastResult.text) {
-              querySpec.text = self.lastResult.text;
-            }
-            self.querySpec(querySpec);
-          }
 
           if (newValue === '') {
             self.clearSuggestions();
-          } else if (self.inlineAutocomplete() === newValue || self.inlineAutocomplete().indexOf(newValue) !== 0) {
-            self.autocomplete();
-          } else if (self.inlineAutocomplete().indexOf(newValue) === 0) {
-            var newAutocomp = self.inlineAutocomplete();
-            while (newAutocomp.lastIndexOf(' ') >= newValue.length) {
-              newAutocomp = newAutocomp.substring(0, newAutocomp.lastIndexOf(' '));
-            }
-            if (newAutocomp !== self.inlineAutocomplete()) {
-              self.suggestions([newAutocomp]);
+            if (self.querySpec() && self.querySpec().query !== '') {
+              self.querySpec({
+                query: '',
+                facets: {},
+                text: []
+              });
             }
+            return;
           }
+
+          self.updateQuerySpec();
+          self.autocomplete();
         });
 
         self.disposals.push(function () {
@@ -248,6 +196,54 @@ from desktop.views import _ko
         });
       };
 
+      InlineAutocomplete.prototype.updateQuerySpec = function () {
+        var self = this;
+        // TODO: Get cursor position and split to before and after
+        self.lastParseResult = globalSearchParser.parseGlobalSearch(self.searchInput(), '');
+        if (hueDebug && hueDebug.showGlobalSearchParseResults) {
+          console.log(self.lastParseResult);
+        }
+        var querySpec = { query: self.searchInput() };
+
+        if (self.lastParseResult.facets) {
+          var knownFacetValues = ko.unwrap(self.knownFacetValues);
+          var cleanFacets = {};
+          Object.keys(self.lastParseResult.facets).forEach(function (facet) {
+            if (!knownFacetValues[facet]) {
+              cleanFacets[facet] = self.lastParseResult.facets[facet];
+            } else {
+              cleanFacets[facet] = {};
+              Object.keys(self.lastParseResult.facets[facet]).forEach(function (value) {
+                if (knownFacetValues[facet][value]) {
+                  cleanFacets[facet][value] = self.lastParseResult.facets[facet][value];
+                } else {
+                  var found = false;
+                  // Find the closest match, i.e. type:s -> type: [string, smallint, ...]
+                  getSortedFacets(knownFacetValues[facet]).forEach(function (knownValue) {
+                    if (knownValue.toLowerCase().indexOf(value.toLowerCase()) === 0) {
+                      if (!cleanFacets[facet][knownValue]) {
+                        cleanFacets[facet][knownValue] = [];
+                      }
+                      cleanFacets[facet][knownValue] = true;
+                      found = true
+                    }
+                  });
+                  if (!found) {
+                    cleanFacets[facet][value] = self.lastParseResult.facets[facet][value];
+                  }
+                }
+              })
+            }
+          });
+          querySpec.facets = cleanFacets;
+        }
+        if (self.lastParseResult.text) {
+          querySpec.text = self.lastParseResult.text;
+        }
+
+        self.querySpec(querySpec);
+      };
+
       InlineAutocomplete.prototype.clearSuggestions = function () {
         var self = this;
         if (self.suggestions().length > 0) {
@@ -264,7 +260,7 @@ from desktop.views import _ko
 
       InlineAutocomplete.prototype.autocomplete = function () {
         var self = this;
-        if (!self.lastResult) {
+        if (!self.lastParseResult) {
           self.clearSuggestions();
           return;
         }
@@ -282,10 +278,10 @@ from desktop.views import _ko
 
         var newSuggestions = [];
         var partialLower = partial.toLowerCase();
-        if (self.lastResult.suggestFacets) {
+        if (self.lastParseResult.suggestFacets) {
           var existingFacetIndex = {};
-          if (self.uniqueFacets && self.lastResult.facets) {
-            Object.keys(self.lastResult.facets).forEach(function (facet) {
+          if (self.uniqueFacets && self.lastParseResult.facets) {
+            Object.keys(self.lastParseResult.facets).forEach(function (facet) {
               existingFacetIndex[facet.toLowerCase()] = true;
             })
           }
@@ -305,10 +301,10 @@ from desktop.views import _ko
           });
         }
 
-        if (self.lastResult.suggestFacetValues) {
+        if (self.lastParseResult.suggestFacetValues) {
           var facetValues = ko.unwrap(self.knownFacetValues);
-          if (facetValues[self.lastResult.suggestFacetValues.toLowerCase()]) {
-            getSortedFacets(facetValues[self.lastResult.suggestFacetValues.toLowerCase()]).forEach(function (value) {
+          if (facetValues[self.lastParseResult.suggestFacetValues.toLowerCase()]) {
+            getSortedFacets(facetValues[self.lastParseResult.suggestFacetValues.toLowerCase()]).forEach(function (value) {
               if (value.toLowerCase().indexOf(partialLower) === 0) {
                 newSuggestions.push(nonPartial + partial + value.substring(partial.length, value.length));
               }
@@ -316,7 +312,7 @@ from desktop.views import _ko
           }
         }
 
-        if (partial !== '' && self.lastResult.suggestResults) {
+        if (partial !== '' && self.lastParseResult.suggestResults) {
           newSuggestions = newSuggestions.concat(self.autocompleteFromEntries(nonPartial, partial));
         }