Browse Source

[home2] Add support for UUID and path url parameters

This changes the updating of the parameter to UUID when browsing instead of the path.
Johan Ahlen 10 years ago
parent
commit
b5d82f3

+ 20 - 13
desktop/core/src/desktop/static/desktop/js/fileBrowser/hueFileEntry.js

@@ -42,14 +42,18 @@
     self.parent = options.parent;
     self.definition = ko.observable(options.definition);
     self.assistHelper = options.assistHelper;
-    self.name = self.definition().name.substring(self.definition().name.lastIndexOf('/') + 1);
-    self.isRoot = self.name === '';
-    self.isDirectory = self.definition().type === 'directory';
-    self.path = self.definition().name;
     self.app = options.app;
 
     self.document = ko.observable();
 
+    self.isRoot = ko.pureComputed(function () {
+      return self.definition().name === '';
+    });
+
+    self.isDirectory = ko.pureComputed(function () {
+      return self.definition().type === 'directory';
+    });
+
     self.isShared = ko.pureComputed(function () {
       var perms = self.definition().perms;
       return perms && (perms.read.users.length || perms.read.groups.length || perms.write.users.length || perms.write.groups.length);
@@ -82,12 +86,15 @@
       return null;
     });
 
-    self.breadcrumbs = [];
-    var lastParent = self.parent;
-    while (lastParent) {
-      self.breadcrumbs.unshift(lastParent);
-      lastParent = lastParent.parent;
-    }
+    self.breadcrumbs = ko.pureComputed(function () {
+      var result = [];
+      var lastParent = self.parent;
+      while (lastParent) {
+        result.unshift(lastParent);
+        lastParent = lastParent.parent;
+      }
+      return result;
+    });
   }
 
   HueFileEntry.prototype.beforeContextOpen = function () {
@@ -259,13 +266,13 @@
           });
 
           newEntries.sort(function (a, b) {
-            if (a.isDirectory && ! b.isDirectory) {
+            if (a.isDirectory() && ! b.isDirectory()) {
               return -1;
             }
-            if (b.isDirectory && ! a.isDirectory) {
+            if (b.isDirectory() && ! a.isDirectory()) {
               return 1;
             }
-            return a.name.localeCompare(b.name);
+            return a.definition().name.localeCompare(b.definition().name);
           });
           self.entries(newEntries);
           if (! self.parent && data.parent) {

+ 48 - 30
desktop/core/src/desktop/static/desktop/js/home2.vm.js

@@ -55,49 +55,67 @@
     };
   }
 
+  HomeViewModel.prototype.openUuid = function (uuid) {
+    var self = this;
+    self.activeEntry(undefined);
+    var entry = new HueFileEntry({
+      activeEntry: self.activeEntry,
+      assistHelper: self.assistHelper,
+      app: 'documents',
+      definition: {
+        uuid: location.getParameter('uuid'),
+        name: 'unknown',
+        type: 'directory',
+        path: '/unknown'
+      }
+    });
+
+    var lastParent = entry;
+
+    var loadParents = function () {
+      if (lastParent.parent) {
+        lastParent = lastParent.parent;
+        lastParent.load(loadParents);
+      } else {
+        self.activeEntry(entry);
+      }
+    };
+
+    entry.load(loadParents);
+  };
+
   HomeViewModel.prototype.openPath = function (path) {
     var self = this;
     var parts = path.split('/');
     parts.shift(); // Remove root
-    self.activeEntry(null);
+    self.activeEntry(undefined);
     var lastChild = new HueFileEntry({
       activeEntry: self.activeEntry,
       assistHelper: self.assistHelper,
       app: 'documents',
       definition: {
-        name: '/',
-        type: 'directory'
-      }
-    });
-    $.each(parts, function (idx, part) {
-      if (part === '') {
-        return false;
+        name: '',
+        type: 'directory',
+        path: '/'
       }
-      lastChild = new HueFileEntry({
-        activeEntry: self.activeEntry,
-        assistHelper: self.assistHelper,
-        parent: lastChild,
-        app: 'documents',
-        definition: {
-          name: lastChild.isRoot ? '/' + part : lastChild.definition.name + '/' + part,
-          type: 'directory'
-        }
-      })
     });
-    self.activeEntry(lastChild);
 
-    self.activeEntry().load(function () {
-      var currentParent = lastChild.parent;
-      var loadParent = function () {
-        if (currentParent) {
-          currentParent.load(function () {
-            currentParent = currentParent.parent;
-            loadParent();
-          });
+    var loadDeep = function () {
+      if (parts.length > 0) {
+        var targetDir = parts.shift();
+        var foundDirs = $.grep(lastChild.entries(), function (entry) {
+          return entry.definition().name === targetDir;
+        });
+        if (foundDirs.length === 1) {
+          lastChild = foundDirs[0];
+          lastChild.load(loadDeep);
+          return;
         }
-      };
-      loadParent();
-    });
+      }
+      self.activeEntry(lastChild);
+    };
+
+    lastChild.load(loadDeep);
   };
 
   return HomeViewModel;

+ 11 - 9
desktop/core/src/desktop/templates/file_browser.mako

@@ -284,7 +284,8 @@ from desktop.views import _ko
     </div>
 
     <div id="shareDocumentModal" class="modal hide fade">
-      <!-- ko with: activeEntry().selectedEntry() -->
+      <!-- ko with: activeEntry -->
+      <!-- ko with: selectedEntry -->
       <!-- ko with: document -->
       <div class="modal-header">
         <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
@@ -353,6 +354,7 @@ from desktop.views import _ko
       </div>
       <!-- /ko -->
       <!-- /ko -->
+      <!-- /ko -->
     </div>
 
     <div id="importDocumentsModal" class="modal hide fade fileupload-modal">
@@ -373,7 +375,7 @@ from desktop.views import _ko
             <span data-bind="visible: uploadFailed">${ _('Import failed!') }</span>
             <progress data-bind="visible: uploading() || uploadComplete()" id="importDocumentsProgress" value="0" max="100" style="width: 560px;"></progress>
             ${ csrf_token(request) | n,unicode }
-            <input type="hidden" name="path" data-bind="value: path" />
+            <input type="hidden" name="path" data-bind="value: definition().path" />
           </form>
         </div>
         <div class="modal-footer">
@@ -406,7 +408,7 @@ from desktop.views import _ko
       <div class="modal-header">
         <a href="#" class="close" data-dismiss="modal">&times</a>
         <h3>${ _('Do you really want to delete') }
-          <!-- ko if: entriesToDelete().length == 1 --> <span data-bind="text: entriesToDelete()[0].name"></span><!-- /ko -->
+          <!-- ko if: entriesToDelete().length == 1 --> <span data-bind="text: entriesToDelete()[0].definition().name"></span><!-- /ko -->
           <!-- ko if: entriesToDelete().length > 1 --> <span data-bind="text: entriesToDelete().length"></span> ${ _('entries') }<!-- /ko -->
         ?</h3>
       </div>
@@ -427,11 +429,11 @@ from desktop.views import _ko
               <!-- /ko -->
 
               <!-- ko foreach: breadcrumbs -->
-              <li><div class="fb-drop-target" data-bind="folderDroppable: { entries: $parent.entries, disableSelect: true }"><a href="javascript:void(0);" data-bind="text: isRoot ? '${ _('My documents') }' : name, click: open"></a></div></li>
+              <li><div class="fb-drop-target" data-bind="folderDroppable: { entries: $parent.entries, disableSelect: true }"><a href="javascript:void(0);" data-bind="text: isRoot() ? '${ _('My documents') }' : definition().name, click: open"></a></div></li>
               <li class="divider">&gt;</li>
               <!-- /ko -->
               <!-- ko ifNot: isRoot -->
-              <li class="active"><div class="fb-drop-target" data-bind="text: name"></div></li>
+              <li class="active"><div class="fb-drop-target" data-bind="text: definition().name"></div></li>
               <!-- /ko -->
             </ul>
           </div>
@@ -516,8 +518,8 @@ from desktop.views import _ko
                 <li data-bind="css: { 'disabled': $parent.selectedEntries().length !== 1 }"><a href="javascript:void(0);" data-bind="click: function() { $parent.showSharingModal(); }, css: { 'disabled': $parent.selectedEntries().length !== 1 }"><i class="fa fa-fw fa-users"></i> ${ _('Share') }</a> </li>
               </ul>
               <div class="fb-primary-col">
-                <i class="fa fa-fw" data-bind="css: { 'fa-folder-o' : isDirectory, 'fa-file-o': ! isDirectory }"></i>
-                <a href="javascript: void(0);" data-bind="text: name, click: open"></a>
+                <i class="fa fa-fw" data-bind="css: { 'fa-folder-o' : isDirectory, 'fa-file-o': ! isDirectory() }"></i>
+                <a href="javascript: void(0);" data-bind="text: definition().name, click: open"></a>
               </div>
               <div class="fb-attr-group">
                 <div class="fb-attr-col fb-share"><i class="fa fa-fw fa-users fb-shared-icon" data-bind="click: function (entry, event) { $parent.showSharingModal($data); event.stopPropagation(); }, css: { 'fb-shared-icon-active': isShared }"></i></div>
@@ -557,7 +559,7 @@ from desktop.views import _ko
             alreadySelected = boundEntry.selected();
             dragToSelect = value;
           });
