diff --git a/static/scripts/app/models/dirent.js b/static/scripts/app/models/dirent.js index 44d69cbce1..5563a75b37 100644 --- a/static/scripts/app/models/dirent.js +++ b/static/scripts/app/models/dirent.js @@ -1,8 +1,9 @@ define([ + 'jquery', 'underscore', 'backbone', 'common' -], function(_, Backbone, Common) { +], function($, _, Backbone, Common) { 'use strict'; var Dirent = Backbone.Model.extend({ @@ -41,6 +42,37 @@ define([ return app.config.siteRoot + "lib/" + dir.repo_id + "/file" + Common.encodePath(dirent_path) + "?dl=1"; } + }, + + // We can't use Backbone.sync() here because the URL for a dirent + // is not a standard RESTful one + deleteFromServer: function(options) { + var dir = this.collection; + var path = this.getPath(); + var model = this; + + var opts = { + repo_id: dir.repo_id, + name: this.get('is_dir') ? 'del_dir' : 'del_file' + }; + $.ajax({ + url: Common.getUrl(opts) + '?p=' + encodeURIComponent(path), + type: 'DELETE', + dataType: 'json', + beforeSend: Common.prepareCSRFToken, + success: function(data) { + // We don't understand how the event actually work in Backbone + // It is safer to call dir.remove() directly. + dir.remove(model); + // this.trigger('destroy'); + if (options.success) + options.success(data); + }, + error: function(xhr) { + if (options.error) + options.error(xhr); + } + }); } }); diff --git a/static/scripts/app/views/dirent-grid.js b/static/scripts/app/views/dirent-grid.js index a0c8bfefcd..dde1756279 100644 --- a/static/scripts/app/views/dirent-grid.js +++ b/static/scripts/app/views/dirent-grid.js @@ -133,8 +133,27 @@ define([ }); // TODO: bind operations here + + this.$('.grid-item-op .delete').on('click', { view: this }, this.del); + return false; - } + }, + + del: function(event) { + var _this = event.data.view; + var dirent_name = _this.model.get('obj_name'); + _this.model.deleteFromServer({ + success: function(data) { + var msg = gettext("Successfully deleted %(name)s") + .replace('%(name)s', Common.HTMLescape(dirent_name)); + Common.feedback(msg, 'success'); + }, + error: function(xhr) { + Common.ajaxErrorHandler(xhr); + } + }); + return false; + }, }); diff --git a/static/scripts/app/views/dirent.js b/static/scripts/app/views/dirent.js index 3add62a80c..ef49ca4aef 100644 --- a/static/scripts/app/views/dirent.js +++ b/static/scripts/app/views/dirent.js @@ -183,20 +183,8 @@ define([ del: function() { var dirent_name = this.model.get('obj_name'); - var dir = this.dir; - var options = { - repo_id: dir.repo_id, - name: this.model.get('is_dir') ? 'del_dir' : 'del_file' - }; - var model = this.model; - $.ajax({ - url: Common.getUrl(options) + '?parent_dir=' + encodeURIComponent(dir.path) - + '&name=' + encodeURIComponent(dirent_name), - type: 'POST', - dataType: 'json', - beforeSend: Common.prepareCSRFToken, + this.model.deleteFromServer({ success: function(data) { - dir.remove(model); var msg = gettext("Successfully deleted %(name)s") .replace('%(name)s', Common.HTMLescape(dirent_name)); Common.feedback(msg, 'success'); diff --git a/static/scripts/common.js b/static/scripts/common.js index 68a314db9e..ea24b7a349 100644 --- a/static/scripts/common.js +++ b/static/scripts/common.js @@ -68,8 +68,8 @@ define([ case 'list_lib_dir': return siteRoot + 'ajax/lib/' + options.repo_id + '/dir/'; case 'star_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/star/'; case 'unstar_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/unstar/'; - case 'del_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/delete/'; - case 'del_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/delete/'; + case 'del_dir': return siteRoot + 'api2/repos/' + options.repo_id + '/dir/'; + case 'del_file': return siteRoot + 'api2/repos/' + options.repo_id + '/file/'; case 'rename_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/rename/'; case 'rename_file': return siteRoot + 'ajax/repo/' + options.repo_id + '/file/rename/'; case 'mv_dir': return siteRoot + 'ajax/repo/' + options.repo_id + '/dir/mv/';