diff --git a/www/common/drive-ui.js b/www/common/drive-ui.js index 240e2f5b0..9643a4b1b 100644 --- a/www/common/drive-ui.js +++ b/www/common/drive-ui.js @@ -1334,7 +1334,7 @@ define([ break; } case 'trash': { - show = ['remove', 'restore', 'properties']; + show = ['remove', 'deleteowned', 'restore', 'properties']; } } diff --git a/www/common/inner/access.js b/www/common/inner/access.js index 6568ff83b..c804ee0b8 100644 --- a/www/common/inner/access.js +++ b/www/common/inner/access.js @@ -898,6 +898,28 @@ define([ $d.append(changePass); } } + if (owned) { + var deleteOwned = h('button.btn.btn-danger-alt', Messages.fc_delete_owned); + var $deleteOwned; + var spinner = UI.makeSpinner(); + UI.confirmButton(deleteOwned, { + classes: 'btn-danger' + }, function () { + spinner.spin(); + sframeChan.query('Q_DELETE_OWNED', { + teamId: typeof(owned) !== "boolean" ? owned : undefined, + channel: data.channel + }, function (err, obj) { + spinner.done(); + if (err || (obj && obj.error)) { UI.warn(Messages.error); } + }); + }); + $d.append(h('br')); + $d.append(h('div', [ + deleteOwned, + spinner.spinner + ])); + } return $d; }; var drawRight = function () { diff --git a/www/common/proxy-manager.js b/www/common/proxy-manager.js index b57a8a24f..8054e83f7 100644 --- a/www/common/proxy-manager.js +++ b/www/common/proxy-manager.js @@ -795,20 +795,23 @@ define([ // Delete permanently some pads or folders var _deleteOwned = function (Env, data, cb) { data = data || {}; - var resolved = _resolvePaths(Env, data.paths); - if (!resolved.main.length && !Object.keys(resolved.folders).length) { + var resolved = _resolvePaths(Env, data.paths || []); + if (!data.channel && !resolved.main.length && !Object.keys(resolved.folders).length) { return void cb({error: 'E_NOTFOUND'}); } var toDelete = { main: [], folders: {} }; - var todo = function (id, uo, p, _cb) { + var todo = function (channel, uo, p, _cb) { var cb = Util.once(Util.mkAsync(_cb)); - var el = uo.find(p); - if (!uo.isFile(el) && !uo.isSharedFolder(el)) { return; } - var data = uo.isFile(el) ? uo.getFileData(el) : getSharedFolderData(Env, el); - var chan = data.channel; + var chan = channel; + if (!chan && uo) { + var el = uo.find(p); + if (!uo.isFile(el) && !uo.isSharedFolder(el)) { return; } + var data = uo.isFile(el) ? uo.getFileData(el) : getSharedFolderData(Env, el); + chan = data.channel; + } Env.removeOwnedChannel(chan, function (obj) { // If the error is that the file is already removed, nothing to // report, it's a normal behavior (pad expired probably) @@ -840,13 +843,16 @@ define([ }; nThen(function (w) { // Delete owned pads from the server + if (data.channel) { + todo(data.channel, null, null, w()); + } resolved.main.forEach(function (p) { todo(null, Env.user.userObject, p, w()); }); Object.keys(resolved.folders).forEach(function (id) { var uo = Env.folders[id].userObject; resolved.folders[id].forEach(function (p) { - todo(id, uo, p, w()); + todo(null, uo, p, w()); }); }); }).nThen(function () { diff --git a/www/common/sframe-common-outer.js b/www/common/sframe-common-outer.js index 26ffa07a2..5689f6284 100644 --- a/www/common/sframe-common-outer.js +++ b/www/common/sframe-common-outer.js @@ -808,6 +808,15 @@ define([ Cryptpad.changePadPassword(Cryptget, Crypto, data, cb); }); + sframeChan.on('Q_DELETE_OWNED', function (data, cb) { + Cryptpad.userObjectCommand({ + cmd: 'deleteOwned', + teamId: data.teamId, + data: { + channel: data.channel + } + }, cb); + }); }; addCommonRpc(sframeChan, isSafe);