Locked files feature

This commit is contained in:
Julien VAUBOURG 2015-04-25 02:48:35 +02:00
parent 8e35815204
commit f5cd4fc507
9 changed files with 110 additions and 33 deletions

View File

@ -7,7 +7,6 @@ $options = [
'base_uri' => "/",
#'base_uploads' => "/var/spool/piratebox/public/uploads/",
#'base_chat' => "/var/spool/piratebox/public/chat/",
'base_uploads' => "/home/ju/tmp/toto/public/uploads/",
'allow_renaming' => true,
'allow_deleting' => true,

View File

@ -23,6 +23,7 @@ require_once('functions.php');
dispatch('/', function() {
set('files', getFiles('/'));
set('tab', 'files');
set('locked', true);
set('cdir', '/');
header('Content-Type: text/html; charset=utf-8');
@ -40,20 +41,26 @@ dispatch('/get', function() {
header('Content-Type: text/html; charset=utf-8');
}
if($ajax && !is_dir(UPLOADS_PATH.$dir)) {
exit('ERR:'.T_("Invalid destination."));
}
if(empty($dir) || !is_dir(UPLOADS_PATH.$dir)) {
$dir = '/';
if($ajax) {
exit('ERR:'.T_("Invalid destination."));
} else {
header('Location: '.ROOT_DIR);
exit();
}
}
if($ajax) {
return getFiles($dir, true);
}
$perms = fileperms(UPLOADS_PATH.$dir);
$locked = !($perms & 0x0080) || $dir == '/';
set('files', getFiles($dir));
set('tab', 'files');
set('locked', $locked);
set('cdir', $dir);
return render('home.html.php');
@ -96,6 +103,7 @@ dispatch_post('/rename', function() {
);
set('folder', $folder);
set('locked', false);
set('newfolder', true);
echo partial('_folder.html.php');
@ -111,6 +119,7 @@ dispatch_post('/rename', function() {
);
set('file', $file);
set('locked', false);
set('newfile', true);
echo partial('_file.html.php');
@ -195,6 +204,7 @@ dispatch_post('/upload', function() {
);
set('file', $file);
set('locked', false);
set('newfile', true);
echo partial('_file.html.php');
@ -235,6 +245,7 @@ dispatch_post('/createfolder', function() {
);
set('folder', $folder);
set('locked', false);
set('newfolder', true);
echo partial('_folder.html.php');
@ -249,6 +260,7 @@ dispatch('/chat', function() {
set('files', getFiles('/'));
set('tab', 'chat');
set('locked', true);
set('cdir', '/');
return render('home.html.php');

View File

@ -203,6 +203,11 @@ function getFiles($dir, $newfiles = false) {
continue;
}
$perms = fileperms($filepath);
$locked = !($perms & 0x0080);
set('locked', $locked);
if(is_dir($filepath)) {
$folder = array(
'name' => $name,

View File

@ -55,6 +55,7 @@ div#infiles {
div.file, div.folder {
display: inline-block;
position: relative;
width: 14.7em;
margin: .4em .3em;
text-align: center;
@ -335,6 +336,24 @@ span.folderdelete {
font-style: normal;
}
span.lockedaction {
background-color: #ccc;
color: #999;
cursor: not-allowed;
}
span.pinnedfile {
position: absolute;
right: 69px;
top: 44px;
color: #11b211;
font-size: 1.2em;
}
div.activefile span.pinnedfile {
display: none;
}
span.filedate, span.filesize, span.filerename, span.filedelete {
font-size: 1em;
}

View File

@ -40,7 +40,6 @@ $(document).ready(function() {
uploadArea.event('send', upload);
setDownloadEvents();
setFileEvents($('.file'));
setFolderEvents($('.folder'));
@ -74,10 +73,6 @@ $(document).ready(function() {
$('a[data-tab=chat]').click();
}
}
if($('#tabfiles').attr('data-opt-allow-deleting') == 'true') {
$('.folderdelete').click(deleteFolderBtn);
}
});
@ -145,7 +140,7 @@ $(document).keypress(function(e) {
// Del
if(e.keyCode == 46) {
if(isTabActive('files') && $('#tabfiles').attr('data-opt-allow-deleting') == 'true') {
if(isTabActive('files') && $('#tabfiles').attr('data-opt-allow-deleting') == 'true' && $('.activefile').attr('data-locked') == 'false') {
deleteFile($('.activefile'));
return false;
@ -154,7 +149,7 @@ $(document).keypress(function(e) {
// F2
if(e.keyCode == 113) {
if(isTabActive('files') && $('#tabfiles').attr('data-opt-allow-renaming') == 'true') {
if(isTabActive('files') && $('#tabfiles').attr('data-opt-allow-renaming') == 'true' && $('.activefile').attr('data-locked') == 'false') {
renameFile($('.activefile'));
return false;

View File

@ -35,21 +35,19 @@ function setFolderEvents(folders) {
folders.click(clickFolder);
}
// Set download panel events
function setDownloadEvents() {
if($('#tabfiles').attr('data-opt-allow-renaming') == 'true') {
$('#download').find('.filerename').click(renameFileBtn);
}
if($('#tabfiles').attr('data-opt-allow-deleting') == 'true') {
$('#download').find('.filedelete').click(deleteFileBtn);
}
}
// Show no file notice with the folder delete button (or not)
// fade: use animations or not
function showNoFile(fade = false) {
if($('#tabfiles').attr('data-opt-allow-deleting') == 'true' && $('#nav').attr('data-cdir') != '%2F') {
if($('#nav').attr('data-locked') == 'true') {
$('.folderdelete').addClass('lockedaction');
$('.folderdelete').off('clicked');
} else {
$('.folderdelete').removeClass('lockedaction');
$('.folderdelete').click(deleteFolderBtn);
}
$('.folderdelete').show();
} else {
@ -111,7 +109,19 @@ function changeDirectory(newcdir, updateHistory = true) {
return;
}
var folderWithLocation = $('.folder[data-dir="' + encodeURIComponent(newcdir) + '"]');
var locked = false;
if(newcdir == '/') {
locked = true;
} else if(folderWithLocation.length > 0) {
locked = (folderWithLocation.attr('data-locked') == 'true');
}
$('#nav').attr('data-cdir', encodeURIComponent(newcdir));
$('#nav').attr('data-locked', locked ? 'true' : 'false');
$('#infiles').empty();
$('#infiles').append(data);
@ -504,6 +514,10 @@ function deleteFile(file = false) {
});
}
function isFileLocked() {
return ($(this).attr('data-locked') == 'true');
}
// Create context menus for files and folders
function createContextMenus() {
var fileMenuItems = {
@ -521,12 +535,12 @@ function createContextMenus() {
}
if($('#tabfiles').attr('data-opt-allow-renaming')== 'true') {
fileMenuItems['rename'] = { name: $('#tabfiles').attr('data-txt-rename') };
folderMenuItems['rename'] = { name: $('#tabfiles').attr('data-txt-rename') };
fileMenuItems['rename'] = { name: $('#tabfiles').attr('data-txt-rename'), disabled: isFileLocked };
folderMenuItems['rename'] = { name: $('#tabfiles').attr('data-txt-rename'), disabled: isFileLocked };
}
if($('#tabfiles').attr('data-opt-allow-deleting') == 'true') {
fileMenuItems['delete'] = { name: $('#tabfiles').attr('data-txt-delete') };
fileMenuItems['delete'] = { name: $('#tabfiles').attr('data-txt-delete'), disabled: isFileLocked };
}
$('#files').contextMenu({
@ -829,6 +843,28 @@ function clickFile() {
$('.itemfile').removeClass('activefile');
$(this).addClass('activefile');
if($('#tabfiles').attr('data-opt-allow-renaming') == 'true') {
if($(this).attr('data-locked') == 'true') {
$('#download .filerename').addClass('lockedaction');
$('#download .filerename').off('click');
} else {
$('#download .filerename').removeClass('lockedaction');
$('#download .filerename').click(renameFileBtn);
}
}
if($('#tabfiles').attr('data-opt-allow-deleting') == 'true') {
if($(this).attr('data-locked') == 'true') {
$('#download .filedelete').addClass('lockedaction');
$('#download .filedelete').off('click');
} else {
$('#download .filedelete').removeClass('lockedaction');
$('#download .filedelete').click(deleteFileBtn);
}
}
$('#download .filename').text($(this).attr('data-name'));
$('#download .downloadfile').attr('href', ($(this).attr('data-filename')));
$('#download .filesize').text($(this).attr('data-size'));

View File

@ -19,6 +19,7 @@
?>
<div class="itemfile file <?= $newfile ? 'newfile' : '' ?>" <?= $newfile ? 'style="display: none"' : '' ?>
data-locked="<?= $locked ? 'true' : 'false' ?>"
data-name="<?= htmlentities($file['name']) ?>"
data-filename="<?= htmlentities(preg_replace('|/+|', '/', $file['filename'])) ?>"
data-size="<?= $file['size'] ?>"
@ -26,6 +27,10 @@
<img src="<?= ROOT_DIR.PUBLIC_DIR ?>img/extensions/<?= urlencode($file['img']) ?>" />
<?php if($locked): ?>
<span class="pinnedfile glyphicon glyphicon-star"></span>
<?php endif; ?>
<?php if($file['shortname'] != $file['name']): ?>
<span class="shortname label label-default" data-toggle="tooltip" data-title="<?= htmlentities($file['name']) ?>"><?= str_replace('...', '&hellip;', htmlentities($file['shortname'])) ?></span>
<?php else: ?>

View File

@ -18,7 +18,15 @@
*/
?>
<div class="itemfile folder <?= $newfolder ? 'newfolder' : '' ?>" <?= $newfolder ? 'style="display: none"' : '' ?> data-dir="<?= rawurlencode($folder['dir']) ?>">
<div class="itemfile folder <?= $newfolder ? 'newfolder' : '' ?>" <?= $newfolder ? 'style="display: none"' : '' ?>
data-locked="<?= $locked ? 'true' : 'false' ?>"
data-dir="<?= rawurlencode($folder['dir']) ?>">
<img src="<?= ROOT_DIR.PUBLIC_DIR ?>img/extensions/folder-page.png" />
<?php if($locked): ?>
<span class="pinnedfile glyphicon glyphicon-star"></span>
<?php endif; ?>
<span class="shortname label label-default"><?= htmlentities($folder['name']) ?></span>
</div>

View File

@ -53,9 +53,7 @@
data-txt-delete="<?= T_("Delete") ?>"
data-opt-allow-renaming="<?= option('allow_renaming') ? 'true' : 'false' ?>"
data-opt-allow-deleting="<?= option('allow_deleting') ? 'true' : 'false' ?>"
data-opt-allow-newfolders="<?= option('allow_newfolders') ? 'true' : 'false' ?>"
>
data-opt-allow-newfolders="<?= option('allow_newfolders') ? 'true' : 'false' ?>">
<div id="download">
<span id="closedownload" class="glyphicon glyphicon-remove"></span>
@ -73,7 +71,7 @@
</div>
<div id="files" class="panel-body">
<ol class="breadcrumb" id="nav" data-cdir="<?= rawurlencode($cdir) ?>">
<ol class="breadcrumb" id="nav" data-cdir="<?= rawurlencode($cdir) ?>" data-locked="<?= $locked ? 'true' : 'false' ?>">
<li class="active"><?= T_("Root") ?></li>
</ol>
@ -83,7 +81,7 @@
<span id="nofile" <?= empty($files) ? '' : 'style="display: none"' ?>>
<?= T_("No files yet.") ?>
<div><span class="folderdelete label label-danger" <?= option('allow_deleting') && $cdir != '/' ? '' : 'style="display: none"' ?>><span class="glyphicon glyphicon-trash"></span> <?= T_("Delete this folder") ?></span></div>
<div><span class="folderdelete label label-danger <?= $locked ? 'lockedaction' : '' ?>" <?= option('allow_deleting') && $cdir != '/' ? '' : 'style="display: none"' ?>><span class="glyphicon glyphicon-trash"></span> <?= T_("Delete this folder") ?></span></div>
</span>
</div>
</div>