first take on preferences with et2, not yet working!

This commit is contained in:
Ralf Becker 2013-04-28 14:52:41 +00:00
parent 5eede4a8ef
commit c9bfdcab5c
4 changed files with 353 additions and 0 deletions

View File

@ -446,6 +446,8 @@ class preferences_hooks
} }
$file['common preferences'] = $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname=preferences'); $file['common preferences'] = $GLOBALS['egw']->link('/index.php','menuaction=preferences.uisettings.index&appname=preferences');
$file['new settings'] = $GLOBALS['egw']->link('/index.php','menuaction=preferences.preferences_settings.index&appname=preferences');
display_section('preferences',$file); display_section('preferences',$file);
} }

View File

@ -0,0 +1,205 @@
<?php
/**
* EGroupware: Preferences app UI for settings/preferences
*
* @link http://www.egroupware.org
* @author Ralf Becker <rb@stylite.de>
* @package preferences
* @copyright (c) 2013 by Ralf Becker <rb@stylite.de>
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$
*/
require_once EGW_INCLUDE_ROOT.'/etemplate/inc/class.etemplate.inc.php';
/**
* UI for settings / preferences
*/
class preferences_settings
{
/**
* Methods callable via menuaction
* @var array
*/
public $public_functions = array(
'index' => true,
);
/**
* App we work on
* @var string
*/
public $appname = 'preferences';
/**
* Preferences read by call_hook
* @var array
*/
public $settings = array();
/**
* Edit preferences
*
* @param array $content=null
* @param string $msg=''
*/
function index(array $content=null, $msg='')
{
$tpl = new etemplate_new('preferences.settings');
if (!is_array($content))
{
$appname = isset($_GET['appname']) ? $_GET['appname'] : 'preferences';
if (!$this->call_hook($appname))
{
throw new egw_exception_wrong_parameter("Could not find settings for application: ".$_GET['appname']);
}
//_debug_array($this->settings); exit;
$sel_options = $readonlys = $content = $tabs = array();
// disable all but first tab and name current tab "tab1", for apps not using sections
$tab = 'tab1';
$readonlys['tabs'] = array(
'tab2' => true,
'tab3' => true,
'tab4' => true,
'tab5' => true,
);
foreach($this->settings as $setting)
{
if (!is_array($setting)) continue;
switch($setting['type'])
{
case 'section':
$tabs[] = $setting['title'];
$tab = 'tab'.count($tabs);
$tpl->setElementAttribute($tab, 'label', $setting['title']);
$readonlys['tabs'][$tab] = false;
// fall through
case 'subsection': // is in old code, but never seen it used
continue 2;
case 'input':
$setting['type'] = 'textbox';
break;
case 'check':
$setting['type'] = 'select';
$setting['values'] = array('no', 'yes');
break;
case 'multiselect':
$setting['type'] = 'select';
break;
case 'color':
$setting['type'] = 'colorpicker';
break;
}
// move values/options to sel_options array
if (isset($setting['values']) && is_array($setting['values']))
{
// need to call fix_encoded_options manually, as id is not matching because of autorepeat
etemplate_widget_menupopup::fix_encoded_options($setting['values']);
$sel_options[$tab][count($content[$tab]).'[value]'] = $setting['values'];
unset($setting['values']);
}
$content[$tab][] = $setting;
}
//_debug_array($content); exit;
//_debug_array($sel_options); exit;
}
else
{
$this->appname = $content['appname'];
}
$tpl->exec('preferences.preferences_settings.index', $content, $sel_options, $readonlys, $content);
}
/**
* Get preferences by calling various hooks to supply them
*
* Sets $this->appname and $this->settings
*
* @param string $appname
* @return boolean
*/
protected function call_hook($appname)
{
$this->appname = $appname;
translation::add_app($this->appname);
if($this->appname != 'preferences')
{
translation::add_app('preferences'); // we need the prefs translations too
}
// calling app specific settings hook
$settings = $GLOBALS['egw']->hooks->single('settings',$this->appname);
// it either returns the settings or save it in $GLOBALS['settings'] (deprecated!)
if (isset($settings) && is_array($settings) && $settings)
{
$this->settings = array_merge($this->settings,$settings);
}
elseif(isset($GLOBALS['settings']) && is_array($GLOBALS['settings']) && $GLOBALS['settings'])
{
$this->settings = array_merge($this->settings,$GLOBALS['settings']);
}
else
{
return False; // no settings returned
}
// calling settings hook all apps can answer (for a specific app)
foreach($GLOBALS['egw']->hooks->process('settings_'.$this->appname,$this->appname,true) as $app => $settings)
{
if (isset($settings) && is_array($settings) && $settings)
{
$this->settings = array_merge($this->settings,$settings);
}
}
/* Remove ui-only settings */
if($this->xmlrpc)
{
foreach($this->settings as $key => $valarray)
{
if(!$valarray['xmlrpc'])
{
unset($this->settings[$key]);
}
}
}
else
{
/* Here we include the settings hook file for the current template, if it exists.
This is not handled by the hooks class and is only valid if not using xml-rpc.
*/
$tmpl_settings = EGW_SERVER_ROOT.$GLOBALS['egw']->framework->template_dir.'/hook_settings.inc.php';
if($this->appname == 'preferences' && file_exists($tmpl_settings))
{
include($tmpl_settings);
$this->settings = array_merge($this->settings,$GLOBALS['settings']);
}
}
// check if we have a default/forced value from the settings hook,
// which is NOT stored as default currently
// --> store it as default, to allow to propagate defaults to existing installations
if ($appname == 'preferences') $appname = 'common';
foreach ($this->settings as $name => $data)
{
// only set not yet set default prefs, so user is able to unset it again with ""
// (only works with type vfs_*, other types delete empty values!)
if (!isset($GLOBALS['egw']->preferences->default[$appname][$name]) &&
((string)$data['default'] !== '' || (string)$data['forced'] !== ''))
{
$default = (string)$data['forced'] !== '' ? $data['forced'] : $data['default'];
//echo "<p>".__METHOD__."($appname) $this->appname/$appname/$name=$default NOT yet set!</p>\n";
$GLOBALS['egw']->preferences->default[$appname][$name] = $default;
$need_update = true;
}
}
if ($need_update)
{
$GLOBALS['egw']->preferences->save_repository(false,'default',true);
}
if($this->debug)
{
_debug_array($this->settings);
}
return True;
}
}

