Change resource selectbox in calendar side menu to a tree

This commit is contained in:
Nathan Gray 2015-12-08 00:59:01 +00:00
parent 9dd383c5a9
commit 14cb62a7db
4 changed files with 210 additions and 31 deletions

View File

@ -821,7 +821,7 @@ class resources_bo
{
$picture = egw::link('/etemplate/thumbnail.php', array(
'path' => $picture
));
),false);
}
break;

View File

@ -586,7 +586,7 @@ class resources_ui
{
$cats = $this->bo->acl->get_cats(EGW_ACL_CALREAD);
if (!$cats) return array();
if(array_key_exists('return_array', $param))
{
$return_array = $param['return_array'];
@ -594,7 +594,6 @@ class resources_ui
}
$owners = explode(',',$param['owner']);
unset($param['owner']);
$res_cats = $selected = array();
// this gets the resource-ids of the cats and implodes them to the array-key of the selectbox,
@ -609,16 +608,8 @@ class resources_ui
$keys = array();
foreach($resources as $res)
{
$keys[] = 'r'.$res['res_id'];
$allowed_list[] = $res['res_id'];
}
$res_cats[implode(',',$keys)] = $cat_name;
if (count(array_intersect($keys,$owners)) == count($keys))
{
$selected[] = implode(',',$keys);
$owners = array_diff($owners,$keys);
}
}
}
// add already selected single resources to the selectbox, eg. call of the resource-calendar from the resources app
@ -633,30 +624,20 @@ class resources_ui
}
}
// Take out resources not allowed by perms, above
$res_ids = array_intersect($res_ids,$allowed_list);
if (count($res_ids))
{
foreach($this->bo->so->search(array('res_id' => $res_ids),'res_id,name') as $data)
{
$resources['r'.$data['res_id']] = $data['name'];
}
}
$content = array('owner' => $selected);
$sel_options['owner'] = self::tree_data('/',$root,$selected);
if(!isset($return_array))
{
$selectbox = html::select(
'owner',
$selected,
$options=array_merge(array('r0' => lang('None')),$resources,$res_cats),
true, // no lang
' style="width: 100%;" id="uical_select_resource"',
min(4, count($options)), // multiple
false
);
$et2 = new etemplate_new('resources.calendar_sidebox');
$et2->exec('calendar.calendar_ui.sidebox_etemplate', $content, $sel_options);
$tree = '<span id="calendar-resources-et2_target" />';
return array(
array(
// Add some jQuery to make sure dropdown is displayed
'text' => $selectbox,
'text' => $tree,
'no_lang' => True,
'link' => False
)
@ -667,5 +648,158 @@ class resources_ui
return array_merge($resources,$res_cats);
}
}
/**
* Autoload tree from $_GET['id'] on
*/
public static function ajax_tree()
{
etemplate_widget_tree::send_quote_json(self::tree_data(!empty($_GET['id']) ? $_GET['id'] : '/'));
}
public static function tree_data($root = '/', &$_parent = null, $open = array())
{
//error_log(__METHOD__ . "($root,".($_parent ? 'true' : '').')');
if(!$_parent)
{
$tree = array('id' => $root === '/' ? 0 : $root, 'item' => array(), 'child' => 1);
}
else
{
$tree =& $_parent;
}
$bo = new resources_bo();
if($root == '/')
{
// Start with categories
$cats = $bo->acl->get_cats(EGW_ACL_CALREAD);
foreach($cats as $cat_id => $cat_name)
{
$data = array();
$data[etemplate_widget_tree::ID] = trim(str_replace(' / ','/', $root.categories::id2name( $cat_id ,'path')));
$data[etemplate_widget_tree::LABEL] = trim(str_replace('&nbsp;','',$cat_name));
$data[etemplate_widget_tree::CHILDREN] = array();
$cat_data = categories::id2name($cat_id, 'data');
if($cat_data['icon'])
{
$data['im0'] = $data['im1'] = $data['im2'] = etemplate_widget_tree::imagePath(egw::link('/phpgwapi/images/'.$cat_data['icon'],array(),false));
}
$parent =& $tree[etemplate_widget_tree::CHILDREN];
$parts = explode('/', $data[etemplate_widget_tree::ID]);
if ($data[etemplate_widget_tree::ID][0] == '/') array_shift($parts); // remove root
array_pop($parts);
$path = '';
foreach($parts as $part)
{
$path .= ($path == '/' ? '' : '/').$part;
if (!isset($parent[$path]))
{
//$icon = etemplate_widget_tree::imagePath( $cat_data['icon']);
$parent[$path] = array(
'id' => $path,
'text' => lang(trim($part)),
//'im0' => 'folderOpen.gif',
'im1' => $icon,
'im2' => $icon,
'item' => array(),
'child' => 1,
);
// if ($path == '/admin') $parent[$path]['open'] = true;
}
$parent =& $parent[$path]['item'];
}
// Get resources for this category
self::tree_data($data[etemplate_widget_tree::ID],$data,$open);
$data[etemplate_widget_tree::TOOLTIP] = lang(categories::id2name($cat_id,'description'));
$parent[$data[etemplate_widget_tree::ID]] = $data;
}
}
else if ($root[0] == 'r')
{
// Fetch resources for a given category
$list = array();
$resources = array();
if ($root[0] == 'r')
{
$tree['id'] = $root;
$resource = $bo->read(substr($root,1));
$tree['text'] = $resource['name'];
$data['im0'] = etemplate_widget_tree::imagePath($bo->get_picture($resource['res_id']));
$tree['item'] = array();
if(in_array($tree['id'], $open))
{
$tree[etemplate_widget_tree::OPEN] = true;
}
$list =& $tree['item'];
$query = array('filter2' => substr($root,1),'csv_export' => true);
if($bo->get_rows($query,$resources,$readonlys))
{
foreach($resources as $res)
{
if(!$res['res_id']) continue;
$data = array();
$data['id'] = 'r'.$res['res_id'];
$data['text'] = $res['name'];
$data['im0'] = etemplate_widget_tree::imagePath($bo->get_picture($res['res_id']));
$data['child'] = $res['acc_count'];
$list[] = $data;
}
}
}
}
else
{
$cat_id = $bo->cats->name2id(trim(array_pop(explode('/',$root))));
$query = array('filter' => $cat_id,'filter2' => -1,'csv_export' => true);
$tree[etemplate_widget_tree::ID] = $root;
$list =& $tree['item'];
if($bo->get_rows($query,$resources,$readonlys))
{
foreach($resources as $res)
{
if(!$res['res_id']) continue;
if(in_array('r'.$res['res_id'],$open))
{
$tree[etemplate_widget_tree::OPEN] = true;
}
if($res['cat_id'] != $cat_id) continue;
$data = array();
$data[etemplate_widget_tree::ID] = 'r'.$res['res_id'];
$data[etemplate_widget_tree::LABEL] = $res['name'];
$data[etemplate_widget_tree::AUTOLOAD_CHILDREN] = $res['acc_count'];
$data['im0'] = $data['im1'] = $data['im2'] = etemplate_widget_tree::imagePath($bo->get_picture($res['res_id']));
$list[] = $data;
}
}
}
if($_parent) return;
self::strip_item_keys($tree['item']);
return $tree;
}
/**
* Attribute 'item' has to be an array
*
* @param array $items
*/
private static function strip_item_keys(array &$items)
{
$items = array_values($items);
foreach($items as &$item)
{
if (is_array($item) && isset($item['item']))
{
self::strip_item_keys($item['item']);
}
}
}
}

