Explorar o código

HUE-5591 [editor] Don’t show the autocomplete dropdown when there are no suggestions

Johan Ahlen %!s(int64=9) %!d(string=hai) anos
pai
achega
5b125fb

+ 24 - 9
desktop/core/src/desktop/static/desktop/js/sqlAutocompleter3.js

@@ -192,18 +192,22 @@ var SqlAutocompleter3 = (function () {
     self.filter('');
 
     var colRefDeferral = self.handleColumnReference();
-    var allDbsDeferral = self.loadDatabases();
+    var databasesDeferral = self.loadDatabases();
 
     self.handleKeywords(colRefDeferral);
     self.handleIdentifiers();
     self.handleColumnAliases();
     self.handleCommonTableExpressions();
     self.handleFunctions(colRefDeferral);
-    self.handleDatabases(allDbsDeferral);
-    self.handleTables(allDbsDeferral);
-    self.handleColumns(colRefDeferral);
-    self.handleValues(colRefDeferral);
-    self.handlePaths();
+    self.handleDatabases(databasesDeferral);
+    var tablesDeferral = self.handleTables(databasesDeferral);
+    var columnsDeferral = self.handleColumns(colRefDeferral);
+    var valuesDeferral = self.handleValues(colRefDeferral);
+    var pathsDeferral = self.handlePaths();
+
+    $.when(colRefDeferral, databasesDeferral, tablesDeferral, columnsDeferral, valuesDeferral, pathsDeferral).done(function () {
+      huePubSub.publish('hue.ace.autocompleter.done');
+    });
   };
 
   /**
@@ -369,6 +373,7 @@ var SqlAutocompleter3 = (function () {
 
   Suggestions.prototype.handleTables = function (allDbsDeferral, colRefDeferral) {
     var self = this;
+    var tablesDeferred = $.Deferred();
     if (self.parseResult.suggestTables) {
       var suggestTables = self.parseResult.suggestTables;
       var fetchTables = function () {
@@ -392,10 +397,12 @@ var SqlAutocompleter3 = (function () {
             });
             self.loadingTables(false);
             self.tables(tableSuggestions);
+            tablesDeferred.resolve(tableSuggestions);
           },
           silenceErrors: true,
           errorCallback: function () {
             self.loadingTables(false);
+            tablesDeferred.resolve([]);
           },
           timeout: AUTOCOMPLETE_TIMEOUT
         });
@@ -410,21 +417,25 @@ var SqlAutocompleter3 = (function () {
             fetchTables();
           } else {
             self.parseResult.suggestColumns = { tables: [{ identifierChain: self.parseResult.suggestTables.identifierChain }] };
-            self.handleColumns(colRefDeferral);
+            return self.handleColumns(colRefDeferral);
           }
         });
       } else if (self.snippet.type() == 'impala' && self.parseResult.suggestTables.identifierChain && self.parseResult.suggestTables.identifierChain.length > 1) {
         self.parseResult.suggestColumns = { tables: [{ identifierChain: self.parseResult.suggestTables.identifierChain }] };
-        self.handleColumns(colRefDeferral);
+        return self.handleColumns(colRefDeferral);
       } else {
         fetchTables();
       }
+    } else {
+      tablesDeferred.resolve([]);
     }
+
+    return tablesDeferred;
   };
 
   Suggestions.prototype.handleColumns = function (colRefDeferral) {
     var self = this;
-
+    var columnsDeferred = $.Deferred();
     if (self.parseResult.suggestColumns) {
       var suggestColumns = self.parseResult.suggestColumns;
       var columnSuggestions = [];
@@ -452,9 +463,13 @@ var SqlAutocompleter3 = (function () {
           columnSuggestions.push({ value: 'INPUT__FILE__NAME', meta: AutocompleterGlobals.i18n.meta.virtual, weight: DEFAULT_WEIGHTS.VIRTUAL_COLUMN });
         }
         self.columns(columnSuggestions);
+        columnsDeferred.resolve(columnSuggestions);
         self.loadingColumns(false);
       });
+    } else {
+      columnsDeferred.resolve([]);
     }
+    return columnsDeferred;
   };
 
   Suggestions.prototype.addColumns = function (table, types, columnSuggestions) {

+ 9 - 4
desktop/libs/notebook/src/notebook/templates/hue_ace_autocompleter.mako

@@ -108,7 +108,7 @@ from desktop.views import _ko
         self.autocompleter = new SqlAutocompleter3(params);
         self.suggestions = self.autocompleter.suggestions;
 
-        self.active = ko.observable(false);
+        self.active = ko.observable(false).extend({ rateLimit: 10 }); // to prevent flickering on empty result
         self.top = ko.observable(1);
         self.left = ko.observable(1);
 
@@ -118,9 +118,6 @@ from desktop.views import _ko
           if (self.selectedIndex() > newValue.length - 1) {
             self.selectedIndex(Math.max(0, newValue.length -1));
           }
-          if (newValue.length === 0) {
-            self.detach();
-          }
         });
 
         self.keyboardHandler = new HashHandler();
@@ -213,6 +210,14 @@ from desktop.views import _ko
           self.editor().on('mousewheel', self.mousewheelListener);
         };
 
+        huePubSub.subscribe('hue.ace.autocompleter.done', function () {
+          window.setTimeout(function () {
+            if (self.active() && self.suggestions.filtered().length === 0) {
+              self.detach();
+            }
+          }, 0);
+        });
+
         huePubSub.subscribe('hue.ace.autocompleter.show', function (data) {
           var session = self.editor().getSession();
           var pos = self.editor().getCursorPosition();