# Copyright (c) 2008-2010 bivio Software, Inc. All Rights Reserved. # # Visit http://www.bivio.biz for more info. # # This library is free software; you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as # published by the Free Software Foundation; either version 2.1 of the # License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; If not, you may get a copy from: # http://www.opensource.org/licenses/lgpl-license.html # # $Id: File.pm,v 1.23 2011/09/27 22:28:39 schellj Exp $ package Bivio::UI::View::File; use strict; use Bivio::Base 'View.Base'; use Bivio::UI::ViewLanguageAUTOLOAD; our($VERSION) = sprintf('%d.%02d', q$Revision: 1.23 $ =~ /\d+/g); my($_FP) = b_use('Type.FilePath'); my($_FCF) = b_use('Model.FileChangeForm'); my($_FCM) = b_use('Type.FileChangeMode'); my($_LOCK) = b_use('Model.RealmFileLock')->if_enabled; sub delete_permanently_form { my($self) = @_; return $self->internal_body($self->internal_delete_permanently_form(@_)); } sub file_change { view_put(xhtml_title => Join([ vs_text('title.FORUM_FILE_CHANGE'), ' ', String([qw(Model.FileChangeForm realm_file path)]), ])), return shift->internal_body(Join([ [\&_javascript_field_selector], vs_simple_form(FileChangeForm => [ If(['Model.FileChangeForm', '->is_folder'], Join([ _link('Add file', 'UPLOAD'), _link('Add text file', 'TEXT_FILE'), _link('Add subfolder', 'ADD_SUBFOLDER'), If(['!', 'Model.FileChangeForm', '->is_root'], _link('Rename folder', 'RENAME')), If(['!', 'Model.FileChangeForm', '->is_root'], _link('Move folder', 'MOVE')), If(['!', 'Model.FileChangeForm', '->is_root'], _link('Delete', 'DELETE')), ], String(' - ')), Join([ _last_updated('FileChangeForm'), String("\n"), Join([ If(['Model.FileChangeForm', '->is_text_content_type'], _link('Edit contents', 'TEXT_FILE')), _link('Replace contents', 'UPLOAD'), _link('Rename file', 'RENAME'), _link('Move file', 'MOVE'), _link('Delete', 'DELETE'), _lock( Link('Leave file locked', URI({ task_id => 'FORUM_FILE_TREE_LIST', query => [['Model.FileChangeForm', '->unsafe_get_context'], 'query'], })), Link('Unlock', '#')->put(attributes => [sub { my($source) = @_; return ' onclick="' . _javascript_form_object() . $source->req('Model.FileChangeForm') ->get_field_name_for_html('cancel_button') . '.click()"'; }]), ), ], String(' - ')), ]), ), vs_blank_cell(), FormFieldError('RealmFile.path_lc'), ['FileChangeForm.name', { row_class => 'hidden_file_field', }], ['FileChangeForm.rename_name', { row_class => 'hidden_file_field', }], ['FileChangeForm.folder_id', { row_class => 'hidden_file_field', choices => ['Model.RealmFolderList'], list_display_field => 'RealmFile.path', }], ['FileChangeForm.file', { row_class => 'hidden_file_field', }], Join([ StandardSubmit({ buttons => 'ok_button cancel_button', }), FormField('FileChangeForm.content', { row_class => 'hidden_file_field', rows => 30, cols => 80, }), ]), _lock([ 'FileChangeForm.comment', { row_class => 'hidden_file_field', rows => 2, }, ]), ])->put(form_name => 'file_form'), "\n" . '\n", ])); } sub file_unlock { return shift->internal_body(vs_simple_form('FileUnlockForm', [ DIV_warn(Join([ 'Override the lock on this file owned by ', String([['Model.RealmFileLock', '->get_model', 'User'], '->format_full_name']), '?', ])), ])); } sub folder_file_list { my($self) = @_; vs_put_pager('RealmFolderFileList'); return $self->tree_list('RealmFolderFileList'); } sub internal_delete_permanently_form { return vs_simple_form('RealmFileDeletePermanentlyForm'); } sub internal_restore_form { return vs_simple_form('RealmFileRestoreForm'); } sub internal_revert_form { return vs_simple_form('RealmFileRevertForm'); } sub restore_form { my($self) = @_; return $self->internal_body($self->internal_restore_form(@_)); } sub revert_form { my($self) = @_; return $self->internal_body($self->internal_revert_form(@_)); } sub tree_list { my($self, $model) = @_; return shift->internal_body( If(['Model.' . ($model || 'RealmFileTreeList'), '->can_write'], _tree_list($model), _simple_tree($model), ), ); } sub version_list { my($self) = @_; view_put(xhtml_title => Join([ ['path_info'], ])); $self->internal_put_base_attr(tools => TaskMenu([ { task_id => 'FORUM_FILE_TREE_LIST', label => String('back to list'), }, ])); return shift->internal_body(vs_paged_list(RealmFileVersionsList => [ ['RealmFile.path', { column_order_by => ['RealmFile.path_lc'], column_widget => Link( Join([ _lock( If(['->is_locked'], Image(vs_text('RealmFileList.locked_leaf_node')), Image(vs_text('RealmFileList.leaf_node')), ), ), _file_name(['revision_number']), ]), URI({ task_id => 'FORUM_FILE', path_info => ['RealmFile.path'], }), ), }], ['RealmFile.modified_date_time', { column_widget => _file_date(), }], _file_owner_column(), _lock('RealmFileLock.comment'), vs_file_versions_actions_column(), #TODO: sorting isn't preserving path_info ])->put(want_sorting => 0)); } sub _file_date { return DateTime(['RealmFile.modified_date_time']) unless $_LOCK; return If( ['RealmFileLock.modified_date_time'], DateTime(['RealmFileLock.modified_date_time']), DateTime(['RealmFile.modified_date_time']), ); } sub _file_link_column { my($simple) = @_; return ['RealmFile.path', { column_order_by => ['RealmFile.path_lc'], column_widget => If(['is_max_files_per_folder'], vs_text('RealmFileTreeList.more_files'), $simple ? String(['base_name']) : _file_name(['base_name']), ), }]; } sub _file_name { my($name) = @_; return String($name) unless $_LOCK; return Join([ String($name), If(['->is_locked'], SPAN_warn(' (locked)')), ]); } sub _file_owner_column { return [ 'RealmOwner_2.display_name', { column_widget => !$_LOCK ? String(['RealmOwner_2.display_name']) : If( ['->is_locked'], SPAN_warn(String(['RealmOwner_3.display_name'])), String(['RealmOwner_2.display_name']), ), }, ]; } sub _javascript_field_selector { my($source) = @_; my($res) = "\n\n"; return $res; } sub _javascript_form_object { return q{document.forms['file_form'].}; } sub _javascript_function_name { my($mode) = @_; return 'file_' . lc($mode->get_name) . '()'; } sub _javascript_link_name { my($mode) = @_; return 'file_link_' . lc($mode->get_name); } sub _last_updated { my($form) = @_; return DIV_prose(Join([ 'Last updated by ', _mailto($form), ' on ', DateTime(['Model.' . $form, 'realm_file', 'modified_date_time']), ])); } sub _link { my($text, $mode) = @_; return Link($text, '#')->put(attributes => ' id="' . _javascript_link_name($_FCM->from_name($mode)) . '"' . ' onclick="' . _javascript_function_name($_FCM->from_name($mode)) . '; return false"'); } sub _mailto { my($form) = @_; return vs_mailto_for_user_id(['Model.' . $form, 'realm_file', 'user_id']); } sub _simple_tree { my($model) = @_; return vs_tree_list($model || 'RealmFileTreeList' => [ _file_link_column(1), 'RealmFile.modified_date_time', ]); } sub _tree_list { my($model) = @_; return vs_tree_list($model || 'RealmFileTreeList' => [ _file_link_column(), ['RealmFile.modified_date_time', { column_widget => If( And( ['->is_file'], ['!', '->is_archive'], ), Link(_file_date(), URI({ task_id => 'FORUM_FILE_VERSIONS_LIST', path_info => ['RealmFile.path'], })), _file_date(), ), }], ['content_length', { format => 'Bytes', column_data_class => 'amount_cell', }], _file_owner_column(), ['actions', { column_data_class => 'list_action', column_widget => ListActions([ map({ [ vs_text_as_prose("RealmFileTreeList.list_action.$_"), $_, URI({ task_id => $_, path_info => ['RealmFile.path'], }), $_ eq 'FORUM_FILE_CHANGE' ? And(['!', '->is_archive'], ['!', 'RealmFile.is_read_only'], ['!', 'is_max_files_per_folder']) : $_ eq 'FORUM_FILE_RESTORE_FORM' ? And(['->is_archive'], [sub { my($source) = @_; my($rf) = $source ->get_model('RealmFile'); return ! ($rf->get('is_folder') && $rf->new_other('RealmFile') ->set_ephemeral ->unsafe_load({ path => $rf->restore_path, })); }]) : And(['->is_archive'], If(['RealmFile.is_folder'], ['is_empty'], 1)), ]; } qw( FORUM_FILE_CHANGE FORUM_FILE_RESTORE_FORM FORUM_FILE_DELETE_PERMANENTLY_FORM )), ]), }], ]); } sub _lock { return $_LOCK ? @_ : (); } 1;