Promote calendar-owner to full widget, loadable by etemplate on its own

This commit is contained in:
Nathan Gray 2016-02-18 19:45:37 +00:00
parent 843b53487b
commit 58b7f38426
7 changed files with 190 additions and 141 deletions

View File

@ -237,7 +237,10 @@ class calendar_export_csv implements importexport_iface_export_plugin {
*
*/
public function get_selectors_etpl($definition = null) {
$states = $GLOBALS['egw']->session->appsession('session_data','calendar');
$states = $this->bo->cal_prefs['saved_states'];
$list = $GLOBALS['egw']->session->appsession('calendar_list','calendar');
if(!$list['startdate'])
{
switch($states['view']) {
case 'month':
$query = $this->get_query_month($states);
@ -252,6 +255,12 @@ class calendar_export_csv implements importexport_iface_export_plugin {
}
$start= new egw_time($query['start']);
$end = new egw_time($query['end']);
}
else
{
$start= new egw_time($list['startdate']);
$end = new egw_time($list['enddate']);
}
if ($states['view'] == 'listview')
{
$list = $GLOBALS['egw']->session->appsession('calendar_list','calendar');
@ -375,6 +384,9 @@ class calendar_export_csv implements importexport_iface_export_plugin {
'no-enum-groups' => lang('only group-events'),
'not-unknown' => lang('No meeting requests'),
);
$states = $this->bo->cal_prefs['saved_states'];
}
/**

View File

@ -0,0 +1,160 @@
<?php
/**
* EGroupware - eTemplate serverside of owner list widget
*
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @package etemplate
* @subpackage api
* @link http://www.egroupware.org
* @author Nathan Gray
* @copyright 2016 Nathan Gray
* @version $Id$
*/
/**
* eTemplate tag list widget
*
* The naming convention is <appname>_<subtype>_etemplate_widget
*/
class calendar_owner_etemplate_widget extends etemplate_widget_taglist
{
/**
* Make sure all the needed select options are there
*
* @param string $cname
* @param array $expand values for keys 'c', 'row', 'c_', 'row_', 'cont'
*/
public function beforeSendToClient($cname, array $expand=null)
{
egw_framework::validate_file('.','et2_widget_owner','calendar');
egw_framework::includeCSS('calendar');
$bo = new calendar_bo();
$form_name = self::form_name($cname, $this->id, $expand);
$value =& self::get_array(self::$request->content, $form_name);
if (!is_array(self::$request->sel_options[$form_name]))
{
self::$request->sel_options[$form_name] = array();
}
$sel_options =& self::$request->sel_options[$form_name];
// Get user accounts, formatted nicely for grouping and matching
// the ajax call calendar_uiforms->ajax_owner() - users first
$accounts = array();
$list = array('accounts', 'owngroups');
foreach($list as $type)
{
$account_options = array('account_type' => $type);
$accounts += accounts::link_query('',$account_options);
}
$accounts = array_intersect_key($accounts, $GLOBALS['egw']->acl->get_grants('calendar'));
$sel_options += array_map(
function($account_id, $account_name) {
return array(
'value' => ''.$account_id,
'label' => $account_name,
'app' => lang('home-accounts')
);
},
array_keys($accounts), $accounts
);
// Add external owners that a select account widget will not find
foreach($value as &$owner)
{
// Make sure it's a string for comparison
$owner = ''.$owner;
if(!is_numeric($owner))
{
$resource = $bo->resources[substr($owner, 0,1)];
$label = egw_link::title($resource['app'], substr($owner,1));
$linked_owners[$resource['app']][substr($owner,1)] = $label;
}
else if (!in_array($owner, array_keys($accounts)))
{
$label = egw_link::title('home-accounts',$owner);
$resource = array('app'=> 'home-accounts');
}
else
{
continue;
}
$sel_options[] = array('value' => $owner, 'label' => $label, 'app' => lang($resource['app']));
}
}
/**
* Handle ajax searches for owner across all supported resources
*
* @return Array List of matching results
*/
public static function ajax_owner()
{
$bo = new calendar_bo();
$query = $_REQUEST['query'];
// Arbitrarily limited to 50 / resource
$options = ['start' => 0, 'num_rows' => 50];
$results = [];
$resources = array_merge(array('' => $bo->resources['']),$bo->resources);
foreach($resources as $type => $data)
{
$mapped = array();
$_results = array();
// Handle accounts seperately
if($type == '')
{
$list = array('accounts', 'owngroups');
foreach($list as $a_type)
{
$account_options = $options + array('account_type' => $a_type);
$_results += accounts::link_query('',$account_options);
}
$_results = array_intersect_key($_results, $GLOBALS['egw']->acl->get_grants('calendar'));
}
else if ($data['app'] && egw_link::get_registry($data['app'], 'query'))
{
$_results = egw_link::query($data['app'], $query,$options);
}
if(!$_results) continue;
$_results = array_unique($_results);
foreach($_results as $id => $title)
{
if($id && $title)
{
// Magicsuggest uses id, not value.
$value = [
'id' => $type.$id,
'value'=> $type.$id,
'label' => $title,
'app' => lang($data['app'])
];
if(is_array($value['label']))
{
$value = array_merge($value, $value['label']);
}
$mapped[] = $value;
}
}
if(count($mapped))
{
$results = array_merge($results, $mapped);
}
}
// switch regular JSON response handling off
egw_json_request::isJSONRequest(false);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($results);
common::egw_exit();
}
}

View File

@ -616,60 +616,6 @@ class calendar_ui
$content = $this->cal_prefs['saved_states'];
$content['view'] = $this->view ? $this->view : 'week';
$content['date'] = $this->date ? $this->date : egw_time();
$owners = $this->owner ? is_array($this->owner) ? array($this->owner) : explode(',',$this->owner) : array($GLOBALS['egw_info']['user']['account_id']);
$sel_options = array('owner' => array());
// Get user accounts, formatted nicely for grouping and matching
// the ajax call calendar_uiforms->ajax_owner() - users first
$accounts = array();
$list = array('accounts', 'owngroups');
foreach($list as $type)
{
$account_options = array('account_type' => $type);
$accounts += accounts::link_query('',$account_options);
}
$accounts = array_intersect_key($accounts, $GLOBALS['egw']->acl->get_grants('calendar'));
$sel_options['owner'] = array_map(
function($account_id, $account_name) {
return array(
'value' => ''.$account_id,
'label' => $account_name,
'app' => lang('home-accounts')
);
},
array_keys($accounts), $accounts
);
// Add external owners that a select account widget will not find
$linked_owners = array();
foreach($owners as &$owner)
{
$owner = ''.$owner;
if(!is_numeric($owner))
{
$resource = $this->bo->resources[substr($owner, 0,1)];
$label = egw_link::title($resource['app'], substr($owner,1));
$linked_owners[$resource['app']][substr($owner,1)] = $label;
}
else if (!in_array($owner, array_keys($accounts)))
{
$label = egw_link::title('home-accounts',$owner);
$resource = array('app'=> 'home-accounts');
}
else
{
continue;
}
$sel_options['owner'][] = array('value' => $owner, 'label' => $label, 'app' => lang($resource['app']));
}
if($linked_owners)
{
// Send them to link registry too
egw_json_response::get()->call('egw.link_title_callback',$linked_owners);
}
$readonlys = array();
$sel_options['status_filter'] = array(

View File

@ -2941,75 +2941,6 @@ class calendar_uiforms extends calendar_ui
}
}
/**
* Handle ajax searches for owner across all supported resources
*
* @return Array List of matching results
*/
public function ajax_owner()
{
$query = $_REQUEST['query'];
// Arbitrarily limited to 50 / resource
$options = ['start' => 0, 'num_rows' => 50];
$results = [];
if($query)
{
$resources = array_merge(array('' => $this->bo->resources['']),$this->bo->resources);
foreach($resources as $type => $data)
{
$mapped = array();
$_results = array();
// Handle accounts seperately
if($type == '')
{
$list = array('accounts', 'owngroups');
foreach($list as $a_type)
{
$account_options = $options + array('account_type' => $a_type);
$_results += accounts::link_query('',$account_options);
}
$_results = array_intersect_key($_results, $GLOBALS['egw']->acl->get_grants('calendar'));
}
else if ($data['app'] && egw_link::get_registry($data['app'], 'query'))
{
$_results = egw_link::query($data['app'], $query,$options);
}
if(!$_results) continue;
$_results = array_unique($_results);
foreach($_results as $id => $title)
{
if($id && $title)
{
// Magicsuggest uses id, not value.
$value = [
'id' => $type.$id,
'value'=> $type.$id,
'label' => $title,
'app' => lang($data['app'])
];
if(is_array($value['label']))
{
$value = array_merge($value, $value['label']);
}
$mapped[] = $value;
}
}
if(count($mapped))
{
$results = array_merge($results, $mapped);
}
}
}
// switch regular JSON response handling off
egw_json_request::isJSONRequest(false);
header('Content-Type: application/json; charset=utf-8');
echo json_encode($results);
common::egw_exit();
}
/**
* imports a mail as Calendar
*

View File

@ -29,7 +29,7 @@ var et2_calendar_owner = et2_taglist_email.extend(
{
attributes: {
"autocomplete_url": {
"default": "calendar.calendar_uiforms.ajax_owner.etemplate"
"default": "calendar_owner_etemplate_widget::ajax_owner"
},
"autocomplete_params": {
"name": "Autocomplete parameters",
@ -90,4 +90,4 @@ var et2_calendar_owner = et2_taglist_email.extend(
return this.taglist.getValue();
}
});
et2_register_widget(et2_calendar_owner, ["calendar_owner"]);
et2_register_widget(et2_calendar_owner, ["calendar-owner"]);

View File

@ -38,7 +38,7 @@
<date statustext="Enddate of the export" id="end"/>
</row>
<row>
<taglist id="owner" empty_label="Owner" span="2" class="shorter" autocomplete_url="calendar.calendar_uiforms.ajax_owner.etemplate" allowFreeEntries="false"/>
<calendar-owner id="owner" empty_label="Owner" span="2" class="shorter" allowFreeEntries="false" autocomplete_url="calendar.calendar_owner_etemplate_widget.ajax_owner"/>
</row>
</rows>
</grid>

View File

@ -27,7 +27,7 @@ if(view_change >= 0) {update.view = app.calendar.sidebox_changes_views[view_chan
<textbox type="hidden" id="first"/>
<textbox type="hidden" id="last"/>
<select-cat id="cat_id" empty_label="All categories" width="86%" onchange="app.calendar.update_state({cat_id: widget.getValue()});" expand_multiple_rows="4"/>
<calendar_owner id="owner" class="et2_fullWidth" onchange="app.calendar.update_state({owner: widget.getValue()}); return false;" multiple="true" allowFreeEntries="false"/>
<calendar-owner id="owner" class="et2_fullWidth" onchange="app.calendar.update_state({owner: widget.getValue()}); return false;" multiple="true" allowFreeEntries="false"/>
<!--
<taglist id="owner" class="et2_fullWidth" onchange="app.calendar.update_state({owner: widget.getValue()});" autocomplete_params=''/>