Changes context-menu to pure delete function.

This commit is contained in:
Lars Jung 2012-08-11 13:25:27 +02:00
parent 91a9621648
commit 0b6b2b0f33
7 changed files with 158 additions and 94 deletions

View File

@ -61,11 +61,10 @@ var H5AI_CONFIG = {
},
/*
Show a context menu when hovering a file entry.
Allow entry deletion.
*/
"context-menu": {
"enabled": true,
"deleteBtn": true
"delete": {
"enabled": true
},
/*

View File

@ -0,0 +1,30 @@
#delete {
display: none;
.topbar-right;
.transition(all 0.2s ease-in-out);
&.failed {
background-color: rgba(255,0,0,0.5);
}
}
#delete-auth {
display: none;
position: fixed;
z-index: 5;
left: 0;
top: 0;
.vert-gradient(rgb(241,241,241), rgb(228,228,228));
border: 1px solid rgb(210,210,210);
input {
display: block;
margin: 4px 6px;
border: 1px solid rgb(210,210,210);
font-family: Ubuntu, sans-serif;
color: #555;
background-color: rgba(255,255,255,1);
width: 100px;
}
}

View File

@ -19,6 +19,7 @@ body {
@import "inc/topbar";
@import "inc/download";
@import "inc/delete";
@import "inc/filter";
@import "inc/content";

View File

@ -1,84 +0,0 @@
modulejs.define('ext/context-menu', ['_', '$', 'core/settings', 'core/entry', 'core/event', 'core/resource'], function (_, $, allsettings, entry, event, resource) {
var defaults = {
enabled: false,
deleteBtn: false
},
settings = _.extend({}, defaults, allsettings['context-menu']),
template = '<div class="context-menu">' +
'<ul></ul>' +
'</div>',
// deleteTmp = '<li class="delete">delete</li>',
deleteTmp = '<li class="delete"><img src="' + resource.image('delete') + '" /> <span>delete</span></li>',
// deleteTmp = '<li class="delete"><img src="' + resource.image('delete') + '" /></li>',
createDeleteBtn = function (entry, $ul) {
var $del = $(deleteTmp).appendTo($ul);
$del.on('click', function (event) {
console.log('delete', entry.label);
$.ajax({
url: resource.api(),
data: {
action: 'delete',
href: entry.absHref
},
dataType: 'json',
success: function (json) {
}
});
});
},
createMenu = function (entry) {
var $html = $(template),
$ul = $html.find('ul');
$html.on('click', function (event) {
event.stopPropagation();
event.preventDefault();
});
createDeleteBtn(entry, $ul);
entry.$extended.find('a').append($html);
},
init = function () {
if (!settings.enabled) {
return;
}
event.sub('entry.mouseenter', function (entry) {
if (!entry.isFolder()) {
var ctx = entry.$extended.find('.context-menu');
if (ctx.length) {
ctx.show();
} else {
createMenu(entry);
}
}
});
event.sub('entry.mouseleave', function (entry) {
// entry.$extended.find('.context-menu').remove();
entry.$extended.find('.context-menu').hide();
});
};
init();
});

View File

@ -0,0 +1,107 @@
modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/entry', 'core/event', 'core/resource'], function (_, $, allsettings, entry, event, resource) {
var defaults = {
enabled: false
},
settings = _.extend({}, defaults, allsettings['delete']),
deleteBtnTemplate = '<li id="delete">' +
'<a href="#">' +
'<img src="' + resource.image('delete') + '" alt="delete" />' +
'<span class="l10n-delete">delete</span>' +
'</a>' +
'</li>',
authTemplate = '<div id="delete-auth">' +
'<input id="delete-auth-user" type="text" value="" placeholder="user" />' +
'<input id="delete-auth-password" type="text" value="" placeholder="password" />' +
'</div>',
selectedHrefsStr = '',
$delete, $img, $deleteAuth, $deleteUser, $deletePassword,
failed = function () {
$delete.addClass('failed');
setTimeout(function () {
$delete.removeClass('failed');
}, 1000);
},
handleResponse = function (json) {
$delete.removeClass('current');
$img.attr('src', resource.image('delete'));
if (!json || json.code) {
if (json && json.code === 401) {
$deleteAuth
.css({
left: $delete.offset().left,
top: $delete.offset().top + $delete.outerHeight()
})
.show();
$deleteUser.focus();
}
failed();
}
},
requestDeletion = function (hrefsStr) {
$delete.addClass('current');
$img.attr('src', resource.image('loading.gif', true));
$.ajax({
url: resource.api(),
data: {
action: 'delete',
hrefs: hrefsStr,
user: $deleteUser.val(),
password: $deletePassword.val()
},
dataType: 'json',
success: handleResponse
});
},
onSelection = function (entries) {
selectedHrefsStr = '';
if (entries.length) {
selectedHrefsStr = _.map(entries, function (entry) {
return entry.absHref;
}).join(':');
$delete.appendTo('#navbar').show();
} else {
$delete.hide();
$deleteAuth.hide();
}
},
init = function () {
if (!settings.enabled) {
return;
}
$delete = $(deleteBtnTemplate)
.find('a').on('click', function (event) {
event.preventDefault();
$deleteAuth.hide();
requestDeletion(selectedHrefsStr);
}).end()
.appendTo('#navbar');
$img = $delete.find('img');
$deleteAuth = $(authTemplate).appendTo('body');
$deleteUser = $deleteAuth.find('#delete-auth-user');
$deletePassword = $deleteAuth.find('#delete-auth-password');
event.sub('selection', onSelection);
};
init();
});

View File

@ -24,9 +24,9 @@
// @include "view/viewmode.js"
// @include "ext/autoupdate.js"
// @include "ext/context-menu.js"
// @include "ext/crumb.js"
// @include "ext/custom.js"
// @include "ext/delete.js"
// @include "ext/download.js"
// @include "ext/dropbox.js"
// @include "ext/filter.js"

View File

@ -162,14 +162,25 @@ else if ($action === "upload") {
else if ($action === "delete") {
list($href) = check_keys(array("href"));
json_fail(1, "deletion disabled", !$options["delete"]["enabled"]);
$absPath = $h5ai->getAbsPath($href);
list($hrefs) = check_keys(array("hrefs"));
if (unlink($absPath)) {
json_exit();
$hrefs = explode(":", trim($hrefs));
$errors = array();
foreach ($hrefs as $href) {
$absPath = $h5ai->getAbsPath($href);
if (!unlink($absPath)) {
$errors[] = $href;
}
}
if ($errors->size) {
json_fail(1, "deletion failed for some");
} else {
json_fail(1, "deletion failed");
json_exit();
}
}