fixed handling of groups:

- groups can now be selected as participants again
- groups need to have calendar run-rights, to be selectable in the calendar (as it was in 1.0)
- groups will NOT be enumerated as users anymore
--> new or removed members are taken into account as participants
- error messages: if no participant selected or startdate behind enddate (no more automatic swapping)
- pushing the version to 1.2
This commit is contained in:
Ralf Becker 2005-11-23 14:21:20 +00:00
parent 199278aef0
commit b111419c1b
12 changed files with 241 additions and 88 deletions

View File

@ -194,6 +194,34 @@ class bocal
unset($config);
}
/**
* Add group-members as participants with status 'G'
*
* @param array $event event-array
* @return int number of added participants
*/
function enum_groups(&$event)
{
$added = 0;
foreach($event['participants'] as $uid => $status)
{
if (is_numeric($uid) && $GLOBALS['egw']->accounts->get_type($uid) == 'g' &&
($members = $GLOBALS['egw']->accounts->member($uid)))
{
foreach($members as $member)
{
$member = $member['account_id'];
if (!isset($event['participants'][$member]))
{
$event['participants'][$member] = 'G';
++$added;
}
}
}
}
return $added;
}
/**
* Searches / lists calendar entries, including repeating ones
*
@ -217,6 +245,7 @@ class bocal
* order column-names plus optional DESC|ASC separted by comma
* show_rejected if set rejected invitation are shown only when true, otherwise it depends on the cal-pref or a running query
* ignore_acl if set and true no check_perms for a general EGW_ACL_READ grants is performed
* enum_groups boolean if set and true, group-members will be added as participants with status 'G'
* @return array of events or array with YYYYMMDD strings / array of events pairs (depending on $daywise param)
*/
function &search($params)
@ -236,6 +265,8 @@ class bocal
$users = array();
foreach($params['users'] as $user)
{
if (in_array($user,$users)) continue; // already added
if ($params['ignore_acl'] || $this->check_perms(EGW_ACL_READ,0,$user))
{
$users[] = $user;
@ -257,6 +288,20 @@ class bocal
}
}
}
else // for users we have to include all the memberships, to get the group-events
{
$memberships = $GLOBALS['egw']->accounts->membership($user);
if (is_array($memberships))
{
foreach($memberships as $group)
{
if (!in_array($group['account_id'],$users))
{
$users[] = $group['account_id'];
}
}
}
}
}
}
// if we have no grants from the given user(s), we directly return no events / an empty array,
@ -291,6 +336,10 @@ class bocal
foreach($events as $id => $event)
{
if ($params['enum_groups'] && $this->enum_groups($event))
{
$events[$id] = $event;
}
if (!$this->check_perms(EGW_ACL_READ,$event))
{
$this->clear_private_infos($events[$id],$users);
@ -1225,16 +1274,18 @@ class bocal
/**
* Converts participants array of an event into array of (readable) participant-names with status
*
* @param $event array of an event
* @param $long_status boolean should the long/verbose status or only the one letter shortcut be used
* @param array $event event-data
* @param boolean $long_status=false should the long/verbose status or only the one letter shortcut be used
* @return array with id / names with status pairs
*/
function participants($event,$long_status=False,$use_type=false)
function participants($event,$long_status=False)
{
//_debug_array($event);
$names = array();
foreach($event['participants'] as $id => $status)
{
if ($status == 'G') continue; // dont show group-invitation
$status = $this->verbose_status[$status];
if (!$long_status)

View File

@ -386,9 +386,10 @@ class bocalupdate extends bocal
* @param int $msg_type type of the notification: MSG_ADDED, MSG_MODIFIED, MSG_ACCEPTED, ...
* @param array $to_notify numerical user-ids as keys (!) (value is not used)
* @param array $old_event Event before the change
* @param array $new_event Event after the change
* @param array $new_event=null Event after the change
* @param int $user=0 User who started the notify, default current user
*/
function send_update($msg_type,$to_notify,$old_event,$new_event=False,$user=False)
function send_update($msg_type,$to_notify,$old_event,$new_event=null,$user=0)
{
if (!is_array($to_notify))
{
@ -490,12 +491,26 @@ class bocalupdate extends bocal
}
$send = &$GLOBALS['egw']->send;
// add all group-members to the notification, unless they are already participants
foreach($to_notify as $userid => $statusid)
{
if (is_numeric($userid) && $GLOBALS['egw']->accounts->get_type($userid) == 'g' &&
($members = $GLOBALS['egw']->accounts->member($userid)))
{
foreach($members as $member)
{
$member = $member['account_id'];
if (!isset($to_notify[$member]))
{
$to_notify[$member] = 'G'; // Group-invitation
}
}
}
}
foreach($to_notify as $userid => $statusid)
{
if (!is_numeric($userid)) continue; // eg. a resource, ToDo notify the responsible of the resource
$userid = (int)$userid;
if ($statusid == 'R' || $GLOBALS['egw']->accounts->get_type($userid) == 'g')
{
continue; // dont notify rejected participants or groups
@ -702,7 +717,7 @@ class bocalupdate extends bocal
$this->send_update($status2msg[$status],$event['participants'],$event);
}
}
return Ok;
return $Ok;
}
/**

View File

@ -265,7 +265,7 @@ class socal
* @param int/array $users user-id or array of user-id's, !$users means all entries regardless of users
* @param int $cat_id=0 mixed category-id or array of cat-id's, default 0 = all
* Please note: only a single cat-id, will include all sub-cats (if the common-pref 'cats_no_subs' is False)
* @param string $filter='' string space delimited filter-names, atm. 'all' or 'private'
* @param string $filter='' string space delimited filter-names, NOT used atm.
* @param string $query='' pattern so search for, if unset or empty all matching entries are returned (no search)
* Please Note: a search never returns repeating events more then once AND does not honor start+end date !!!
* @param int/bool $offset=False offset for a limited query or False (default)
@ -707,6 +707,14 @@ ORDER BY cal_user_type, cal_usre_id
{
//echo "<p>socal::participants($cal_id,".print_r($participants,true).",$change_since)</p>\n";
// remove group-invitations, they are NOT stored in the db
foreach($participants as $uid => $status)
{
if ($status == 'G')
{
unset($participants[$uid]);
}
}
$where = array('cal_id' => $cal_id);
if ((int) $change_since)
@ -716,14 +724,13 @@ ORDER BY cal_user_type, cal_usre_id
if ($change_since !== false) // existing entries only
{
// delete not longer set participants
$parts = $deleted = array();
$deleted = array();
$this->db->select($this->user_table,'DISTINCT cal_user_type,cal_user_id,cal_quantity',$where,__LINE__,__FILE__);
while (($row = $this->db->row(true)))
{
$uid = $this->combine_user($row['cal_user_type'],$row['cal_user_id']);
if (!isset($participants[$uid]))
if (!isset($participants[$uid])) // delete group-invitations
{
$parts[] = $uid;
$deleted[$row['cal_user_type']][] = $row['cal_user_id'];
}
elseif($row['cal_quantity'] == (substr($participants[$uid],1) ? substr($participants[$uid],1) : 1))
@ -815,8 +822,16 @@ ORDER BY cal_user_type, cal_usre_id
{
$where[] = '(cal_recur_date=0 OR cal_recur_date >= '.time().')';
}
$this->db->update($this->user_table,array('cal_status' => $status),$where,__LINE__,__FILE__);
if ($status == 'G') // remove group invitations, as we dont store them in the db
{
$this->db->delete($this->user_table,$where,__LINE__,__FILE__);
}
else
{
$this->db->insert($this->user_table,array(
'cal_status' => $status,
),$where,__LINE__,__FILE__);
}
return $this->db->affected_rows();
}
@ -840,6 +855,8 @@ ORDER BY cal_user_type, cal_usre_id
foreach($participants as $uid => $status)
{
if ($status == 'G') continue; // dont save group-invitations
$this->split_user($uid,$type,$id);
$this->db->insert($this->user_table,array(
'cal_status' => $status !== true ? $status{0} : 'U',

View File

@ -72,7 +72,7 @@ class uical
*/
var $cat_id;
/**
* @var int $filter session-state: selected filter
* @var int $filter session-state: selected filter, NOT used at the moment (was all or private)
*/
var $filter;
/**
@ -158,7 +158,7 @@ class uical
* - cat_id: the selected category
* - owner: the owner of the displayed calendar
* - save_owner: the overriden owner of the planner
* - filter: the used filter: no filter / all or only privat
* - filter: the used filter: no filter / all or only privat, NOT used atm.
* - sortby: category or user of planner
* - view: the actual view, where dialogs should return to or which they refresh
* @param set_states array to manualy set / change one of the states, default NULL = use $_REQUEST
@ -235,12 +235,7 @@ class uical
$this->view = $states['view'] = $func;
}
$this->view_menuaction = $this->view == 'listview' ? 'calendar.uilist.listview' : 'calendar.uiviews.'.$this->view;
// deal with group-owners
if (substr($this->owner,0,2) == 'g_' || $GLOBALS['egw']->accounts->get_type($this->owner) == 'g')
{
$this->set_owner_to_group($this->owner);
$states['owner'] = $this->owner;
}
$states['multiple'] = $this->multiple = $_GET['multiple'] || count(explode(',',$this->owner)) > 1;
if ($this->debug > 0 || $this->debug == 'menage_states') $this->bo->debug_message('uical::manage_states(%1) session was %2, states now %3, is_group=%4, g_owner=%5',True,$set_states,$states_session,$states,$this->is_group,$this->g_owner);
@ -248,32 +243,6 @@ class uical
$GLOBALS['egw']->session->appsession('session_data','calendar',$states);
}
/**
* Sets a group as owner (of the events to show)
*
* It set $this->is_group and $this->g_owner - array with user-id's of the group-members who gave read-grants
* @param group-id or 'g_'+group-id
*/
function set_owner_to_group($owner)
{
$this->owner = (int) (substr($owner,0,2) == 'g_' ? substr($owner,2) : $owner);
$this->is_group = True;
$this->g_owner = Array();
$members = $GLOBALS['egw']->accounts->member($this->owner);
if (is_array($members))
{
foreach($members as $user)
{
// use only members which gave the user a read-grant
if ($this->bo->check_perms(EGW_ACL_READ,0,$user['account_id']))
{
$this->g_owner[] = $user['account_id'];
}
}
}
if ($this->debug > 2 || $this->debug == 'set_owner_to_group') $this->bo->debug_message('uical::set_owner_to_group(%1): owner=%2, g_owner=%3',True,$owner,$this->owner,$this->g_owner);
}
/**
* gets the icons displayed for a given event
*
@ -295,7 +264,9 @@ class uical
{
$icons[] = $this->html->image('calendar','recur',lang('recurring event'));
}
$icons[] = $this->html->image('calendar',count($event['participants']) > 1 ? 'users' : 'single');
list($first_part) = each($event['participants']);
$icons[] = $this->html->image('calendar',count($event['participants']) > 1 ||
$GLOBALS['egw']->accounts->get_type($first_part) == 'g' ? 'users' : 'single');
}
if($event['public'] == 0)
{
@ -537,13 +508,14 @@ class uical
$file[$n]['text'];
// Filter all or private
/* NOT used at the moment
if(is_numeric($this->owner) && $this->bo->check_perms(EGW_ACL_PRIVATE,0,$this->owner))
{
$file[] = $this->_select_box('Filter','filter',
'<option value=" all "'.($this->filter==' all '?' selected="1"':'').'>'.lang('No filter').'</option>'."\n".
'<option value=" private "'.($this->filter==' private '?' selected="1"':'').'>'.lang('Private Only').'</option>'."\n");
}
*/
// Calendarselection: User or Group
if(count($this->bo->grants) > 0 && (!isset($GLOBALS['egw_info']['server']['deny_user_grants_access']) ||
!$GLOBALS['egw_info']['server']['deny_user_grants_access']))
@ -576,7 +548,7 @@ function load_cal(url,id) {
}
</script>
".
$this->accountsel->selection('owner','uical_select_owner',$accounts,'calendar+',$this->multiple ? 3 : 1,False,
$this->accountsel->selection('owner','uical_select_owner',$accounts,'calendar+',$this->multiple ? 4 : 1,False,
' style="width: '.($this->multiple && $this->common_prefs['account_selection']=='selectbox' ? 185 : 165).'px;"'.
' title="'.lang('select a %1',lang('user')).'" onchange="load_cal(\''.
$GLOBALS['egw']->link('/index.php',array(

View File

@ -66,10 +66,23 @@ class uiforms extends uical
*/
function &default_add_event()
{
$extra_participants = $_GET['participants'] ? explode(',',$_GET['participants']) : array();
$owner = (int) (isset($_GET['owner']) ? $_GET['owner'] : $this->owner);
if (!$owner || !$this->bo->check_perms(EGW_ACL_ADD,0,$owner)) $owner = $this->user;
if (!$owner || !is_numeric($owner) || $GLOBALS['egw']->accounts->get_type($owner) != 'u' ||
!$this->bo->check_perms(EGW_ACL_ADD,0,$owner))
{
if ($owner) // make an owner who is no user or we have no add-rights a participant
{
$extra_participants[] = $owner;
}
$owner = $this->user;
}
//echo "<p>this->owner=$this->owner, _GET[owner]=$_GET[owner], user=$this->user => owner=$owner</p>\n";
// by default include the owner as participant (the user can remove him)
$extra_participants[] = $owner;
$start = $this->bo->date2ts(array(
'full' => isset($_GET['date']) && (int) $_GET['date'] ? (int) $_GET['date'] : $this->date,
'hour' => (int) (isset($_GET['hour']) && (int) $_GET['hour'] ? $_GET['hour'] : $this->bo->cal_prefs['workdaystarts']),
@ -77,12 +90,11 @@ class uiforms extends uical
));
//echo "<p>_GET[date]=$_GET[date], _GET[hour]=$_GET[hour], _GET[minute]=$_GET[minute], this->date=$this->date ==> start=$start=".date('Y-m-d H:i',$start)."</p>\n";
$participant_types = array('u' => array($owner => $owner == $this->user ? 'A' : 'U'));
$participants = array($owner => $owner == $this->user ? 'A' : 'U');
if ($_GET['participants'])
{
foreach(explode(',',$_GET['participants']) as $uid)
$participant_types['u'] = $participant_types = $participants = array();
foreach($extra_participants as $uid)
{
if (isset($participants[$uid])) continue; // already included
if (is_numeric($uid))
{
$participants[$uid] = $participant_types['u'][$uid] = $uid == $this->user ? 'A' : 'U';
@ -101,7 +113,6 @@ class uiforms extends uical
}
}
}
}
return array(
'participant_types' => $participant_types,
'participants' => $participants,
@ -209,11 +220,6 @@ class uiforms extends uical
// ToDo: move this logic into bocal
}
}
if ($event['start'] > $event['end']) // end need to be after start, otherwise swap them
{
$event['start'] = $content['end'];
$event['end'] = $content['start'];
}
if ($content['whole_day'])
{
$event['start'] = $this->bo->date2array($event['start']);
@ -314,6 +320,18 @@ class uiforms extends uical
$msg = lang('Permission denied');
break;
}
if ($event['start'] > $event['end'])
{
$msg = lang('Error: Starttime has to be before the endtime !!!');
$button = '';
break;
}
if (!$event['participants'])
{
$msg = lang('Error: no participants selected !!!');
$button = '';
break;
}
if ($content['edit_single']) // we edited a single event from a series
{
$event['reference'] = $event['id'];
@ -516,6 +534,11 @@ class uiforms extends uical
{
$etpl =& CreateObject('etemplate.etemplate','calendar.edit');
$sel_options = array(
'recur_type' => &$this->bo->recur_types,
'accounts_status' => $this->bo->verbose_status,
'owner' => array(),
);
if (!is_array($event))
{
$preserv = array(
@ -581,8 +604,29 @@ class uiforms extends uical
if ($view)
{
$content['participants'][$name][$name.'_status'] = $participants;
$stati =& $content['participants'][$name][$name.'_status'];
$stati = $participants;
// enumerate group-invitations, so people can accept/reject them
if ($name == 'accounts')
{
foreach($participants as $id => $status)
{
if ($GLOBALS['egw']->accounts->get_type($id) == 'g' &&
($members = $GLOBALS['egw']->accounts->member($id)))
{
$sel_options['accounts_status']['G'] = lang('Select one');
foreach($members as $member)
{
if (!isset($stati[$member['account_id']]) && $this->bo->check_perms(EGW_ACL_EDIT,0,$member['account_id']))
{
$stati[$member['account_id']] = 'G'; // status for invitation via membership in group
$content['participants'][$name][] = $member['account_id'];
}
}
}
}
}
foreach($stati as $id => $status)
{
$readonlys[$name.'_status['.$id.']'] = !$this->bo->check_perms(EGW_ACL_EDIT,0,($type != 'u' ? $type : '').$id);
}
@ -657,11 +701,6 @@ class uiforms extends uical
{
$readonlys['button[delete_series]'] = !$view || $event['recur_type'] == MCAL_RECUR_NONE;
}
$sel_options = array(
'recur_type' => &$this->bo->recur_types,
'accounts_status' => &$this->bo->verbose_status,
'owner' => array(),
);
if ($event['id'] || $this->bo->check_perms(EGW_ACL_EDIT,$event)) // new event or edit rights to the event ==> allow to add alarm for all users
{
$sel_options['owner'][0] = lang('All participants');

View File

@ -192,6 +192,7 @@ class uiviews extends uical
$search_params['daywise'] = false;
$search_params['start'] = $this->first;
$search_params['end'] = $this->last;
$search_params['enum_groups'] = $this->sortby == 'user';
$events = $this->bo->search($search_params);
if ($this->debug > 0) $this->bo->debug_message('uiviews::planner() date=%1: first=%2, last=%3',False,$this->date,$this->bo->date2string($this->first),$this->bo->date2string($this->last));

View File

@ -1,5 +1,5 @@
<?php
// eTemplates for Application 'calendar', generated by soetemplate::dump4setup() 2005-11-12 18:04
// eTemplates for Application 'calendar', generated by soetemplate::dump4setup() 2005-11-23 11:13
/* $Id$ */
@ -25,6 +25,8 @@ $templ_data[] = array('name' => 'calendar.edit.participants','template' => '','l
$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.0.1.002','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:7:"row,top";s:1:"A";s:2:"95";s:2:"h1";s:6:",@view";s:2:"h2";s:7:",!@view";s:2:"c2";s:4:",top";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:15:",,,participants";s:5:"label";s:12:"Participants";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:2:"14";s:4:"name";s:22:"participants[accounts]";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:3:{s:4:"type";s:16:"resources_select";s:4:"size";s:2:"14";s:4:"name";s:23:"participants[resources]";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"B";a:6:{s:4:"type";s:4:"grid";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:22:"participants[accounts]";s:7:"options";a:0:{}}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:6:{s:4:"type";s:4:"grid";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:23:"participants[resources]";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:4;s:4:"size";s:23:"100%,200,,row_on,,,auto";s:7:"options";a:4:{i:3;s:6:"row_on";i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,row_on,,,auto','style' => '','modified' => '1129665796',);
$templ_data[] = array('name' => 'calendar.edit.participants','template' => '','lang' => '','group' => '0','version' => '1.0.1.003','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:7:"row,top";s:1:"A";s:2:"95";s:2:"h1";s:6:",@view";s:2:"h2";s:7:",!@view";s:2:"c2";s:4:",top";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:15:",,,participants";s:5:"label";s:12:"Participants";}s:1:"B";a:3:{s:4:"type";s:14:"select-account";s:4:"size";s:12:"14,calendar+";s:4:"name";s:22:"participants[accounts]";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:3:{s:4:"type";s:16:"resources_select";s:4:"size";s:2:"14";s:4:"name";s:23:"participants[resources]";}}i:2;a:4:{s:1:"A";a:2:{s:4:"type";s:5:"label";s:5:"label";s:12:"Participants";}s:1:"B";a:6:{s:4:"type";s:4:"grid";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:22:"participants[accounts]";s:7:"options";a:0:{}}s:1:"C";a:3:{s:4:"type";s:5:"label";s:5:"label";s:9:"Resources";s:5:"align";s:5:"right";}s:1:"D";a:6:{s:4:"type";s:4:"grid";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:23:"participants[resources]";s:7:"options";a:0:{}}}}s:4:"rows";i:2;s:4:"cols";i:4;s:4:"size";s:23:"100%,200,,row_on,,,auto";s:7:"options";a:4:{i:3;s:6:"row_on";i:0;s:4:"100%";i:1;s:3:"200";i:6;s:4:"auto";}}}','size' => '100%,200,,row_on,,,auto','style' => '','modified' => '1129665796',);
$templ_data[] = array('name' => 'calendar.edit.recurrence','template' => '','lang' => '','group' => '0','version' => '','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:3:"row";s:1:"A";s:2:"95";}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:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118737412',);
$templ_data[] = array('name' => 'calendar.edit.recurrence','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:6:{s:2:"c1";s:2:"th";s:1:"A";s:2:"95";s:2:"c2";s:3:"row";s:2:"c3";s:3:"row";s:2:"c4";s:3:"row";s:1:"D";s:3:"50%";}i:1;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"span";s:3:"all";s:5:"label";s:27:"Repeating Event Information";}s:1:"B";a:2:{s:4:"type";s:5:"label";s:5:"label";s:16:"be back soon ;-)";}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:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_type";s:5:"label";s:11:"Repeat type";}s:1:"B";a:2:{s:4:"type";s:6:"select";s:4:"name";s:10:"recur_type";}s:1:"C";a:3:{s:4:"type";s:5:"label";s:4:"size";s:17:",,,recur_interval";s:5:"label";s:8:"Interval";}s:1:"D";a:4:{s:4:"type";s:13:"select-number";s:4:"name";s:14:"recur_interval";s:4:"help";s:53:"repeating interval, eg. 2 to repeat every second week";s:4:"size";s:9:"None,2,10";}}i:3;a:4:{s:1:"A";a:3:{s:4:"type";s:5:"label";s:4:"size";s:16:",,,recur_enddate";s:5:"label";s:8:"End date";}s:1:"B";a:3:{s:4:"type";s:4:"date";s:4:"name";s:13:"recur_enddate";s:4:"help";s:57:"repeat the event until which date (empty means unlimited)";}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:3:{s:4:"type";s:5:"label";s:4:"size";s:13:",,,recur_data";s:5:"label";s:11:"Repeat days";}s:1:"B";a:4:{s:4:"type";s:10:"select-dow";s:4:"size";s:3:"5,1";s:4:"name";s:10:"recur_data";s:4:"help";s:44:"Days of the week for a weekly repeated event";}s:1:"C";a:1:{s:4:"type";s:5:"label";}s:1:"D";a:1:{s:4:"type";s:5:"label";}}}s:4:"rows";i:4;s:4:"cols";i:4;s:4:"size";s:8:"100%,200";s:7:"options";a:2:{i:0;s:4:"100%";i:1;s:3:"200";}}}','size' => '100%,200','style' => '','modified' => '1118737412',);

View File

@ -88,7 +88,9 @@ enddate of the export calendar de Enddatum des Exports
ends calendar de endet
error adding the alarm calendar de Fehler beim Zufügen des Alarms
error: importing the ical calendar de Fehler: beim Importieren des iCal
error: no participants selected !!! calendar de Fehler: keine Teilnehmer ausgewählt !!!
error: saving the event !!! calendar de Fehler: beim Speichern des Termins !!!
error: starttime has to be before the endtime !!! calendar de Fehler: Startzeit muß vor Endzeit liegen !!!
event copied - the copy can now be edited calendar de Termin kopiert - die Kopie kann jetzt bearbeitet werden
event deleted calendar de Termin gelöscht
event details follow calendar de Details zum Termin folgen

View File

@ -88,7 +88,9 @@ enddate of the export calendar en Enddate of the export
ends calendar en ends
error adding the alarm calendar en Error adding the alarm
error: importing the ical calendar en Error: importing the iCal
error: no participants selected !!! calendar en Error: no participants selected !!!
error: saving the event !!! calendar en Error: saving the event !!!
error: starttime has to be before the endtime !!! calendar en Error: Starttime has to be before the endtime !!!
event copied - the copy can now be edited calendar en Event copied - the copy can now be edited
event deleted calendar en Event deleted
event details follow calendar en Event Details follow

View File

@ -12,7 +12,7 @@
/* $Id$ */
$setup_info['calendar']['name'] = 'calendar';
$setup_info['calendar']['version'] = '1.0.1.009';
$setup_info['calendar']['version'] = '1.2';
$setup_info['calendar']['app_order'] = 3;
$setup_info['calendar']['enable'] = 1;
@ -67,3 +67,4 @@

View File

@ -18,7 +18,6 @@
'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False),
'cal_category' => array('type' => 'varchar','precision' => '30'),
'cal_groups' => array('type' => 'varchar','precision' => '255'),
'cal_modified' => array('type' => 'int','precision' => '8'),
'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'),

View File

@ -38,7 +38,6 @@
$GLOBALS['egw_setup']->oProc->AlterColumn($table, $field, array('type' => 'int', 'precision' => 4, 'nullable' => false, 'default' => 0));
}
$test[] = '0.9.3pre1';
function calendar_upgrade0_9_3pre1()
{
@ -47,66 +46,77 @@
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre2';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre2";
function calendar_upgrade0_9_3pre2()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre3';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre3";
function calendar_upgrade0_9_3pre3()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre4';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre4";
function calendar_upgrade0_9_3pre4()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre5';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre5";
function calendar_upgrade0_9_3pre5()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre6';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre6";
function calendar_upgrade0_9_3pre6()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre7';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre7";
function calendar_upgrade0_9_3pre7()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre8';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre8";
function calendar_upgrade0_9_3pre8()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre9';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre9";
function calendar_upgrade0_9_3pre9()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3pre10';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3pre10";
function calendar_upgrade0_9_3pre10()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.3';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.3";
function calendar_upgrade0_9_3()
{
$GLOBALS['setup_info']['calendar']['currentver'] = '0.9.4pre1';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = "0.9.4pre1";
function calendar_upgrade0_9_4pre1()
{
@ -1446,4 +1456,46 @@
$GLOBALS['setup_info']['calendar']['currentver'] = '1.0.1.009';
return $GLOBALS['setup_info']['calendar']['currentver'];
}
$test[] = '1.0.1.009';
function calendar_upgrade1_0_1_009()
{
$db2 = clone($GLOBALS['egw_setup']->db);
$add_groups = array();
$GLOBALS['egw_setup']->db->select('egw_cal','DISTINCT egw_cal.cal_id,cal_groups,cal_recur_date',"cal_groups != ''",__LINE__,__FILE__,
False,'','calendar',0,',egw_cal_user WHERE egw_cal.cal_id=egw_cal_user.cal_id');
while(($row = $GLOBALS['egw_setup']->db->row(true)))
{
$row['cal_user_type'] = 'u';
foreach(explode(',',$row['cal_groups']) as $group)
{
$row['cal_user_id'] = $group;
$db2->insert('egw_cal_user',array('cal_status' => 'U'),$row,__LINE__,__FILE__,'calendar');
}
}
$GLOBALS['egw_setup']->oProc->DropColumn('egw_cal',array(
'fd' => array(
'cal_id' => array('type' => 'auto','nullable' => False),
'cal_uid' => array('type' => 'varchar','precision' => '255','nullable' => False),
'cal_owner' => array('type' => 'int','precision' => '4','nullable' => False),
'cal_category' => array('type' => 'varchar','precision' => '30'),
'cal_modified' => array('type' => 'int','precision' => '8'),
'cal_priority' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '2'),
'cal_public' => array('type' => 'int','precision' => '2','nullable' => False,'default' => '1'),
'cal_title' => array('type' => 'varchar','precision' => '255','nullable' => False,'default' => '1'),
'cal_description' => array('type' => 'text'),
'cal_location' => array('type' => 'varchar','precision' => '255'),
'cal_reference' => array('type' => 'int','precision' => '4','nullable' => False,'default' => '0'),
'cal_modifier' => array('type' => 'int','precision' => '4'),
'cal_non_blocking' => array('type' => 'int','precision' => '2','default' => '0')
),
'pk' => array('cal_id'),
'fk' => array(),
'ix' => array(),
'uc' => array()
),'cal_groups');
return $GLOBALS['setup_info']['calendar']['currentver'] = '1.2';
}
?>