浏览代码

[home2] Add create directory functionality to the the file browser

Johan Ahlen 10 年之前
父节点
当前提交
fbe5ab20f1

+ 24 - 0
desktop/core/src/desktop/static/desktop/js/assist/assistHelper.js

@@ -213,6 +213,30 @@
       .fail(self.assistErrorCallback(options));
   };
 
+  /**
+   * @param {Object} options
+   * @param {Function} options.successCallback
+   * @param {Function} [options.errorCallback]
+   * @param {boolean} [options.silenceErrors]
+   *
+   * @param {string} options.path
+   * @param {string} options.name
+   */
+  AssistHelper.prototype.createDocumentsFolder = function (options) {
+    var self = this;
+    $.post("/desktop/api2/doc/mkdir", {
+      parent_path: ko.mapping.toJSON(options.path),
+      name: ko.mapping.toJSON(options.name)
+    }, function (data) {
+      if (! self.successResponseIsError(data)) {
+        options.successCallback(data);
+      } else {
+        self.assistErrorCallback(options)(data);
+      }
+    })
+      .fail(self.assistErrorCallback(options));
+  };
+
   /**
    *
    * @param {Object} options

+ 43 - 28
desktop/core/src/desktop/static/desktop/js/documents/hueDirectory.js

@@ -30,6 +30,7 @@
    * @param {AssistHelper} options.assistHelper
    * @param {Object} options.definition
    * @param {HueFolder} options.parent
+   * @param {string} options.app - Currently only 'documents' is supported
    *
    * @constructor
    */
@@ -39,6 +40,7 @@
     self.definition = options.definition;
     self.assistHelper = options.assistHelper;
     self.path = self.parent ? self.parent.path + self.definition.name : self.definition.name;
+    self.app = options.app;
 
     self.loaded = ko.observable(false);
     self.loading = ko.observable(false);
@@ -60,35 +62,48 @@
     }
     self.loading(true);
 
-    self.assistHelper.fetchDocuments({
-      successCallback: function(data) {
-        self.hasErrors(false);
-        self.entries($.map(data.documents, function (definition) {
-          if (definition.type === "directory") {
-            return new HueDirectory({
-              assistHelper: self.assistHelper,
-              definition: definition,
-              parent: self
-            })
-          } else {
-            return {
-              definition: definition,
-              path: self.path + definition.name
+    if (self.app === 'documents') {
+      self.assistHelper.fetchDocuments({
+        successCallback: function(data) {
+          self.hasErrors(false);
+          self.entries($.map(data.documents, function (definition) {
+            if (definition.type === "directory") {
+              return new HueDirectory({
+                assistHelper: self.assistHelper,
+                definition: definition,
+                parent: self
+              })
+            } else {
+              return {
+                definition: definition,
+                path: self.path + definition.name
+              }
             }
-          }
-        }));
-        $.each(data.documents, function (idx, document) {
-          console.log(document);
-        });
-        self.loading(false);
-        self.loaded(true);
-      },
-      errorCallback: function () {
-        self.hasErrors(true);
-        self.loading(false);
-        self.loaded(true);
-      }
-    });
+          }));
+          $.each(data.documents, function (idx, document) {
+            console.log(document);
+          });
+          self.loading(false);
+          self.loaded(true);
+        },
+        errorCallback: function () {
+          self.hasErrors(true);
+          self.loading(false);
+          self.loaded(true);
+        }
+      });
+    }
+  };
+
+  HueDirectory.prototype.createDirectory = function (name) {
+    var self = this;
+    if (self.app === 'documents') {
+      self.assistHelper.createDocumentsFolder({
+        successCallback: self.load.bind(self),
+        path: self.path,
+        name: name
+      });
+    }
   };
 
   return HueDirectory;

+ 1 - 16
desktop/core/src/desktop/static/desktop/js/home2.vm.js

@@ -38,6 +38,7 @@
 
     self.currentDirectory = ko.observable(new HueDirectory({
       assistHelper: self.assistHelper,
+      app: 'documents',
       definition: {
         name: '/'
       }
@@ -45,26 +46,10 @@
 
     self.currentDirectory().open();
 
-    self.mkdirFormPath = ko.observable('');
     self.deleteFormPath = ko.observable('');
     self.shareFormDocId = ko.observable('');
     self.exportFormDocIds = ko.observable('');
 
-    self.mkdir = function() {
-      $.post("/desktop/api2/doc/mkdir", {
-        parent_path: ko.mapping.toJSON(self.currentDirectory().path),
-        name: ko.mapping.toJSON(self.mkdirFormPath)
-      }, function (data) {
-        if (data.status == 0) {
-          self.currentFolder.load();
-        } else {
-          $(document).trigger("error", data.message);
-        }
-      }).fail(function (xhr) {
-        $(document).trigger("error", xhr.responseText);
-      });
-    };
-
     self.deleteDocument = function() {
       $.post("/desktop/api2/doc/delete", {
         doc_id: ko.mapping.toJSON(self.deleteFormPath),

+ 18 - 1
desktop/core/src/desktop/templates/file_browser.mako

@@ -139,6 +139,23 @@ from desktop.views import _ko
   </style>
 
   <script type="text/html" id="fb-template">
+    <div id="createDirectoryModal" class="modal hide fade">
+      <!-- ko with: currentDirectory -->
+      <div class="modal-body form-horizontal">
+        <div class="control-group">
+          <label class="control-label" for="newDirectoryName">Name</label>
+          <div class="controls">
+            <input id="newDirectoryName" type="text" /></label>
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <input type="button" class="btn" data-dismiss="modal" value="Cancel">
+        <input type="button" class="btn" value="Create" data-bind="click: function () { $data.createDirectory($('#newDirectoryName').val()); $('#createDirectoryModal').modal('hide'); }"/>
+      </div>
+      <!-- /ko -->
+    </div>
+
     <div class="fb-container">
       <div class="fb-action-bar">
         <h4>
@@ -150,7 +167,7 @@ from desktop.views import _ko
           </div>
           <div class="fb-folder-actions">
             <a class="inactive-action" href="javascript:void(0);"><span class="fa-stack fa-fw fb-action"><i class="fa fa-file-o fa-stack-1x"></i><i class="fa fa-plus-circle fa-stack-1x" style="font-size: 14px; margin-left: 6px; margin-top: 6px;"></i></span></a>
-            <a class="inactive-action" href="javascript:void(0);"><span class="fa-stack fa-fw fb-action"><i class="fa fa-folder-o fa-stack-1x" ></i><i class="fa fa-plus-circle fa-stack-1x" style="font-size: 14px; margin-left: 7px; margin-top: 3px;"></i></span></a>
+            <a class="inactive-action" href="javascript:void(0);" data-bind="click: function () { $('#createDirectoryModal').modal('show'); }"><span class="fa-stack fa-fw fb-action"><i class="fa fa-folder-o fa-stack-1x" ></i><i class="fa fa-plus-circle fa-stack-1x" style="font-size: 14px; margin-left: 7px; margin-top: 3px;"></i></span></a>
             <a class="inactive-action" href="javascript:void(0);"><i class="fa fa-fw fa-times fb-action"></i></a>
             <a class="inactive-action" href="javascript:void(0);"><i class="fa fa-fw fa-users fb-action"></i></a>
             <a class="inactive-action" href="javascript:void(0);"><i class="fa fa-fw fa-download fb-action"></i></a>