View File

@ -0,0 +1,33 @@
/**
* EGroupware - CSS Styles used by preferences app
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package preferences
* @link http://www.egroupware.org
* @author Ralf Becker <RalfBecker@outdoor-training.de>
* @version $Id$
*/
table.prefTable {
width: 100%;
}
tr.prefRow {
position: relative;
}
td.prefName, td.prefValue {
width: 50%;
}
.prefHelp {
position: absolute;
display: none;
width: 98%;
background-color: lightyellow;
border: 1px solid black;
border-radius: 10px;
padding: 5px;
margin-top: 5px;
}
tr.prefRow:hover .prefHelp {
display: block;
z-index: 10; /* FF: displays it under next prefName without */
}

View File

@ -0,0 +1,113 @@
<?xml version="1.0"?>
<!-- $Id$ -->
<overlay>
<template id="preferences.settings.tab1" template="" lang="" group="0" version="1.9.001">
<grid width="100%" class="prefTable egwGridView_grid">
<columns>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="prefRow">
<box class="prefName">
<description id="${row}[label]"/>
<description id="${row}[help]" class="prefHelp"/>
</box>
<widget type="@${row}[type]" id="${row}[value]" size="@${row}[size]" class="prefValue"/>
</row>
</rows>
</grid>
</template>
<template id="preferences.settings.tab2" template="" lang="" group="0" version="1.9.001">
<grid width="100%" class="prefTable egwGridView_grid">
<columns>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="prefRow">
<box class="prefName">
<description id="${row}[label]"/>
<description id="${row}[help]" class="prefHelp"/>
</box>
<widget type="@${row}[type]" id="${row}[value]" size="@${row}[size]" class="prefValue"/>
</row>
</rows>
</grid>
</template>
<template id="preferences.settings.tab3" template="" lang="" group="0" version="1.9.001">
<grid width="100%" class="prefTable egwGridView_grid">
<columns>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="prefRow">
<box class="prefName">
<description id="${row}[label]"/>
<description id="${row}[help]" class="prefHelp"/>
</box>
<widget type="@${row}[type]" id="${row}[value]" size="@${row}[size]" class="prefValue"/>
</row>
</rows>
</grid>
</template>
<template id="preferences.settings.tab4" template="" lang="" group="0" version="1.9.001">
<grid width="100%" class="prefTable egwGridView_grid">
<columns>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="prefRow">
<box class="prefName">
<description id="${row}[label]"/>
<description id="${row}[help]" class="prefHelp"/>
</box>
<widget type="@${row}[type]" id="${row}[value]" size="@${row}[size]" class="prefValue"/>
</row>
</rows>
</grid>
</template>
<template id="preferences.settings.tab5" template="" lang="" group="0" version="1.9.001">
<grid width="100%" class="prefTable egwGridView_grid">
<columns>
<column width="50%"/>
<column/>
</columns>
<rows>
<row class="prefRow">
<box class="prefName">
<description id="${row}[label]"/>
<description id="${row}[help]" class="prefHelp"/>
</box>
<widget type="@${row}[type]" id="${row}[value]" size="@${row}[size]" class="prefValue"/>
</row>
</rows>
</grid>
</template>
<template id="preferences.settings" template="" lang="" group="0" version="1.9.001">
<description id="msg" class="redItalic"/>
<tabbox id="tabs">
<tabs>
<tab id="tab1" label="Tab 1"/>
<tab id="tab2" label="Tab 2"/>
<tab id="tab3" label="Tab 3"/>
<tab id="tab4" label="Tab 4"/>
<!-- tab id="tab5" label="Tab 5"/ -->
</tabs>
<tabpanels>
<template id="preferences.settings.tab1" content="tab1"/>
<template id="preferences.settings.tab2" content="tab2"/>
<template id="preferences.settings.tab3" content="tab3"/>
<template id="preferences.settings.tab4" content="tab4"/>
<!-- template id="preferences.settings.tab4" content="tab5"/ -->
</tabpanels>
</tabbox>
<hbox>
<button label="Save" id="button[save]"/>
<button label="Apply" id="button[apply]"/>
<button label="Cancel" id="button[cancel]"/>
</hbox>
</template>
</overlay>