فهرست منبع

[assist] Make sure the last opened HDFS folder exists before trying to open it

If a folder in the last opened path is missing it will go as far as it can.
Johan Ahlen 10 سال پیش
والد
کامیت
921b657
2فایلهای تغییر یافته به همراه50 افزوده شده و 14 حذف شده
  1. 36 1
      desktop/core/src/desktop/static/desktop/js/assist/assistHdfsEntry.js
  2. 14 13
      desktop/core/src/desktop/templates/assist.mako

+ 36 - 1
desktop/core/src/desktop/static/desktop/js/assist/assistHdfsEntry.js

@@ -48,6 +48,7 @@
 
 
     self.entries = ko.observableArray([]);
     self.entries = ko.observableArray([]);
 
 
+    self.loaded = false;
     self.loading = ko.observable(false);
     self.loading = ko.observable(false);
     self.open = ko.observable(false);
     self.open = ko.observable(false);
 
 
@@ -67,7 +68,7 @@
     huePubSub.publish('assist.dblClickHdfsItem', self);
     huePubSub.publish('assist.dblClickHdfsItem', self);
   };
   };
 
 
-  AssistHdfsEntry.prototype.loadEntries = function() {
+  AssistHdfsEntry.prototype.loadEntries = function(callback) {
     var self = this;
     var self = this;
     if (self.loading()) {
     if (self.loading()) {
       return;
       return;
@@ -85,16 +86,50 @@
           assistHelper: self.assistHelper
           assistHelper: self.assistHelper
         })
         })
       }));
       }));
+      self.loaded = true;
       self.loading(false);
       self.loading(false);
+      if (callback) {
+        callback();
+      }
     };
     };
 
 
     var errorCallback = function () {
     var errorCallback = function () {
       self.loading(false);
       self.loading(false);
+      if (callback) {
+        callback();
+      }
     };
     };
 
 
     self.assistHelper.fetchHdfsPath(self.getHierarchy(), successCallback, errorCallback)
     self.assistHelper.fetchHdfsPath(self.getHierarchy(), successCallback, errorCallback)
   };
   };
 
 
+  AssistHdfsEntry.prototype.loadDeep = function(folders, callback) {
+    var self = this;
+
+    if (folders.length === 0) {
+      callback(self);
+      return;
+    }
+
+    var findNextAndLoadDeep = function () {
+      var nextName = folders.shift();
+      var foundEntry = $.grep(self.entries(), function (entry) {
+        return entry.definition.name === nextName && entry.definition.type === 'dir';
+      });
+      if (foundEntry.length === 1) {
+        foundEntry[0].loadDeep(folders, callback);
+      } else {
+        callback(self);
+      }
+    };
+
+    if (! self.loaded) {
+      self.loadEntries(findNextAndLoadDeep);
+    } else {
+      findNextAndLoadDeep();
+    }
+  };
+
   AssistHdfsEntry.prototype.getHierarchy = function () {
   AssistHdfsEntry.prototype.getHierarchy = function () {
     var self = this;
     var self = this;
     var parts = [];
     var parts = [];

+ 14 - 13
desktop/core/src/desktop/templates/assist.mako

@@ -669,20 +669,21 @@ from desktop.views import _ko
 
 
         var lastKnownPath = self.assistHelper.getFromTotalStorage('assist', 'currentHdfsPath', '/');
         var lastKnownPath = self.assistHelper.getFromTotalStorage('assist', 'currentHdfsPath', '/');
         var parts = lastKnownPath.split('/');
         var parts = lastKnownPath.split('/');
-        parts[0] = '/';
-
-        var currentEntry = null;
-        $.each(parts, function (idx, part) {
-          currentEntry = new AssistHdfsEntry({
-            definition: {
-              name: part,
-              type: 'dir'
-            },
-            parent: currentEntry,
-            assistHelper: self.assistHelper
-          });
-          currentEntry.loadEntries();
+        parts.shift();
+
+        var currentEntry = new AssistHdfsEntry({
+          definition: {
+            name: '/',
+            type: 'dir'
+          },
+          parent: null,
+          assistHelper: self.assistHelper
+        });
+
+        currentEntry.loadDeep(parts, function (entry) {
+          currentEntry = entry;
         });
         });
+
         currentEntry.open(true);
         currentEntry.open(true);
         self.selectedHdfsEntry = ko.observable(currentEntry);
         self.selectedHdfsEntry = ko.observable(currentEntry);