Implemented file rename, improvements files list request handling

This commit is contained in:
Aleksander Machniak 2013-06-07 12:56:32 +02:00
parent aa1d7894ba
commit 8f06095640
5 changed files with 152 additions and 34 deletions

View file

@ -83,7 +83,7 @@ window.rcmail && rcmail.addEventListener('init', function() {
}
// "one file only" commands
rcmail.env.file_commands = ['files-get'];
rcmail.env.file_commands = ['files-get', 'files-edit'];
// "one or more file" commands
rcmail.env.file_commands_all = ['files-delete', 'files-move', 'files-copy'];
@ -176,18 +176,14 @@ function kolab_directory_selector_dialog(id)
};
// show dialog window
dialog.dialog({
modal: true,
resizable: !bw.ie6,
closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons
kolab_dialog_show(dialog, {
title: rcmail.gettext('kolab_files.' + (id ? 'saveto' : 'saveall')),
// close: function() { rcmail.dialog_close(); },
buttons: buttons,
minWidth: 250,
minHeight: 300,
height: 350,
width: 300
}).show();
});
if (!rcmail.env.folders_loaded) {
file_api.folder_list();
@ -229,18 +225,14 @@ function kolab_files_selector_dialog()
};
// show dialog window
dialog.dialog({
modal: true,
resizable: !bw.ie6,
closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons
kolab_dialog_show(dialog, {
title: rcmail.gettext('kolab_files.selectfiles'),
// close: function() { rcmail.dialog_close(); },
buttons: buttons,
minWidth: 500,
minHeight: 300,
width: 700,
height: 500
}).show();
});
if (!rcmail.env.files_loaded) {
file_api.folder_list();
@ -289,18 +281,14 @@ function kolab_files_folder_create_dialog()
};
// show dialog window
dialog.dialog({
modal: true,
resizable: !bw.ie6,
closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons
kolab_dialog_show(dialog, {
title: rcmail.gettext('kolab_files.foldercreate'),
// close: function() { rcmail.dialog_close(); },
buttons: buttons,
minWidth: 400,
minHeight: 300,
width: 500,
height: 400
}).show();
});
// build parent selector
select.append($('<option>').val('').text('---'));
@ -317,6 +305,52 @@ function kolab_files_folder_create_dialog()
});
};
// file edition dialog
function kolab_files_file_edit_dialog(file)
{
var dialog = $('#files-file-edit-dialog'),
buttons = {}, name = file_api.file_name(file)
input = $('input[name="name"]', dialog).val(name);
buttons[rcmail.gettext('kolab_files.save')] = function () {
var folder = file_api.file_path(file), name = input.val();
if (!name)
return;
name = folder + file_api.env.directory_separator + name;
// @TODO: now we only update filename
if (name != file)
file_api.file_rename(file, name);
dialog.dialog('destroy').hide();
};
buttons[rcmail.gettext('kolab_files.cancel')] = function () {
dialog.dialog('destroy').hide();
};
// show dialog window
kolab_dialog_show(dialog, {
title: rcmail.gettext('kolab_files.fileedit'),
buttons: buttons
});
};
function kolab_dialog_show(dialog, params)
{
params = $.extend({
modal: true,
resizable: !bw.ie6,
closeOnEscape: (!bw.ie6 && !bw.ie7), // disabled for performance reasons
minWidth: 400,
minHeight: 300,
width: 500,
height: 400
}, params || {});
dialog.dialog(params).show();
};
// smart upload button
function kolab_files_upload_input(button)
{
@ -632,6 +666,14 @@ rcube_webmail.prototype.files_open = function()
file_api.file_open(files[0], rcmail.env.viewer);
};
rcube_webmail.prototype.files_edit = function()
{
var files = this.env.file ? [this.env.file] : kolab_files_selected();
if (files.length == 1)
file_api.file_edit_start(files[0]);
};
rcube_webmail.prototype.files_set_quota = function(p)
{
if (p.total) {
@ -653,6 +695,8 @@ rcube_webmail.prototype.files_set_quota = function(p)
function kolab_files_ui()
{
this.requests = {};
/*
// Called on "session expired" session
this.logout = function(response) {};
@ -795,8 +839,6 @@ function kolab_files_ui()
rcmail.enable_command('files-folder-delete', 'files-upload', false);
this.env.folder = null;
this.env.collection = null;
this.quota();
};
// folder create request
@ -864,6 +906,13 @@ function kolab_files_ui()
if (!params)
params = {};
// reset all pending list requests
for (i in this.requests) {
this.requests[i].abort();
rcmail.hide_message(i);
delete this.requests[i];
}
if (params.all_folders) {
params.collection = null;
params.folder = null;
@ -891,20 +940,23 @@ function kolab_files_ui()
// empty the list
this.env.file_list = [];
rcmail.file_list.clear();
rcmail.file_list.clear(true);
// request
if (params.collection || params.all_folders)
this.file_list_loop(params);
else if (this.env.folder) {
this.req = this.set_busy(true, 'loading');
this.request('file_list', params, 'file_list_response');
params.req_id = this.set_busy(true, 'loading');
this.requests[params.req_id] = this.request('file_list', params, 'file_list_response');
}
};
// file list response handler
this.file_list_response = function(response)
{
if (response.req_id)
rcmail.hide_message(response.req_id);
if (!this.response(response))
return;
@ -945,9 +997,9 @@ function kolab_files_ui()
this.env.folders_loop_lock = false;
for (i=0; i<folders.length && i<limit; i++) {
this.req = this.set_busy(true, 'loading');
params.req_id = this.set_busy(true, 'loading');
params.folder = folders.shift();
this.request('file_list', params, 'file_list_loop_response');
this.requests[params.req_id] = this.request('file_list', params, 'file_list_loop_response');
}
};
@ -959,10 +1011,13 @@ function kolab_files_ui()
limit = Math.max(this.env.search_threads || 1, 1),
valid = this.response(response);
if (response.req_id)
rcmail.hide_message(response.req_id);
for (i=0; i<folders.length && i<limit; i++) {
this.req = this.set_busy(true, 'loading');
params.req_id = this.set_busy(true, 'loading');
params.folder = folders.shift();
this.request('file_list', params, 'file_list_loop_response');
this.requests[params.req_id] = this.request('file_list', params, 'file_list_loop_response');
}
if (!valid)
@ -1060,7 +1115,7 @@ function kolab_files_ui()
else if (c == 'size')
col = '<td class="size">' + this.file_size(data.size) + '</td>';
else if (c == 'options')
col = '<td class="options"></td>'; // @TODO
col = '<td class="options"><span></span></td>';
else
col = '<td class="' + c + '"></td>';
@ -1071,6 +1126,10 @@ function kolab_files_ui()
.html(row)
.attr({id: 'rcmrow' + index, 'data-file': file, 'data-type': data.type});
$('td.options > span', row).click(function(e) {
kolab_files_file_edit_dialog(file);
});
// collection (or search) lists files from all folders
// display file name with full path as title
if (!this.env.folder)
@ -1259,15 +1318,12 @@ function kolab_files_ui()
};
// open jquery UI dialog
dialog.dialog({
modal: true,
resizable: !bw.ie6,
closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons
kolab_dialog_show(dialog.html(text), {
close: skip_func,
buttons: buttons,
minWidth: 400,
width: 400
}).html(text).show();
});
};
// file move (with overwrite) response handler
@ -1286,6 +1342,23 @@ function kolab_files_ui()
}
};
// file(s) rename request
this.file_rename = function(oldfile, newfile)
{
this.req = this.set_busy(true, 'kolab_files.fileupdating');
this.request('file_move', {file: oldfile, 'new': newfile}, 'file_rename_response');
};
// file(s) move response handler
this.file_rename_response = function(response)
{
if (!this.response(response))
return;
// @TODO: we could update metadata instead
this.file_list();
};
// file upload request
this.file_upload = function(form)
{

View file

@ -100,6 +100,7 @@ class kolab_files_engine
$this->rc->output->add_handlers(array(
'folder-create-form' => array($this, 'folder_create_form'),
'file-search-form' => array($this, 'file_search_form'),
'file-edit-form' => array($this, 'file_edit_form'),
'filelist' => array($this, 'file_list'),
'filequotadisplay' => array($this, 'quota_display'),
));
@ -167,6 +168,35 @@ class kolab_files_engine
return $out;
}
/**
* Template object for file_edit form
*/
public function file_edit_form($attrib)
{
$attrib['name'] = 'file-edit-form';
if (empty($attrib['id'])) {
$attrib['id'] = 'file-edit-form';
}
$input_name = new html_inputfield(array('id' => 'file-name', 'name' => 'name', 'size' => 30));
$table = new html_table(array('cols' => 2, 'class' => 'propform'));
$table->add('title', html::label('file-name', Q($this->plugin->gettext('filename'))));
$table->add(null, $input_name->show());
$out = $table->show();
// add form tag around text field
if (empty($attrib['form'])) {
$out = $this->rc->output->form_tag($attrib, $out);
}
$this->plugin->add_label('save', 'cancel', 'fileupdating', 'fileedit');
$this->rc->output->add_gui_object('file-edit-form', $attrib['id']);
return $out;
}
/**
* Template object for file search form in "From cloud" dialog
*/

View file

@ -26,7 +26,9 @@ $labels['get'] = 'Download';
$labels['getfile'] = 'Download file';
$labels['view'] = 'View';
$labels['viewfile'] = 'View file';
$labels['rename'] = 'Rename file';
$labels['deletefile'] = 'Delete selected file(s)';
$labels['fileedit'] = 'File properties';
$labels['collection_audio'] = 'Audio';
$labels['collection_video'] = 'Video';
@ -43,6 +45,7 @@ $labels['foldercreatenotice'] = 'Folder created successfully.';
$labels['saveallnotice'] = 'Successfully saved $n file(s).';
$labels['saveallerror'] = 'Saving $n file(s) failed.';
$labels['attacherror'] = 'Failed to attach file(s) from the cloud';
$labels['fileupdating'] = 'Updating file...';
$labels['filemoving'] = 'Moving file(s)...';
$labels['filecopying'] = 'Copying file(s)...';
$labels['filedeleting'] = 'Deleting file(s)...';

View file

@ -168,6 +168,7 @@
#filelist tr td.options {
width: 26px;
cursor: pointer;
}
#filelist thead tr td.filename,
@ -214,6 +215,13 @@
padding: 0 3px;
}
#filelist tbody tr td.options:hover span {
width: 26px;
height: 18px;
background: url(../../../../skins/larry/images/buttons.png) -5px -418px no-repeat;
display: block;
}
#filelist td.filename {
padding: 0 4px;
}
@ -249,6 +257,7 @@
#files-dialog,
#files-compose-dialog,
#files-file-edit-dialog,
#files-folder-create-dialog {
display: none;
}

View file

@ -60,6 +60,9 @@
<div id="files-folder-create-dialog">
<roundcube:object name="folder-create-form" />
</div>
<div id="files-file-edit-dialog">
<roundcube:object name="file-edit-form" />
</div>
<div id="listoptions" class="propform popupdialog">
<roundcube:if condition="!in_array('kolab_files_list_cols', (array)config:dont_override)" />