-          if (boundEntry.isDirectory) {
+          if (boundEntry.isDirectory()) {
             $element.droppable({
               drop: function (ev, ui) {
                 if (! dragToSelect) {
@@ -637,7 +639,7 @@ from desktop.views import _ko
                   $helper.find('.drag-text').text(selectedEntries.length + ' ${ _('selected') }');
                   $helper.find('i').removeClass().addClass('fa fa-fw fa-clone');
                 } else {
-                  $helper.find('.drag-text').text(boundEntry.name);
+                  $helper.find('.drag-text').text(boundEntry.definition().name);
                   $helper.find('i').removeClass().addClass($element.find('.fb-primary-col i').attr('class'));
                 }
 

+ 10 - 29
desktop/core/src/desktop/templates/home2.mako

@@ -14,7 +14,7 @@
 ## See the License for the specific language governing permissions and
 ## limitations under the License.
 <%!
-  from desktop.views import commonheader, commonfooter, commonshare2, commonimportexport, _ko
+  from desktop.views import commonheader, commonfooter, _ko
   from django.utils.translation import ugettext as _
 %>
 
@@ -194,19 +194,6 @@ ${ fileBrowser.fileBrowser() }
       </div>
       <div class="resizer" data-bind="visible: $root.isLeftPanelVisible, splitDraggable : { appName: 'notebook', leftPanelVisible: $root.isLeftPanelVisible }" style="display:none;"><div class="resize-bar">&nbsp;</div></div>
       <div class="right-panel home-container" data-bind="style: { 'padding-left' : $root.isLeftPanelVisible() ? '8px' : '0' }">
-##         <div class="home-header">
-##           <input id="searchInput" type="text" placeholder="${ _('Search for name, description, etc...') }" class="input-xlarge search-query" style="margin-left: 20px;margin-top: 5px">
-##           <input data-bind="value: shareFormDocId" placeholder="doc id, e.g. 50491" />
-##           <a class="share-link btn" rel="tooltip" data-placement="bottom" style="margin-left:20px" data-bind="click: function(e){ prepareShareModal(e) },
-##             attr: {'data-original-title': '${ _ko("Share") } ' + name}">
-##             <i class="fa fa-users"></i> ${ _('Share') }
-##           </a>
-##
-##           <input data-bind="value: exportFormDocIds" placeholder="doc id, e.g. 50491,50492" />
-##           <a class="share-link btn" data-bind="click: exportDocuments">
-##             <i class="fa fa-download"></i> ${ _('Export') }
-##           </a>
-##         </div>
         <div class="file-browser" data-bind="component: {
           name: 'file-browser',
           params: {
@@ -226,9 +213,6 @@ ${ fileBrowser.fileBrowser() }
   </tr>
 </script>
 
-## ${ commonshare2() | n,unicode }
-## ${ commonimportexport(request) | n,unicode }
-
 <script type="text/javascript" charset="utf-8">
   require([
     'knockout',
@@ -258,27 +242,24 @@ ${ fileBrowser.fileBrowser() }
 
       var viewModel = new HomeViewModel(options);
 
-      viewModel.activeEntry.subscribe(function (newEntry) {
-        hueUtils.changeURL('/home?path=' + newEntry.path);
-      });
       var loadUrlParam = function () {
-        if (location.getParameter('path')) {
+        if (location.getParameter('uuid')) {
+          viewModel.openUuid(location.getParameter('uuid'));
+        } else if (location.getParameter('path')) {
           viewModel.openPath(location.getParameter('path'));
         }
       };
       window.onpopstate = loadUrlParam;
       loadUrlParam();
 
+      viewModel.activeEntry.subscribe(function (newEntry) {
+        if (newEntry.definition().uuid) {
+          hueUtils.changeURL('/home?uuid=' + newEntry.definition().uuid);
+        }
+      });
+
       ko.applyBindings(viewModel, $('#documentList')[0]);
 
-##       ShareViewModel.initSharing("#documentShareModal");
-##       shareViewModel.setDocId(-1);
-##
-##
-##       prepareShareModal = function(job) {
-##         shareViewModel.setDocId(viewModel.shareFormDocId());
-##         openShareModal();
-##       };
     });
   });
 </script>