Эх сурвалжийг харах

HUE-4058 [home] Rename a directory

Enrico Berti 9 жил өмнө
parent
commit
868d0da

+ 17 - 0
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -453,6 +453,23 @@
     }, options);
   };
 
+  /**
+   * @param {Object} options
+   * @param {Function} options.successCallback
+   * @param {Function} [options.errorCallback]
+   * @param {boolean} [options.silenceErrors]
+   *
+   * @param {string} options.uuid
+   * @param {string} options.name
+   */
+  ApiHelper.prototype.updateDocument = function (options) {
+    var self = this;
+    self.simplePost("/desktop/api2/doc/update", {
+      uuid: ko.mapping.toJSON(options.uuid),
+      name: options.name
+    }, options);
+  };
+
   /**
    * @param {Object} options
    * @param {Function} options.successCallback

+ 23 - 0
desktop/core/src/desktop/static/desktop/js/fileBrowser/hueFileEntry.js

@@ -212,6 +212,17 @@
     }
   };
 
+  HueFileEntry.prototype.showRenameDirectoryModal = function () {
+    var self = this;
+    if (!self.selected()) {
+      self = self.selectedEntry();
+    }
+    if (! self.isTrash() && ! self.isTrashed()) {
+      $('#renameDirectoryName').val(self.definition().name);
+      $('#renameDirectoryModal').modal('show');
+    }
+  };
+
   HueFileEntry.prototype.setSort = function (name) {
     var self = this;
     if (self.activeSort().indexOf(name) === -1) {
@@ -597,5 +608,17 @@
     }
   };
 
+  HueFileEntry.prototype.renameDirectory = function (name) {
+    var self = this;
+    if (name && self.app === 'documents') {
+      self.apiHelper.updateDocument({
+        successCallback: self.load.bind(self),
+        uuid: self.definition().uuid,
+        name: name
+      });
+      $('#renameDirectoryName').val(null)
+    }
+  };
+
   return HueFileEntry;
 }));

+ 22 - 0
desktop/core/src/desktop/templates/file_browser.mako

@@ -469,6 +469,24 @@ from desktop.views import _ko
       <!-- /ko -->
     </div>
 
+    <div id="renameDirectoryModal" data-keyboard="true" class="modal hide fade" tabindex="-1">
+      <!-- ko with: activeEntry -->
+      <form class="form-horizontal">
+        <div class="modal-header">
+          <button type="button" class="close" data-dismiss="modal" data-bind="click: function () { $('#renameDirectoryName').val(null) }" aria-hidden="true">&times;</button>
+          <h3>${_('Rename Directory')}</h3>
+        </div>
+        <div class="modal-body ">
+          <input id="renameDirectoryName" class="input large-as-modal" type="text" placeholder="${ _('Directory name') }" />
+        </div>
+        <div class="modal-footer">
+          <input type="button" class="btn" data-dismiss="modal" data-bind="click: function () { $('#renameDirectoryName').val(null) }" value="${ _('Cancel') }">
+          <input type="submit" class="btn btn-primary disable-feedback" value="${ _('Rename') }" data-bind="click: function () { if ($('#renameDirectoryName').val()) { $data.selectedEntry().renameDirectory($('#renameDirectoryName').val()); $('#renameDirectoryModal').modal('hide'); } }"/>
+        </div>
+      </form>
+      <!-- /ko -->
+    </div>
+
     <div id="deleteEntriesModal" data-keyboard="true" class="modal hide fade" tabindex="-1">
       <!-- ko with: activeEntry -->
       <div class="modal-header">
@@ -560,6 +578,7 @@ from desktop.views import _ko
           </div>
           <!-- /ko -->
           <div><a class="inactive-action fb-action" title="${_('New folder')}" href="javascript:void(0);" data-bind="click: function () { showNewDirectoryModal() }, css: { 'disabled': isTrash() || isTrashed() }"><span class="fa-stack fa-fw" style="width: 1.28571429em;"><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></div>
+          <div><a class="inactive-action fb-action" title="${_('Rename folder')}" href="javascript:void(0);" data-bind="click: function () { showRenameDirectoryModal() }, css: { 'disabled': isTrash() || isTrashed() || selectedEntry() === null || (selectedEntry() != null && !selectedEntry().isDirectory()) }"><i class="fa fa-fw fa-edit"></i></a></div>
           <div><a class="inactive-action fb-action" href="javascript:void(0);" data-bind="click: function () { if (isTrash() || isTrashed() || (sharedWithMeSelected() && superuser)) { showDeleteConfirmation() } else { moveToTrash() } }, css: { 'disabled': selectedEntries().length === 0 || (sharedWithMeSelected() && ! superuser) }, attr: { 'title' : isTrash() || isTrashed() || (sharedWithMeSelected() && superuser) ? '${ _('Delete forever') }' : '${ _('Move to trash') }' }"><i class="fa fa-fw fa-times"></i></a></div>
           <!-- ko if: app === 'documents' -->
           <div><a class="inactive-action fb-action" title="${_('Share')}" href="javascript:void(0);" data-bind="click: function() { showSharingModal(null) }, css: { 'disabled': selectedEntries().length !== 1 || (selectedEntries().length === 1 && selectedEntries()[0].isTrashed) }"><i class="fa fa-fw fa-users"></i></a></div>
@@ -618,6 +637,9 @@ from desktop.views import _ko
                 <li><a href="javascript:void(0);" data-bind="click: function() { $parent.showDeleteConfirmation(); }"><i class="fa fa-fw fa-times"></i> ${ _('Delete') } <span data-bind="visible: $parent.selectedEntries().length > 1, text: '(' + $parent.selectedEntries().length + ')'"></span></a></li>
                 <!-- /ko -->
                 <!-- ko ifnot: isTrashed -->
+                <!-- ko if: isDirectory -->
+                <li data-bind="css: { 'disabled': $parent.selectedEntries().length !== 1 }"><a href="javascript:void(0);" data-bind="click: showRenameDirectoryModal, css: { 'disabled': $parent.selectedEntries().length !== 1 }"><i class="fa fa-fw fa-edit"></i> ${ _('Rename') }</a></li>
+                <!-- /ko -->
                 <li data-bind="css: { 'disabled': $parent.selectedEntries().length !== 1 }"><a href="javascript:void(0);" data-bind="click: open, css: { 'disabled': $parent.selectedEntries().length !== 1 }"><i class="fa fa-fw fa-file-o"></i> ${ _('Open') }</a></li>
                 <li><a href="javascript:void(0);" data-bind="click: contextMenuDownload"><i class="fa fa-fw fa-download"></i> ${ _('Download') } <span data-bind="visible: $parent.selectedEntries().length > 1, text: '(' + $parent.selectedEntries().length + ')'"></span></a></li>
                 <li data-bind="visible: ! $altDown() && !($parent.sharedWithMeSelected() && $parent.superuser), css: { 'disabled' : $parent.sharedWithMeSelected()  && ! $parent.superuser }"><a href="javascript:void(0);" data-bind="click: function () { $parent.moveToTrash(); }, css: { 'disabled' : $parent.sharedWithMeSelected() && ! $parent.superuser }"><i class="fa fa-fw fa-trash-o"></i> ${ _('Move to trash') } <span data-bind="visible: $parent.selectedEntries().length > 1, text: '(' + $parent.selectedEntries().length + ')'"></span></a></li>

+ 8 - 1
desktop/core/src/desktop/tests_doc2.py

@@ -100,7 +100,7 @@ class TestDocument2(object):
     assert_true('not found' in data['message'])
 
 
-  def test_directory_create(self):
+  def test_directory_create_and_rename(self):
     response = self.client.post('/desktop/api2/doc/mkdir', {'parent_uuid': json.dumps(self.home_dir.uuid), 'name': json.dumps('test_mkdir')})
     data = json.loads(response.content)
 
@@ -109,6 +109,13 @@ class TestDocument2(object):
     assert_equal(data['directory']['name'], 'test_mkdir', data)
     assert_equal(data['directory']['type'], 'directory', data)
 
+    response = self.client.post('/desktop/api2/doc/update', {'uuid': json.dumps(data['directory']['uuid']),
+                                                             'name': 'updated'})
+
+    data = json.loads(response.content)
+    assert_equal(0, data['status'])
+    assert_equal('updated', data['document']['name'], data)
+
 
   def test_file_move(self):
     source_dir = Directory.objects.create(name='test_mv_file_src', owner=self.user, parent_directory=self.home_dir)