diff --git a/filemanager/inc/class.filemanager_hooks.inc.php b/filemanager/inc/class.filemanager_hooks.inc.php new file mode 100644 index 0000000000..cdb38815e6 --- /dev/null +++ b/filemanager/inc/class.filemanager_hooks.inc.php @@ -0,0 +1,158 @@ + + * @package filemanager + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @version $Id: class.filemanager_hooks.inc.php 25002 2008-03-03 12:16:11Z ralfbecker $ + */ + +/** + * Class containing admin, preferences and sidebox-menus (used as hooks) + */ +class filemanager_hooks +{ + static $appname = 'filemanager'; + static $foldercount = 1; + static function sidebox_menu($args) + { + $location = is_array($args) ? $args['location'] : $args; + $basepath = '/'; + $rootpath = '/home'; + $homepath = '/home/'.$GLOBALS['egw_info']['user']['account_lid']; + //echo "
admin_prefs_sidebox_hooks::all_hooks(".print_r($args,True).") appname='$appname', location='$location'
\n"; + $config = config::read(self::$appname); + if (!empty($config['max_folderlinks'])) self::$foldercount = (int)$config['max_folderlinks']; + $file_prefs = &$GLOBALS['egw_info']['user']['preferences'][self::$appname]; + if ($location == 'sidebox_menu') + { + $title = $GLOBALS['egw_info']['apps'][self::$appname]['title'] . ' '. lang('Menu'); + $file = Array( + 'Home' => $GLOBALS['egw']->link('/index.php',array('menuaction'=>self::$appname.'.filemanager_ui.index','path'=>$homepath)), + 'Root' => $GLOBALS['egw']->link('/index.php',array('menuaction'=>self::$appname.'.filemanager_ui.index','path'=>$rootpath)), + # not sure if we want to offer a link to the base directory for default, this way i do that as preference + #'Base' => $GLOBALS['egw']->link('/index.php',array('menuaction'=>self::$appname.'.filemanager_ui.index','path'=>$basepath)), + ); + if (!empty($file_prefs['showbase'])) $file['Base']= $GLOBALS['egw']->link('/index.php',array('menuaction'=>self::$appname.'.filemanager_ui.index','path'=>$basepath)); + if (!empty($file_prefs['startfolder'])) $file['Startfolder']= $GLOBALS['egw']->link('/index.php',array('menuaction'=>self::$appname.'.filemanager_ui.index','path'=>$file_prefs['startfolder'])); + for ($i=1; $i<=self::$foldercount;$i++) { + if (!empty($file_prefs['folderlink'.$i])) { + $foldername = array_pop(explode("/",$file_prefs['folderlink'.$i])); + $file['Link '.$i.($foldername?": ($foldername)":'(Base)')]= $GLOBALS['egw']->link('/index.php',array( + 'menuaction'=>self::$appname.'.filemanager_ui.index', + 'path'=>$file_prefs['folderlink'.$i])); + } + } + display_sidebox(self::$appname,$title,$file); + } + self::preferences(self::$appname); + if ($GLOBALS['egw_info']['user']['apps']['admin']) self::admin(self::$appname); + } + + /** + * Entries for filemanagers's admin menu + */ + static function admin($location = 'admin') + { + $file = Array( + 'Site Configuration' => $GLOBALS['egw']->link('/index.php','menuaction=admin.uiconfig.index&appname='.self::$appname), + ); + if ($location == 'admin') { + display_section(self::$appname,$file); + } else { + display_sidebox(self::$appname,lang('Admin'),$file); + } + } + + static function preferences($location = 'preferences') + { + $file = array( + 'Preferences' => $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname='.self::$appname), + ); + if ($location == 'preferences') + { + display_section(self::$appname,$file); + } else { + display_sidebox(self::$appname,lang('Preferences'),$file); + } + } + + static function settings() + { + $config = config::read(self::$appname); + if (!empty($config['max_folderlinks'])) self::$foldercount = (int)$config['max_folderlinks']; + + $upload_boxes = array( + '1' => '1', + '5' => '5', + '10' => '10', + '20' => '20', + '30' => '30' + ); + $yes_no = array( + '0' => 'No', + '1' => 'Yes' + ); + + $GLOBALS['settings'] = array( + 'showbase' => array( + 'type' => 'select', + 'name' => 'showbase', + 'values' => $yes_no, + 'label' => 'Show link to filemanagers basedirectory (/) in side box menu?', + 'help' => 'Default behavior is NO. The link will not be shown, but you are still able to navigate to this location, + or configure this paricular location as startfolder or folderlink.', + 'xmlrpc' => True, + 'amin' => False + ), + 'alwayssortfolderstotop' => array( + 'type' => 'select', + 'name' => 'alwayssortfolderstotop', + 'values' => $yes_no, + 'label' => 'Sort folders always to the top?', + 'help' => 'Default behavior is NO. If you set this to YES, folders will always appear at the top of the list, + no matter what you sort by. It will slow your mustang down as well.', + 'xmlrpc' => True, + 'amin' => False + ), + 'startfolder' => array( + 'type' => 'input', + 'name' => 'startfolder', + 'size' => 80, + 'default' => '', + 'label' => 'Enter the complete VFS path to specify your desired start folder.', + 'help' => 'If you leave this empty, the path does not exist or the user does not have permission to access the specified folder, + the users startfolder will default to the users home folder.', + 'xmlrpc' => True, + 'amin' => False + ), +# 'show_upload_boxes' => array( +# 'type' => 'select', +# 'label' => 'Default number of upload fields to show', +# 'name' => 'show_upload_boxes', +# 'values' => $upload_boxes, +# 'help' => 'How many upload slots should be available for uploading files? (The boxes are displayed at the bottom of the file listing)', +# 'xmlrpc' => True, +# 'admin' => False +# ), + ); + for ($i=1;$i<=self::$foldercount;$i++) { + $GLOBALS['settings']['folderlink'.$i] = array( + 'type' => 'input', + 'name' => 'folderlink'.$i, + 'size' => 80, + 'default' => '', + 'label' => 'Enter the complete VFS path to specify a fast access link to a folder ('.$i.').', + 'help' => 'If you leave this empty, the path does not exist or the user does not have permission to access the specified folder, + the link will lead the user to the start folder or users home folder (if the startfolder is either not configured, or + not available to the user).', + 'xmlrpc' => True, + 'amin' => False + ); + } + + return true; + } +} diff --git a/filemanager/inc/class.filemanager_ui.inc.php b/filemanager/inc/class.filemanager_ui.inc.php index 7802f7315e..5e650fe37b 100644 --- a/filemanager/inc/class.filemanager_ui.inc.php +++ b/filemanager/inc/class.filemanager_ui.inc.php @@ -60,6 +60,14 @@ class filemanager_ui if (isset($_GET['path']) && ($path = $_GET['path']) && $path[0] == '/' && egw_vfs::is_dir($path)) { $content['nm']['path'] = $path; + } + else + { + if (!empty($GLOBALS['egw_info']['user']['preferences']['filemanager']['startfolder']) + && egw_vfs::is_dir($GLOBALS['egw_info']['user']['preferences']['filemanager']['startfolder'])) + { + $content['nm']['path'] = $GLOBALS['egw_info']['user']['preferences']['filemanager']['startfolder']; + } } if (isset($_GET['msg'])) $msg = $_GET['msg']; } @@ -369,45 +377,116 @@ class filemanager_ui { $namefilter = '/'.str_replace(array('\\?','\\*'),array('.{1}','.*'),preg_quote($query['search'])).'/i'; } - foreach(egw_vfs::find($query['path'],array( - 'mindepth' => 1, - 'maxdepth' => $query['filter'] ? $query['filter'] : null, - 'order' => $query['order'], 'sort' => $query['sort'], - 'limit' => (int)$query['num_rows'].','.(int)$query['start'], - 'need_mime' => true, - 'name_preg' => $namefilter, - ),true) as $path => $row) - { - $row['icon'] = egw_vfs::mime_icon($row['mime']); - $row['perms'] = egw_vfs::int2mode($row['mode']); - // only show link if we have access to the file or dir - if (egw_vfs::check_access($path,egw_vfs::READABLE)) + // if you want to have the folders on top, we must search for them first + if ((int)$GLOBALS['egw_info']['user']['preferences']['filemanager']['alwayssortfolderstotop']==1) { + $dirs = array(); + $files = array(); + foreach(egw_vfs::find($query['path'],array( + 'type'=>'d', + 'mindepth' => 1, + 'maxdepth' => $query['filter'] ? $query['filter'] : null, + 'order' => $query['order'], 'sort' => $query['sort'], + 'limit' => (int)$query['num_rows'].','.(int)$query['start'], + 'need_mime' => true, + 'name_preg' => $namefilter, + ),true) as $path => $row) { - if ($row['mime'] == egw_vfs::DIR_MIME_TYPE) - { - $row['link'] = '/index.php?menuaction=filemanager.filemanager_ui.index&path='.$path; - } - else - { - $row['link'] = egw_vfs::download_url($path); - } + $row['icon'] = egw_vfs::mime_icon($row['mime']); + $row['perms'] = egw_vfs::int2mode($row['mode']); + // only show link if we have access to the file or dir + if (egw_vfs::check_access($path,egw_vfs::READABLE)) $row['link'] = '/index.php?menuaction=filemanager.filemanager_ui.index&path='.$path; + $row['user'] = $row['uid'] ? $GLOBALS['egw']->accounts->id2name($row['uid']) : 'root'; + $row['group'] = $row['gid'] ? $GLOBALS['egw']->accounts->id2name(-$row['gid']) : 'root'; + $row['hsize'] = egw_vfs::hsize($row['size']); + + $dirs[] = $row; + + $dir = dirname($path); + if (!isset($dir_is_writable[$dir])) $dir_is_writable[$dir] = egw_vfs::is_writable($dir); + if (!$dir_is_writable[$dir]) $readonlys["delete[$path]"] = true; // no rights to delete the file + } - $row['user'] = $row['uid'] ? $GLOBALS['egw']->accounts->id2name($row['uid']) : 'root'; - $row['group'] = $row['gid'] ? $GLOBALS['egw']->accounts->id2name(-$row['gid']) : 'root'; - $row['hsize'] = egw_vfs::hsize($row['size']); - - //echo $path; _debug_array($row); - - $rows[++$n] = $row; - - $dir = dirname($path); - if (!isset($dir_is_writable[$dir])) - { - $dir_is_writable[$dir] = egw_vfs::is_writable($dir); + $numofdirs = egw_vfs::$find_total; + $dirsretrieved = count($dirs); + #echo "Dirs found:$numofdirs