Improve recurrence text so description for RDATE is better (#5401)

This commit is contained in:
Aleksander Machniak 2016-04-24 06:01:55 -04:00
parent 6bb5511b6d
commit 37a4b8c696

View file

@ -771,77 +771,74 @@ class libcalendaring extends rcube_plugin
*/ */
public function recurrence_text($rrule) public function recurrence_text($rrule)
{ {
// derive missing FREQ and INTERVAL from RDATE list $limit = 10;
$exdates = array();
$format = $this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']);
$format = self::to_php_date_format($format);
$format_fn = function($dt) use ($format) {
return rcmail::get_instance()->format_date($dt, $format);
};
if (is_array($rrule['EXDATE']) && !empty($rrule['EXDATE'])) {
$exdates = array_map($format_fn, $rrule['EXDATE']);
}
if (empty($rrule['FREQ']) && !empty($rrule['RDATE'])) { if (empty($rrule['FREQ']) && !empty($rrule['RDATE'])) {
$first = $rrule['RDATE'][0]; $rdates = array_map($format_fn, $rrule['RDATE']);
$second = $rrule['RDATE'][1];
$third = $rrule['RDATE'][2];
if (is_a($first, 'DateTime') && is_a($second, 'DateTime')) {
$diff = $first->diff($second);
foreach (array('y' => 'YEARLY', 'm' => 'MONTHLY', 'd' => 'DAILY') as $k => $freq) {
if ($diff->$k != 0) {
$rrule['FREQ'] = $freq;
$rrule['INTERVAL'] = $diff->$k;
// verify interval with next item if (!empty($exdates)) {
if (is_a($third, 'DateTime')) { $rdates = array_diff($rdates, $exdates);
$diff2 = $second->diff($third);
if ($diff2->$k != $diff->$k) {
unset($rrule['INTERVAL']);
}
}
break;
}
}
}
if (!$rrule['INTERVAL']) {
$rrule['FREQ'] = 'RDATE';
}
$rrule['UNTIL'] = end($rrule['RDATE']);
} }
$freq = sprintf('%s %d ', $this->gettext('every'), $rrule['INTERVAL']); if (count($rdates) > $limit) {
$details = ''; $rdates = array_slice($rdates, 0, $limit);
$more = true;
}
return $this->gettext('ondate') . ' ' . join(', ', $rdates)
. ($more ? '...' : '');
}
$output = sprintf('%s %d ', $this->gettext('every'), $rrule['INTERVAL'] ?: 1);
switch ($rrule['FREQ']) { switch ($rrule['FREQ']) {
case 'DAILY': case 'DAILY':
$freq .= $this->gettext('days'); $output .= $this->gettext('days');
break; break;
case 'WEEKLY': case 'WEEKLY':
$freq .= $this->gettext('weeks'); $output .= $this->gettext('weeks');
break; break;
case 'MONTHLY': case 'MONTHLY':
$freq .= $this->gettext('months'); $output .= $this->gettext('months');
break; break;
case 'YEARLY': case 'YEARLY':
$freq .= $this->gettext('years'); $output .= $this->gettext('years');
break; break;
} }
if ($rrule['INTERVAL'] <= 1) {
$freq = $this->gettext(strtolower($rrule['FREQ']));
}
if ($rrule['COUNT']) { if ($rrule['COUNT']) {
$until = $this->gettext(array('name' => 'forntimes', 'vars' => array('nr' => $rrule['COUNT']))); $until = $this->gettext(array('name' => 'forntimes', 'vars' => array('nr' => $rrule['COUNT'])));
} }
else if ($rrule['UNTIL']) { else if ($rrule['UNTIL']) {
$until = $this->gettext('recurrencend') . ' ' . $this->rc->format_date($rrule['UNTIL'], self::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']))); $until = $this->gettext('recurrencend') . ' ' . $this->rc->format_date($rrule['UNTIL'], $format);
} }
else { else {
$until = $this->gettext('forever'); $until = $this->gettext('forever');
} }
$except = ''; $output .= ', ' . $until;
if (is_array($rrule['EXDATE']) && !empty($rrule['EXDATE'])) {
$format = self::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format'])); if (!empty($exdates)) {
$exdates = array_map( if (count($exdates) > $limit) {
function($dt) use ($format) { return rcmail::get_instance()->format_date($dt, $format); }, $exdates = array_slice($exdates, 0, $limit);
array_slice($rrule['EXDATE'], 0, 10) $more = true;
);
$except = '; ' . $this->gettext('except') . ' ' . join(', ', $exdates);
} }
return rtrim($freq . $details . ', ' . $until . $except); $output = '; ' . $this->gettext('except') . ' ' . join(', ', $exdates)
. ($more ? '...' : '');
}
return $output;
} }
/** /**