From 958452ff9554e35621485fbfb4ce1f23989fe61c Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 31 Jan 2010 03:36:01 +0000 Subject: [PATCH 01/22] Implementation of global categories limited to a certain group: - from user perspectiv they are global cat like the existing ones (also comming in two flavors: global or for a certain app) - admins can select to limit a global cat when they create it --> all members of a given group have the cat as a global one ==> This does a silent modification of the categories table: global cats get changed from cat_owner=-1 to cat_owner=0 !!! --- admin/inc/class.admin_categories.inc.php | 3 +- admin/lang/egw_de.lang | 3 + admin/lang/egw_en.lang | 5 +- admin/setup/etemplates.inc.php | 6 +- admin/templates/default/categories.edit.xet | 10 +++- admin/templates/default/categories.index.xet | 13 ++-- etemplate/inc/class.select_widget.inc.php | 5 +- phpgwapi/inc/class.categories.inc.php | 62 ++++++++++++++++---- 8 files changed, 84 insertions(+), 23 deletions(-) diff --git a/admin/inc/class.admin_categories.inc.php b/admin/inc/class.admin_categories.inc.php index 343c0c9b0e..1b78d66ab7 100644 --- a/admin/inc/class.admin_categories.inc.php +++ b/admin/inc/class.admin_categories.inc.php @@ -112,7 +112,7 @@ class admin_categories } elseif ($content['button'] || $content['delete']) { - $cats = new categories(categories::GLOBAL_ACCOUNT,$content['appname']); + $cats = new categories($content['owner'] ? $content['owner'] : categories::GLOBAL_ACCOUNT,$content['appname']); if ($content['delete']['delete']) { @@ -178,6 +178,7 @@ class admin_categories $sel_options['icon'] = self::get_icons(); $readonlys['button[delete]'] = !$content['id'] || !self::$acl_delete; // cant delete not yet saved category + $readonlys['owner'] = $content['id'] > 0; $tmpl = new etemplate('admin.categories.edit'); $tmpl->exec('admin.admin_categories.edit',$content,$sel_options,$readonlys,$content+array( diff --git a/admin/lang/egw_de.lang b/admin/lang/egw_de.lang index 64e3b14b68..7a77db3d7a 100644 --- a/admin/lang/egw_de.lang +++ b/admin/lang/egw_de.lang @@ -111,6 +111,7 @@ change password for %1 admin de Ändern des Passworts für %1 check acl for entries of not (longer) existing accounts admin de Prüfe ACL Einträge auf Bezüge zu nicht (mehr) existierenden Benutzerkonten check ip address of all sessions admin de IP-Adresse für alle Sessions überprüfen check items to %1 to %2 for %3 admin de Durch Abhaken %3 in %2 %1 +children admin de Kinder click to select a color admin de Anclicken um eine Farbe auszuwählen color admin de Farbe command scheduled to run at %1 admin de Ausführung des Befehls eingeplant am/um %1 @@ -323,6 +324,8 @@ leave the group untouched and return back to the list admin de Gruppe unverände leave without saveing the entry admin de beendet ohne den Eintrag zu speichern leaves without saveing admin de beendet ohne zu speichern length
rows admin de Länge
Zeilen +limit global category to members of a certain group admin de Beschränkt die global Kategorie auf der Mitglieder einer bestimmten Gruppe +limit to members of admin de Beschränken auf Mitglieder von list config settings admin de Konfigurationseinstellungen auflisten list current sessions admin de aktive Sitzungen anzeigen list of current users admin de Liste der gegenwärtigen Benutzer diff --git a/admin/lang/egw_en.lang b/admin/lang/egw_en.lang index 535f8f3369..bc97e381ac 100644 --- a/admin/lang/egw_en.lang +++ b/admin/lang/egw_en.lang @@ -55,7 +55,7 @@ after how many unsuccessful attempts to login, an account should be blocked (def after how many unsuccessful attempts to login, an ip should be blocked (default 3) ? admin en After how many unsuccessful attempts to login, an IP should be blocked (default 3) ? aliases admin en Aliases all records and account information will be lost! admin en All records and account information will be lost! -all users admin en All Users +all users admin en All users allow anonymous access to this app admin en Allow anonymous access to this app allow remote administration from following install id's (comma separated) admin en Allow remote administration from following install ID's (comma separated) alternate email address admin en alternate email address @@ -111,6 +111,7 @@ change password for %1 admin en change password for %1 check acl for entries of not (longer) existing accounts admin en Check ACL for entries of not (longer) existing accounts check ip address of all sessions admin en Check IP address of all sessions check items to %1 to %2 for %3 admin en Check items to %1 to %2 for %3 +children admin en Children click to select a color admin en Click to select a color color admin en Color command scheduled to run at %1 admin en Command scheduled to run at %1 @@ -321,6 +322,8 @@ leave the group untouched and return back to the list admin en Leave the group u leave without saveing the entry admin en leave without saveing the entry leaves without saveing admin en leaves without saveing length
rows admin en Length
Rows +limit global category to members of a certain group admin en Limit global category to members of a certain group +limit to members of admin en Limit to members of list config settings admin en List config settings list current sessions admin en List current sessions list of current users admin en list of current users diff --git a/admin/setup/etemplates.inc.php b/admin/setup/etemplates.inc.php index 50379d0b2a..8501337762 100644 --- a/admin/setup/etemplates.inc.php +++ b/admin/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * eGroupWare - eTemplates for Application admin * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2010-01-31 00:50 + * generated by soetemplate::dump4setup() 2010-01-31 04:31 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package admin @@ -33,11 +33,11 @@ $templ_data[] = array('name' => 'admin.categories.delete','template' => '','lang { }','modified' => '1264754384',); -$templ_data[] = array('name' => 'admin.categories.edit','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:2:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:10:{i:0;a:10:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c5";s:3:"row";s:2:"c7";s:3:"row";s:2:"c6";s:3:"row";s:2:"c8";s:3:"row";s:2:"h7";s:15:",@appname=phpgw";s:2:"h2";s:2:"25";s:2:"h1";s:6:",!@msg";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,parent";s:5:"label";s:15:"Parent category";}s:1:"B";a:3:{s:4:"type";s:10:"select-cat";s:4:"size";s:25:"None,,,$cont[appname],,-1";s:4:"name";s:6:"parent";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:7:",,,name";s:5:"label";s:4:"Name";}s:1:"B";a:3:{s:4:"type";s:4:"text";s:4:"size";s:6:"50,150";s:4:"name";s:4:"name";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,description";s:5:"label";s:11:"Description";}s:1:"B";a:3:{s:4:"type";s:8:"textarea";s:4:"size";s:4:"5,50";s:4:"name";s:11:"description";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,cat_data[color]";s:5:"label";s:5:"Color";}s:1:"B";a:2:{s:4:"type";s:11:"colorpicker";s:4:"name";s:11:"data[color]";}}i:6;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:17:",,,cat_data[icon]";s:5:"label";s:4:"Icon";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:6:"select";s:4:"name";s:10:"data[icon]";s:4:"size";s:4:"None";s:8:"onchange";s:73:"document.getElementById(\'icon_url\').src = \'$cont[base_url]\' + this.value;";}i:2;a:3:{s:4:"type";s:5:"image";s:4:"name";s:8:"icon_url";s:4:"span";s:9:",leftPad5";}}}i:7;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:11:"Application";}s:1:"B";a:3:{s:4:"type";s:10:"select-app";s:4:"name";s:7:"appname";s:8:"readonly";s:1:"1";}}i:8;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"Modified";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:8:"last_mod";s:8:"readonly";s:1:"1";}}i:9;a:2:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";}i:2;a:3:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";}}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:10:"buttononly";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";}i:2;a:6:{s:4:"type";s:10:"buttononly";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:20:"Delete this category";s:7:"onclick";s:157:"set_style_by_class(\'tr\',\'confirmSubs\',\'visibility\',\'$cont[children]\'?\'visible\':\'collapse\'); set_style_by_class(\'fieldset\',\'confirmDelete\',\'display\',\'block\');";}}}}s:4:"rows";i:9;s:4:"cols";i:2;}i:1;a:2:{s:4:"type";s:8:"template";s:4:"name";s:23:"admin.categories.delete";}}','size' => '','style' => '','modified' => '1264740967',); +$templ_data[] = array('name' => 'admin.categories.edit','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:2:{i:0;a:4:{s:4:"type";s:4:"grid";s:4:"data";a:11:{i:0;a:12:{s:2:"c2";s:2:"th";s:2:"c3";s:3:"row";s:2:"c4";s:7:"row,top";s:2:"c5";s:3:"row";s:2:"c7";s:3:"row";s:2:"c6";s:3:"row";s:2:"h7";s:15:",@appname=phpgw";s:2:"h2";s:2:"25";s:2:"h1";s:6:",!@msg";s:2:"c9";s:3:"row";s:2:"c8";s:3:"row";s:2:"h9";s:11:",!@last_mod";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"span";s:13:"all,redItalic";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:9:",,,parent";s:5:"label";s:15:"Parent category";}s:1:"B";a:3:{s:4:"type";s:10:"select-cat";s:4:"size";s:25:"None,,,$cont[appname],,-1";s:4:"name";s:6:"parent";}}i:3;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:7:",,,name";s:5:"label";s:4:"Name";}s:1:"B";a:3:{s:4:"type";s:4:"text";s:4:"size";s:6:"50,150";s:4:"name";s:4:"name";}}i:4;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,description";s:5:"label";s:11:"Description";}s:1:"B";a:3:{s:4:"type";s:8:"textarea";s:4:"size";s:4:"5,50";s:4:"name";s:11:"description";}}i:5;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,cat_data[color]";s:5:"label";s:5:"Color";}s:1:"B";a:2:{s:4:"type";s:11:"colorpicker";s:4:"name";s:11:"data[color]";}}i:6;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,data[icon]";s:5:"label";s:4:"Icon";}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:6:"select";s:4:"name";s:10:"data[icon]";s:4:"size";s:4:"None";s:8:"onchange";s:73:"document.getElementById(\'icon_url\').src = \'$cont[base_url]\' + this.value;";}i:2;a:3:{s:4:"type";s:5:"image";s:4:"name";s:8:"icon_url";s:4:"span";s:9:",leftPad5";}}}i:7;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:11:"Application";}s:1:"B";a:4:{s:4:"type";s:10:"select-app";s:4:"name";s:7:"appname";s:8:"readonly";s:1:"1";s:4:"size";s:16:"All applications";}}i:8;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:8:",,,owner";s:5:"label";s:19:"Limit to members of";}s:1:"B";a:4:{s:4:"type";s:14:"select-account";s:4:"size";s:16:"All users,groups";s:4:"name";s:5:"owner";s:4:"help";s:51:"Limit global category to members of a certain group";}}i:9;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"Modified";}s:1:"B";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:8:"last_mod";s:8:"readonly";s:1:"1";}}i:10;a:2:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:3:{s:4:"type";s:6:"button";s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";}i:2;a:3:{s:4:"type";s:6:"button";s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";}}s:1:"B";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"2";i:1;a:4:{s:4:"type";s:10:"buttononly";s:4:"name";s:14:"button[cancel]";s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";}i:2;a:6:{s:4:"type";s:10:"buttononly";s:5:"label";s:6:"Delete";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"help";s:20:"Delete this category";s:7:"onclick";s:157:"set_style_by_class(\'tr\',\'confirmSubs\',\'visibility\',\'$cont[children]\'?\'visible\':\'collapse\'); set_style_by_class(\'fieldset\',\'confirmDelete\',\'display\',\'block\');";}}}}s:4:"rows";i:10;s:4:"cols";i:2;}i:1;a:2:{s:4:"type";s:8:"template";s:4:"name";s:23:"admin.categories.delete";}}','size' => '','style' => '','modified' => '1264740967',); $templ_data[] = array('name' => 'admin.categories.index','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:2:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:1:{s:2:"h1";s:6:",!@msg";}i:1;a:1:{s:1:"A";a:4:{s:4:"type";s:5:"label";s:4:"name";s:3:"msg";s:5:"align";s:6:"center";s:4:"span";s:13:"all,redItalic";}}i:2;a:1:{s:1:"A";a:3:{s:4:"type";s:9:"nextmatch";s:4:"size";s:4:"rows";s:4:"name";s:2:"nm";}}i:3;a:1:{s:1:"A";a:4:{s:4:"type";s:10:"buttononly";s:5:"label";s:3:"Add";s:4:"name";s:3:"add";s:7:"onclick";s:193:"window.open(egw::link(\'/index.php\',\'menuaction=admin.admin_categories.edit&appname={$cont[nm][appname]}\'),\'_blank\',\'dependent=yes,width=600,height=300,scrollbars=yes,status=yes\'); return false;";}}}s:4:"rows";i:3;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}i:1;a:2:{s:4:"type";s:8:"template";s:4:"name";s:23:"admin.categories.delete";}}','size' => '100%','style' => '.level0 { font-weight: bold; }','modified' => '1264657515',); -$templ_data[] = array('name' => 'admin.categories.index.rows','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:6:{s:2:"c1";s:2:"th";s:2:"c2";s:13:"$row_cont[id]";s:1:"E";s:2:"80";s:1:"D";s:2:"40";s:1:"H";s:2:"1%";s:1:"G";s:2:"30";}i:1;a:8:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:4:"name";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:11:"description";}s:1:"C";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:7:"appname";s:5:"label";s:11:"Application";}s:1:"D";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:4:"Icon";s:4:"name";s:4:"icon";s:5:"align";s:6:"center";}s:1:"E";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:5:"Color";s:4:"name";s:5:"color";}s:1:"F";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:8:"Modified";s:4:"name";s:8:"last_mod";}s:1:"G";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:8:"Children";s:4:"name";s:4:"subs";s:5:"align";s:6:"center";}s:1:"H";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:2;a:8:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:4:"html";s:4:"name";s:20:"${row}[level_spacer]";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:12:"${row}[name]";s:4:"span";s:17:",$row_cont[class]";}}s:1:"B";a:2:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[description]";}s:1:"C";a:4:{s:4:"type";s:10:"select-app";s:4:"name";s:15:"${row}[appname]";s:4:"size";s:6:"Global";s:8:"readonly";s:1:"1";}s:1:"D";a:4:{s:4:"type";s:5:"image";s:4:"name";s:16:"${row}[icon_url]";s:5:"label";s:23:"{$row_cont[data][icon]}";s:5:"align";s:6:"center";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[data][color]";}s:1:"F";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:16:"${row}[last_mod]";s:8:"readonly";s:1:"1";}s:1:"G";a:3:{s:4:"type";s:5:"label";s:4:"name";s:12:"${row}[subs]";s:5:"align";s:6:"center";}s:1:"H";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"3,,0,0";i:1;a:5:{s:4:"type";s:10:"buttononly";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"name";s:19:"edit[$row_cont[id]]";s:7:"onclick";s:185:"window.open(egw::link(\'/index.php\',\'menuaction=admin.admin_categories.edit&cat_id=$row_cont[id]\'),\'_blank\',\'dependent=yes,width=600,height=300,scrollbars=yes,status=yes\'); return false;";}i:2;a:5:{s:4:"type";s:10:"buttononly";s:4:"size";s:3:"new";s:5:"label";s:7:"Add sub";s:4:"name";s:18:"add[$row_cont[id]]";s:7:"onclick";s:208:"window.open(egw::link(\'/index.php\',\'menuaction=admin.admin_categories.edit&parent=$row_cont[id]&appname=$cont[appname]\'),\'_blank\',\'dependent=yes,width=600,height=300,scrollbars=yes,status=yes\'); return false;";}i:3;a:7:{s:4:"type";s:10:"buttononly";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"help";s:20:"Delete this category";s:7:"onclick";s:246:"document.getElementById(\'exec[delete][cat_id]\').value=\'$row_cont[id]\'; set_style_by_class(\'tr\',\'confirmSubs\',\'visibility\',\'$row_cont[children]\'?\'visible\':\'collapse\'); set_style_by_class(\'fieldset\',\'confirmDelete\',\'display\',\'block\'); return false;";s:4:"span";s:9:",leftPad5";}}}}s:4:"rows";i:2;s:4:"cols";i:8;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1264657599',); +$templ_data[] = array('name' => 'admin.categories.index.rows','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:6:{s:2:"c1";s:2:"th";s:2:"c2";s:13:"$row_cont[id]";s:1:"E";s:2:"40";s:1:"H";s:2:"30";s:1:"I";s:2:"1%";s:1:"F";s:2:"80";}i:1;a:9:{s:1:"A";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:4:"Name";s:4:"name";s:4:"name";}s:1:"B";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:11:"Description";s:4:"name";s:11:"description";}s:1:"C";a:3:{s:4:"type";s:16:"nextmatch-header";s:4:"name";s:3:"app";s:5:"label";s:11:"Application";}s:1:"D";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:19:"Limit to members of";s:4:"name";s:5:"owner";}s:1:"E";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:4:"Icon";s:4:"name";s:4:"icon";s:5:"align";s:6:"center";}s:1:"F";a:3:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:5:"Color";s:4:"name";s:5:"color";}s:1:"G";a:3:{s:4:"type";s:20:"nextmatch-sortheader";s:5:"label";s:8:"Modified";s:4:"name";s:8:"last_mod";}s:1:"H";a:4:{s:4:"type";s:16:"nextmatch-header";s:5:"label";s:8:"Children";s:4:"name";s:4:"subs";s:5:"align";s:6:"center";}s:1:"I";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:2;a:9:{s:1:"A";a:4:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"2,,0,0";i:1;a:2:{s:4:"type";s:4:"html";s:4:"name";s:20:"${row}[level_spacer]";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"name";s:12:"${row}[name]";s:4:"span";s:17:",$row_cont[class]";}}s:1:"B";a:2:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[description]";}s:1:"C";a:3:{s:4:"type";s:10:"select-app";s:4:"name";s:15:"${row}[appname]";s:8:"readonly";s:1:"1";}s:1:"D";a:4:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"${row}[owner]";s:8:"readonly";s:1:"1";s:4:"size";s:16:"All users,groups";}s:1:"E";a:4:{s:4:"type";s:5:"image";s:4:"name";s:16:"${row}[icon_url]";s:5:"label";s:23:"{$row_cont[data][icon]}";s:5:"align";s:6:"center";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:4:"name";s:19:"${row}[data][color]";}s:1:"G";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:16:"${row}[last_mod]";s:8:"readonly";s:1:"1";}s:1:"H";a:3:{s:4:"type";s:5:"label";s:4:"name";s:12:"${row}[subs]";s:5:"align";s:6:"center";}s:1:"I";a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:6:"3,,0,0";i:1;a:5:{s:4:"type";s:10:"buttononly";s:4:"size";s:4:"edit";s:5:"label";s:4:"Edit";s:4:"name";s:19:"edit[$row_cont[id]]";s:7:"onclick";s:185:"window.open(egw::link(\'/index.php\',\'menuaction=admin.admin_categories.edit&cat_id=$row_cont[id]\'),\'_blank\',\'dependent=yes,width=600,height=380,scrollbars=yes,status=yes\'); return false;";}i:2;a:5:{s:4:"type";s:10:"buttononly";s:4:"size";s:3:"new";s:5:"label";s:7:"Add sub";s:4:"name";s:18:"add[$row_cont[id]]";s:7:"onclick";s:208:"window.open(egw::link(\'/index.php\',\'menuaction=admin.admin_categories.edit&parent=$row_cont[id]&appname=$cont[appname]\'),\'_blank\',\'dependent=yes,width=600,height=380,scrollbars=yes,status=yes\'); return false;";}i:3;a:7:{s:4:"type";s:10:"buttononly";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:4:"name";s:21:"delete[$row_cont[id]]";s:4:"help";s:20:"Delete this category";s:7:"onclick";s:246:"document.getElementById(\'exec[delete][cat_id]\').value=\'$row_cont[id]\'; set_style_by_class(\'tr\',\'confirmSubs\',\'visibility\',\'$row_cont[children]\'?\'visible\':\'collapse\'); set_style_by_class(\'fieldset\',\'confirmDelete\',\'display\',\'block\'); return false;";s:4:"span";s:9:",leftPad5";}}}}s:4:"rows";i:2;s:4:"cols";i:9;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1264657599',); $templ_data[] = array('name' => 'admin.cmds','template' => '','lang' => '','group' => '0','version' => '1.5.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:9:"nextmatch";s:4:"size";s:15:"admin.cmds.rows";s:4:"name";s:2:"nm";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '','modified' => '1195518120',); diff --git a/admin/templates/default/categories.edit.xet b/admin/templates/default/categories.edit.xet index 300792c260..8a73760208 100644 --- a/admin/templates/default/categories.edit.xet +++ b/admin/templates/default/categories.edit.xet @@ -80,7 +80,7 @@ - + @@ -91,10 +91,16 @@ - + + + + + + + diff --git a/admin/templates/default/categories.index.xet b/admin/templates/default/categories.index.xet index a0adbc54e3..fe8e60ef86 100644 --- a/admin/templates/default/categories.index.xet +++ b/admin/templates/default/categories.index.xet @@ -7,6 +7,7 @@ + @@ -17,7 +18,8 @@ - + + @@ -31,15 +33,18 @@ - + + + + - - + + diff --git a/etemplate/inc/class.select_widget.inc.php b/etemplate/inc/class.select_widget.inc.php index 8011cdf909..693709714b 100644 --- a/etemplate/inc/class.select_widget.inc.php +++ b/etemplate/inc/class.select_widget.inc.php @@ -193,7 +193,7 @@ class select_widget { $s = str_repeat(' ',$cat['level']) . stripslashes($cat['name']); - if ($cat['app_name'] == categories::GLOBAL_APPNAME || $cat['owner'] == categories::GLOBAL_ACCOUNT) + if (categories::is_global($cat)) { $s .= ' ♦'; } @@ -225,7 +225,8 @@ class select_widget $cell['no_lang'] = True; foreach(is_array($value) ? $value : (strpos($value,',') !== false ? explode(',',$value) : array($value)) as $id) { - $cell['sel_options'][$id] = $this->accountInfo($id,$acc,$type2,$type=='both'); + $cell['sel_options'][$id] = !$id && !is_numeric($rows) ? lang($rows) : + $this->accountInfo($id,$acc,$type2,$type=='both'); } break; } diff --git a/phpgwapi/inc/class.categories.inc.php b/phpgwapi/inc/class.categories.inc.php index 9fee974b4b..0ef6597e46 100644 --- a/phpgwapi/inc/class.categories.inc.php +++ b/phpgwapi/inc/class.categories.inc.php @@ -92,7 +92,16 @@ class categories /** * account_id for global categories */ - const GLOBAL_ACCOUNT = -1; + const GLOBAL_ACCOUNT = 0; + + /** + * Owners for global accounts + * + * Usually the users group memberships and self::GLOBAL_ACCOUNT + * + * @var array + */ + private $global_owners = array(self::GLOBAL_ACCOUNT); /** * constructor for categories class @@ -104,13 +113,16 @@ class categories { if (!$app_name) $app_name = $GLOBALS['egw_info']['flags']['currentapp']; - if ($accountid == self::GLOBAL_ACCOUNT) + if ($accountid === self::GLOBAL_ACCOUNT || + $accountid < 0 && $GLOBALS['egw']->accounts->exists($accountid) == 2) { - $this->account_id = self::GLOBAL_ACCOUNT; + $this->account_id = (int) $accountid; } else { $this->account_id = (int) get_account_id($accountid); + $this->global_owners = $GLOBALS['egw']->accounts->memberships($this->account_id,true); + $this->global_owners[] = self::GLOBAL_ACCOUNT; } $this->app_name = $app_name; $this->db = $GLOBALS['egw']->db; @@ -466,22 +478,24 @@ class categories */ public function check_perms($needed,$category) { - if (!is_array($category) && !($category = self::$cache[$category])) + if (!is_array($category) && !($category = self::read($category))) { return null; } // The user for the global cats has id self::GLOBAL_ACCOUNT, this one has full access to all global cats - if ($this->account_id == self::GLOBAL_ACCOUNT && ($category['appname'] == self::GLOBAL_APPNAME - || $category['appname'] == $this->app_name && $category['owner'] == self::GLOBAL_ACCOUNT)) + if ($this->account_id == self::GLOBAL_ACCOUNT && ($category['appname'] == self::GLOBAL_APPNAME || + $category['appname'] == $this->app_name && self::is_global($category))) { + //echo "

".__METHOD__."($needed,$category[name]) access because class instanciated for GLOBAL ACCOUNT

\n"; return true; } // Read access to global categories - if ($needed == EGW_ACL_READ && ($category['appname'] == self::GLOBAL_APPNAME - || $category['appname'] == $this->app_name && $category['owner'] == self::GLOBAL_ACCOUNT)) + if ($needed == EGW_ACL_READ && in_array($category['owner'],$this->global_owners) && + ($category['appname'] == self::GLOBAL_APPNAME || $category['appname'] == $this->app_name)) { + //echo "

".__METHOD__."($needed,$category[name]) access because global via memberships

\n"; return true; } @@ -659,7 +673,7 @@ class categories foreach($cats as $k => $cat) { $cats[$k]['weight'] = 100 * ($cat['name'] == $cat_name) + - 10 * ($cat['owner'] == $this->account_id ? 3 : ($cat['owner'] == self::GLOBAL_ACCOUNT ? 2 : 1)) + + 10 * ($cat['owner'] == $this->account_id ? 3 : ($cat['owner'] <= self::GLOBAL_ACCOUNT ? 2 : 1)) + ($cat['appname'] != self::GLOBAL_APPNAME); } // sort heighest weight to the top @@ -667,6 +681,19 @@ class categories } return $cache[$cat['cat_name']] = (int) $cats[0]['id']; } + + /** + * Check if catgory is global (owner <= 0 || appname == 'phpgw') + * + * @param int|array $cat + * @return boolean + */ + static function is_global($cat) + { + if (!is_array($cat) && !($cat = self::read($cat))) return null; // cat not found + + return $cat['owner'] <= self::GLOBAL_ACCOUNT || $cat['appname'] == self::GLOBAL_APPNAME; + } /** * return category information for a given id @@ -781,12 +808,27 @@ class categories //error_log(__METHOD__."() ".count($cache)." cats restored: ".function_backtrace()); return self::$cache =& $cache; } + // check if we are already updated to global owner == 0, if not do it now + if (!$GLOBALS['egw']->db->select(self::TABLE,'COUNT(*)','cat_owner=0',__LINE__,__FILE__)->fetchColumn()) + { + $GLOBALS['egw']->db->update(self::TABLE,'cat_owner=0','cat_owner=-1',__LINE__,__FILE__); + $GLOBALS['egw']->db->insert(self::TABLE,array( + 'cat_main' => 0, + 'cat_parent' => 0, + 'cat_level' => 0, + 'cat_owner' => 0, + 'cat_appname' => '*update*', + 'cat_name' => 'global=0', + 'cat_description' => 'global=0', + ),false,__LINE__,__FILE__); + } self::$cache = array(); // read all cats (cant use $this->db!) foreach($GLOBALS['egw']->db->select(self::TABLE,'*',false,__LINE__,__FILE__, false,'ORDER BY cat_main, cat_level, cat_name ASC') as $cat) { $cat = egw_db::strip_array_keys($cat,'cat_'); + if ($cat['appname'] == '*update*') continue; // --> ignore update marker $cat['app_name'] = $cat['appname']; // backlink children to their parent if ($cat['parent']) @@ -898,7 +940,7 @@ class categories } $s .= '>'.str_repeat(' ',$cat['level']); $s .= $GLOBALS['egw']->strip_html($cat['name']); - if ($cat['app_name'] == self::GLOBAL_APPNAME || $cat['owner'] == 'self::GLOBAL_ACCOUNT') + if (self::is_global($cat)) { $s .= ' ♦'; } From 2805cc1904736f62616c668de02b2d4ef84b27d7 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sun, 31 Jan 2010 04:41:13 +0000 Subject: [PATCH 02/22] adapting resources install to changed categories class (cat_owner=0 instead -1) --- resources/setup/default_records.inc.php | 51 ++++++++++++------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/resources/setup/default_records.inc.php b/resources/setup/default_records.inc.php index d7406dfbd8..46a0f23beb 100644 --- a/resources/setup/default_records.inc.php +++ b/resources/setup/default_records.inc.php @@ -1,29 +1,28 @@ - * @version $Id$ - */ +/** + * eGroupWare - resources + * http://www.egroupware.org + * + * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License + * @package resources + * @author Cornelius Weiss + * @version $Id$ + */ - $resources_table_prefix = 'egw_resources'; - - // Add a general category for resources - $GLOBALS['egw_setup']->db->insert($GLOBALS['egw_setup']->cats_table,array('cat_parent' => 0, 'cat_owner' => -1,'cat_access' => 'public','cat_appname' => 'resources','cat_name' => 'General resources','cat_description' => 'This category has been added by setup','last_mod' => time()),false,__LINE__,__FILE__); - $cat_id = $GLOBALS['egw_setup']->db->get_last_insert_id($GLOBALS['egw_setup']->cats_table,'cat_id'); - - // Give default group all rights to this general cat - $defaultgroup = $GLOBALS['egw_setup']->add_account('Default','Default','Group',False,False); - $GLOBALS['egw_setup']->add_acl('resources','run',$defaultgroup); - $GLOBALS['egw_setup']->add_acl('resources',"L$cat_id",$defaultgroup,399); - - // Add two rooms to give user an idea of what resources is... - $oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Meeting room 1',$cat_id,1,'cat_src',-1)"); - $oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Meeting room 2',$cat_id,1,'cat_src',-1)"); - $res_id = $oProc->m_odb->get_last_insert_id($resources_table_prefix,'res_id'); - $oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Fixed Beamer',$cat_id,0,'cat_src',$res_id)"); - +$resources_table_prefix = 'egw_resources'; +// Add a general category for resources +$GLOBALS['egw_setup']->db->insert($GLOBALS['egw_setup']->cats_table,array('cat_parent' => 0, 'cat_owner' => categories::GLOBAL_ACCOUNT,'cat_access' => 'public','cat_appname' => 'resources','cat_name' => 'General resources','cat_description' => 'This category has been added by setup','last_mod' => time()),false,__LINE__,__FILE__); +$cat_id = $GLOBALS['egw_setup']->db->get_last_insert_id($GLOBALS['egw_setup']->cats_table,'cat_id'); + +// Give default group all rights to this general cat +$defaultgroup = $GLOBALS['egw_setup']->add_account('Default','Default','Group',False,False); +$GLOBALS['egw_setup']->add_acl('resources','run',$defaultgroup); +$GLOBALS['egw_setup']->add_acl('resources',"L$cat_id",$defaultgroup,399); + +// Add two rooms to give user an idea of what resources is... +$oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Meeting room 1',$cat_id,1,'cat_src',-1)"); +$oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Meeting room 2',$cat_id,1,'cat_src',-1)"); +$res_id = $oProc->m_odb->get_last_insert_id($resources_table_prefix,'res_id'); +$oProc->query("INSERT INTO {$resources_table_prefix} (name,cat_id,bookable,picture_src,accessory_of) VALUES ( 'Fixed Beamer',$cat_id,0,'cat_src',$res_id)"); + \ No newline at end of file From 6e258109d8307f3495b6cb28ebb35b28d1f43b42 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Mon, 1 Feb 2010 10:35:05 +0000 Subject: [PATCH 03/22] as you can now see other apps in calendar, you must make sure you read only true calendar events for recurring dates, participants and customfields --- calendar/inc/class.calendar_so.inc.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index 131e5deca8..4e0a768275 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -460,22 +460,22 @@ class calendar_so $recur_dates[] = $row['cal_recur_date']; } if ($row['participants']) - { - $row['participants'] = explode(',',$row['participants']); - $row['participants'] = array_combine($row['participants'], - array_fill(0,count($row['participants']),'')); - } - else - { - $row['participants'] = array(); - } - $row['alarm'] = array(); + { + $row['participants'] = explode(',',$row['participants']); + $row['participants'] = array_combine($row['participants'], + array_fill(0,count($row['participants']),'')); + } + else + { + $row['participants'] = array(); + } + $row['alarm'] = array(); $row['recur_exception'] = $row['recur_exception'] ? explode(',',$row['recur_exception']) : array(); $events[$id] = egw_db::strip_array_keys($row,'cal_'); } //_debug_array($events); - if (count($events)) + if (count($ids)) { // now ready all users with the given cal_id AND (cal_recur_date=0 or the fitting recur-date) // This will always read the first entry of each recuring event too, we eliminate it later From 995940eeb53038af765d204dc5cc7ac5e4b74eda Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 2 Feb 2010 11:23:11 +0000 Subject: [PATCH 04/22] small improvements regarding the tooltip behavior for calendar --- calendar/inc/class.calendar_uiviews.inc.php | 11 ++++++++--- phpgwapi/inc/class.html.inc.php | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php index 666c1300ed..f6c9768310 100644 --- a/calendar/inc/class.calendar_uiviews.inc.php +++ b/calendar/inc/class.calendar_uiviews.inc.php @@ -1351,12 +1351,19 @@ class calendar_uiviews extends calendar_ui 'color' => $color, ); } + + $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.$owner; + $ttip_options = array( 'BorderWidth' => 0, // as we use our round borders 'Padding' => 0, 'Sticky' => true, // make long tooltips scrollable 'ClickClose' => true, - 'FollowMouse' => false, + 'FOLLOWMOUSE' => false, + 'DELAY' => 600, + 'FIX' => "['".$draggableID."',10,-5]", + 'SHADOW' => false, + 'WIDTH' => -400, ); $ie_fix = ''; if (html::$user_agent == 'msie') // add a transparent image to make the event "opaque" to mouse events @@ -1383,8 +1390,6 @@ class calendar_uiviews extends calendar_ui $style = 'position: relative; margin-top: 3px;'; } - $draggableID = 'drag_'.$event['id'].'_O'.$event['owner'].'_C'.$owner; - $html = $indent.'
Date: Tue, 2 Feb 2010 11:35:13 +0000 Subject: [PATCH 05/22] fixed position of tooltip did not fix the problem intended, and had unwanted sideeffects --- calendar/inc/class.calendar_uiviews.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php index f6c9768310..8e3eff694c 100644 --- a/calendar/inc/class.calendar_uiviews.inc.php +++ b/calendar/inc/class.calendar_uiviews.inc.php @@ -145,6 +145,7 @@ class calendar_uiviews extends calendar_ui (count(explode(',',$this->owner)) == 1 ? ': '.$this->bo->participant_name($this->owner) : ''); // standard params for calling bocal::search for all views + $this->owner = str_replace('%2C',',',$this->owner); $this->search_params = array( 'start' => $this->date, 'cat_id' => $this->cat_id, @@ -1361,7 +1362,7 @@ class calendar_uiviews extends calendar_ui 'ClickClose' => true, 'FOLLOWMOUSE' => false, 'DELAY' => 600, - 'FIX' => "['".$draggableID."',10,-5]", + //'FIX' => "['".$draggableID."',10,-5]", 'SHADOW' => false, 'WIDTH' => -400, ); From f9a3ab52dc32844243ea62c7cf220e79d8bd0f32 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 2 Feb 2010 13:29:51 +0000 Subject: [PATCH 06/22] only do the integration query, if currentapp is calendar, because of performance issues thereof (addressbook fetches the last calendar event(, which fetchs the infologs)) --- calendar/inc/class.calendar_so.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calendar/inc/class.calendar_so.inc.php b/calendar/inc/class.calendar_so.inc.php index 4e0a768275..1a5094a132 100644 --- a/calendar/inc/class.calendar_so.inc.php +++ b/calendar/inc/class.calendar_so.inc.php @@ -558,7 +558,7 @@ class calendar_so */ private static function get_union_selects(array &$selects,$start,$end,$users,$cat_id,$filter,$query) { - if (in_array(basename($_SERVER['SCRIPT_FILENAME']),array('groupdav.php','rpc.php','xmlrpc.php'))) + if (in_array(basename($_SERVER['SCRIPT_FILENAME']),array('groupdav.php','rpc.php','xmlrpc.php')) || $GLOBALS['egw_info']['flags']['currentapp'] != 'calendar') { return; // disable integration for GroupDAV, SyncML, ... } From b654383b11b2ff6fbaec87dbc3e7b3beb4a1d108 Mon Sep 17 00:00:00 2001 From: Klaus Leithoff Date: Tue, 2 Feb 2010 15:44:40 +0000 Subject: [PATCH 07/22] translations provided by G.Mueller --- admin/lang/egw_de.lang | 148 ++++++++++++++++++++--------------------- admin/lang/egw_en.lang | 8 ++- 2 files changed, 79 insertions(+), 77 deletions(-) diff --git a/admin/lang/egw_de.lang b/admin/lang/egw_de.lang index 7a77db3d7a..99937c5852 100644 --- a/admin/lang/egw_de.lang +++ b/admin/lang/egw_de.lang @@ -3,12 +3,12 @@ %1 acl records of not (longer) existing accounts deleted. admin de %1 ACL Einträge von nicht (mehr) existierenden Accounts gelöscht. %1 class not instanciated admin de %1 Klasse nicht instanziert %1 group %2 admin de %1 Gruppe %2 -%1 is no command! admin de %1 ist kein Kommando! +%1 is no command! admin de %1 ist kein Befehl ! %1 log entries deleted. admin de %1 Protokolleinträge gelöscht. -%1 not found or not executable !!! admin de %1 nicht gefunden oder nicht ausführbar!!! +%1 not found or not executable !!! admin de %1 nicht gefunden oder nicht ausführbar !!! %1 rights for %2 and applications %3 admin de %1 Rechte für %2 und Anwendung(en) %3 %1 user %2 admin de %1 Benutzer %2 -(default no, leave it off if you dont use it) admin de (Vorgabe Nein, ausgeschaltet lassen, wenn nicht benützt) +(default no, leave it off if you dont use it) admin de (Vorgabe Nein, ausgeschaltet lassen, wenn nicht benutzt) (stored password will not be shown here) admin de (Gespeichertes Passwort wird hier nicht angezeigt) (to install new applications use
setup [manage applications] !!!) admin de (Zur Installation neuer Anwendungen verwenden Sie bitte
Setup [Anwendungen Verwalten] !!!) - type admin de -Typ @@ -22,7 +22,7 @@ account has been updated common de Konto wurde aktualisiert account list admin de Benutzerkonten anzeigen account permissions admin de Zugriffsrechte account preferences admin de Einstellungen der Benutzerkonten -account-id's have to be integers! admin de Konten-Ids müssen vom Typ Integer (Zahl) sein! +account-id's have to be integers! admin de Konten-ID`s müssen vom Typ Integer (Zahl) sein! acl manager admin de ACL-Manager acl rights common de ACL-Rechte action admin de Aktion @@ -32,11 +32,11 @@ add a category admin de Eine Kategorie hinzufügen add a group admin de Eine Gruppe hinzufügen add a new account. admin de Neues Benutzerkonto anlegen add a new remote instance admin de Eine neue entfernte Instanz hinzufügen -add a subcategory admin de Ein Unterkategorie hizufügen +add a subcategory admin de Ein Unterkategorie hinzufügen add a user admin de Einen Benutzer hinzufügen add account admin de Benutzerkonto hinzufügen add application admin de Anwendung hinzufügen -add auto-created users to this group ('default' will be attempted if this is empty.) admin de Automatisch erzeuge Benutzer in diese Gruppe aufnehmen ("default" wird versucht wenn sie hier nichts eintragen.) +add auto-created users to this group ('default' will be attempted if this is empty.) admin de Automatisch erzeugte Benutzer in diese Gruppe aufnehmen ("default" wird versucht wenn sie hier nichts eintragen.) add global category admin de Globale Kategorie hinzufügen add global category for %1 admin de Globale Kategorie für %1 hinzufügen add group admin de Gruppe hinzufügen @@ -45,14 +45,14 @@ add new application admin de Neue Anwendung hinzufügen add peer server admin de Server zu Serververbund hinzufügen add sub-category admin de Unterkategorie hinzufügen admin email admin de E-Mail-Administration -admin email addresses (comma-separated) to be notified about the blocking (empty for no notify) admin de E-Mail-Adressen der Administratoren (mit Komma getrennt) die über eine Sperre benachrichtigt werden sollen (leer für keine Benachrichtigung) +admin email addresses (comma-separated) to be notified about the blocking (empty for no notify) admin de E-Mail-Adressen der Administratoren (mit Komma getrennt) die über eine Sperre benachrichtigt werden sollen ('leer' für keine Benachrichtigung) admin name admin de Admininistratorname admin queue and history admin de Admin Queue und Historie administration admin de Administration admins admin de Administatoren advanced options admin de erweiterte Optionen -after how many unsuccessful attempts to login, an account should be blocked (default 3) ? admin de Nach wievielen erfolglosen Versuchen sich anzumelden, soll ein Benutzerkonto gesperrt werden (Vorgabe 3)? -after how many unsuccessful attempts to login, an ip should be blocked (default 3) ? admin de Nach wievielen erfolglosen Versuchen sich anzumelden soll eine IP-Adresse gesperrt werden (Vorgabe 3)? +after how many unsuccessful attempts to login, an account should be blocked (default 3) ? admin de Nach wievielen erfolglosen Anmeldeversuchen soll ein Benutzerkonto gesperrt werden (Vorgabe 3)? +after how many unsuccessful attempts to login, an ip should be blocked (default 3) ? admin de Nach wievielen erfolglosen Anmeldeversuchen soll eine IP-Adresse gesperrt werden (Vorgabe 3)? aliases admin de E-Mail-Alias all records and account information will be lost! admin de Alle Datensätze und Kontoinformationen sind dann verloren! all users admin de Alle Benutzer @@ -60,12 +60,12 @@ allow anonymous access to this app admin de Anonymen Zugriff auf diese Anwendung allow remote administration from following install id's (comma separated) admin de Erlaube die Remote-Verwaltung identifiziert durch folgende (Komma separierte) Install IDs alternate email address admin de Alternative E-Mail-Adresse anonymous user admin de Anonymer Benutzer -anonymous user (not shown in list sessions) admin de Anonymer Benutzer (wird bei Sitzungen anzeigen nicht angezeigt) +anonymous user (not shown in list sessions) admin de Anonymer Benutzer (wird bei 'Sitzungen anzeigen' nicht angezeigt) anonymous user does not exist! admin de Anonymer Benutzer existiert NICHT! anonymous user has no run-rights for the application! admin de Anonymer Benutzer hat KEINE Ausführungsrechte für die Anwendung! appearance admin de Aussehen application admin de Anwendung -application '%1' not found (maybe not installed or misspelled)! admin de Anwendung '%1' nicht gefunden. (eventuell nicht Installiert oder Falsch geschrieben)! +application '%1' not found (maybe not installed or misspelled)! admin de Anwendung '%1' nicht gefunden. (eventuell nicht installiert oder falsch geschrieben)! application name admin de Name der Anwendung application title admin de Titel der Anwendung applications admin de Anwendungen @@ -74,32 +74,32 @@ applications run rights updated. admin de Anwendungsrechte aktualisiert. applies the changes admin de übernimmt Änderungen apply the changes admin de Änderungen übernehmen archive: zip or tar admin de Archive: ZIP oder TAR -are you sure you want to delete the application %1 ? admin de Sind Sie sicher, dass Sie die Anwendung %1 löschen wollen? -are you sure you want to delete this account ? admin de Sind Sie sicher, dass Sie dieses Konto löschen wollen? +are you sure you want to delete the application %1 ? admin de Sind Sie sicher, dass Sie die Anwendung %1 löschen möchten? +are you sure you want to delete this account ? admin de Sind Sie sicher, dass Sie dieses Konto löschen möchten? are you sure you want to delete this application ? admin de Sind Sie sicher, dass Sie diese Applikation löschen möchten? -are you sure you want to delete this category ? common de Sind Sie sicher, dass Sie diese Kategorie löschen wollen? +are you sure you want to delete this category ? common de Sind Sie sicher, dass Sie diese Kategorie löschen möchten? are you sure you want to delete this global category ? admin de Sind Sie sicher, dass Sie diese globale Kategorie löschen möchten? -are you sure you want to delete this group ? admin de Sind Sie sicher, dass Sie diese Gruppe löschen wollen ? -are you sure you want to delete this server? admin de Sind sie sicher, dass sie diesen Server löschen wollen ? -are you sure you want to kill this session ? admin de Sind Sie sicher, dass Sie diese Session beenden wollen ? +are you sure you want to delete this group ? admin de Sind Sie sicher, dass Sie diese Gruppe löschen möchten? +are you sure you want to delete this server? admin de Sind sie sicher, dass sie diesen Server löschen möchten? +are you sure you want to kill this session ? admin de Sind Sie sicher, dass Sie diese Session beenden möchten? async services last executed admin de Asynchroner Dienst zuletzt ausgeführt asynchronous timed services admin de Asynchroner zeitgesteuerter Dienst -asyncservices not yet installed or other error (%1) !!! admin de Asynchroner Dienst is noch nicht installiert oder ein anderer Fehler ist aufgetreten (%1) !!! -attempt to use correct mimetype for ftp instead of default 'application/octet-stream' admin de Soll versucht werden den richtigen MINE-typ für FTP zu verwenden, statt dem Vorgabewert "application/octet-stream" +asyncservices not yet installed or other error (%1) !!! admin de Asynchroner Dienst ist noch nicht installiert oder ein anderer Fehler ist aufgetreten (%1) !!! +attempt to use correct mimetype for ftp instead of default 'application/octet-stream' admin de Soll versucht werden, den richtigen MINE-typ für FTP zu verwenden, statt dem Vorgabewert "application/octet-stream" attribute accountstatus explained admin de Dies betrifft das Attribut -accountStatus- aus dem QMAIL Schema attribute mail explained admin de Dies betrifft das Attribut -mail- aus dem CORE Schema. Dieses Attribut darf nicht leer sein und wird gleichzeitig als E-Mail-Adresse innerhalb eGW verwendet. attribute mailalternateaddress explained admin de Dies betrifft das Attribut -mailAlternateAddress- aus dem QMAIL Schema. Das experimentelle Schema verwendet dies auch als Alias für mailLocalAddress. attribute mailforwardingaddress explained admin de Dies betrifft das Attribut -mailForwardingAddress- aus dem QMAIL Schema. Darf nicht leer sein. Der Begriff mailRoutingAddress wurde hierfür früher als Alias verwendet. -authentication / accounts admin de Benutzerauthentifizierung/Benutzerkonten +authentication / accounts admin de Benutzerauthentifizierung / Benutzerkonten auto create account records for authenticated users admin de Automatisch Benutzerkonten für authentifizierte Benutzer anlegen -back to the list admin de Zurück zur Liste +back to the list admin de zurück zur Liste bi-dir passthrough admin de Weiterleitung in beide Richtungen bi-directional admin de beide Richtungen bottom admin de unten calculate next run admin de nächste Ausführung berechnen -can change password admin de Darf Passwort ändern -cancel testjob! admin de Testjob abbrechen! -cancel this scheduled command admin de Dieses geplante Kommando abbrechen +can change password admin de darf Passwort ändern +cancel testjob! admin de Test-Job abbrechen! +cancel this scheduled command admin de Diesen geplanten Befehl abbrechen categories list admin de Liste der Kategorien category %1 has been saved ! admin de Kategorie %1 wurde gespeichert category list admin de Kategorieliste @@ -118,10 +118,10 @@ command scheduled to run at %1 admin de Ausführung des Befehls eingeplant am/um commercial: all sorts of companies admin de Kommerziell: alle Arten von Firmen complete path to aspell program admin de Vollständiger Pfad zum Programm ASPELL config password or md5 hash from the header.inc.php admin de Konfigurationspasswort oder md5 Hash von der header.inc.php Datei -cookie domain (default empty means use full domain name, for sitemgr eg. ".domain.com" allows to use the same cookie for egw.domain.com and www.domain.com) admin de Cookie Domain (Vorgabe leer bedeutet den kompletten Domainnamen, für SiteMgr erlaubt zB. ".domain.com" das gleiche Cookie für egw.domain.com und www.domain.com zu verwenden) +cookie domain (default empty means use full domain name, for sitemgr eg. ".domain.com" allows to use the same cookie for egw.domain.com and www.domain.com) admin de Cookie Domain (Vorgabe 'leer' bedeutet den kompletten Domainnamen, für SiteMgr erlaubt zB. ".domain.com" das gleiche Cookie für egw.domain.com und www.domain.com zu verwenden) cookie path (allows multiple egw sessions with different directories, has problemes with sitemgr!) admin de Cookie Pfad (erlaubt mehrere eGW Sitzungen mit unterschiedlichen Verzeichnissen, hat Probleme mit SiteMgr!) -could not remote execute the command admin de Kann das Kommando nicht Remote ausführen. -country admin de Nation +could not remote execute the command admin de Kann den Befehl nicht Remote ausführen. +country admin de Land country selection admin de Länderauswahl create group admin de Erstelle Gruppe created admin de Erstellt @@ -158,7 +158,7 @@ deny access to access log admin de Zugriff auf Zugangsprotokoll verbieten deny access to application registery admin de Zugriff auf Anwendungsdatenbank verbieten deny access to applications admin de Zugriff auf Anwendungen verbieten deny access to asynchronous timed services admin de Zugriff auf asynchroner zeitgesteuerter Dienst verbieten -deny access to current sessions admin de Zugriff auf aktuellen Sitzungen verbieten +deny access to current sessions admin de Zugriff auf aktuelle Sitzungen verbieten deny access to db backup and restore admin de Zugriff auf DB Datensicherung und Wiederherstellung verbieten deny access to error log admin de Zugriff auf Fehlerprotokoll verbieten deny access to global categories admin de Zugriff auf globalen Kategorien verbieten @@ -168,17 +168,17 @@ deny access to peer servers admin de Zugriff auf Serververbund verbieten deny access to phpinfo admin de Zugriff auf phpinfo verbieten deny access to site configuration admin de Zugriff auf Konfiguration der Anwendung verbieten deny access to user accounts admin de Zugriff auf Benutzerkonten verbieten -deny all users access to grant other users access to their entries ? admin de Allen Benutzern verbieten anderen Benutzern Zugriff zu ihren Daten zu gewähren? +deny all users access to grant other users access to their entries ? admin de Allen Benutzern verbieten, anderen Benutzern Zugriff zu ihren Daten zu gewähren? description can not exceed 255 characters in length ! admin de Die Beschreibung darf nicht länger als 255 Zeichen sein! -determines the order the fields are displayed admin de finded die Reihenfolge der angezeigten Felder +determines the order the fields are displayed admin de bestimmt die Reihenfolge der angezeigten Felder disable "auto completion" of the login form admin de Automatisches Vervollständigen der Logindaten abschalten disable wysiwyg-editor admin de WYSIWYG Editor (formatierter Text) abschalten disabled (not recomended) admin de abgeschaltet (nicht empfohlen) display admin de Anzeigen do not delete the category and return back to the list admin de Kategorie NICHT löschen und zurück zur Liste gehen -do you also want to delete all global subcategories ? admin de wollen Sie auch alle globalen Unterkategorien löschen? +do you also want to delete all global subcategories ? admin de Wollen Sie auch alle globalen Unterkategorien löschen? do you want to delete all global subcategories ? admin de Möchten Sie alle Globale Unterkategorien löschen? -do you want to move all global subcategories one level down ? admin de Wollen sie alle globalen Unterkategorien eine Ebene nach unten verschieben? +do you want to move all global subcategories one level down ? admin de Wollen Sie alle globalen Unterkategorien eine Ebene nach unten verschieben? document root (default) admin de Wurzelverzeichnis des Webservers (Vorgabe) each value is a line like [=