in public/explorer.js [1257:1420]
function TrashController($scope, SharedService) {
DEBUG.log('TrashController init');
window.trashScope = $scope; // for debugging
$scope.trash = { title: null, button: null, objects: [] };
// Cache jquery selectors
const $btnDelete = $('#trash-btn-delete');
const $btnCancel = $('#trash-btn-cancel');
//
// Delete a list of objects from the provided S3 bucket
//
$scope.deleteFiles = (Bucket, objects, recursion) => {
DEBUG.log('Delete files:', objects);
$scope.$apply(() => {
$scope.trash.trashing = true;
});
for (let ii = 0; ii < objects.length; ii++) {
DEBUG.log('Delete key:', objects[ii].Key);
DEBUG.log('Object:', objects[ii]);
DEBUG.log('Index:', ii);
const s3 = new AWS.S3(AWS.config);
// If the user is deleting a folder then recursively list
// objects and delete them
if (isfolder(objects[ii].Key) && SharedService.getSettings().delimiter) {
const params = { Bucket, Prefix: objects[ii].Key };
s3.listObjects(params, (err, data) => {
if (err) {
if (!recursion) {
// AccessDenied is a normal consequence of lack of permission
// and we do not treat this as completely unexpected
if (err.code === 'AccessDenied') {
$(`#trash-td-${ii}`).html('<span class="trasherror">Access Denied</span>');
} else {
DEBUG.log(JSON.stringify(err));
$(`#trash-td-${ii}`).html(`<span class="trasherror">Failed: ${err.code}</span>`);
SharedService.showError(params, err);
}
} else {
DEBUG.log(JSON.stringify(err));
SharedService.showError(params, err);
}
} else if (data.Contents.length > 0) {
$scope.deleteFiles(Bucket, data.Contents, true);
}
});
}
const params = { Bucket, Key: objects[ii].Key };
DEBUG.log('Delete params:', params);
s3.deleteObject(params, (err, _data) => {
if (err) {
if (!recursion) {
// AccessDenied is a normal consequence of lack of permission
// and we do not treat this as completely unexpected
if (err.code === 'AccessDenied') {
$(`#trash-td-${ii}`).html('<span class="trasherror">Access Denied</span>');
} else {
DEBUG.log(JSON.stringify(err));
$(`#trash-td-${ii}`).html(`<span class="trasherror">Failed: ${err.code}</span>`);
SharedService.showError(params, err);
}
} else {
DEBUG.log(JSON.stringify(err));
SharedService.showError(params, err);
}
} else {
DEBUG.log('Deleted', objects[ii].Key, 'from', Bucket);
let count = $btnDelete.attr('data-filecount');
if (!recursion) {
$(`#trash-td-${ii}`).html('<span class="trashdeleted">Deleted</span>');
$btnDelete.attr('data-filecount', --count);
}
// Update count in Delete button
$scope.$apply(() => {
$scope.trash.button = `Delete (${count})`;
});
// If all files deleted then update buttons
if (count === 0) {
$btnDelete.hide();
$btnCancel.text('Close');
}
// Refresh underlying folder view
SharedService.viewRefresh();
}
});
}
};
$scope.$on('broadcastTrashObjects', (e, args) => {
DEBUG.log('TrashController', 'broadcast trash objects', args);
$scope.trash.objects = [];
// Populate scope trash object array with objects to be deleted
for (let ii = 0; ii < args.keys.length; ii++) {
const obj = args.keys[ii];
DEBUG.log('Object to be deleted:', obj);
const object = path2short(isfolder(obj.Key)
? prefix2folder(obj.Key)
: fullpath2filename(obj.Key));
const folder = path2short(isfolder(obj.Key)
? prefix2parentfolder(obj.Key)
: fullpath2pathname(obj.Key));
const lastmodified = isfolder(obj.Key)
? ''
: moment(obj.LastModified).fromNow();
const timestamp = obj.LastModified
? moment(obj.LastModified).local().format('YYYY-MM-DD HH:mm:ss')
: '';
const objectclass = isfolder(obj.Key)
? ''
: mapStorage[obj.StorageClass];
const size = isfolder(obj.Key)
? ''
: bytesToSize(obj.Size);
$scope.trash.objects.push({
object,
folder,
lastmodified,
timestamp,
objectclass,
size,
});
}
// Remove any prior click handler from Delete button
$btnDelete.unbind('click');
// Add new click handler for Delete button
$btnDelete.click((e2) => {
e2.preventDefault();
$scope.deleteFiles(args.bucket, args.keys);
});
// Reset buttons for initial use
$btnDelete.show();
$btnCancel.text('Cancel');
// Bind file count into button
$btnDelete.attr('data-filecount', args.keys.length);
$scope.trash.count = args.keys.length;
$scope.trash.button = `Delete (${args.keys.length})`;
$scope.trash.trashing = false;
$('#TrashModal').modal({ keyboard: true, backdrop: 'static' });
});
}