浏览代码

HUE-7231 [assist] Keep track of the last opened documents folder

It will now fallback to root only in case of failure loading the docs folder.
Johan Ahlen 8 年之前
父节点
当前提交
54e042f

+ 11 - 4
desktop/core/src/desktop/static/desktop/js/document/hueFileEntry.js

@@ -516,7 +516,7 @@ var HueFileEntry = (function () {
     }
     }
   };
   };
 
 
-  HueFileEntry.prototype.load = function (callback) {
+  HueFileEntry.prototype.load = function (successCallback, errorCallback, silenceErrors) {
     var self = this;
     var self = this;
     if (self.loading()) {
     if (self.loading()) {
       return;
       return;
@@ -527,6 +527,7 @@ var HueFileEntry = (function () {
       self.apiHelper.fetchDocuments({
       self.apiHelper.fetchDocuments({
         uuid: self.definition().uuid,
         uuid: self.definition().uuid,
         type: self.serverTypeFilter().type,
         type: self.serverTypeFilter().type,
+        silenceErrors: !!silenceErrors,
         successCallback: function(data) {
         successCallback: function(data) {
           self.definition(data.document);
           self.definition(data.document);
           self.hasErrors(false);
           self.hasErrors(false);
@@ -557,15 +558,18 @@ var HueFileEntry = (function () {
 
 
           if (self.isRoot() && self.entries().length === 1 && self.entries()[0].definition().type === 'directory' && self.entries()[0].isSharedWithMe()) {
           if (self.isRoot() && self.entries().length === 1 && self.entries()[0].definition().type === 'directory' && self.entries()[0].isSharedWithMe()) {
             self.activeEntry(self.entries()[0]);
             self.activeEntry(self.entries()[0]);
-            self.activeEntry().load(callback);
-          } else if (callback && typeof callback === 'function') {
-            callback();
+            self.activeEntry().load(successCallback);
+          } else if (successCallback && typeof successCallback === 'function') {
+            successCallback();
           }
           }
         },
         },
         errorCallback: function () {
         errorCallback: function () {
           self.hasErrors(true);
           self.hasErrors(true);
           self.loading(false);
           self.loading(false);
           self.loaded(true);
           self.loaded(true);
+          if (errorCallback) {
+            errorCallback();
+          }
         }
         }
       });
       });
     }
     }
@@ -713,6 +717,9 @@ var HueFileEntry = (function () {
 
 
   HueFileEntry.prototype.makeActive = function () {
   HueFileEntry.prototype.makeActive = function () {
     var self = this;
     var self = this;
+    if (!self.loaded()) {
+      self.load();
+    }
     self.activeEntry(this);
     self.activeEntry(this);
   };
   };
 
 

+ 59 - 15
desktop/core/src/desktop/templates/assist.mako

@@ -556,7 +556,7 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, get_ord
     <!-- ko with: activeEntry -->
     <!-- ko with: activeEntry -->
     <div class="assist-flex-header assist-breadcrumb">
     <div class="assist-flex-header assist-breadcrumb">
       <!-- ko ifnot: isRoot -->
       <!-- ko ifnot: isRoot -->
-      <a href="javascript: void(0);" data-bind="click: function () { parent.makeActive(); }">
+      <a href="javascript: void(0);" data-bind="click: function () { if (loaded()) { parent.makeActive(); } }">
         <i class="fa fa-fw fa-chevron-left"></i>
         <i class="fa fa-fw fa-chevron-left"></i>
         <i class="fa fa-fw fa-folder-o"></i>
         <i class="fa fa-fw fa-folder-o"></i>
         <span data-bind="text: definition().name, attr: {'title': definition().name }"></span>
         <span data-bind="text: definition().name, attr: {'title': definition().name }"></span>
@@ -1199,25 +1199,47 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, get_ord
        **/
        **/
       function AssistDocumentsPanel (options) {
       function AssistDocumentsPanel (options) {
         var self = this;
         var self = this;
+        self.apiHelper = options.apiHelper;
+        self.user = options.user;
 
 
         self.activeEntry = ko.observable();
         self.activeEntry = ko.observable();
-        var root = new HueFileEntry({
-          activeEntry: self.activeEntry,
-          trashEntry: ko.observable(),
-          apiHelper: options.apiHelper,
-          app: 'documents',
-          user: options.user,
-          activeSort: ko.observable('name'),
-          definition: {
-            name: '/',
-            type: 'directory'
+
+        var lastOpenedUuid = self.apiHelper.getFromTotalStorage('assist', 'last.opened.assist.doc.uuid');
+
+        if (lastOpenedUuid) {
+          self.activeEntry(new HueFileEntry({
+            activeEntry: self.activeEntry,
+            trashEntry: ko.observable(),
+            apiHelper: self.apiHelper,
+            app: 'documents',
+            user: self.user,
+            activeSort: ko.observable('name'),
+            definition: {
+              uuid: lastOpenedUuid,
+              type: 'directory'
+            }
+          }))
+        } else {
+          self.fallbackToRoot();
+        }
+
+        self.activeEntry.subscribe(function (newEntry) {
+          if (!newEntry.loaded()) {
+            var loadedSub = newEntry.loaded.subscribe(function (loaded) {
+              if (loaded && !newEntry.hasErrors() && newEntry.definition() && newEntry.definition().uuid) {
+                self.apiHelper.setInTotalStorage('assist', 'last.opened.assist.doc.uuid', newEntry.definition().uuid);
+              }
+              loadedSub.dispose();
+            })
+          } else if (!newEntry.hasErrors() && newEntry.definition() && newEntry.definition().uuid) {
+            self.apiHelper.setInTotalStorage('assist', 'last.opened.assist.doc.uuid', newEntry.definition().uuid);
           }
           }
         });
         });
-        self.activeEntry(root);
 
 
         self.reload = function () {
         self.reload = function () {
-          self.activeEntry(root);
-          self.activeEntry().load();
+          self.activeEntry().load(function () {}, function () {
+            self.fallbackToRoot();
+          });
         };
         };
 
 
         huePubSub.subscribe('assist.document.refresh', function () {
         huePubSub.subscribe('assist.document.refresh', function () {
@@ -1226,10 +1248,32 @@ from notebook.conf import ENABLE_QUERY_BUILDER, ENABLE_QUERY_SCHEDULING, get_ord
         });
         });
       }
       }
 
 
+      AssistDocumentsPanel.prototype.fallbackToRoot = function () {
+        var self = this;
+        if (!self.activeEntry() || self.activeEntry().definition() && (self.activeEntry().definition().path !== '/' || self.activeEntry().definition().uuid)) {
+          self.apiHelper.setInTotalStorage('assist', 'last.opened.assist.doc.uuid', null);
+          self.activeEntry(new HueFileEntry({
+            activeEntry: self.activeEntry,
+            trashEntry: ko.observable(),
+            apiHelper: self.apiHelper,
+            app: 'documents',
+            user: self.user,
+            activeSort: ko.observable('name'),
+            definition: {
+              name: '/',
+              type: 'directory'
+            }
+          }));
+          self.activeEntry().load();
+        }
+      };
+
       AssistDocumentsPanel.prototype.init = function () {
       AssistDocumentsPanel.prototype.init = function () {
         var self = this;
         var self = this;
         if (! self.activeEntry().loaded()) {
         if (! self.activeEntry().loaded()) {
-          self.activeEntry().load();
+          self.activeEntry().load(function () {}, function () {
+            self.fallbackToRoot();
+          }, true);
         }
         }
       };
       };