Przeglądaj źródła

[beeswax] Fix issue with initially selected DB in assist

When loading saved queries the saved database should be the active database and not the last selected one. This updates the assist panel database when the design is loaded. As the assist component might be loaded after the design is fetched the update is deferred.
Johan Ahlen 10 lat temu
rodzic
commit
76e7f30a3b

+ 0 - 4
apps/beeswax/src/beeswax/static/beeswax/js/beeswax.vm.js

@@ -141,10 +141,6 @@ function BeeswaxViewModel(server) {
     'deferEvaluation': true
   });
 
-  huePubSub.subscribe('hue.assist.databaseChanged', function(databaseName) {
-    self.selectedDatabase(self.databases.indexOf(databaseName));
-  });
-
   self.hasParametersFilled = ko.computed(function() {
     var hasBlank = false;
     $.each(self.design.parameters(), function(index, element) {

+ 21 - 9
apps/beeswax/src/beeswax/templates/execute.mako

@@ -44,7 +44,7 @@ ${ layout.menubar(section='query') }
       <div class="tab-pane active" id="navigatorTab">
         <div class="card card-small card-tab">
           <div class="card-body" style="margin-top: 0;">
-            <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper, database: database }}"></div>
+            <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper, database: database, appName: '${ app_name }' }}"></div>
           </div>
         </div>
       </div>
@@ -2575,18 +2575,21 @@ function getDatabases(callback){
         width: "100%",
         no_results_text: "${_('Oops, no database found!')}"
       }).change(function () {
-        saveLastUsedDatabase();
+        updateAssistDatabase();
       });
       $(".chosen-select").trigger("chosen:updated");
-      if ($.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database") != null && $.inArray($.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database"), viewModel.databases()) > -1) {
-        viewModel.database($.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database"));
+      var assistOptions = $.totalStorage("${app_name}.assist.options") || {};
+
+      if (assistOptions != null && $.inArray(assistOptions.lastSelectedDb, viewModel.databases()) > -1) {
+        viewModel.database(assistOptions.lastSelectedDb);
       }
       else {
         if ($.inArray("default", viewModel.databases()) > -1){
           viewModel.database("default");
         }
         else {
-          $.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database", null);
+          assistOptions.lastSelectedDb = null;
+          $.totalStorage("${app_name}.assist.options", assistOptions);
         }
       }
       var _waitForNavigatorInit = -1;
@@ -2608,8 +2611,11 @@ function getDatabases(callback){
   });
 }
 
-function saveLastUsedDatabase(){
-  $.totalStorage(hac_getTotalStorageUserPrefix() + "${app_name}_last_database", viewModel.database());
+function updateAssistDatabase(){
+  var desiredDb = viewModel.database();
+  window.setTimeout(function() {
+    huePubSub.publish('hue.assist.changeDatabase', desiredDb)
+  }, 100);
 }
 
 function loadEditor() {
@@ -2622,19 +2628,25 @@ function loadDesign(design_id) {
     viewModel.fetchDesign();
   });
 
-  $(document).one('fetched.design', saveLastUsedDatabase);
+  $(document).one('fetched.design', updateAssistDatabase);
 
   setupCodeMirrorSubscription();
   loadEditor();
 }
 
+huePubSub.subscribe('hue.assist.databaseChanged', function(name) {
+  if (name !== viewModel.database()) {
+    viewModel.database(name);
+  }
+});
+
 function loadQueryHistory(query_history_id) {
   $(document).one('fetched.databases', function() {
     viewModel.design.history.id(query_history_id);
     viewModel.fetchQueryHistory();
   });
 
-  $(document).one('fetched.query', saveLastUsedDatabase);
+  $(document).one('fetched.query', updateAssistDatabase);
 
   setupCodeMirrorSubscription();
   loadEditor();

+ 1 - 1
apps/spark/src/spark/templates/editor_components.mako

@@ -224,7 +224,7 @@ from desktop.views import _ko
     <a title="${_('Toggle Assist')}" class="pointer hide-assist" data-bind="click: function() { $root.isLeftPanelVisible(false) }">
       <i class="fa fa-chevron-left"></i>
     </a>
-    <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper }}"></div>
+    <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper, appName: 'spark'  }}"></div>
   </div>
   <div class="resizer" data-bind="visible: $root.isLeftPanelVisible() && $root.assistAvailable, splitDraggable : { appName: 'spark', leftPanelVisible: $root.isLeftPanelVisible }"><div class="resize-bar">&nbsp;</div></div>
   <div class="right-panel" data-bind="event: { scroll: function(){ $(document).trigger('hideAutocomplete'); } }">

