calendar: non_blocking whole day events are displayed now on top of the day in one row only

This commit is contained in:
Christian Binder 2006-10-17 20:01:08 +00:00
parent c461da0bbd
commit 914c044a1c
2 changed files with 72 additions and 6 deletions

View File

@ -51,7 +51,14 @@ class uiviews extends uical
* *
* @var int $extraRows * @var int $extraRows
*/ */
var $extraRows = 1; var $extraRows = 2;
/**
* extra rows original (save original value even if it gets changed in the class)
*
* @var int $extraRowsOriginal
*/
var $extraRowsOriginal;
var $timeRow_width = 40; var $timeRow_width = 40;
@ -90,6 +97,13 @@ class uiviews extends uical
*/ */
var $scroll_to_wdstart=false; var $scroll_to_wdstart=false;
/**
* counter for the current whole day event of a single day
*
* @var int $wholeDayPosCounter;
*/
var $wholeDayPosCounter=1;
/** /**
* Constructor * Constructor
* *
@ -98,6 +112,7 @@ class uiviews extends uical
function uiviews($set_states=null) function uiviews($set_states=null)
{ {
$this->uical(false,$set_states); // call the parent's constructor $this->uical(false,$set_states); // call the parent's constructor
$this->extraRowsOriginal = $this->extraRows; //save original extraRows value
$GLOBALS['egw_info']['flags']['nonavbar'] = False; $GLOBALS['egw_info']['flags']['nonavbar'] = False;
$app_header = array( $app_header = array(
@ -408,7 +423,7 @@ class uiviews extends uical
if (count($users) == 1 || count($users) > 3) // for more then 3 users, show all in one row if (count($users) == 1 || count($users) > 3) // for more then 3 users, show all in one row
{ {
$content =& $this->timeGridWidget($this->bo->search($search_params),$this->cal_prefs['interval']); $content =& $this->timeGridWidget($this->tagWholeDayOnTop($this->bo->search($search_params)),$this->cal_prefs['interval']);
} }
else else
{ {
@ -417,7 +432,7 @@ class uiviews extends uical
{ {
$search_params['users'] = $uid; $search_params['users'] = $uid;
$content .= '<b>'.$label."</b>\n"; $content .= '<b>'.$label."</b>\n";
$content .= $this->timeGridWidget($this->bo->search($search_params), $content .= $this->timeGridWidget($this->tagWholeDayOnTop($this->bo->search($search_params)),
count($users) * $this->cal_prefs['interval'],400 / count($users),'','',$uid); count($users) * $this->cal_prefs['interval'],400 / count($users),'','',$uid);
} }
} }
@ -457,6 +472,7 @@ class uiviews extends uical
if (count($users) == 1 || count($users) > 5) if (count($users) == 1 || count($users) > 5)
{ {
$dayEvents =& $this->bo->search($this->search_params); $dayEvents =& $this->bo->search($this->search_params);
$dayEvents = $this->tagWholeDayOnTop($dayEvents);
$owner = 0; $owner = 0;
} }
else else
@ -469,6 +485,7 @@ class uiviews extends uical
list(,$dayEvents['<b>'.$label.'</b>']) = each($this->bo->search($search_params)); list(,$dayEvents['<b>'.$label.'</b>']) = each($this->bo->search($search_params));
$owner[] = $uid; $owner[] = $uid;
} }
$dayEvents = $this->tagWholeDayOnTop($dayEvents);
} }
$cols = array(); $cols = array();
$cols[0] =& $this->timeGridWidget($dayEvents,$this->cal_prefs['interval'],450,'','',$owner); $cols[0] =& $this->timeGridWidget($dayEvents,$this->cal_prefs['interval'],450,'','',$owner);
@ -597,7 +614,7 @@ class uiviews extends uical
// time before workday => condensed in the first $this->extraRows rows // time before workday => condensed in the first $this->extraRows rows
if ($this->wd_start > 0 && $time < $this->wd_start) if ($this->wd_start > 0 && $time < $this->wd_start)
{ {
$pos = (1 + $this->extraRows * $time / $this->wd_start) * $this->rowHeight; // 1 for the header $pos = (($this->extraRows - $this->extraRowsOriginal + 1) + ($time / $this->wd_start * ($this->extraRowsOriginal - 1))) * $this->rowHeight;
} }
// time after workday => condensed in the last row // time after workday => condensed in the last row
elseif ($this->wd_end < 24*60 && $time > $this->wd_end+1*$this->granularity_m) elseif ($this->wd_end < 24*60 && $time > $this->wd_end+1*$this->granularity_m)
@ -748,6 +765,7 @@ class uiviews extends uical
$n = 0; $n = 0;
foreach($daysEvents as $day => $events) foreach($daysEvents as $day => $events)
{ {
$this->wholeDayPosCounter=1;
$short_title = count($daysEvents) > 1; $short_title = count($daysEvents) > 1;
$col_owner = $owner; $col_owner = $owner;
if (!is_numeric($day)) if (!is_numeric($day))
@ -815,7 +833,7 @@ class uiviews extends uical
$event['end_m'] = 24*60-1; $event['end_m'] = 24*60-1;
$event['multiday'] = True; $event['multiday'] = True;
} }
if ($this->use_time_grid) if ($this->use_time_grid && !$event['whole_day_on_top'])
{ {
for($c = 0; $event['start_m'] < $col_ends[$c]; ++$c); for($c = 0; $event['start_m'] < $col_ends[$c]; ++$c);
$col_ends[$c] = $event['end_m']; $col_ends[$c] = $event['end_m'];
@ -978,6 +996,8 @@ class uiviews extends uical
{ {
if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width); if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width);
if($event['whole_day_on_top']) { $block='event_widget_wholeday_on_top'; }
static $tpl = False; static $tpl = False;
if (!$tpl) if (!$tpl)
{ {
@ -985,6 +1005,7 @@ class uiviews extends uical
$tpl->set_root($GLOBALS['egw']->common->get_tpl_dir('calendar')); $tpl->set_root($GLOBALS['egw']->common->get_tpl_dir('calendar'));
$tpl->set_file('event_widget_t','event_widget.tpl'); $tpl->set_file('event_widget_t','event_widget.tpl');
$tpl->set_block('event_widget_t','event_widget'); $tpl->set_block('event_widget_t','event_widget');
$tpl->set_block('event_widget_t','event_widget_wholeday_on_top');
$tpl->set_block('event_widget_t','event_tooltip'); $tpl->set_block('event_widget_t','event_tooltip');
$tpl->set_block('event_widget_t','planner_event'); $tpl->set_block('event_widget_t','planner_event');
} }
@ -1120,7 +1141,15 @@ class uiviews extends uical
} }
if ($this->use_time_grid) if ($this->use_time_grid)
{ {
$style = 'top: '.$this->time2pos($event['start_m']).'%; height: '.$height.'%;'; if($event['whole_day_on_top'])
{
$style = 'top: '.($this->rowHeight*$this->wholeDayPosCounter).'%; height: '.$this->rowHeight.'%;';
$this->wholeDayPosCounter++;
}
else
{
$style = 'top: '.$this->time2pos($event['start_m']).'%; height: '.$height.'%;';
}
} }
else else
{ {
@ -1724,4 +1753,35 @@ class uiviews extends uical
'%; width: '.$width.'%; background-color: '.$color.';"'.$data['popup'].' '. '%; width: '.$width.'%; background-color: '.$color.';"'.$data['popup'].' '.
$this->html->tooltip($data['tooltip'],False,array('BorderWidth'=>0,'Padding'=>0)).'>'."\n".$data['html'].$indent."</div>\n"; $this->html->tooltip($data['tooltip'],False,array('BorderWidth'=>0,'Padding'=>0)).'>'."\n".$data['html'].$indent."</div>\n";
} }
/**
* Marks whole day events for later usage and increments extraRows
*
* @param array $dayEvents
* @return array $dayEvents
*/
function tagWholeDayOnTop($dayEvents)
{
foreach ($dayEvents as $day=>$oneDayEvents)
{
$extraRowsToAdd = 0;
foreach ($oneDayEvents as $num=>$event)
{
$start = $this->bo->date2array($event['start']);
$end = $this->bo->date2array($event['end']);
if(!$start['hour'] && !$start['minute'] && $end['hour'] == 23 && $end['minute'] == 59 && $event['non_blocking'])
{
$dayEvents[$day][$num]['whole_day_on_top']=true;
$this->whole_day_positions[$num]=($this->rowHeight*($num+2));
$extraRowsToAdd++;
}
}
// check after every day if we have to increase $this->extraRows
if(($this->extraRowsOriginal+$extraRowsToAdd) > $this->extraRows) { $this->extraRows = ($this->extraRowsOriginal+$extraRowsToAdd); }
}
return $dayEvents;
}
} }

View File

@ -6,6 +6,12 @@
{indent}<div class="calEventBody{Small}">{title}</div> {indent}<div class="calEventBody{Small}">{title}</div>
<!-- END event_widget --> <!-- END event_widget -->
<!-- BEGIN event_widget_wholeday_on_top -->
{indent}<div class="calEventBody{Small}">
{indent} {title}
{indent}</div>
<!-- END event_widget_wholeday_on_top -->
<!-- BEGIN event_tooltip --> <!-- BEGIN event_tooltip -->
<div class="calEventTooltip" style="border-color: {bordercolor}; background: {bodybackground};"> <div class="calEventTooltip" style="border-color: {bordercolor}; background: {bodybackground};">
<div class="calEventHeaderSmall" style="background-color: {bordercolor};"> <div class="calEventHeaderSmall" style="background-color: {bordercolor};">