Pārlūkot izejas kodu

[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 9 gadi atpakaļ
vecāks
revīzija
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>