+ 24 - 22
desktop/core/src/desktop/templates/ko_components.mako

@@ -621,11 +621,7 @@ from desktop.views import _ko
         });
 
         // We need the names because select2 does not support objects
-        self.availableDatabaseNames = ko.computed(function() {
-          return $.map(self.databases(), function(database) {
-            return database.definition.name;
-          })
-        });
+        self.availableDatabaseNames = ko.observableArray();
         self.selectedDatabaseName = ko.observable();
 
         self.selectedDatabaseName.subscribe(function(name) {
@@ -645,19 +641,28 @@ from desktop.views import _ko
           huePubSub.publish('hue.assist.databaseChanged', name);
         });
 
-        // params.database is leading database source (set from saved queries for instance)
-        if (ko.isObservable(params.database)) {
-          self.selectedDatabaseName(params.database());
-          params.database.subscribe(function(newValue) {
-            self.selectedDatabaseName(newValue);
-          });
-        }
+        huePubSub.subscribe('hue.assist.changeDatabase', function(name) {
+          self.selectedDatabaseName(name);
+        });
 
         self.loadingTables = ko.computed(function() {
-          return self.selectedDatabaseName() && ! (self.selectedDatabase() && !self.selectedDatabase().loading());
+          return  ! (self.selectedDatabase() && !self.selectedDatabase().loading());
         });
 
-        self.fetchDatabases();
+        self.fetchDatabases(function() {
+          window.setTimeout(function() {
+            if ($.inArray(self.selectedDatabaseName(), self.availableDatabaseNames()) > -1) {
+              return;
+            }
+            if ($.inArray(self.options.lastSelectedDb(), self.availableDatabaseNames()) > -1) {
+              self.selectedDatabaseName(self.options.lastSelectedDb());
+            } else if ($.inArray("default", self.availableDatabaseNames()) > -1) {
+              self.selectedDatabaseName("default");
+            } else if (self.availableDatabaseNames().length > 0) {
+              self.selectedDatabaseName(self.availableDatabaseNames()[0]);
+            }
+          }, 150);
+        });
 
         self.modalItem = ko.observable();
         self.analysisStats = ko.observable();
@@ -711,7 +716,7 @@ from desktop.views import _ko
         self.selectedDatabaseName(selectedDb);
       };
 
-      AssistPanel.prototype.fetchDatabases = function() {
+      AssistPanel.prototype.fetchDatabases = function(callback) {
         var self = this;
 
         self.assistHelper.fetchDatabases(function(data) {
@@ -723,15 +728,12 @@ from desktop.views import _ko
               isDatabase: true
             }, null, self, self.filter);
           }));
+          self.availableDatabaseNames(data.databases);
 
-          if (self.options.lastSelectedDb() != null && $.inArray(self.options.lastSelectedDb(), data.databases) > -1) {
-            self.selectedDatabaseName(self.options.lastSelectedDb());
-          } else if ($.inArray("default", data.databases) > -1) {
-            self.selectedDatabaseName("default");
-          } else if (data.databases.length > 0) {
-            self.selectedDatabaseName(data.databases[0]);
-          }
           self.reloading(false);
+          if (callback) {
+            callback();
+          }
         }, function() {
           self.reloading(false);
           self.hasErrors(true);