View File

@ -86,6 +86,36 @@ app.classes.resources = AppJS.extend(
this.egw.open_link('calendar.calendar_uiviews.index&view=planner&sortby=user&owner=0,r'+res_ids.join(',r')+'&ajax=true');
},
/**
* Calendar sidebox hook change handler
*
*/
sidebox_change: function(ev, widget)
{
if(ev[0] != 'r') {
widget.setSubChecked(ev,widget.getValue()[ev].value || false);
}
var owner = jQuery.extend([],app.calendar.state.owner) || [];
for(var i = owner.length-1; i >= 0; i--)
{
if(owner[i][0] == 'r')
{
owner.splice(i,1);
}
}
var value = widget.getValue();
for(var key in value)
{
if(key[0] !== 'r') continue;
if(value[key].value && owner.indexOf(key) === -1)
{
owner.push(key);
}
}
app.calendar.update_state({owner: owner});
},
/**
* Book selected resource for calendar
*

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE overlay PUBLIC "-//Stylite AG//eTemplate 2//EN" "http://www.egroupware.org/etemplate2.dtd">
<!-- $Id$ -->
<overlay>
<template id="resources.calendar_sidebox" template="" lang="" group="0" version="16.1">
<vbox parent_node="calendar-resources-et2_target">
<tree id="owner" autoloading="resources_ui::ajax_tree" multiple="true" onchange="app.resources.sidebox_change"/>
</vbox>
<styles>
#resources-calendar_sidebox {
display: none;
}
</styles>
</template>
</overlay>