From 26901c686575aaf10b0a2e945dbab6faa0fcceb9 Mon Sep 17 00:00:00 2001 From: Ralf Becker Date: Sat, 12 Jun 2004 09:48:20 +0000 Subject: [PATCH] first version of the account-selection widget --- phpgwapi/inc/class.uiaccountsel.inc.php | 480 ++++++++++++++++++++ phpgwapi/templates/default/uiaccountsel.tpl | 123 +++++ 2 files changed, 603 insertions(+) create mode 100644 phpgwapi/inc/class.uiaccountsel.inc.php create mode 100644 phpgwapi/templates/default/uiaccountsel.tpl diff --git a/phpgwapi/inc/class.uiaccountsel.inc.php b/phpgwapi/inc/class.uiaccountsel.inc.php new file mode 100644 index 0000000000..821c5a56c1 --- /dev/null +++ b/phpgwapi/inc/class.uiaccountsel.inc.php @@ -0,0 +1,480 @@ + True, + ); + + function uiaccountsel($account_id = '', $account_type='') + { + $this->accounts($account_id,$account_type); // call constructor of extended class + + $this->account_selection = $GLOBALS['phpgw_info']['user']['preferences']['common']['account_selection']; + } + + /** + * Create an account-selection for a certain range of users + * + * @param $name string name of the form-element + * @param $element_id string id of the form-element, this need to be unique for the whole window !!! + * @param $selected array/int user-id or array of user-id's which are already selected + * @param $use string/array 'accounts', 'groups', 'both' or app-name for all accounts with run-rights or an + * array with id's as keys or values. If the id is in the key and the value is a string, it gets appended to the user-name + * @param $lines int number of lines for multiselection or 0 for a single selection + * (in that case accounts should be an int or contain only 1 user-id) + * @param $not int/array user-id or array of user-id's not to display in selection, default False = display all + * @param $options additional options (e.g. style) + * @param $onchange javascript to execute if the selection changes, eg. to reload the page + * @return the necessary html + */ + function selection($name,$element_id,$selected,$use='accounts',$lines=1,$not=False,$options='',$onchange='') + { + //echo "

uiaccountsel::selection('$name',".print_r($selected,True).",'$use',$lines,$not,'$options')

\n"; + if (!is_object($GLOBALS['phpgw']->html)) + { + $GLOBALS['phpgw']->html = CreateObject('phpgwapi.html'); + } + if (!is_array($selected)) + { + $selected = $selected ? array($selected) : array(); + } + $enumerate_groups = False; + + switch($this->account_selection) + { + case 'popup': + $use = $selected; + break; + case 'primary_group': + $use = count($selected) && !isset($selected[0]) ? array_keys($selected) : $selected; + $members = $this->member($GLOBALS['phpgw']->accounts->data['account_primary_group']); + if (is_array($members)) + { + foreach($members as $member) + { + if (!in_array($member['account_id'],$use)) + { + $use[] = $member['account_id']; + } + } + } + break; + case 'selectbox': + default: + if ($use == 'accounts' || $use == 'groups' || $use == 'both') + { + $use = $GLOBALS['phpgw']->accounts->get_list($use); + } + elseif (!is_array($use)) // app-name + { + $use = $GLOBALS['phpgw']->acl->get_ids_for_location('run',1,$use); + $enumerate_groups = True; + } + } + $users = $groups = array(); + $use_keys = count($use) && !isset($use[0]); // id's are the keys + foreach($use as $key => $val) + { + $id = $use_keys ? $key : (is_array($val) ? $val['account_id'] : $val); + + if ($not && ($id == $not || is_array($not) && in_array($id,$not))) + { + continue; // dont display that one + } + if ($this->get_type($id) == 'u') + { + $users[$id] = !is_array($val) ? $GLOBALS['phpgw']->common->grab_owner_name($id) : + $GLOBALS['phpgw']->common->display_fullname( + $val['account_lid'],$val['account_firstname'],$val['account_lastname']); + } + else + { + if ($enumerate_groups && ($members = $this->member($id))) + { + foreach($members as $member) + { + if ($not && $member['account_id'] == $not) continue; // dont display that one + + $users[$member['account_id']] = $GLOBALS['phpgw']->common->grab_owner_name($member['account_id']); + } + } + $groups[$id] = lang('group').' '.$this->id2name($id); + } + } + // sort users and groups alphabeticaly and put the groups behind the users + uasort($users,strcasecmp); + uasort($groups,strcasecmp); + $select = $users + $groups; + + if (count($selected) && !isset($selected[0])) // id's are the keys + { + foreach($selected as $id => $val) + { + if (is_string($val) && isset($users[$id])) // add string to option-label + { + $users[$id] .= " ($val)"; + } + } + $selected = array_keys($selected); + } + // add necessary popup trigers + $popup = "window.open('".$GLOBALS['phpgw']->link('/index.php',array( + 'menuaction' => 'phpgwapi.uiaccountsel.popup', + 'app' => $GLOBALS['phpgw_info']['flags']['currentapp'], + 'element_id' => $element_id, + ))."','Search','width=800,height=600,toolbar=no,scrollbars=yes,resizable=yes')"; + if (!$lines) + { + $options .= ' onchange="if (this.value=\'popup\') '.$popup.';'.($onchange?" else {$onchange}":'').'"'; + $select['popup'] = lang('Search').' ...'; + } + elseif ($onchange) + { + $options .= ' onchange="'.$onchange.'"'; + } + //echo "

html::select('$name',".print_r($selected,True).",".print_r($select,True).",True,'$options')

\n"; + $html = $GLOBALS['phpgw']->html->select($name,$selected,$select,True,$options.' id="'.$element_id.'"',$lines); + + if ($lines > 1 && ($this->account_selection == 'popup' || $this->account_selection == 'primary_group')) + { + $html .= $GLOBALS['phpgw']->html->image('calendar','multi_3',lang('click to select or search accounts'),' onclick="'.$popup.';" style="cursor: pointer; cursor: hand;"'); + } + + if(!$GLOBALS['phpgw_info']['flags']['uiaccountsel']['addOption_installed']) + { + $html .= ''; + $GLOBALS['phpgw_info']['flags']['uiaccountsel']['addOption_installed'] = True; + } + return $html; + } + + function popup($app='') + { + if (!$app) $app = $_GET['app']; + + $group_id = get_var('group_id',array('GET','POST')); + $element_id = get_var('element_id',array('GET','POST')); + + if(isset($_POST['query'])) + { + $GLOBALS['query'] = $_POST['query']; + } + + $start = (int) get_var('start',array('POST'),0); + $order = get_var('order',array('GET'),'account_lid'); + $sort = get_var('sort',array('GET'),'ASC'); + + $this->nextmatchs = CreateObject('phpgwapi.nextmatchs'); + + $GLOBALS['phpgw']->template->set_root($GLOBALS['phpgw']->common->get_tpl_dir('phpgwapi')); + + $GLOBALS['phpgw']->template->set_file(array('accounts_list_t' => 'uiaccountsel.tpl')); + $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_cal','cal'); + $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_other','other'); + $GLOBALS['phpgw']->template->set_block('accounts_list_t','group_all','all'); + + $GLOBALS['phpgw']->template->set_block('accounts_list_t','bla_intro','ibla'); + $GLOBALS['phpgw']->template->set_block('accounts_list_t','other_intro','iother'); + $GLOBALS['phpgw']->template->set_block('accounts_list_t','all_intro','iall'); + + + $GLOBALS['phpgw']->template->set_block('accounts_list_t','accounts_list','list'); + + $GLOBALS['phpgw']->template->set_var('font',$GLOBALS['phpgw_info']['theme']['font']); + $GLOBALS['phpgw']->template->set_var('lang_search',lang('search')); + $GLOBALS['phpgw']->template->set_var('lang_groups',lang('user groups')); + $GLOBALS['phpgw']->template->set_var('lang_accounts',lang('user accounts')); + + $GLOBALS['phpgw']->template->set_var('img',$GLOBALS['phpgw']->common->image('phpgwapi','select')); + $GLOBALS['phpgw']->template->set_var('lang_select_user',lang('Select user')); + $GLOBALS['phpgw']->template->set_var('lang_select_group',lang('Select group')); + $GLOBALS['phpgw']->template->set_var('css_file',$GLOBALS['phpgw_info']['server']['webserver_url'] . + '/phpgwapi/templates/idots/css/idots.css'); + + switch($app) + { + case 'calendar': + $GLOBALS['phpgw']->template->fp('ibla','bla_intro',True); + $GLOBALS['phpgw']->template->fp('iall','all_intro',True); + break; + case 'admin': + $GLOBALS['phpgw']->template->set_var('lang_perm',lang('group name')); + $GLOBALS['phpgw']->template->fp('iother','other_intro',True); + break; + default: + $GLOBALS['phpgw']->template->fp('iother','other_intro',True); + $GLOBALS['phpgw']->template->fp('iall','all_intro',True); + break; + } + + $GLOBALS['phpgw_info']['flags']['currentapp'] = $app; + $GLOBALS['phpgw']->common->phpgw_header(); + + $GLOBALS['phpgw']->template->set_var('lang_perm',lang('Groups with permission for %1',lang($app))); + $GLOBALS['phpgw']->template->set_var('lang_nonperm',lang('Groups without permission for %1',lang($app))); + + $link_data = array + ( + 'menuaction' => 'phpgwapi.uiaccountsel.popup', + 'app' => $app, + 'group_id' => $group_id, + 'element_id' => $element_id, + ); + + $app_groups = array(); + + if ($app != 'admin') + { + $user_groups = $this->membership($this->account); + + $app_user = $GLOBALS['phpgw']->acl->get_ids_for_location('run',1,$app); + for ($i = 0;$iget_type($app_user[$i]); + if($type == 'g') + { + $app_groups[] = $app_user[$i]; + $members[] = $GLOBALS['phpgw']->acl->get_ids_for_location($app_user[$i],1,'phpgw_group'); + } + } + + $i = count($app_user); + while(is_array($members) && list(,$mem) = each($members)) + { + for($j=0;$jget_list('groups'); + $all_user = $this->get_list('accounts'); + + while(is_array($all_groups) && list(,$agroup) = each($all_groups)) + { + $user_groups[] = array + ( + 'account_id' => $agroup['account_id'], + 'account_name' => $agroup['account_firstname'] + ); + } + + for($j=0;$jtemplate->set_var('lang_list_members',lang('List members')); + + if (is_array($user_groups)) + { + foreach($user_groups as $group) + { + $link_data['group_id'] = $group['account_id']; + + $GLOBALS['phpgw']->template->set_var('onclick',"opener.addOption('$element_id','". + $GLOBALS['phpgw']->common->grab_owner_name($group['account_id'])."','$group[account_id]')"); + + if (in_array($group['account_id'],$app_groups)) + { + $GLOBALS['phpgw']->template->set_var('tr_color',$this->nextmatchs->alternate_row_color($tr_color)); + $GLOBALS['phpgw']->template->set_var('link_user_group',$GLOBALS['phpgw']->link('/index.php',$link_data)); + $GLOBALS['phpgw']->template->set_var('name_user_group',$group['account_name']); + $GLOBALS['phpgw']->template->set_var('account_display',$GLOBALS['phpgw']->common->grab_owner_name($group['account_id'])); + $GLOBALS['phpgw']->template->set_var('accountid',$group['account_id']); + + switch($app) + { + case 'calendar': $GLOBALS['phpgw']->template->fp('cal','group_cal',True); break; + default: $GLOBALS['phpgw']->template->fp('other','group_other',True); break; + } + } + else + { + if ($app != 'admin') + { + $GLOBALS['phpgw']->template->set_var('link_all_group',$GLOBALS['phpgw']->link('/index.php',$link_data)); + $GLOBALS['phpgw']->template->set_var('name_all_group',$group['account_name']); + $GLOBALS['phpgw']->template->set_var('accountid',$group['account_id']); + $GLOBALS['phpgw']->template->fp('all','group_all',True); + } + } + } + } + + if (!$GLOBALS['query']) + { + if (isset($group_id) && !empty($group_id)) + { + //echo 'GROUP_ID: ' . $group_id; + $users = $GLOBALS['phpgw']->acl->get_ids_for_location($group_id,1,'phpgw_group'); + + for ($i=0;$iaccounts->account_id = $users[$i]; + $GLOBALS['phpgw']->accounts->read_repository(); + + switch ($order) + { + case 'account_firstname': + $id = $GLOBALS['phpgw']->accounts->data['firstname']; + break; + case 'account_lastname': + $id = $GLOBALS['phpgw']->accounts->data['lastname']; + break; + case 'account_lid': + default: + $id = $GLOBALS['phpgw']->accounts->data['account_lid']; + break; + } + $id .= $GLOBALS['phpgw']->accounts->data['lastname']; // default sort-order + $id .= $GLOBALS['phpgw']->accounts->data['firstname']; + $id .= $GLOBALS['phpgw']->accounts->data['account_id']; // make our index unique + + $val_users[$id] = array + ( + 'account_id' => $GLOBALS['phpgw']->accounts->data['account_id'], + 'account_lid' => $GLOBALS['phpgw']->accounts->data['account_lid'], + 'account_firstname' => $GLOBALS['phpgw']->accounts->data['firstname'], + 'account_lastname' => $GLOBALS['phpgw']->accounts->data['lastname'] + ); + } + } + + if (is_array($val_users)) + { + if ($sort != 'DESC') + { + ksort($val_users); + } + else + { + krsort($val_users); + } + } + $val_users = array_values($val_users); // get a numeric index + } + $total = count($val_users); + } + else + { + switch($app) + { + case 'calendar': $users = 'both'; break; + default: $users = 'accounts'; break; + } + $entries = $this->get_list($users,$start,$sort,$order,$GLOBALS['query']); + $total = $this->total; + for ($i=0;$inextmatchs->left('/index.php',$start,$total,$link_data); + $right = $this->nextmatchs->right('/index.php',$start,$total,$link_data); + $GLOBALS['phpgw']->template->set_var('left',$left); + $GLOBALS['phpgw']->template->set_var('right',$right); + + $GLOBALS['phpgw']->template->set_var('lang_showing',$this->nextmatchs->show_hits($total,$start)); + +// -------------------------- end nextmatch ------------------------------------ + + $GLOBALS['phpgw']->template->set_var('search_action',$GLOBALS['phpgw']->link('/index.php',$link_data)); + $GLOBALS['phpgw']->template->set_var('search_list',$this->nextmatchs->search(array('query' => $GLOBALS['query'], 'search_obj' => 1))); + +// ---------------- list header variable template-declarations -------------------------- + +// -------------- list header variable template-declaration ------------------------ + $GLOBALS['phpgw']->template->set_var('sort_lid',$this->nextmatchs->show_sort_order($sort,'account_lid',$order,'/index.php',lang('LoginID'),$link_data)); + $GLOBALS['phpgw']->template->set_var('sort_firstname',$this->nextmatchs->show_sort_order($sort,'account_firstname',$order,'/index.php',lang('Firstname'),$link_data)); + $GLOBALS['phpgw']->template->set_var('sort_lastname',$this->nextmatchs->show_sort_order($sort,'account_lastname',$order,'/index.php',lang('Lastname'),$link_data)); + +// ------------------------- end header declaration -------------------------------- + $stop = min($start + $this->nextmatchs->maxmatches,count($val_users)); + for($i = $start; $i < $stop; ++$i) + { + $GLOBALS['phpgw']->template->set_var('tr_color',$this->nextmatchs->alternate_row_color($tr_color)); + +// ---------------- template declaration for list records -------------------------- + + $user = $val_users[$i]; + $GLOBALS['phpgw']->template->set_var(array( + 'lid' => $user['account_lid'], + 'firstname' => $user['account_firstname'] ? $user['account_firstname'] : ' ', + 'lastname' => $user['account_lastname'] ? $user['account_lastname'] : ' ', + 'onclick' => "opener.addOption('$element_id','". + $GLOBALS['phpgw']->common->grab_owner_name($user['account_id'])."','$user[account_id]')", + )); + + $GLOBALS['phpgw']->template->fp('list','accounts_list',True); + } + + $GLOBALS['phpgw']->template->set_var('start',$start); + $GLOBALS['phpgw']->template->set_var('sort',$sort); + $GLOBALS['phpgw']->template->set_var('order',$order); + $GLOBALS['phpgw']->template->set_var('query',$GLOBALS['query']); + $GLOBALS['phpgw']->template->set_var('group_id',$group_id); + + $GLOBALS['phpgw']->template->set_var('lang_done',lang('done')); + $GLOBALS['phpgw']->template->pfp('out','accounts_list_t',True); + + $GLOBALS['phpgw']->common->phpgw_footer(); + } + } diff --git a/phpgwapi/templates/default/uiaccountsel.tpl b/phpgwapi/templates/default/uiaccountsel.tpl new file mode 100644 index 0000000000..2e09e0cf5c --- /dev/null +++ b/phpgwapi/templates/default/uiaccountsel.tpl @@ -0,0 +1,123 @@ + + + + +
+ + + + + + + +
+ + + {left} + + {right} + +
{lang_showing}
+
+
+   +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{lang_groups}
{lang_perm}
{lang_perm}
{name_user_group} +
+ +
+
{name_user_group}
 
{lang_nonperm}
{name_all_group}
+
+ + + + + + + + + + + + + + + + + + + + + + +
{lang_accounts}
{sort_lid}{sort_firstname}{sort_lastname} 
{lid}{firstname}{lastname} +
+ +
+
+
+

+ +

+