From 7783ec44e0ebfdd3162b3e7133c2c79fbc5dbc4a Mon Sep 17 00:00:00 2001 From: Hadi Nategh Date: Thu, 31 Oct 2013 14:51:19 +0000 Subject: [PATCH] Calendar app runs by et2 --- calendar/inc/class.calendar_uiforms.inc.php | 261 ++------ calendar/inc/class.calendar_uilist.inc.php | 26 +- calendar/inc/class.calendar_uiviews.inc.php | 77 +-- calendar/js/app.js | 602 ++++++++++++++---- calendar/js/navigation.js | 12 +- calendar/setup/etemplates.inc.php | 9 +- calendar/templates/default/app.css | 13 +- calendar/templates/default/edit.xet | 35 +- calendar/templates/default/edit_series.xet | 4 +- calendar/templates/default/freetimesearch.xet | 12 +- calendar/templates/default/list.xet | 2 +- calendar/templates/default/print.xet | 2 +- 12 files changed, 574 insertions(+), 481 deletions(-) diff --git a/calendar/inc/class.calendar_uiforms.inc.php b/calendar/inc/class.calendar_uiforms.inc.php index 0fabf809c5..5418b9a2b6 100644 --- a/calendar/inc/class.calendar_uiforms.inc.php +++ b/calendar/inc/class.calendar_uiforms.inc.php @@ -219,8 +219,6 @@ class calendar_uiforms extends calendar_ui { $msg = lang('Alarm deleted'); unset($content['alarm'][$id]); - $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; } else { @@ -427,8 +425,7 @@ class calendar_uiforms extends calendar_ui } if (!$content['no_popup']) { - $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; + //we are handling refreshing for status changes on client side } if ($status == 'R' && $event['alarm']) { @@ -557,19 +554,6 @@ class calendar_uiforms extends calendar_ui case 'infolog': if ($event['id'] && !$this->bo->check_perms(EGW_ACL_EDIT,$event)) { - switch ($button) - { - case 'sendrequest': - case 'mail': // just mail without edit-rights is ok - $js = $this->custom_mail($event,false,($button=='sendrequest')); - break 2; - case 'print': // just print without edit-rights is ok - $js = $this->custom_print($event,false); - break 2; - case 'infolog': // create infolog without edit-rights is ok - $this->create_infolog($event['id']); - break 2; - } $msg = lang('Permission denied'); $button = ''; break; @@ -874,23 +858,6 @@ class calendar_uiforms extends calendar_ui { egw_link::link('calendar',$event['id'],$content['link_to']['to_id']); } - $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; - - if ($button == 'print') - { - $js = $this->custom_print($event,!$content['id'])."\n".$js; // first open the new window and then update the view - } - - if ($button == 'mail' || $button == 'sendrequest') - { - $js = $this->custom_mail($event,!$content['id'],($button=='sendrequest'))."\n".$js; // first open the new window and then update the view - } - - if ($button == 'infolog') - { - $this->create_infolog($event['id']); - } } else { @@ -901,8 +868,7 @@ class calendar_uiforms extends calendar_ui case 'cancel': if($content['cancel_needs_refresh']) { - $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; + egw_framework::refresh_opener($msg, 'calendar'); } break; @@ -921,14 +887,13 @@ class calendar_uiforms extends calendar_ui { $msg = lang('Event deleted'); } - $js = "opener.location += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; + } break; case 'freetime': // the "click" has to be in onload, to make sure the button is already created - $GLOBALS['egw']->js->set_onload("document.getElementsByName('exec[freetime]')[0].click();"); + $event['button_was'] = $button; break; case 'add_alarm': @@ -961,8 +926,7 @@ class calendar_uiforms extends calendar_ui $event['alarm'][$alarm_id] = $alarm; $msg = lang('Alarm added'); - $js = "opener.location.search += (opener.location.search?'&msg=':'?msg=')+'". - addslashes($msg)."';"; + egw_framework::refresh_opener($msg,'calendar', $event['id'], 'update'); } else { @@ -994,12 +958,12 @@ class calendar_uiforms extends calendar_ui 'msg' => $msg, )); } - $js .= 'window.close();'; - echo "\n"; + + egw_framework::window_close(); common::egw_exit(); } unset($event['no_notifications']); - return $this->edit($event,$preserv,$msg,$js,$event['id'] ? $event['id'] : $content['link_to']['to_id']); + return $this->edit($event,$preserv,$msg,$event['id'] ? $event['id'] : $content['link_to']['to_id']); } /** @@ -1039,7 +1003,7 @@ class calendar_uiforms extends calendar_ui * @param boolean $added * @return string javascript window.open command */ - function custom_mail($event,$added,$asrequest=false) + function ajax_custom_mail($event,$added,$asrequest=false) { $to = array(); @@ -1089,7 +1053,7 @@ class calendar_uiforms extends calendar_ui fclose($f); } $vars = array( - 'menuaction' => 'felamimail.uicompose.compose', + 'menuaction' => 'mail.mail_compose.compose', 'mimeType' => 'plain', // force type to plain as thunderbird seems to try to be smart while parsing html messages with ics attachments 'preset[to]' => $to, 'preset[subject]' => $subject, @@ -1100,39 +1064,8 @@ class calendar_uiforms extends calendar_ui 'preset[size]' => filesize($ics_file), ); if ($asrequest) $vars['preset[msg]'] = lang('You attempt to mail a meetingrequest to the recipients above. Depending on the client this mail is opened with, the recipient may or may not see the mailbody below, but only see the meeting request attached.'); - return "window.open('".egw::link('/index.php',$vars)."','_blank','width=700,height=700,scrollbars=yes,status=no');"; - } - - /** - * return javascript to open compose window to print the event - * - * @param array $event - * @param boolean $added - * @return string javascript window.open command - */ - function custom_print($event,$added) - { - $vars = array( - 'menuaction' => 'calendar.calendar_uiforms.edit', - 'cal_id' => $event['id'], - 'print' => true, - ); - return "window.open('".egw::link('/index.php',$vars)."','_blank','width=700,height=700,scrollbars=yes,status=no');"; - } - - /** - * Open new infolog window to convert event to an infolog - * - * @param array|int $event event or id - */ - function create_infolog($event,$added) - { - $vars = array( - 'menuaction' => 'infolog.infolog_ui.edit', - 'action' => 'calendar', - 'action_id' => is_array($event) ? $event['id'] : $event, - ); - egw::redirect_link('/index.php', $vars); + $response = egw_json_response::get(); + $response->call('app.calendar.custom_mail', $vars); } /** @@ -1176,10 +1109,9 @@ class calendar_uiforms extends calendar_ui * no_popup boolean use a popup or not * edit_single int timestamp of single event edited, unset/null otherwise * @param string $msg='' msg to display - * @param string $js='window.focus();' javascript to include in the page * @param mixed $link_to_id='' $content from or for the link-widget */ - function edit($event=null,$preserv=null,$msg='',$js = 'window.focus();',$link_to_id='') + function edit($event=null,$preserv=null,$msg='',$link_to_id='') { $sel_options = array( 'recur_type' => &$this->bo->recur_types, @@ -1251,7 +1183,7 @@ class calendar_uiforms extends calendar_ui { if (!$preserv['no_popup']) { - $js = "alert('".lang('Permission denied')."'); window.close();"; + egw_framework::window_close(lang('Permission denied')); } else { @@ -1328,7 +1260,7 @@ class calendar_uiforms extends calendar_ui } } } - $etpl = new etemplate(); + $etpl = new etemplate_new(); if (!$etpl->read($preserv['template'])) { $etpl->read($preserv['template'] = 'calendar.edit'); @@ -1357,40 +1289,13 @@ class calendar_uiforms extends calendar_ui } elseif(egw_vfs::lock($lock_path,$preserv['lock_token'],$locktime,$lock_owner,$scope='shared',$type='write',false,false)) { - // install ajax handler to unlock the entry again, if the window get's closed by the user (X of window or our [Close] button) - $GLOBALS['egw']->js->set_onunload("if (do_onunload) xajax_doXMLHTTPsync('calendar.calendar_uiforms.ajax_unlock',$event[id],'$preserv[lock_token]');"); - $GLOBALS['egw']->js->set_onload("replace_eTemplate_onsubmit();"); - - // overwrite submit method of eTemplate form AND onSubmit event, to switch off onUnload handler for regular form submits - // selectboxes use onchange(this.form.submit()) which does not fire onSubmit event --> need to overwrite submit() method - // regular submit buttons dont call submit(), but trigger onSubmit event --> need to overwrite onSubmit event - $GLOBALS['egw_info']['flags']['java_script'] .= ' - -'; + //We handle AJAX_REQUEST in client-side for unlocking the locked entry, in case of closing the entry by X button or close button } else { $msg .= ' '.lang("Can't aquire lock!"); // eg. an exclusive lock via CalDAV ... $view = true; } - //echo "

lock_path=$lock_path, lock_owner=$lock_owner, lock_token=$preserv[lock_token], msg=$msg

\n"; } $content = array_merge($event,array( 'link_to' => array( @@ -1573,22 +1478,13 @@ function replace_eTemplate_onsubmit() } else { - //Add the check_recur_type function to onload, which disables recur_data function - //if recur_type is not repeat weekly. - $onload = "check_recur_type('recur_type',2);"; - // We hide the enddate if one of our predefined durations fits - // the call to set_style_by_class has to be in onload, to make sure the function and the element is already created - $onload .= " \$j('table.end_hide').css('display','".($content['duration'] && isset($sel_options['duration'][$content['duration']]) ? 'none' : 'block')."');"; - - $GLOBALS['egw']->js->set_onload($onload); - $readonlys['recur_exception'] = true; if ($event['recur_type'] != MCAL_RECUR_NONE) { $readonlys['recur_exception'] = !count($content['recur_exception']); // otherwise we get a delete button - $onclick =& $etpl->get_cell_attribute('button[delete]','onclick'); - $onclick = str_replace('Delete this event','Delete this series of recuring events',$onclick); + //$onclick =& $etpl->get_cell_attribute('button[delete]','onclick'); + //$onclick = str_replace('Delete this event','Delete this series of recuring events',$onclick); } elseif ($event['reference'] != 0) { @@ -1663,16 +1559,10 @@ function replace_eTemplate_onsubmit() : ($view ? ($content['edit_single'] ? lang('View exception') : ($content['recur_type'] ? lang('View series') : lang('View'))) : ($content['edit_single'] ? lang('Create exception') : ($content['recur_type'] ? lang('Edit series') : lang('Edit'))))); - //Function for disabling the recur_data multiselect box - $js .= - "\nfunction check_recur_type(_id, _ind)\n{\nif(document.getElementById('exec['+_id+']')) { - egw_set_checkbox_multiselect_enabled('recur_data',". - "document.getElementById('exec['+_id+']').selectedIndex == _ind);\n\n}\n}\n"; - - $GLOBALS['egw_info']['flags']['java_script'] .= "\n"; - $content['cancel_needs_refresh'] = (bool)$_GET['cancel_needs_refresh']; + if (!empty($preserv['lock_token'])) $content['lock_token'] = $preserv['lock_token']; + // non_interactive==true from $_GET calls immediate save action without displaying the edit form if(isset($_GET['non_interactive']) && (bool)$_GET['non_interactive'] === true) { @@ -1701,9 +1591,6 @@ function replace_eTemplate_onsubmit() { egw_vfs::unlock($lock_path,$token,false); } - $response = new xajaxResponse(); - $response->addScript('window.close();'); - return $response->getXML(); } /** @@ -1879,12 +1766,12 @@ function replace_eTemplate_onsubmit() $event['ics_method'] = $readonlys['ics_method'] = strtolower($ical_method); $event['ics_method_label'] = strtolower($ical_method) == 'request' ? lang('Meeting request') : lang('Reply to meeting request'); - $tpl = new etemplate('calendar.meeting'); + $tpl = new etemplate_new('calendar.meeting'); $tpl->exec('calendar.calendar_uiforms.meeting', $event, $sel_options, $readonlys, $event, 2); } /** - * displays a sheduling conflict + * displays a scheduling conflict * * @param array $event * @param array $conflicts array with conflicting events, the events are not garantied to be readable by the user! @@ -1892,7 +1779,7 @@ function replace_eTemplate_onsubmit() */ function conflicts($event,$conflicts,$preserv) { - $etpl = CreateObject('etemplate.etemplate','calendar.conflicts'); + $etpl = CreateObject('etemplate.etemplate_new','calendar.conflicts'); foreach($conflicts as $k => $conflict) { @@ -1943,7 +1830,7 @@ function replace_eTemplate_onsubmit() */ function ajax_freetimesearch(array $edit_content) { - $response = new xajaxResponse(); + $response = egw_json_response::get(); //$response->addAlert(__METHOD__.'('.array2string($edit_content).')'); if ($edit_content['duration']) @@ -1994,14 +1881,12 @@ function replace_eTemplate_onsubmit() egw_cache::setSession('calendar','freetimesearch_args_'.(int)$edit_content['id'],$content); //menuaction=calendar.calendar_uiforms.freetimesearch&values2url('start,end,duration,participants,recur_type,whole_day'),ft_search,700,500 - $link = egw::link('/index.php',array( - 'menuaction' => 'calendar.calendar_uiforms.freetimesearch', - 'cal_id' => $edit_content['id'], - )); + $link = 'calendar.calendar_uiforms.freetimesearch&cal_id='. $edit_content['id']; - $response->addScriptCall('egw_openWindowCentered2',$link,'ft_search',700,500); + $response->call('app.calendar.freetime_search_popup',$link); + + //$response->addScriptCall('egw_openWindowCentered2',$link,'ft_search',700,500); - return $response->getXML(); } /** @@ -2019,8 +1904,7 @@ function replace_eTemplate_onsubmit() */ function freetimesearch($content = null) { - $etpl = new etemplate('calendar.freetimesearch'); - + $etpl = new etemplate_new('calendar.freetimesearch'); $sel_options['search_window'] = array( 7*DAY_s => lang('one week'), 14*DAY_s => lang('two weeks'), @@ -2033,6 +1917,12 @@ function replace_eTemplate_onsubmit() // get content from session (and delete it immediatly) $content = egw_cache::getSession('calendar','freetimesearch_args_'.(int)$_GET['cal_id']); egw_cache::unsetSession('calendar','freetimesearch_args_'.(int)$_GET['cal_id']); + //Since the start_time and end_time from calendar_user_preferences are numbers, not timestamp, in order to show them on date-timeonly + //widget we need to convert them from numbers to timestamps, only for the first time when we have template without content + $sTime = $content['start_time']; + $eTime = $content['end_time']; + $content['start_time'] = strtotime(((strlen($content['start_time'])<2)?("0".$content['start_time']):$content['start_time']).":00"); + $content['end_time'] = strtotime(((strlen($content['end_time'])<2)?("0".$content['end_time']):$content['end_time']).":00"); // pick a searchwindow fitting the duration (search for a 10 day slot in a one week window never succeeds) foreach($sel_options['search_window'] as $window => $label) @@ -2047,83 +1937,30 @@ function replace_eTemplate_onsubmit() else { if (!$content['duration']) $content['duration'] = $content['end'] - $content['start']; - - if (is_array($content['freetime']['select'])) + $weekds = 0; + foreach ($content['weekdays'] as $keys =>$wdays) { - list($selected) = each($content['freetime']['select']); - //echo "$selected = ".date('D d.m.Y H:i',$content['freetime'][$selected]['start']); - $start = (int) $content['freetime'][$selected]['start']; - $end = $start + $content['duration']; - /** - * ToDo: make this an eTemplate function to transmit content back to the opener - */ - $fields_to_set = array( - 'exec[start][str]' => date($this->common_prefs['dateformat'],$start), - 'exec[start][i]' => (int) date('i',$start), - 'exec[end][str]' => date($this->common_prefs['dateformat'],$end), - 'exec[end][i]' => (int) date('i',$end), - 'exec[duration]' => $content['duration'], - ); - if ($this->common_prefs['timeformat'] == 12) - { - $fields_to_set += array( - 'exec[start][H]' => date('h',$start), - 'exec[start][a]' => date('a',$start), - 'exec[end][H]' => date('h',$end), - 'exec[end][a]' => date('a',$end), - ); - } - else - { - $fields_to_set += array( - 'exec[start][H]' => (int) date('H',$start), - 'exec[end][H]' => (int) date('H',$end), - ); - } - echo " - -\n"; - exit; + $weekds = $weekds + $wdays; } + //split_freetime_daywise function expects to get start_time and end_time values as string numbers, only "hour", therefore, since the date-timeonly widget returns + //always timestamp, we need to convert them to only "hour" string numbers. + $sTime = date('H', $content['start_time']); + $eTime = date('H', $content['end_time']); } + if ($content['recur_type']) { $content['msg'] .= lang('Only the initial date of that recuring event is checked!'); } $content['freetime'] = $this->freetime($content['participants'],$content['start'],$content['start']+$content['search_window'],$content['duration'],$content['cal_id']); - $content['freetime'] = $this->split_freetime_daywise($content['freetime'],$content['duration'],$content['weekdays'],$content['start_time'],$content['end_time'],$sel_options); + $content['freetime'] = $this->split_freetime_daywise($content['freetime'],$content['duration'],(is_array($content['weekdays'])?$weekds:$content['weekdays']),$sTime,$eTime,$sel_options); - //echo "
".print_r($content,true)."
\n"; $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('freetime search'); - // let the window popup, if its already there - $GLOBALS['egw_info']['flags']['java_script'] .= "\n"; - if (!is_object($GLOBALS['egw']->js)) - { - $GLOBALS['egw']->js = CreateObject('phpgwapi.javascript'); - } $sel_options['duration'] = $this->durations; if ($content['duration'] && isset($sel_options['duration'][$content['duration']])) $content['end'] = ''; - // We hide the enddate if one of our predefined durations fits - // the call to set_style_by_class has to be in onload, to make sure the function and the element is already created - $GLOBALS['egw']->js->set_onload("\$j('table.end_hide').css('visibility','".($content['duration'] && isset($sel_options['duration'][$content['duration']]) ? 'hidden' : 'visible')."');"); - $etpl->exec('calendar.calendar_uiforms.freetimesearch',$content,$sel_options,'',array( + $etpl->exec('calendar.calendar_uiforms.freetimesearch',$content,$sel_options,NULL,array( 'participants' => $content['participants'], 'cal_id' => $content['cal_id'], 'recur_type' => $content['recur_type'], @@ -2275,7 +2112,7 @@ function replace_eTemplate_onsubmit() $end_date = $e-$daybegin > DAY_s ? lang(date('l',$e)).' '.date($this->common_prefs['dateformat'],$e).' ' : ''; $times[$s] = date($time_format,$s).' - '.$end_date.date($time_format,$e); } - $sel_options[$n.'[start]'] = $times; + $sel_options[$n.'start'] = $times; } } return $freetime_daywise; @@ -2343,7 +2180,7 @@ function replace_eTemplate_onsubmit() $content['msg'] = $msg; $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Export'); - $etpl = new etemplate('calendar.export'); + $etpl = new etemplate_new('calendar.export'); $etpl->exec('calendar.calendar_uiforms.export',$content); } @@ -2383,7 +2220,7 @@ function replace_eTemplate_onsubmit() 'msg' => $msg, ); $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Import'); - $etpl = new etemplate('calendar.import'); + $etpl = new etemplate_new('calendar.import'); $etpl->exec('calendar.calendar_uiforms.import',$content); } @@ -2449,7 +2286,7 @@ function replace_eTemplate_onsubmit() $content['rows'][] = array('cat_id' => ''); $GLOBALS['egw_info']['flags']['app_header'] = lang('Calendar').' - '.lang('Category ACL'); - $tmp = new etemplate('calendar.cat_acl'); + $tmp = new etemplate_new('calendar.cat_acl'); $tmp->exec('calendar.calendar_uiforms.cat_acl',$content,null,$readonlys,$preserv); } diff --git a/calendar/inc/class.calendar_uilist.inc.php b/calendar/inc/class.calendar_uilist.inc.php index 23a9a82ebe..89222168fc 100644 --- a/calendar/inc/class.calendar_uilist.inc.php +++ b/calendar/inc/class.calendar_uilist.inc.php @@ -95,7 +95,7 @@ class calendar_uilist extends calendar_ui if ($_GET['msg']) $msg .= $_GET['msg']; if ($this->group_warning) $msg .= $this->group_warning; - $etpl = new etemplate('calendar.list'); + $etpl = new etemplate_new('calendar.list'); // Handle merge from sidebox if($_GET['merge']) @@ -157,7 +157,7 @@ class calendar_uilist extends calendar_ui 'order' => 'cal_start',// IO name of the column to sort after (optional for the sortheaders) 'sort' => 'ASC',// IO direction of the sort: 'ASC' or 'DESC' 'default_cols' => '!week,weekday,cal_title,cal_description,recure,cal_location,cal_owner,cat_id,pm_id,legacy_actions', - 'filter_onchange' => "set_style_by_class('table','custom_hide','visibility',this.value == 'custom' ? 'visible' : 'hidden'); if (this.value != 'custom') this.form.submit();", + 'filter_onchange' => "app.calendar.filter_change", 'header_left' => 'calendar.list.dates', 'row_id' => 'row_id', // set in get rows "$event[id]:$event[recur_date]" 'actions' => $this->get_actions(), @@ -188,7 +188,7 @@ class calendar_uilist extends calendar_ui $html = $etpl->exec('calendar.calendar_uilist.listview',$content,$sel_options,$readonlys,array(),$home ? -1 : 0); // Not sure why this has to be echoed instead of appended, but that's what works. - echo calendar_uiviews::edit_series(); + //echo calendar_uiviews::edit_series(); return $html; } @@ -290,7 +290,6 @@ class calendar_uilist extends calendar_ui $label = lang('Before %1',$this->bo->long_date($this->date)); break; case 'custom': - $GLOBALS['egw']->js->set_onload("set_style_by_class('table','custom_hide','visibility','visible');"); $this->first = $search_params['start'] = $params['startdate']; $this->last = $search_params['end'] = strtotime('+1 day', $params['enddate'])-1; $label = $this->bo->long_date($this->first,$this->last); @@ -456,10 +455,8 @@ class calendar_uilist extends calendar_ui unset($app); unset($app_id); } - // set js_calendar_integration object, for app.js cal_open() function - $GLOBALS['egw_info']['flags']['java_script'] = ''; + // set js_calendar_integration object, to use it in app.js cal_open() function + $params['js_integration_data'] = json_encode($js_integration_data); $wv=0; $dv=0; @@ -801,7 +798,7 @@ class calendar_uilist extends calendar_ui 'url' => 'menuaction=calendar.calendar_uiforms.edit&cal_id=$id', 'popup' => egw_link::get_registry('calendar', 'view_popup'), 'group' => $group=1, - 'onExecute' => 'javaScript:cal_open', + 'onExecute' => 'javaScript:app.calendar.cal_open', 'disableClass' => 'rowNoView', ), 'copy' => array( @@ -843,7 +840,7 @@ class calendar_uilist extends calendar_ui 'url' => 'menuaction=filemanager.filemanager_ui.index&path=/apps/$app/$id', 'group' => $group, 'allowOnMultiple' => false, - 'onExecute' => 'javaScript:cal_fix_app_id', + 'onExecute' => 'javaScript:app.calendar.cal_fix_app_id', 'disableClass' => 'rowNoView', ); } @@ -867,7 +864,7 @@ class calendar_uilist extends calendar_ui 'group' => $group, 'allowOnMultiple' => false, 'hideOnDisabled' => true, // show only one timesheet action in context menu - 'onExecute' => 'javaScript:cal_fix_app_id', + 'onExecute' => 'javaScript:app.calendar.cal_fix_app_id', 'popup' => egw_link::get_registry('timesheet', 'add_popup'), ); $actions['timesheet-add'] = array( // automatic add for multiple events @@ -893,9 +890,7 @@ class calendar_uilist extends calendar_ui ++$group; $actions['delete'] = array( 'caption' => 'Delete', - 'confirm' => 'Delete this event', - 'confirm_multiple' => 'Delete these entries', - 'onExecute' => 'javaScript:cal_delete', + 'onExecute' => 'javaScript:app.calendar.cal_delete', 'group' => $group, 'disableClass' => 'rowNoDelete', ); @@ -904,11 +899,10 @@ class calendar_uilist extends calendar_ui { $actions['undelete'] = array( 'caption' => 'Un-delete', - 'onExecute' => 'javaScript:cal_delete', + 'onExecute' => 'javaScript:app.calendar.cal_delete', 'icon' => 'revert', 'hint' => 'Recover this event', 'group' => $group, - 'enabled' => 'javaScript:nm_enableClass', 'enableClass' => 'rowDeleted', 'hideOnDisabled' => true, ); diff --git a/calendar/inc/class.calendar_uiviews.inc.php b/calendar/inc/class.calendar_uiviews.inc.php index 74525d4611..a2ba093d44 100644 --- a/calendar/inc/class.calendar_uiviews.inc.php +++ b/calendar/inc/class.calendar_uiviews.inc.php @@ -360,7 +360,6 @@ class calendar_uiviews extends calendar_ui $content =& $this->plannerWidget($events,$this->first,$this->last,$this->sortby != 'category' ? $this->sortby : (int) $this->cat_id); - $content .= $this->edit_series(); if (!$home) { @@ -395,7 +394,6 @@ class calendar_uiviews extends calendar_ui { if ($this->debug > 0) $this->bo->debug_message('uiviews::year date=%2',True,$this->date); - $content = $this->edit_series(); $this->_month_align_year($this->first,$this->last); @@ -675,7 +673,6 @@ class calendar_uiviews extends calendar_ui 'end' => $this->last, )+$this->search_params); - $content = $this->edit_series(); // we add DAY_s/2 to $this->first (using 12h), to deal with daylight saving changes for ($week_start = $this->first; $week_start < $this->last; $week_start = strtotime("+1 week",$week_start)) { @@ -885,7 +882,6 @@ class calendar_uiviews extends calendar_ui count($users) * $this->cal_prefs['interval'],400 / count($users),'','',$uid); } } - $content .= $this->edit_series(); if (!$home) { @@ -970,7 +966,6 @@ class calendar_uiviews extends calendar_ui $cols[0] =& $this->timeGridWidget($this->tagWholeDayOnTop($dayEvents),$this->cal_prefs['interval'],450,'','',$owner); - $cols[0] .= $this->edit_series(); // only show todo's for a single user if (count($users) == 1 && ($todos = $this->get_todos($todo_label)) !== false) @@ -1004,7 +999,6 @@ class calendar_uiviews extends calendar_ui else { $content = $this->timeGridWidget($this->bo->search($this->search_params),$this->cal_prefs['interval'],300); - $content .= $this->edit_series(); // make wz_dragdrop elements work if(is_object($this->dragdrop)) { $this->dragdrop->setJSCode(); } @@ -1013,75 +1007,6 @@ class calendar_uiviews extends calendar_ui } } - /** - * Return HTML and Javascript to query user about editing an event series or create an exception - * - * Layout is defined in eTemplate 'calendar.edit_series' - * - * @param string $link=null url without cal_id and date GET parameters, default calendar.calendar_uiforms.edit - * @param string $target='_blank' target - * @return string - */ - function edit_series($link=null,$target='_blank') - { - if (is_null($link)) $link = egw::link('/index.php',array('menuaction'=>'calendar.calendar_uiforms.edit')); - - $tpl = new etemplate('calendar.edit_series'); - - return $tpl->show(array()).''; - } - /** * Query the open ToDo's via a hook from InfoLog or any other 'calendar_include_todos' provider * @@ -1875,7 +1800,7 @@ function open_edit(series) { if ($event['recur_type'] != MCAL_RECUR_NONE) { - $popup = ' onclick="edit_series(event,'.$event['id'].','.$this->bo->date2string($event['start']).');"'; + $popup = ' onclick="app.calendar.edit_series(event,'.$event['id'].','.$this->bo->date2string($event['start']).');"'; } else { diff --git a/calendar/js/app.js b/calendar/js/app.js index 073884ca78..7887fdaa2c 100644 --- a/calendar/js/app.js +++ b/calendar/js/app.js @@ -1,147 +1,499 @@ /** - * Calendar - static javaScript functions + * EGroupware - Calendar - Javascript UI * * @link http://www.egroupware.org - * @author Ralf Becker * @package calendar + * @author Hadi Nategh + * @copyright (c) 2008-13 by Ralf Becker * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @version $Id$ */ /** - * Fix calendar specific id: "cal_id:recurrence" or "appId:", replacing $app and $id in url - * - * Cut away the recurrence date from id, and use app from calendar integration - * - * @param _action - * @param _senders + * UI for calendar + * + * @augments AppJS */ -function cal_fix_app_id(_action, _senders) +app.calendar = AppJS.extend( { - var app = 'calendar'; - var id = _senders[0].id; - var matches = id.match(/^([0-9]+):([0-9]+)$/); - if (matches) + /** + * application name + */ + appname: 'calendar', + /** + * et2 widget container + */ + et2: null, + /** + * edit_series vars + */ + calendar_edit_id: null, + calendar_edit_date: null, + /** + * Constructor + * + * @memberOf app.calendar + */ + init: function() { - id = matches[1]; - } - else if (matches = id.match(/^([a-z_-]+)([0-9]+)/i)) + // call parent + this._super.apply(this, arguments); + }, + + /** + * Destructor + */ + destroy: function() { - app = matches[1]; - id = matches[2]; - } - var backup_url = _action.data.url; - + delete this.et2; + // call parent + this._super.apply(this, arguments); + + }, + + /** + * This function is called when the etemplate2 object is loaded + * and ready. If you must store a reference to the et2 object, + * make sure to clean it up in destroy(). + * + * @param et2 etemplate2 Newly ready object + */ + et2_ready: function(et2) + { + // call parent + this._super.apply(this, arguments); + var content = this.et2.getArrayMgr('content'); + + if (typeof et2.templates['calendar.list'] != 'undefined') + { + this.filter_change(); + } + if (typeof et2.templates['calendar.edit'] != 'undefined' && typeof content.data['conflicts'] == 'undefined') + { + $j(document.getElementById('calendar-edit_calendar-delete_series')).hide(); + //Check if it's fallback from conflict window or it's from edit window + if (content.data['button_was'] != 'freetime') + { + this.set_enddate_visibility(); + this.check_recur_type(); + } + else + { + this.freetime_search(); + } + //send Syncronus ajax request to the server to unlock the on close entry + //set onbeforeunload with json request to send request when the window gets close by X button + window.onbeforeunload = function () { + this.egw.json('calendar.calendar_uiforms.ajax_unlock' + , [content.data['id'],content.data['lock_token']],null,true,null,null).sendRequest(true); + }; + } + //this.replace_eTemplate_onsubmit(); + if (typeof et2.templates['calendar.freetimesearch'] != 'undefined') + { + this.set_enddate_visibility(); + } + }, + + /** + * open the freetime search popup + * + */ + freetime_search_popup: function(_link) + { + this.egw.open_link(_link,'ft_search','700x500') ; + }, + + /** + * send an ajax request to server to set the freetimesearch window content + * + */ + freetime_search: function() + { + var content = this.et2.getArrayMgr('content').data; + content['start'] = this.et2.getWidgetById('start').get_value(); + content['end'] = this.et2.getWidgetById('end').get_value(); + content['duration'] = this.et2.getWidgetById('duration').get_value(); + + var request = this.egw.json('calendar.calendar_uiforms.ajax_freetimesearch', [content],null,null,null,null); + request.sendRequest(); + }, + + /** + * Function for disabling the recur_data multiselect box + * + */ + check_recur_type: function() + { + var recurType = this.et2.getWidgetById('recur_type'); + var recurData = this.et2.getWidgetById('recur_data'); + + if(recurType && recurData) + { + recurData.set_disabled(recurType.get_value() != 2); + } + }, + + /** + * Show/Hide end date, for both edit and freetimesearch popups, + * based on if "use end date" selected or not. + * + */ + set_enddate_visibility: function() + { + var duration = this.et2.getWidgetById('duration'); + var end = this.et2.getWidgetById('end'); + if (typeof duration != 'undefined' && typeof end != 'undefined') + { + end.set_disabled(duration.get_value()!==''); + } + }, + + /** + * handles actions selectbox in calendar edit popup + * + * @param {widget object} widget, widget "actions selectBox" in edit popup window + */ + actions_change: function(egw,widget) + { + var event = this.et2.getArrayMgr('content').data; + if (widget) + { + var id = this.et2.getArrayMgr('content').data['id']; + switch (widget.get_value()) + { + case 'print': + this.egw.open_link('calendar.calendar_uiforms.edit&cal_id='+id+'&print=1','_blank','700x700'); + this.et2._inst.submit(); + break; + case 'mail': + this.egw.json('calendar.calendar_uiforms.ajax_custom_mail', [event, !event['id'], false],null,null,null,null).sendRequest(); + this.et2._inst.submit(); + break; + case 'sendrequest': + this.egw.json('calendar.calendar_uiforms.ajax_custom_mail', [event, !event['id'], true],null,null,null,null).sendRequest(); + this.et2._inst.submit(); + break; + case 'infolog': + this.egw.open_link('infolog.infolog_ui.edit&action=calendar&action_id='+($j.isPlainObject(event)?event['id']:event),'_self','700x600','infolog'); + this.et2._inst.submit(); + break; + default: + this.et2._inst.submit(); + } + } + }, + /** + * open mail compose popup window + * + * @param {Array} vars, + * @todo need to provide right mail compose from server to custom_mail function + */ + custom_mail: function (vars) + { + this.egw.open_link('mail.mail_compose.compose&','_blank','700x700'); + }, + /** + * control delete_series popup visibility + * + * @param {Array} exceptions, an array contains number of exception entries + * + */ + delete_btn: function(exceptions) + { + var content = this.et2.getArrayMgr('content').data; + + if (exceptions) + { + + $j(document.getElementById('calendar-edit_calendar-delete_series')).show(); + } + else if (content['recur_type'] !== 0) + { + return confirm('Delete this series of recuring events'); + } + else + { + return confirm('Delete this event'); + } + }, + + /** + * print_participants_status(egw,widget) + * Handle to apply changes from status in print popup + * + * @param {widget object} widget, widget "status" in print popup window + * + */ + print_participants_status: function(egw,widget) + { + if (widget && window.opener) + { + //Parent popup window + var editPopWindow = window.opener; + + if (editPopWindow) + { + //Update paretn popup window + editPopWindow.etemplate2.getByApplication('calendar')[0].widgetContainer.getWidgetById(widget.id).set_value(widget.get_value()); + } + this.et2._inst.submit(); + + editPopWindow.opener.egw_refresh('status changed','calendar'); + } + else if (widget) + { + window.egw_refresh(this.egw.lang('The original popup edit window is closed! You need to close the print window and reopen the entry again.'),'calendar'); + } + }, + + /** + * Handles to select freetime, and replace the selected one on Start, + * and End date&time in edit calendar entry popup. + * + * @param {widget object} _widget, widget "select button" in freetime search popup window + * + */ + freetime_select: function(_egw,_widget) + { + if (_widget) + { + var content = this.et2._inst.widgetContainer.getArrayMgr('content').data; + // Make the Id from selected button by checking the index + var selectedId = _widget.id.match(/^select\[([0-9])\]$/i)[1]; + + var sTime = this.et2.getWidgetById(selectedId+'start'); + + var eTime = this.et2.getWidgetById(selectedId+'[end]'); + //Catches the start time from freetime content + var str = sTime.get_value(); + + var end = parseInt(str) + parseInt(content['duration']); + + //check the parent window is still open before to try to access it + if (window.opener) + { + var editWindowObj = window.opener.etemplate2.getByApplication('calendar')[0]; + if (typeof editWindowObj != "undefined") + { + var startTime = editWindowObj.widgetContainer.getWidgetById('start'); + var endTime = editWindowObj.widgetContainer.getWidgetById('end'); + if (startTime && endTime) + { + startTime.set_value(str); + endTime.set_value(end); + } + } + } + else + { + alert(this.egw.lang('The original calendar edit popup is closed!')); + } + } + window.close(); + }, + + /** + * show/hide the filter of nm list in calendar listview + * + */ + filter_change: function() + { + var filter = this.et2.getWidgetById('filter'); + var dates = this.et2.getWidgetById('calendar.list.dates'); + + if (filter && dates) + { + dates.set_disabled(filter.value !== "custom"); + } + }, + + /** + * this function try to fix ids which are from integrated apps + * + */ + cal_fix_app_id: function(_action, _senders) + { + var app = 'calendar'; + var id = _senders[0].id; + var matches = id.match(/^([0-9]+):([0-9]+)$/); + if (matches) + { + id = matches[1]; + } + else if (matches = id.match(/^([a-z_-]+)([0-9]+)/i)) + { + app = matches[1]; + id = matches[2]; + } + var backup_url = _action.data.url; + _action.data.url = _action.data.url.replace(/(\$|%24)id/,id); _action.data.url = _action.data.url.replace(/(\$|%24)app/,app); - nm_action(_action, _senders); - - _action.data.url = backup_url; // restore url -} + nm_action(_action, _senders); + //egw.open_link( _action.data.url,'timesheet','edit'); + _action.data.url = backup_url; // restore url + }, -/** - * Open calendar entry, taking into accout the calendar integration of other apps - * - * calendar_uilist::get_rows sets var js_calendar_integration object - * - * @param _action - * @param _senders - */ -function cal_open(_action, _senders) -{ - var id = _senders[0].id; - var matches = id.match(/^(?:calendar::)?([0-9]+):([0-9]+)$/); - var backup = _action.data; - if (matches) + /** + * Open calendar entry, taking into accout the calendar integration of other apps + * + * calendar_uilist::get_rows sets var js_calendar_integration object + * + * @param _action + * @param _senders + * + */ + cal_open: function(_action, _senders) { - edit_series(matches[1],matches[2]); - return; - } - else if (matches = id.match(/^([a-z_-]+)([0-9]+)/i)) - { - var app = matches[1]; - _action.data.url = window.egw_webserverUrl+'/index.php?'; - var get_params = js_integration_data[app].edit; - get_params[js_integration_data[app].edit_id] = matches[2]; - for(var name in get_params) - _action.data.url += name+"="+encodeURIComponent(get_params[name])+"&"; - - if (js_integration_data[app].edit_popup && - (matches = js_integration_data[app].edit_popup.match(/^(.*)x(.*)$/))) - { - _action.data.width = matches[1]; - _action.data.height = matches[2]; - } - else - { - _action.data.nm_action = 'location'; - } - } - console.log(_action); - nm_action(_action, _senders, null, {ids: []}); - - _action.data = backup; // restore url, width, height, nm_action -} - -/** - * Delete calendar entry, asking if you want to delete series or exception - * - * - * @param _action - * @param _senders - */ -function cal_delete(_action, _senders) -{ - var backup = _action.data; - var matches = false; - - // Loop so we ask if any of the selected entries is part of a series - for(var i = 0; i < _senders.length; i++) - { - var id = _senders[i].id; - if(!matches) - { - matches = id.match(/^(?:calendar::)?([0-9]+):([0-9]+)$/); - } - } - if (matches) - { - var id = matches[1]; - var date = matches[2]; - var popup = jQuery(document.getElementById(_action.getManager().etemplate_var_prefix + '[' + _action.id + '_popup]')); - var row = null; - - // Cancel normal confirm - delete _action.data.confirm; - delete _action.data.confirm_multiple; - - // nm action - show popup - nm_open_popup(_action,_senders); - - if(!popup) + var js_integration_data = this.et2.getArrayMgr('content').data.nm.js_integration_data; + var id = _senders[0].id; + var matches = id.match(/^(?:calendar::)?([0-9]+):([0-9]+)$/); + var backup = _action.data; + if (matches) { + this.edit_series(matches[1],matches[2]); return; } - if (row = jQuery("#"+id+"\\:"+date)) { - // Open at row - popup.css({ - position: "absolute", - top: row.position().top + row.height() -popup.height()/2, - left: $j(window).width()/2-popup.width()/2 - }); - } else { - // Open popup in the middle - popup.css({ - position: "absolute", - top: $j(window).height()/2-popup.height()/2, - left: $j(window).width()/2-popup.width()/2 - }); + else if (matches = id.match(/^([a-z_-]+)([0-9]+)/i)) + { + var app = matches[1]; + _action.data.url = window.egw_webserverUrl+'/index.php?'; + var get_params = js_integration_data[app].edit; + get_params[js_integration_data[app].edit_id] = matches[2]; + for(var name in get_params) + _action.data.url += name+"="+encodeURIComponent(get_params[name])+"&"; + + if (js_integration_data[app].edit_popup && + (matches = js_integration_data[app].edit_popup.match(/^(.*)x(.*)$/))) + { + _action.data.width = matches[1]; + _action.data.height = matches[2]; + } + else + { + _action.data.nm_action = 'location'; + } } - return; - } - console.log(_action); - nm_action(_action, _senders, null, {ids: []}); - - _action.data = backup; // restore url, width, height, nm_action -} + egw.open(id.replace(/^calendar::/g,''),'calendar','edit'); + _action.data = backup; // restore url, width, height, nm_action + }, + + /** + * Delete calendar entry, asking if you want to delete series or exception + * + * + * @param _action + * @param _senders + */ + cal_delete: function(_action, _senders) + { + var backup = _action.data; + var matches = false; + + // Loop so we ask if any of the selected entries is part of a series + for(var i = 0; i < _senders.length; i++) + { + var id = _senders[i].id; + if(!matches) + { + matches = id.match(/^(?:calendar::)?([0-9]+):([0-9]+)$/); + } + } + if (matches) + { + var id = matches[1]; + var date = matches[2]; + var popup = jQuery(document.getElementById(_action.getManager().etemplate_var_prefix + '[' + _action.id + '_popup]')); + var row = null; + + // Cancel normal confirm + delete _action.data.confirm; + delete _action.data.confirm_multiple; + + // nm action - show popup + nm_open_popup(_action,_senders); + + if(!popup) + { + return; + } + if (row = jQuery("#"+id+"\\:"+date)) { + // Open at row + popup.css({ + position: "absolute", + top: row.position().top + row.height() -popup.height()/2, + left: $j(window).width()/2-popup.width()/2 + }); + } else { + // Open popup in the middle + popup.css({ + position: "absolute", + top: $j(window).height()/2-popup.height()/2, + left: $j(window).width()/2-popup.width()/2 + }); + } + return; + } + + console.log(_action); + nm_action(_action, _senders, null, {ids: []}); + + _action.data = backup; // restore url, width, height, nm_action + }, + + /** + * Create edit exception dialog for recurrence entries + * + * @param {timestamp} date + * @param {string} id, cal_id + * @param {type} name description + */ + edit_series: function(event,id,date) + { + + // Coming from list, there is no event + if(arguments.length == 2) + { + date = id; + id = event; + event = null; + } + calendar_edit_id = id; + calendar_edit_date = date; + var that = this; + var buttons = [ + {text: this.egw.lang("Edit exception"), id: "exception", class: "ui-priority-primary", "default": true}, + {text: this.egw.lang("Edit series"), id:"series"}, + {text: this.egw.lang("Cancel"), id:"cancel"}, + ]; + var callbackExceptionDialog = function (button_id) + { + switch(button_id) + { + case 'exception': + that.open_edit(false); + break; + case 'series': + that.open_edit(true); + break; + case 'cancel': + + default: + break; + } + } + var confirmExcDialog = et2_dialog.show_dialog(callbackExceptionDialog, this.egw.lang("Do you want to edit this event as an exception or the whole series?"),this.egw.lang("This event is part of a series"), {},buttons, et2_dialog.WARNING_MESSAGE); + }, + + /** + * open calendar entry with the proper url either as series modifiction or exception modification + * + */ + open_edit: function(series) + { + this.egw.open(calendar_edit_id,'calendar','edit','&date='+calendar_edit_date + +(!series?'&exception=1':'')); + }, +}); diff --git a/calendar/js/navigation.js b/calendar/js/navigation.js index d17d40ee91..6eb06f894f 100644 --- a/calendar/js/navigation.js +++ b/calendar/js/navigation.js @@ -10,7 +10,7 @@ /** * Sidebox navigation for calendar - * + * * @todo add code from jscalendar->flat(), or better replace it altogether ... */ (function() @@ -35,13 +35,13 @@ egw_appWindow('calendar').location=url+'&owner='+(no_reset?'':'0,')+owner; } } - + /** * Initialisation after DOM *and* jQuery is loaded */ egw_LAB.wait(function() { $j(function(){ - var calendar_window = egw_appWindow('calendar'); + var calendar_window = egw_appWindow('calendar'); // change handlers setting a certain url, eg. view $j('#calendar_view').change(function(){ calendar_window.location = egw_webserverUrl+'/index.php?'+this.value; @@ -60,14 +60,14 @@ if ($j.isArray(val)) val = val.join(','); calendar_window.location = current_view_url+ (current_view_url.search.length ? '&' : '?')+this.name+'='+val; - if (this.name == 'merge') this.value=''; + if (this.name == 'merge') this.value=''; }); // click handler to switch selectbox to multiple $j('#calendar_cat_id_multiple').click(function(){ var selectBox = document.getElementById(this.id.replace('_multiple', '')); - if (selectBox && !selectBox.multiple) + if (selectBox && !selectBox.multiple) { - selectBox.size=4; + selectBox.size=4; selectBox.multiple=true; } }); diff --git a/calendar/setup/etemplates.inc.php b/calendar/setup/etemplates.inc.php index 3b039b7963..4976021a18 100644 --- a/calendar/setup/etemplates.inc.php +++ b/calendar/setup/etemplates.inc.php @@ -2,7 +2,7 @@ /** * EGroupware - eTemplates for Application calendar * http://www.egroupware.org - * generated by soetemplate::dump4setup() 2013-05-23 11:44 + * generated by soetemplate::dump4setup() 2013-06-27 17:06 * * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @package calendar @@ -21,7 +21,8 @@ $templ_data[] = array('name' => 'calendar.conflicts','template' => '','lang' => $templ_data[] = array('name' => 'calendar.delete_series','template' => '','lang' => '','group' => '0','version' => '1.7.003','data' => 'a:1:{i:0;a:8:{s:4:"type";s:4:"vbox";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:1:"2";i:1;a:5:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"1";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:30:"This event is part of a series";}s:4:"name";s:14:"#dialog-header";s:4:"span";s:13:",promptheader";}i:2;a:6:{s:4:"type";s:4:"vbox";s:4:"size";s:1:"2";i:1;a:2:{s:4:"type";s:5:"label";s:5:"label";s:59:"Do you want to keep the series exceptions in your calendar?";}s:4:"span";s:7:",prompt";s:4:"name";s:14:"dialog-content";i:2;a:6:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"3";i:1;a:4:{s:4:"type";s:6:"button";s:5:"label";s:15:"Keep exceptions";s:4:"help";s:48:"All exceptions are converted into single events.";s:4:"name";s:30:"button[delete_keep_exceptions]";}i:2;a:4:{s:4:"type";s:6:"button";s:5:"label";s:17:"Delete exceptions";s:4:"help";s:52:"The exceptions are deleted together with the series.";s:4:"name";s:25:"button[delete_exceptions]";}i:3;a:3:{s:4:"type";s:10:"buttononly";s:5:"label";s:6:"Cancel";s:7:"onclick";s:64:"document.getElementById(\'delete_series\').style.display = \'none\';";}s:5:"align";s:6:"center";}}s:4:"name";s:14:"#delete_series";}}','size' => '','style' => '','modified' => '1273136129',); $templ_data[] = array('name' => 'calendar.edit','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:7:{i:0;a:7:{s:1:"A";s:3:"100";s:1:"B";s:3:"300";s:2:"h1";s:6:",!@msg";s:2:"c2";s:2:"th";s:2:"h2";s:2:"28";s:2:"h4";s:8:",!@owner";s:2:"h6";s:13:",!@recur_type";}i:1;a:4:{s:1:"A";a:5:{s:4:"span";s:13:"all,redItalic";s:7:"no_lang";s:1:"1";s:5:"align";s:6:"center";s:4:"name";s:3:"msg";s:4:"type";s:4:"html";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Title";}s:1:"B";a:74:{s:4:"size";s:6:"2,,0,0";s:4:"span";s:3:"all";s:6:"needed";s:1:"1";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"size";s:6:"75,255";s:6:"needed";s:1:"1";s:4:"name";s:5:"title";s:4:"type";s:4:"text";s:8:"tabindex";i:1;}i:2;a:4:{s:4:"type";s:5:"label";s:5:"label";s:3:"#%s";s:4:"name";s:2:"id";s:4:"size";s:1:"b";}i:3;a:1:{s:4:"type";s:5:"label";}i:4;a:1:{s:4:"type";s:5:"label";}i:5;a:1:{s:4:"type";s:5:"label";}i:6;a:1:{s:4:"type";s:5:"label";}i:7;a:1:{s:4:"type";s:5:"label";}i:8;a:1:{s:4:"type";s:5:"label";}i:9;a:1:{s:4:"type";s:5:"label";}i:10;a:1:{s:4:"type";s:5:"label";}i:11;a:1:{s:4:"type";s:5:"label";}i:12;a:1:{s:4:"type";s:5:"label";}i:13;a:1:{s:4:"type";s:5:"label";}i:14;a:1:{s:4:"type";s:5:"label";}i:15;a:1:{s:4:"type";s:5:"label";}i:16;a:1:{s:4:"type";s:5:"label";}i:17;a:1:{s:4:"type";s:5:"label";}i:18;a:1:{s:4:"type";s:5:"label";}i:19;a:1:{s:4:"type";s:5:"label";}i:20;a:1:{s:4:"type";s:5:"label";}i:21;a:1:{s:4:"type";s:5:"label";}i:22;a:1:{s:4:"type";s:5:"label";}i:23;a:1:{s:4:"type";s:5:"label";}i:24;a:1:{s:4:"type";s:5:"label";}i:25;a:1:{s:4:"type";s:5:"label";}i:26;a:1:{s:4:"type";s:5:"label";}i:27;a:1:{s:4:"type";s:5:"label";}i:28;a:1:{s:4:"type";s:5:"label";}i:29;a:1:{s:4:"type";s:5:"label";}i:30;a:1:{s:4:"type";s:5:"label";}i:31;a:1:{s:4:"type";s:5:"label";}i:32;a:1:{s:4:"type";s:5:"label";}i:33;a:1:{s:4:"type";s:5:"label";}i:34;a:1:{s:4:"type";s:5:"label";}i:35;a:1:{s:4:"type";s:5:"label";}i:36;a:1:{s:4:"type";s:5:"label";}i:37;a:1:{s:4:"type";s:5:"label";}i:38;a:1:{s:4:"type";s:5:"label";}i:39;a:1:{s:4:"type";s:5:"label";}i:40;a:1:{s:4:"type";s:5:"label";}i:41;a:1:{s:4:"type";s:5:"label";}i:42;a:1:{s:4:"type";s:5:"label";}i:43;a:1:{s:4:"type";s:5:"label";}i:44;a:1:{s:4:"type";s:5:"label";}i:45;a:1:{s:4:"type";s:5:"label";}i:46;a:1:{s:4:"type";s:5:"label";}i:47;a:1:{s:4:"type";s:5:"label";}i:48;a:1:{s:4:"type";s:5:"label";}i:49;a:1:{s:4:"type";s:5:"label";}i:50;a:1:{s:4:"type";s:5:"label";}i:51;a:1:{s:4:"type";s:5:"label";}i:52;a:1:{s:4:"type";s:5:"label";}i:53;a:1:{s:4:"type";s:5:"label";}i:54;a:1:{s:4:"type";s:5:"label";}i:55;a:1:{s:4:"type";s:5:"label";}i:56;a:1:{s:4:"type";s:5:"label";}i:57;a:1:{s:4:"type";s:5:"label";}i:58;a:1:{s:4:"type";s:5:"label";}i:59;a:1:{s:4:"type";s:5:"label";}i:60;a:1:{s:4:"type";s:5:"label";}i:61;a:1:{s:4:"type";s:5:"label";}i:62;a:1:{s:4:"type";s:5:"label";}i:63;a:1:{s:4:"type";s:5:"label";}i:64;a:1:{s:4:"type";s:5:"label";}i:65;a:1:{s:4:"type";s:5:"label";}i:66;a:1:{s:4:"type";s:5:"label";}i:67;a:1:{s:4:"type";s:5:"label";}i:68;a:1:{s:4:"type";s:5:"label";}i:69;a:1:{s:4:"type";s:5:"label";}i:70;a:1:{s:4:"type";s:5:"label";}}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:3;a:4:{s:1:"A";a:5:{s:4:"span";s:3:"all";s:4:"name";s:76:"tabs=general|description|participants|recurrence|custom|links|alarms|history";s:4:"type";s:3:"tab";s:5:"label";s:71:"General|Description|Participants|Recurrence|Custom|Links|Alarms|History";s:4:"help";s:173:"Location, Start- and Endtimes, ...|Full description|Participants, Resources, ...|Repeating Event Information|Custom fields|Links, Attachments|Alarm management|Change history";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}i:4;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:8:"readonly";s:4:"true";s:4:"name";s:5:"owner";}s:1:"C";a:7:{s:5:"label";s:7:"Updated";s:8:"readonly";s:4:"true";s:7:"no_lang";s:1:"1";s:5:"align";s:5:"right";s:4:"name";s:8:"modified";s:4:"type";s:9:"date-time";s:4:"span";s:8:",noBreak";}s:1:"D";a:6:{s:5:"class";s:7:"noBreak";s:4:"type";s:14:"select-account";s:5:"label";s:2:"by";s:8:"readonly";s:4:"true";s:5:"align";s:5:"right";s:4:"name";s:8:"modifier";}}i:5;a:4:{s:1:"A";a:8:{s:4:"span";s:1:"3";s:4:"type";s:4:"hbox";s:4:"size";s:1:"5";i:1;a:4:{s:5:"label";s:4:"Save";s:4:"name";s:12:"button[save]";s:4:"type";s:6:"button";s:4:"help";s:22:"saves the changes made";}i:2;a:4:{s:5:"label";s:5:"Apply";s:4:"name";s:13:"button[apply]";s:4:"type";s:6:"button";s:4:"help";s:17:"apply the changes";}i:3;a:5:{s:5:"label";s:6:"Cancel";s:7:"onclick";s:15:"window.close();";s:4:"name";s:14:"button[cancel]";s:4:"type";s:6:"button";s:4:"help";s:16:"Close the window";}i:4;a:5:{s:8:"onchange";s:34:"this.form.submit(); this.value=\'\';";s:4:"name";s:6:"action";s:4:"size";s:10:"Actions...";s:4:"type";s:6:"select";s:4:"help";s:39:"Execute a further action for this entry";}i:5;a:4:{s:4:"type";s:8:"checkbox";s:5:"label";s:30:"Do not notify of these changes";s:4:"name";s:16:"no_notifications";s:4:"span";s:1:"2";}}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:6:{s:5:"label";s:6:"Delete";s:7:"onclick";s:150:"if ($cont[query_delete_exceptions]) { getElementById(\'delete_series\').style.display=\'block\'; return false; } else return confirm(\'Delete this event\');";s:5:"align";s:5:"right";s:4:"name";s:14:"button[delete]";s:4:"type";s:6:"button";s:4:"help";s:17:"Delete this event";}}i:6;a:4:{s:1:"A";a:3:{s:4:"type";s:8:"template";s:4:"span";s:3:"all";s:4:"name";s:22:"calendar.delete_series";}s:1:"B";a:1:{s:4:"type";s:5:"label";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}}s:4:"cols";i:4;s:4:"rows";i:6;s:4:"size";s:4:"100%";s:7:"options";a:1:{i:0;s:4:"100%";}}}','size' => '100%','style' => '.end_hide { display: block; white-space: nowrap; margin-left: 10px; } -.noBreak { white-space: nowrap; }','modified' => '1292883792',); +.noBreak { white-space: nowrap; } +.CatTree { width:200px; height:200px; overflow: auto;}','modified' => '1292883792',); $templ_data[] = array('name' => 'calendar.edit.alarms','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:5:{s:2:"c1";s:3:"row";s:1:"A";s:5:"120px";s:2:"h1";s:16:"20,@no_add_alarm";s:2:"c2";s:4:",top";s:2:"h2";s:8:",!@alarm";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:6:"select";s:4:"name";s:12:"before_after";s:5:"label";s:12:"%s the event";}s:1:"B";a:10:{s:4:"type";s:4:"hbox";s:4:"size";s:1:"8";i:1;a:4:{s:4:"type";s:13:"select-number";s:4:"size";s:4:",0,7";s:4:"name";s:15:"new_alarm[days]";s:4:"help";s:4:"days";}i:2;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[days]";s:5:"label";s:4:"days";}i:3;a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:16:"new_alarm[hours]";s:4:"size";s:5:",0,23";s:4:"help";s:5:"hours";}i:4;a:3:{s:4:"type";s:5:"label";s:4:"size";s:19:",,,new_alarm[hours]";s:5:"label";s:5:"hours";}i:5;a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:15:"new_alarm[mins]";s:4:"size";s:7:",0,55,5";s:4:"help";s:7:"Minutes";}i:6;a:3:{s:4:"type";s:5:"label";s:4:"size";s:18:",,,new_alarm[mins]";s:5:"label";s:7:"Minutes";}i:7;a:5:{s:4:"type";s:6:"select";s:4:"name";s:16:"new_alarm[owner]";s:7:"no_lang";s:1:"1";s:5:"label";s:3:"for";s:4:"help";s:31:"Select who should get the alarm";}i:8;a:3:{s:4:"type";s:6:"button";s:4:"name";s:17:"button[add_alarm]";s:5:"label";s:9:"Add alarm";}}}i:2;a:2:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Alarms";}s:1:"B";a:6:{s:4:"type";s:4:"grid";s:4:"data";a:3:{i:0;a:2:{s:2:"c1";s:2:"th";s:2:"c2";s:3:"row";}i:1;a:5:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Time";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"before the event";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"All participants";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:5:"Owner";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Action";}}i:2;a:5:{s:1:"A";a:3:{s:4:"type";s:9:"date-time";s:4:"name";s:12:"${row}[time]";s:8:"readonly";s:1:"1";}s:1:"B";a:3:{s:4:"type";s:5:"label";s:4:"name";s:14:"${row}[offset]";s:7:"no_lang";s:1:"1";}s:1:"C";a:4:{s:4:"type";s:8:"checkbox";s:5:"align";s:6:"center";s:4:"name";s:11:"${row}[all]";s:8:"readonly";s:1:"1";}s:1:"D";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:13:"${row}[owner]";s:8:"readonly";s:1:"1";}s:1:"E";a:7:{s:4:"type";s:6:"button";s:4:"size";s:6:"delete";s:5:"label";s:6:"Delete";s:5:"align";s:6:"center";s:4:"name";s:27:"delete_alarm[$row_cont[id]]";s:4:"help";s:17:"Delete this alarm";s:7:"onclick";s:36:"return confirm(\'Delete this alarm\');";}}}s:4:"rows";i:2;s:4:"cols";i:5;s:4:"name";s:5:"alarm";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:2;s:4:"size";s:17:"100%,210,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '','modified' => '1286382659',); @@ -29,13 +30,13 @@ $templ_data[] = array('name' => 'calendar.edit.custom','template' => '','lang' = $templ_data[] = array('name' => 'calendar.edit.description','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:2:{s:2:"c1";s:7:"row,top";s:1:"A";s:2:"95";}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:14:",,,description";s:5:"label";s:11:"Description";}s:1:"B";a:3:{s:4:"type";s:8:"textarea";s:4:"size";s:5:"12,70";s:4:"name";s:11:"description";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"size";s:8:"100%,210";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"210";}}}','size' => '100%,210','style' => '','modified' => '1118480337',); -$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"c1";s:3:"row";s:2:"c2";s:3:"row";s:2:"c4";s:3:"row";s:2:"c5";s:7:"row_off";s:2:"c6";s:3:"row";s:2:"c7";s:3:"row";}i:1;a:2:{s:1:"A";a:4:{s:3:"for";s:5:"start";s:5:"width";s:2:"95";s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:3:{s:6:"needed";s:1:"1";s:4:"name";s:5:"start";s:4:"type";s:9:"date-time";}i:2;a:6:{s:5:"align";s:6:"center";s:5:"label";s:9:"whole day";s:4:"name";s:9:"whole_day";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:31:"Event will occupy the whole day";}}}i:2;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"duration";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:7:"no_lang";s:1:"1";s:8:"onchange";s:220:"set_style_by_class(\'table\',\'end_hide\',\'display\',this.value == \'\' ? \'block\' : \'none\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";s:4:"name";s:8:"duration";s:4:"size";s:24:"Use end date,,,,,,,false";s:4:"type";s:6:"select";s:4:"help";s:23:"Duration of the meeting";}i:2;a:3:{s:4:"name";s:3:"end";s:4:"type";s:9:"date-time";s:4:"span";s:9:",end_hide";}}}i:3;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:5:{s:5:"label";s:15:"Freetime search";s:7:"onclick";s:85:"ajax_submit(this.form,\'calendar.calendar_uiforms.ajax_freetimesearch\'); return false;";s:4:"name";s:8:"freetime";s:4:"type";s:10:"buttononly";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";}}i:4;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"location";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"name";s:8:"location";s:4:"type";s:4:"text";s:4:"size";s:4:",255";s:4:"span";s:15:",inputFullWidth";}}i:5;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"priority";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Priority";}s:1:"B";a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}}i:6;a:2:{s:1:"A";a:3:{s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:7:"Options";}s:1:"B";a:5:{s:5:"label";s:12:"non blocking";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:56:"A non blocking event will not conflict with other events";}}i:7;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:4:{s:5:"label";s:7:"Private";s:4:"name";s:6:"public";s:4:"size";s:3:"0,1";s:4:"type";s:8:"checkbox";}}}s:4:"cols";i:2;s:4:"rows";i:7;s:4:"size";s:8:"100%,210";}i:2;a:6:{s:5:"align";s:5:"right";s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";s:4:"span";s:7:",row_on";i:1;a:4:{s:3:"for";s:8:"category";s:4:"type";s:5:"label";s:5:"label";s:10:"Categories";s:4:"span";s:7:",row_on";}i:2;a:3:{s:4:"type";s:10:"select-cat";s:4:"name";s:8:"category";s:4:"size";s:1:"9";}}}}','size' => '','style' => '','modified' => '1343065389',); +$templ_data[] = array('name' => 'calendar.edit.general','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:5:{s:4:"type";s:4:"grid";s:4:"data";a:8:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"c1";s:3:"row";s:2:"c2";s:3:"row";s:2:"c4";s:3:"row";s:2:"c5";s:7:"row_off";s:2:"c6";s:3:"row";s:2:"c7";s:3:"row";}i:1;a:2:{s:1:"A";a:4:{s:3:"for";s:5:"start";s:5:"width";s:2:"95";s:4:"type";s:5:"label";s:5:"label";s:5:"Start";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:3:{s:6:"needed";s:1:"1";s:4:"name";s:5:"start";s:4:"type";s:9:"date-time";}i:2;a:6:{s:5:"align";s:6:"center";s:5:"label";s:9:"whole day";s:4:"name";s:9:"whole_day";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:31:"Event will occupy the whole day";}}}i:2;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"duration";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Duration";}s:1:"B";a:4:{s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"hbox";i:1;a:6:{s:7:"no_lang";s:1:"1";s:8:"onchange";s:220:"set_style_by_class(\'table\',\'end_hide\',\'display\',this.value == \'\' ? \'block\' : \'none\'); if (this.value == \'\') document.getElementById(form::name(\'end[str]\')).value = document.getElementById(form::name(\'start[str]\')).value;";s:4:"name";s:8:"duration";s:4:"size";s:12:"Use end date";s:4:"type";s:6:"select";s:4:"help";s:23:"Duration of the meeting";}i:2;a:3:{s:4:"name";s:3:"end";s:4:"type";s:9:"date-time";s:4:"span";s:9:",end_hide";}}}i:3;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:5:{s:5:"label";s:15:"Freetime search";s:7:"onclick";s:85:"ajax_submit(this.form,\'calendar.calendar_uiforms.ajax_freetimesearch\'); return false;";s:4:"name";s:8:"freetime";s:4:"type";s:10:"buttononly";s:4:"help";s:88:"Find free timeslots where the selected participants are availible for the given timespan";}}i:4;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"location";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Location";}s:1:"B";a:4:{s:4:"name";s:8:"location";s:4:"type";s:4:"text";s:4:"size";s:4:",255";s:4:"span";s:15:",inputFullWidth";}}i:5;a:2:{s:1:"A";a:4:{s:3:"for";s:8:"priority";s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:8:"Priority";}s:1:"B";a:2:{s:4:"type";s:15:"select-priority";s:4:"name";s:8:"priority";}}i:6;a:2:{s:1:"A";a:3:{s:5:"width";s:1:"0";s:4:"type";s:5:"label";s:5:"label";s:7:"Options";}s:1:"B";a:5:{s:5:"label";s:12:"non blocking";s:4:"name";s:12:"non_blocking";s:4:"size";s:11:",, ,disable";s:4:"type";s:8:"checkbox";s:4:"help";s:56:"A non blocking event will not conflict with other events";}}i:7;a:2:{s:1:"A";a:1:{s:4:"type";s:5:"label";}s:1:"B";a:4:{s:5:"label";s:7:"Private";s:4:"name";s:6:"public";s:4:"size";s:3:"0,1";s:4:"type";s:8:"checkbox";}}}s:4:"cols";i:2;s:4:"rows";i:7;s:4:"size";s:8:"100%,210";}i:2;a:6:{s:5:"align";s:5:"right";s:4:"size";s:6:"2,,0,0";s:4:"type";s:4:"vbox";s:4:"span";s:7:",row_on";i:1;a:4:{s:3:"for";s:8:"category";s:4:"type";s:5:"label";s:5:"label";s:10:"Categories";s:4:"span";s:7:",row_on";}i:2;a:3:{s:4:"type";s:8:"tree-cat";s:4:"name";s:8:"category";s:4:"span";s:8:",CatTree";}}}}','size' => '','style' => '','modified' => '1343065389',); $templ_data[] = array('name' => 'calendar.edit.history','template' => '','lang' => '','group' => '0','version' => '1.7.002','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:2:{i:0;a:0:{}i:1;a:1:{s:1:"A";a:3:{s:4:"type";s:10:"historylog";s:4:"name";s:7:"history";s:4:"size";s:14:"history_status";}}}s:4:"rows";i:1;s:4:"cols";i:1;s:4:"size";s:17:"100%,210,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '','modified' => '1265901708',); $templ_data[] = array('name' => 'calendar.edit.links','template' => '','lang' => '','group' => '0','version' => '1.0.1.001','data' => 'a:1:{i:0;a:6:{s:4:"type";s:4:"grid";s:4:"data";a:5:{i:0;a:7:{s:1:"A";s:2:"95";s:2:"c1";s:2:"th";s:2:"h1";s:6:",@view";s:2:"c2";s:3:"row";s:2:"h2";s:6:",@view";s:2:"c3";s:2:"th";s:2:"c4";s:11:"row_off,top";}i:1;a:2:{s:1:"A";a:3:{s:4:"span";s:3:"all";s:4:"type";s:5:"label";s:5:"label";s:16:"Create new links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:2;a:2:{s:1:"A";a:3:{s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";s:4:"type";s:7:"link-to";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:3;a:2:{s:1:"A";a:3:{s:4:"span";s:3:"all";s:4:"type";s:5:"label";s:5:"label";s:14:"Existing links";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}i:4;a:2:{s:1:"A";a:3:{s:4:"span";s:3:"all";s:4:"name";s:7:"link_to";s:4:"type";s:9:"link-list";}s:1:"B";a:1:{s:4:"type";s:5:"label";}}}s:4:"cols";i:2;s:4:"rows";i:4;s:4:"size";s:17:"100%,210,,,,,auto";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '','modified' => '1231922193',); -$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.9.001','data' => 'a:1:{i:0;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:6:{s:1:"A";s:2:"95";s:2:"c3";s:4:",top";s:2:"c1";s:3:"row";s:2:"c2";s:2:"th";s:2:"h1";s:8:",@no_add";s:1:"D";s:2:"70";}i:1;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"New";}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:14:"select-account";s:4:"size";s:27:"User or group,calendar+,,10";s:4:"name";s:7:"account";s:4:"help";s:13:"User or group";}i:2;a:3:{s:4:"type";s:10:"link-entry";s:4:"name";s:8:"resource";s:4:"size";s:14:"@cal_resources";}}s:1:"C";a:4:{s:4:"type";s:3:"int";s:4:"size";s:4:"1,,3";s:4:"name";s:8:"quantity";s:5:"align";s:6:"center";}s:1:"D";a:3:{s:4:"type";s:6:"select";s:4:"name";s:4:"role";s:4:"span";s:11:",selectRole";}s:1:"E";a:4:{s:4:"type";s:6:"button";s:5:"label";s:3:"Add";s:4:"name";s:3:"add";s:5:"align";s:6:"center";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:2;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:8:"Quantity";s:5:"align";s:6:"center";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Role";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:3;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"name";s:11:"${row}[app]";}s:1:"B";a:6:{s:4:"type";s:5:"label";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:26:"accounts_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:3:"int";s:4:"name";s:16:"${row}[quantity]";s:4:"size";s:4:"1,,3";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:4:"name";s:18:"${row}[role_label]";}s:1:"E";a:3:{s:4:"type";s:6:"select";s:4:"name";s:14:"${row}[status]";s:8:"onchange";i:1;}s:1:"F";a:9:{s:4:"type";s:6:"button";s:4:"data";a:2:{i:0;a:1:{s:2:"h1";s:19:",!@resources_status";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:16:"resources_select";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:27:"resources_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:28:"delete[$row_cont[delete_id]]";s:5:"align";s:6:"center";s:5:"label";s:6:"Delete";s:8:"onchange";i:1;s:4:"size";s:6:"delete";}}}s:4:"rows";i:3;s:4:"cols";i:6;s:4:"size";s:17:"100%,210,,,,,auto";s:4:"name";s:12:"participants";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '.selectRole select { width: 100%; }','modified' => '1352836069',); +$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.7.001','data' => 'a:1:{i:0;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:6:{s:1:"A";s:2:"95";s:2:"c3";s:4:",top";s:2:"c1";s:3:"row";s:2:"c2";s:2:"th";s:2:"h1";s:8:",@no_add";s:1:"D";s:2:"70";}i:1;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"New";}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:14:"select-account";s:4:"size";s:27:"User or group,calendar+,,10";s:4:"name";s:7:"account";s:4:"help";s:13:"User or group";}i:2;a:3:{s:4:"type";s:10:"link-entry";s:4:"name";s:8:"resource";s:4:"size";s:14:"@cal_resources";}}s:1:"C";a:4:{s:4:"type";s:3:"int";s:4:"size";s:4:"1,,3";s:4:"name";s:8:"quantity";s:5:"align";s:6:"center";}s:1:"D";a:3:{s:4:"type";s:6:"select";s:4:"name";s:4:"role";s:4:"span";s:11:",selectRole";}s:1:"E";a:4:{s:4:"type";s:6:"button";s:5:"label";s:3:"Add";s:4:"name";s:3:"add";s:5:"align";s:6:"center";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:2;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:8:"Quantity";s:5:"align";s:6:"center";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Role";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:3;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"name";s:11:"${row}[app]";}s:1:"B";a:6:{s:4:"type";s:5:"label";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:26:"accounts_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}s:1:"C";a:5:{s:4:"type";s:3:"int";s:4:"name";s:16:"${row}[quantity]";s:4:"size";s:4:"1,,3";s:8:"readonly";s:1:"1";s:5:"align";s:6:"center";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:4:"name";s:18:"${row}[role_label]";}s:1:"E";a:3:{s:4:"type";s:6:"select";s:4:"name";s:14:"${row}[status]";s:8:"onchange";i:1;}s:1:"F";a:9:{s:4:"type";s:6:"button";s:4:"data";a:2:{i:0;a:1:{s:2:"h1";s:19:",!@resources_status";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:16:"resources_select";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:27:"resources_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:28:"delete[$row_cont[delete_id]]";s:5:"align";s:6:"center";s:5:"label";s:6:"Delete";s:8:"onchange";i:1;s:4:"size";s:6:"delete";}}}s:4:"rows";i:3;s:4:"cols";i:6;s:4:"size";s:17:"100%,210,,,,,auto";s:4:"name";s:12:"participants";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"210";i:6;s:4:"auto";}}}','size' => '100%,210,,,,,auto','style' => '.selectRole select { width: 100%; }','modified' => '1248274661',); $templ_data[] = array('name' => 'calendar.edit.print','template' => '','lang' => '','group' => '0','version' => '1.6.001','data' => 'a:1:{i:0;a:7:{s:4:"type";s:4:"grid";s:4:"data";a:4:{i:0;a:6:{s:1:"A";s:2:"95";s:2:"c3";s:4:",top";s:2:"c1";s:3:"row";s:2:"c2";s:2:"th";s:2:"h1";s:8:",@no_add";s:1:"D";s:24:",@hide_status_recurrence";}i:1;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:3:"New";}s:1:"B";a:4:{s:4:"type";s:4:"vbox";s:4:"size";s:6:"2,,0,0";i:1;a:4:{s:4:"type";s:14:"select-account";s:4:"size";s:27:"User or group,calendar+,,10";s:4:"name";s:7:"account";s:4:"help";s:13:"User or group";}i:2;a:3:{s:4:"type";s:10:"link-entry";s:4:"name";s:8:"resource";s:4:"size";s:14:"@cal_resources";}}s:1:"C";a:3:{s:4:"type";s:3:"int";s:4:"size";s:4:"1,,3";s:4:"name";s:8:"quantity";}s:1:"D";a:1:{s:4:"type";s:5:"label";}s:1:"E";a:3:{s:4:"type";s:6:"button";s:5:"label";s:3:"Add";s:4:"name";s:3:"add";}s:1:"F";a:1:{s:4:"type";s:5:"label";}}i:2;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:4:"Type";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"C";a:2:{s:4:"type";s:5:"label";s:5:"label";s:8:"Quantity";}s:1:"D";a:2:{s:4:"type";s:5:"label";s:5:"label";s:10:"All future";}s:1:"E";a:2:{s:4:"type";s:5:"label";s:5:"label";s:6:"Status";}s:1:"F";a:2:{s:4:"type";s:5:"label";s:5:"label";s:7:"Actions";}}i:3;a:6:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:4:"name";s:11:"${row}[app]";}s:1:"B";a:6:{s:4:"type";s:5:"label";s:4:"data";a:2:{i:0;a:0:{}i:1;a:2:{s:1:"A";a:3:{s:4:"type";s:14:"select-account";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:26:"accounts_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:13:"${row}[title]";s:7:"no_lang";s:1:"1";}s:1:"C";a:3:{s:4:"type";s:3:"int";s:4:"name";s:16:"${row}[quantity]";s:4:"size";s:4:"1,,3";}s:1:"D";a:3:{s:4:"type";s:8:"checkbox";s:4:"name";s:25:"${row}[status_recurrence]";s:5:"align";s:6:"center";}s:1:"E";a:4:{s:4:"type";s:6:"select";s:4:"name";s:14:"${row}[status]";s:7:"no_lang";s:1:"1";s:8:"onchange";i:1;}s:1:"F";a:9:{s:4:"type";s:6:"button";s:4:"data";a:2:{i:0;a:1:{s:2:"h1";s:19:",!@resources_status";}i:1;a:2:{s:1:"A";a:4:{s:4:"type";s:16:"resources_select";s:4:"name";s:6:"${row}";s:8:"readonly";s:1:"1";s:7:"no_lang";s:1:"1";}s:1:"B";a:5:{s:4:"type";s:6:"select";s:4:"name";s:27:"resources_status[$row_cont]";s:8:"onchange";s:1:"1";s:4:"help";s:30:"Accept or reject an invitation";s:7:"no_lang";s:1:"1";}}}s:4:"rows";i:1;s:4:"cols";i:2;s:4:"name";s:22:"delete[$row_cont[uid]]";s:5:"align";s:6:"center";s:5:"label";s:6:"Delete";s:8:"onchange";i:1;s:4:"size";s:6:"delete";}}}s:4:"rows";i:3;s:4:"cols";i:6;s:4:"size";s:17:"100%,200,,,,,auto";s:4:"name";s:12:"participants";s:7:"options";a:3:{i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,,,,auto','style' => '','modified' => '1229280346',); diff --git a/calendar/templates/default/app.css b/calendar/templates/default/app.css index a81101a260..532c67a4a3 100644 --- a/calendar/templates/default/app.css +++ b/calendar/templates/default/app.css @@ -508,22 +508,15 @@ e.g. the div with class calTimeGrid is generated by the timeGridWidget method of * edit series or exception popup used in eventWidget and * delete series and exceptions popup used in edit event */ -#delete_series,#edit_series { +#calendar-edit_calendar-delete_series{ position: fixed; - top: 200px; - left: 500px; + top: 100px; + left: 200px; z-index: 20000; display: none; border-collapse:collapse; border-spacing:0px } -#delete_series { - top: 100px; - left: 200px; -} -#delete_series input,#edit_series input { - margin: 8px; -} #dialog-content { display:block; height:100px; diff --git a/calendar/templates/default/edit.xet b/calendar/templates/default/edit.xet index 4719e8d4a6..e9560a5530 100644 --- a/calendar/templates/default/edit.xet +++ b/calendar/templates/default/edit.xet @@ -20,14 +20,14 @@ - + - + - + @@ -139,14 +139,11 @@ - - - - + @@ -166,7 +163,7 @@ -