From be7587e691f1cf5a54ec08a69fd41394f7c6b7e0 Mon Sep 17 00:00:00 2001 From: nathangray Date: Fri, 14 Oct 2016 13:35:17 -0600 Subject: [PATCH] Add sitemgr module for weekN --- .../class.module_calendar_week.inc.php | 359 ++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 calendar/sitemgr/class.module_calendar_week.inc.php diff --git a/calendar/sitemgr/class.module_calendar_week.inc.php b/calendar/sitemgr/class.module_calendar_week.inc.php new file mode 100644 index 0000000000..e947e4ca51 --- /dev/null +++ b/calendar/sitemgr/class.module_calendar_week.inc.php @@ -0,0 +1,359 @@ +arguments = array( + 'cat_id' => array( + 'type' => 'select', + 'label' => lang('Choose a category'), + 'options' => array(), // specification of options is postponed into the get_user_interface function + 'multiple' => true, + ), + 'numWeeks' => array( + 'type' => 'textfield', + 'label' => lang('Number of weeks to show'), + 'default' => 2, + 'params' => array('size' => 1) + ), + 'search' => array( + 'type' => 'textfield', + 'label' => lang('Search string for the events'), + ), + 'owner' => array( + 'type' => 'select', + 'options' => array(), + 'label' => lang('Group(s) or user(s) whose calendars to show (if ACL exists)'), + // 'multiple' => true, is set in the get_user_interface function. + ), + 'resources' => array( + 'type' => 'select', + 'label' => lang('Resources'), + 'options' => array(), + 'multiple' => true + ), + 'css' => array( + 'type' => 'textfield', + 'label' => lang('User selectable CSS file for the calendar setup'), + 'default' => $this->default_css, + ), + 'acceptDateParam' => array( + 'type' => 'checkbox', + 'label' => lang('Shall the date parameter be accepted (e.g. from calendar module)?'), + 'default' => false, + ), + ); + $this->title = lang('Calendar - Multi-Weekly'); + $this->description = lang("This module displays a user's calendar as multiple weeks. Don't give calendar application access to the anon user!"); + } + + function get_user_interface() + { + // copied from bookmarks module. + $cats = new Api\Categories('','calendar'); + foreach($cats->return_array('all',0,False,'','cat_name','',True) as $cat) + { + $this->arguments['cat_id']['options'][$cat['id']] = str_repeat('  ',$cat['level']).$cat['name']; + } + if (count($this->arguments['cat_id']['options']) > 5) + { + $this->arguments['cat_id']['multiple'] = 5; + } + + if (! isset($GLOBALS['egw']->accounts)) + { + $GLOBALS['egw']->accounts = new Api\Accounts(); + } + $this->accounts =& $GLOBALS['egw']->accounts; + $search_params=array( + 'type' => 'both', + 'app' => 'calendar', + ); + $accounts = $this->accounts->search($search_params); + $calendar_bo = new calendar_bo(); + $users = array(); + $groups = array(); + // sort users and groups separately. + $anon_user = $this->accounts->name2id($GLOBALS['Common_BO']->sites->current_site['anonymous_user'],'account_lid','u'); + $anon_groups = $this->accounts->memberships($anon_user,true); + foreach ($accounts as $entry) + { + $is_group = false; + $has_read_permissions = false; + $acl = new Acl($entry['account_id']); + $acl->read_repository(); + // get the rights for each account to check whether the anon user has read permissions. + $rights = $acl->get_rights($anon_user,'calendar'); + // also add the anon user if it's his own calendar. + if ($calendar_bo->check_perms(Acl::READ|calendar_bo::ACL_READ_FOR_PARTICIPANTS|calendar_bo::ACL_FREEBUSY,0,$entry['account_id'],'ts',null,$anon_user) || ($entry['account_id'] == $anon_user)) + { + $has_read_permissions = true; + } + else + { + // scan the groups which pass on permissions to the anon user group member + // or ass permissions if this is the anon group's calendar. + foreach ($anon_groups as $parent_group) + { + $rights = $acl->get_rights($parent_group,'calendar'); + if (($rights & Acl::READ) || ($entry['account_id'] == $parent_group)) + { + $has_read_permissions = true; + break; + } + } + } + if ($has_read_permissions) + { + // Separate groups from users for improved readability. + if ($is_group) + { + $groups[$entry['account_id']] = $entry['account_lid']; + } + else + { + $users[$entry['account_id']] = Api\Accounts::format_username($entry['account_lid'],$entry['account_firstname'],$entry['account_lastname']); + } + } + } + asort($groups); + asort($users); + // concat users and groups to the option array. + $this->arguments['owner']['options'] = array_unique($groups + $users); + if (count($this->arguments['owner']['options']) > 10) + { + $this->arguments['owner']['multiple'] = 10; + } + else if (count($this->arguments['owner']['options']) > 0) + { + $this->arguments['owner']['multiple'] = true; + } + + // Resources + $query = ''; + $options = array('start' => 0, 'num_rows' => 50); + + $acl = new Acl($anon_user); + $acl->read_repository(); + foreach ($calendar_bo->resources as $type => $data) + { + // Check anon user's permissions - must have at least run for the hook to be available + if($acl->check('run',EGW_ACL_READ, $data['app']) && + $type != '' && $data['app'] && Link::get_registry($data['app'], 'query') + ) + { + $_results = Link::query($data['app'], $query,$options); + } + if(!$_results) continue; + $_results = array_unique($_results); + foreach ($_results as $key => $value) + { + if($calendar_bo->check_perms(Acl::READ,0,$type.$key,'ts',null,$anon_user)) + { + $this->arguments['resources']['options'][$type.$key] = $value; + } + } + } + + return parent::get_user_interface(); + } + + function get_content(&$arguments,$properties) + { + $GLOBALS['egw_info']['flags']['currentapp'] = 'calendar'; + Api\Translation::add_app('calendar'); + + //error_log(array2string($arguments)); + if (empty($arguments['date'])) + { + $arguments['date'] = date('Ymd'); + } + + if (isset($_GET['date'])) $arguments['date'] = $_GET['date']; + if (empty($arguments['cat_id'])) $arguments['cat_id'] = ''; + if(isset($arguments['resources']) && in_array('r0', $arguments['resources'])) + { + foreach($arguments['resources'] as $index => $value) + { + if($value == 'r0') + { + unset($arguments['resources'][$index]); + } + } + } + + $params = $arguments; + if (isset($params['resources']) && count($params['resources'])) + { + $params['owner'] = array_merge((array)$params['owner'], (array)$params['resources']); + unset($params['resources']); + } + + $html = ''."\n"; + $html .= Api\Html::image('sitemgr', 'left', lang('Previous'), 'onclick=\'app.calendar.toolbar_action({id:"previous",data:{state:{view:"weekN"}}});\'') + . Api\Html::image('sitemgr', 'right', lang('Next'), 'style="float: right;" onclick=\'app.calendar.toolbar_action({id:"next",data:{state:{view:"weekN"}}});\''); + + if (is_array($params['owner'])) + { + // Buffer, and add anything that gets cleared to the content + ob_start(function($buffer) use(&$html) { + $html .= $buffer; + return ''; + }); + Framework::$header_done = true; + $ui = new calendar_uiviews(); + $ui->owner = $params['owner']; + + $tmpl = new Etemplate('calendar.view'); + + $start = new Api\DateTime($arguments['date']); + $start->setWeekstart(); + $ui->first = $start->format('ts'); + $ui->last = strtotime("+{$params['numWeeks']} weeks",$ui->first) - 1; + + // Calendar uses user preferences for number of weeks, so set it + if((int)$params['numWeeks'] != (int)$ui->cal_prefs['multiple_weeks']) + { + $anon_user = $GLOBALS['egw']->accounts->name2id($GLOBALS['Common_BO']->sites->current_site['anonymous_user'],'account_lid','u'); + $pref = new Api\Preferences($anon_user); + $pref->add('calendar','multiple_weeks',(int)$params['numWeeks']); + $pref->save_repository(); + } + + $navHeader = lang('Week').' '.$ui->week_number($ui->first).' - '.$ui->week_number($this->last).': '. + $ui->bo->long_date($ui->first,$ui->last); + + $granularity = ($ui->cal_prefs['interval'] ? (int)$ui->cal_prefs['interval'] : 30); + + $content = array('view' => array()); + + $sel_options = array(); + + $ui->search_params['query'] = $params['search']; + $ui->search_params['cat_id'] = $params['cat_id']; + + // Loop through, using Api\DateTime to handle DST + $week = 0; + $week_start = new EGroupware\Api\DateTime($ui->first); + $week_start->setTime(0,0,0); + $week_end = new Api\DateTime($week_start); + $week_end->add(new DateInterval('P6DT23H59M59S')); + $last = new EGroupware\Api\DateTime($ui->last); + + for ($week_start; $week_start < $last; $week_start->add('1 week'), $week_end->add('1 week')) + { + $search_params = $ui->search_params; + + $search_params['start'] = $week_start->format('ts'); + $search_params['end'] = $week_end->format('ts'); + + $content['view'][] = (array)$ui->tagWholeDayOnTop($ui->bo->search($search_params)) + + array( + 'id' => $week_start->format('Ymd') + ); + $tmpl->setElementAttribute("view[$week]",'onchange',false); + $tmpl->setElementAttribute("view[$week]",'granularity',$granularity); + $tmpl->setElementAttribute("view[$week]",'height','250px'); + $week++; + } + + + // Make sure all used owners are there, faking + // calendar_owner_etemplate_widget::beforeSendToClient() since the + // rest of the calendar app is probably missing. + foreach($params['owner'] as $owner) + { + $sel_options['owner'][] = Array( + 'id' => $owner, + 'value' => $owner, + 'label' => calendar_owner_etemplate_widget::get_owner_label($owner) + ); + } + $tmpl->exec(__METHOD__, $content,$sel_options, array('__ALL__' => true),array(),2); + $html .= ob_get_contents(); + + $html .= ''; + + ob_end_clean(); + } + else + { + $html .= '
'.lang('No owner selected').'
'; + } + + return $html; + } +}