forked from extern/egroupware
Added egw_grid_columns class which is capable of managing the grid columns of a certain grid and to store, load and merge the user columns data into the default column set
This commit is contained in:
parent
0d9f55b59e
commit
afcf96a3cd
333
phpgwapi/inc/class.egw_grid_columns.inc.php
Normal file
333
phpgwapi/inc/class.egw_grid_columns.inc.php
Normal file
@ -0,0 +1,333 @@
|
||||
<?php
|
||||
/**
|
||||
* eGroupWare API: egw action grid columns classes
|
||||
*
|
||||
* @link http://www.egroupware.org
|
||||
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
|
||||
* @package api
|
||||
* @subpackage egw action grid
|
||||
* @author Andreas Stöckel
|
||||
* @copyright (c) 2011 Stylite
|
||||
* @version $Id$
|
||||
*/
|
||||
|
||||
/**
|
||||
* The egw_grid_columns class in this file is the PHP counterpart to the implementation
|
||||
* in the JS file egw_grid_columns.js. It can generate column json data, verify
|
||||
* it and store user settings for columns in the preferences
|
||||
*/
|
||||
|
||||
class egw_json_object
|
||||
{
|
||||
private $supported_properties = array(
|
||||
"id" => array(
|
||||
"types" => "string",
|
||||
"default" => ""
|
||||
)
|
||||
);
|
||||
|
||||
protected $data = array();
|
||||
|
||||
/**
|
||||
* Merges the given properties into the supported properties array.
|
||||
*
|
||||
* @param array $props are the supported properties which will be added to the
|
||||
* object.
|
||||
*/
|
||||
protected function add_supported_properties($props)
|
||||
{
|
||||
$this->supported_properties = array_merge($this->supported_properties, $props);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the object data from the
|
||||
*/
|
||||
public function load_assoc(array $assoc)
|
||||
{
|
||||
/**
|
||||
* Calls the magic setter for each data element
|
||||
*/
|
||||
foreach ($assoc as $key => $data)
|
||||
{
|
||||
$this->$key = $data;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an associative array with the object data
|
||||
*/
|
||||
public function store_assoc($include_defaults = false)
|
||||
{
|
||||
$result = array();
|
||||
|
||||
foreach ($this->supported_properties as $key => $opt)
|
||||
{
|
||||
if (!array_key_exists("store", $opt) || $opt[$store])
|
||||
{
|
||||
$val = $this->$key;
|
||||
|
||||
if ($val != $opt["default"] || $include_defaults )
|
||||
{
|
||||
$result[$key] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic setter function - checks whether the specified key is supported by the
|
||||
* the object and the given value is of the supported type.
|
||||
*/
|
||||
public function __set($key,$val)
|
||||
{
|
||||
if (array_key_exists($key, $this->supported_properties))
|
||||
{
|
||||
$sup_entry = $this->supported_properties[$key];
|
||||
|
||||
// Test for the type (PHP-Docu says not to use gettype here)
|
||||
$correct_type = true;
|
||||
|
||||
if (array_key_exists("types", $sup_entry))
|
||||
{
|
||||
$types = explode(",", $sup_entry["types"]);
|
||||
|
||||
foreach ($types as $type)
|
||||
{
|
||||
switch ($type)
|
||||
{
|
||||
case "bool":
|
||||
$correct_type = $correct_type || is_bool($val);
|
||||
break;
|
||||
case "string":
|
||||
$correct_type = $correct_type || is_string($val);
|
||||
break;
|
||||
case "int":
|
||||
$correct_type = $correct_type || is_int($val);
|
||||
break;
|
||||
case "float":
|
||||
$correct_type = $correct_type || is_float($val);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set the value in the data array or call a setter function an inherited
|
||||
// class might have specified
|
||||
if ($correct_type)
|
||||
{
|
||||
if (method_exists($this, "set_".$key))
|
||||
{
|
||||
call_user_func(array($this, "set_".$key), $val);
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->data[$key] = $val;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Magic getter function - returns the default value if the data key has not
|
||||
* been set yet, returns null if the property does not exists.
|
||||
*/
|
||||
public function __get($key) {
|
||||
if (array_key_exists($key, $this->supported_properties))
|
||||
{
|
||||
// Check whether the inherited class has a special getter implemented
|
||||
if (method_exists($this, "get_".$key))
|
||||
{
|
||||
return call_user_func(array($this, "get_".$key), $val);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (array_key_exists($key, $this->data))
|
||||
{
|
||||
return $this->data[$key];
|
||||
}
|
||||
else
|
||||
{
|
||||
return $this->supported_properties[$key]["default"];
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Define some constants as they occur in egw_grid_columns.js
|
||||
*/
|
||||
define("EGW_COL_TYPE_DEFAULT", 0);
|
||||
define("EGW_COL_TYPE_NAME_ICON_FIXED", 1);
|
||||
|
||||
define("EGW_COL_VISIBILITY_ALWAYS", 0);
|
||||
define("EGW_COL_VISIBILITY_VISIBLE", 1);
|
||||
define("EGW_COL_VISIBILITY_INVISIBLE", 2);
|
||||
|
||||
define("EGW_COL_SORTABLE_NONE", 0);
|
||||
define("EGW_COL_SORTABLE_ALPHABETIC", 1);
|
||||
define("EGW_COL_SORTABLE_NUMERICAL", 2);
|
||||
define("EGW_COL_SORTABLE_NATURAL", 3);
|
||||
|
||||
define("EGW_COL_SORTMODE_NONE", 0);
|
||||
define("EGW_COL_SORTMODE_ASC", 1);
|
||||
define("EGW_COL_SORTMODE_DESC", 2);
|
||||
|
||||
define("EGW_COL_DEFAULT_FETCH", -10000);
|
||||
|
||||
/**
|
||||
* Object which represents a single column
|
||||
*/
|
||||
class egw_grid_column extends egw_json_object
|
||||
{
|
||||
public function __construct($id = "")
|
||||
{
|
||||
// Add the supported properties
|
||||
$this->add_supported_properties(array(
|
||||
"width" => array("types" => "bool,int,string", "default" => false),
|
||||
"maxWidth" => array("types" => "int,bool", "default" => false),
|
||||
"caption" => array("types" => "string", "default" => ""),
|
||||
"visibility" => array("types" => "int", "default" => EGW_COL_VISIBILITY_VISIBLE),
|
||||
"visible" => array("types" => "bool", "default" => true, "store" => false),
|
||||
"sortable" => array("types" => "int", "default" => EGW_COL_SORTABLE_NONE),
|
||||
"sortmode" => array("types" => "int", "default" => EGW_COL_SORTMODE_NONE),
|
||||
"default" => array("types" => "string,int", "default" => EGW_COL_DEFAULT_FETCH),
|
||||
"type" => array("types" => "int", "default" => EGW_COL_TYPE_DEFAULT),
|
||||
));
|
||||
|
||||
// Set the column id
|
||||
$this->id = $id;
|
||||
}
|
||||
|
||||
public function get_visible()
|
||||
{
|
||||
return $this->visibility != EGW_COL_VISIBILITY_INVISIBLE;
|
||||
}
|
||||
|
||||
public function set_visible($val)
|
||||
{
|
||||
if ($this->visibility != EGW_COL_VISIBILITY_ALWAYS)
|
||||
{
|
||||
$this->visibility = $val ? EGW_COL_VISIBILITY_VISIBLE : EGW_COL_VISIBILITY_INVISIBLE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class egw_grid_columns
|
||||
{
|
||||
private $app_name;
|
||||
private $grid_name;
|
||||
|
||||
private $grid_data = array();
|
||||
|
||||
public function __construct($app_name, $grid_name = "main")
|
||||
{
|
||||
$this->app_name = $app_name;
|
||||
$this->grid_name = $grid_name;
|
||||
}
|
||||
|
||||
public function load_grid_data($data)
|
||||
{
|
||||
foreach ($data as $col)
|
||||
{
|
||||
$colobj = new egw_grid_column();
|
||||
$colobj->load_assoc($col);
|
||||
|
||||
$this->grid_data[] = $colobj;
|
||||
}
|
||||
}
|
||||
|
||||
private function get_col($id)
|
||||
{
|
||||
foreach ($this->grid_data as $col)
|
||||
{
|
||||
if ($col->id == $id)
|
||||
{
|
||||
return $col;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the given column data in the user preferences for this grid
|
||||
*/
|
||||
private function get_userdata()
|
||||
{
|
||||
if ($GLOBALS['egw_info']['user']['preferences'][$this->app_name][$this->grid_name.'_column_data'])
|
||||
{
|
||||
return unserialize($GLOBALS['egw_info']['user']['preferences'][$this->app_name][$this->grid_name.'_column_data']);
|
||||
}
|
||||
return array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores the given column data in the user preferences for this grid
|
||||
*/
|
||||
private function set_userdata($data)
|
||||
{
|
||||
$GLOBALS['egw']->preferences->read_repository();
|
||||
|
||||
$GLOBALS['egw']->preferences->change($this->app_name, $this->grid_name.'_column_data',
|
||||
serialize($data));
|
||||
|
||||
$GLOBALS['egw']->preferences->save_repository(true);
|
||||
}
|
||||
|
||||
public function load_userdata()
|
||||
{
|
||||
// Read the userdata from the user preferences
|
||||
$data = $this->get_userdata();
|
||||
|
||||
error_log(__METHOD__.print_r($data, true));
|
||||
|
||||
// Merge the userdata into the column data
|
||||
foreach ($data as $col_id => $col_data)
|
||||
{
|
||||
$col = $this->get_col($col_id);
|
||||
if ($col && is_array($col_data))
|
||||
{
|
||||
$col->load_assoc($col_data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function store_userdata($data)
|
||||
{
|
||||
$store_data = array();
|
||||
|
||||
// Check whether the specified columns exists
|
||||
foreach ($data as $col_id => $col_data)
|
||||
{
|
||||
$col = $this->get_col($col_id);
|
||||
if ($col)
|
||||
{
|
||||
$store_data[$col_id] = $col_data;
|
||||
}
|
||||
}
|
||||
|
||||
// Store the verified data columns
|
||||
$this->set_userdata($store_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the associative array containing the column data which can be
|
||||
* JSON-encoded and sent to the client
|
||||
*/
|
||||
public function get_assoc()
|
||||
{
|
||||
$result = array();
|
||||
foreach ($this->grid_data as $col)
|
||||
{
|
||||
$result[] = $col->store_assoc();
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
@ -18,11 +18,14 @@ uses
|
||||
egw_action_columns
|
||||
*/
|
||||
|
||||
function egwGrid(_parentNode, _columns, _objectManager, _fetchCallback, _context)
|
||||
function egwGrid(_parentNode, _columns, _objectManager, _fetchCallback, _columnChangeCallback, _context)
|
||||
{
|
||||
this.parentNode = _parentNode;
|
||||
this.objectManager = _objectManager;
|
||||
|
||||
this.columnChangeCallback = _columnChangeCallback;
|
||||
this.context = _context;
|
||||
|
||||
this.width = 0;
|
||||
this.height = 0;
|
||||
|
||||
@ -134,6 +137,22 @@ egwGrid.prototype.selectcolsClick = function(_at)
|
||||
var self = this;
|
||||
menu.setGlobalOnClick(function(_elem) {
|
||||
column_data[_elem.id].visible = _elem.checked;
|
||||
|
||||
if (self.columnChangeCallback)
|
||||
{
|
||||
// Create the user data column visibility set
|
||||
var set = {};
|
||||
for (k in column_data)
|
||||
{
|
||||
set[k] = {
|
||||
"visible": column_data[k].visible
|
||||
};
|
||||
}
|
||||
|
||||
// Call the column change callback with the user data
|
||||
self.columnChangeCallback.call(self.context, set);
|
||||
}
|
||||
|
||||
self.columns.setColumnVisibilitySet(column_data);
|
||||
});
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user