From 06dae2b9fe8d3a799ea848481ace32cec4fc563a Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Tue, 9 Nov 2010 13:02:31 +0000 Subject: [PATCH] * sorting fileselection popup always by directory on top and then name --- .../inc/class.filemanager_select.inc.php | 241 ++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 filemanager/inc/class.filemanager_select.inc.php diff --git a/filemanager/inc/class.filemanager_select.inc.php b/filemanager/inc/class.filemanager_select.inc.php new file mode 100644 index 0000000000..3d5d1f71fe --- /dev/null +++ b/filemanager/inc/class.filemanager_select.inc.php @@ -0,0 +1,241 @@ + + * @copyright (c) 2009 by Ralf Becker + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id$ + */ + +/** + * Select file to open or save dialog + * + * This dialog can be called from applications to open or store files from the VFS. + * + * There are the following ($_GET) parameters: + * - menuaction=filemanager.filemanager_select.select (required) + * - mode=(open|open-multiple|saveas|select-dir) (required) + * - method=app.class.method (required callback, gets called with id and selected file(s)) + * - id=... (optional parameter passed to callback) + * - path=... (optional start path in VFS) + * - mime=... (optional mime-type to limit display to given type) + * - label=... (optional label for submit button, default "Open") + * + * The application calls this method in a popup with size: 640x580 px + * After the user selected one or more files (depending on the mode parameter), the "method" callback gets + * called on server (!) side. Parameters are the id plus the selected files as 1. and 2. parameter. + * The callback returns javascript to eg. update it's UI AND (!) to close the current popup ("window.close();"). + */ +class filemanager_select +{ + /** + * Methods callable via menuaction + * + * @var array + */ + var $public_functions = array( + 'select' => true, + ); + + /** + * Constructor + * + */ + function __construct() + { + // strip slashes from _GET parameters, if someone still has magic_quotes_gpc on + if (get_magic_quotes_gpc() && $_GET) + { + $_GET = etemplate::array_stripslashes($_GET); + } + } + + /** + * File selector + * + * @param array $content + */ + function select(array $content=null) + { + if (!is_array($content)) + { + $content = array(); + $content['mode'] = $_GET['mode']; + if (!in_array($content['mode'],array('open','open-multiple','saveas','select-dir'))) + { + throw new egw_exception_wrong_parameter("Wrong or unset required mode parameter!"); + } + $content['path'] = $_GET['path']; + if (!isset($content['path'])) + { + $content['path'] = egw_session::appsession('select_path','filemanger'); + } + $content['name'] = (string)$_GET['name']; + $content['method'] = $_GET['method']; + $content['id'] = $_GET['id']; + $content['label'] = isset($_GET['label']) ? $_GET['label'] : lang('Open'); + if (($content['options-mime'] = isset($_GET['mime']))) + { + $content['options-mime'] = array(); + foreach((array)$_GET['mime'] as $key => $value) + { + if (is_numeric($key)) + { + $content['options-mime'][$value] = lang('%1 files',strtoupper(mime_magic::mime2ext($value))).' ('.$value.')'; + } + else + { + $content['options-mime'][$key] = lang('%1 files',strtoupper($value)).' ('.$key.')'; + } + } + list($content['mime']) = each($content['options-mime']); + } + } + elseif(isset($content['button'])) + { + list($button) = each($content['button']); + unset($content['button']); + switch($button) + { + case 'up': + if ($content['path'] != '/') $content['path'] = egw_vfs::dirname($content['path']); + break; + case 'home': + $content['path'] = filemanager_ui::get_home_dir(); + break; + case 'ok': + switch($content['mode']) + { + case 'open-multiple': + foreach((array)$content['dir']['selected'] as $name) + { + $files[] = egw_vfs::concat($content['path'],$name); + } + break; + case 'select-dir': + $files = $content['path']; + break; + default: + $files = egw_vfs::concat($content['path'],$content['name']); + break; + } + $js = ExecMethod2($content['method'],$content['id'],$files); + echo "\n\n\n\n\n"; + $GLOBALS['egw']->common->egw_exit(); + } + } + elseif(isset($content['apps'])) + { + list($app) = each($content['apps']); + if ($app == 'home') $content['path'] = filemanager_ui::get_home_dir(); + } + $content['apps'] = array_keys(self::get_apps()); + + if (isset($app)) + { + $content['path'] = '/apps/'.(isset($content['apps'][$app]) ? $content['apps'][$app] : $app); + } + if ((substr($content['path'],0,strlen('/apps/favorites/')) == '/apps/favorites/' /*|| // favorites the imediatly resolved + egw_vfs::is_link($content['path'])*/) && // we could replace all symlinks with the link, to save space in the URL + $link = egw_vfs::readlink($content['path'])) + { + $content['path'] = $link[0] == '/' ? $link : egw_vfs::concat($content['path'],'../'.$link); + } + if (!$content['path'] || !egw_vfs::is_dir($content['path'])) + { + $content['path'] = filemanager_ui::get_home_dir(); + } + if (!($files = egw_vfs::find($content['path'],array( + 'order' => 'name', + 'sort' => 'ASC', + 'maxdepth' => 1, + )))) + { + $content['msg'] = lang("Can't open directory %1!",$content['path']); + } + else + { + $n = 0; + $content['dir'] = array('mode' => $content['mode']); + array_shift($files); // remove directory itself + foreach($files as $path) + { + $name = egw_vfs::basename($path); + $is_dir = egw_vfs::is_dir($path); + if ($content['mime'] && !$is_dir && egw_vfs::mime_content_type($path) != $content['mime']) + { + continue; // does not match mime-filter --> ignore + } + $content['dir'][$n] = array( + 'name' => $name, + 'path' => $path, + 'onclick' => $is_dir ? "return select_goto('".addslashes($path)."');" : + ($content['mode'] != 'open-multiple' ? "return select_show('".addslashes($name)."');" : + "return select_toggle('".addslashes($name)."');"), + ); + if ($is_dir && $content['mode'] == 'open-multiple') + { + $readonlys['selected['.$name.']'] = true; + } + ++$n; + } + if (!$n) $readonlys['selected[]'] = true; // remove checkbox from empty line + } + $content['js'] = ' +'; + // scroll to end of path + $GLOBALS['egw']->js->set_onload("document.getElementById('exec[path][c". (count(explode('/',$content['path']))-1) ."]').scrollIntoView();"); + + //_debug_array($readonlys); + egw_session::appsession('select_path','filemanger',$content['path']); + $tpl = new etemplate('filemanager.select'); + $tpl->exec('filemanager.filemanager_select.select',$content,$sel_options,$readonlys,array( + 'mode' => $content['mode'], + 'method' => $content['method'], + 'id' => $content['id'], + 'label' => $content['label'], + 'mime' => $content['mime'], + 'options-mime' => $content['options-mime'], + ),2); + } + + /** + * Get a list off all apps having an application directory in VFS + * + * @return array + */ + static function get_apps() + { + $apps = array(false); // index starting from 1 + if (isset($GLOBALS['egw_info']['apps']['stylite'])) $apps = array('favorites' => lang('Favorites')); + $apps += egw_link::app_list('query'); + + unset($apps['mydms']); // they do NOT support adding files to VFS + unset($apps['wiki']); + + return $apps; + } +}