From 3e72371fd7c360fec2904710819a2a590ce8dbb0 Mon Sep 17 00:00:00 2001 From: Christian Binder Date: Sat, 27 Oct 2012 11:38:47 +0000 Subject: [PATCH] * New feature: cross-application document merge in filemanager GUI --- filemanager/inc/class.filemanager_ui.inc.php | 91 +++++++++++++++++++- filemanager/templates/default/file.xet | 8 +- 2 files changed, 94 insertions(+), 5 deletions(-) diff --git a/filemanager/inc/class.filemanager_ui.inc.php b/filemanager/inc/class.filemanager_ui.inc.php index c1ff36b0e6..4a390fa717 100644 --- a/filemanager/inc/class.filemanager_ui.inc.php +++ b/filemanager/inc/class.filemanager_ui.inc.php @@ -34,6 +34,12 @@ class filemanager_ui 'filemanager_ui::listview' => 'Listview', ); public static $views_init = false; + + /** + * vfs namespace for document merge properties + * + */ + public static $merge_prop_namespace = ''; /** * Constructor @@ -53,6 +59,7 @@ class filemanager_ui } self::init_views(); + self::$merge_prop_namespace = egw_vfs::DEFAULT_PROP_NAMESPACE.$GLOBALS['egw_info']['flags']['currentapp']; } /** @@ -169,6 +176,44 @@ class filemanager_ui } return $actions; } + + /** + * Get mergeapp property for given path + * + * @param string $path + * @param string $scope='self' (default) or 'parents' + * $scope == 'self' query only the given path + * $scope == 'parents' query only path parents for property (first parent in hierarchy upwards wins) + * + * @return string merge application or NULL if no property found + */ + private static function get_mergeapp($path, $scope='self') + { + $app = null; + switch($scope) + { + case 'self': + $props = egw_vfs::propfind($path, self::$merge_prop_namespace); + $app = empty($props) ? null : $props[0]['val']; + break; + case 'parents': + // search for props in parent directories + $currentpath = $path; + while($dir = egw_vfs::dirname($currentpath)) + { + $props = egw_vfs::propfind($dir, self::$merge_prop_namespace); + if(!empty($props)) + { + // found prop in parent directory + return $app = $props[0]['val']; + } + $currentpath = $dir; + } + break; + } + + return $app; + } /** * Main filemanager page @@ -1060,6 +1105,25 @@ function force_download(_action, _senders) { $props[] = array('name' => $name, 'val' => $content[$name] ? $content[$name] : null); } + elseif ($name == 'mergeapp') + { + $mergeprop = array( + array( + 'ns' => self::$merge_prop_namespace, + 'name' => 'mergeapp', + 'val' => (!empty($content[$name]) ? $content[$name] : null), + ), + ); + if (egw_vfs::proppatch($path,$mergeprop)) + { + $content['old'][$name] = $content[$name]; + $msg .= lang('Setting for document merge saved.'); + } + else + { + $msg .= lang('Saving setting for document merge failed!'); + } + } else { static $name2cmd = array('uid' => 'chown','gid' => 'chgrp','perms' => 'chmod'); @@ -1223,7 +1287,31 @@ function force_download(_action, _senders) 0 => lang('No access'), ); } - $sel_options['mergeapp']= egw_link::app_list('merge'); + + // mergeapp + $content['mergeapp'] = self::get_mergeapp($path, 'self'); + $content['mergeapp_parent'] = self::get_mergeapp($path, 'parents'); + if(!empty($content['mergeapp'])) + { + $content['mergeapp_effective'] = $content['mergeapp']; + } + elseif(!empty($content['mergeapp_parent'])) + { + $content['mergeapp_effective'] = $content['mergeapp_parent']; + } + else + { + $content['mergeapp_effective'] = null; + } + // mergeapp select options + $mergeapp_list = egw_link::app_list('merge'); + $mergeapp_empty = !empty($content['mergeapp_parent']) + ? $mergeapp_list[$content['mergeapp_parent']] . ' (parent setting)' : ''; + $sel_options['mergeapp'] = array('' => $mergeapp_empty); + $sel_options['mergeapp'] = $sel_options['mergeapp'] + $mergeapp_list; + // mergeapp other gui options + $content['mergeapp_itempicker_disabled'] = $content['is_dir'] || empty($content['mergeapp_effective']); + $preserve = $content; if (!isset($preserve['old'])) { @@ -1233,6 +1321,7 @@ function force_download(_action, _senders) 'uid' => $content['uid'], 'gid' => $content['gid'], 'comment' => (string)$content['comment'], + 'mergeapp' => $content['mergeapp'] ); if ($cfs) foreach($cfs as $name => $data) { diff --git a/filemanager/templates/default/file.xet b/filemanager/templates/default/file.xet index 9a24c589b0..1a829cccfc 100644 --- a/filemanager/templates/default/file.xet +++ b/filemanager/templates/default/file.xet @@ -209,9 +209,9 @@ - + - + @@ -226,13 +226,13 @@ - + - +