From e987e51af2770972166097017ef09104e8c9a6a4 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 24 Apr 2014 15:04:18 +0200 Subject: [PATCH] Move recurrence form handling functions and texts from calendar to libcalendaring for shared use --- plugins/calendar/calendar.php | 97 +----- plugins/calendar/calendar_ui.js | 149 +--------- plugins/calendar/lib/calendar_ui.php | 157 +--------- plugins/calendar/localization/cs_CZ.inc | 26 -- plugins/calendar/localization/da_DK.inc | 25 -- plugins/calendar/localization/de_CH.inc | 27 -- plugins/calendar/localization/de_DE.inc | 27 -- plugins/calendar/localization/en_US.inc | 31 +- plugins/calendar/localization/fr_FR.inc | 25 -- plugins/calendar/localization/hu_HU.inc | 27 -- plugins/calendar/localization/it_IT.inc | 27 -- plugins/calendar/localization/ja_JP.inc | 25 -- plugins/calendar/localization/nl_NL.inc | 27 -- plugins/calendar/localization/pl_PL.inc | 27 -- plugins/calendar/localization/pt_BR.inc | 27 -- plugins/calendar/localization/ru_RU.inc | 27 -- plugins/calendar/skins/larry/calendar.css | 33 --- plugins/libcalendaring/libcalendaring.js | 188 ++++++++++++ plugins/libcalendaring/libcalendaring.php | 278 ++++++++++++++++++ plugins/libcalendaring/localization/cs_CZ.inc | 29 ++ plugins/libcalendaring/localization/da_DK.inc | 28 ++ plugins/libcalendaring/localization/de_CH.inc | 30 ++ plugins/libcalendaring/localization/de_DE.inc | 30 ++ plugins/libcalendaring/localization/en_US.inc | 30 ++ plugins/libcalendaring/localization/fr_FR.inc | 28 ++ plugins/libcalendaring/localization/hu_HU.inc | 30 ++ plugins/libcalendaring/localization/it_IT.inc | 29 ++ plugins/libcalendaring/localization/ja_JP.inc | 28 ++ plugins/libcalendaring/localization/nl_NL.inc | 30 ++ plugins/libcalendaring/localization/pl_PL.inc | 29 ++ plugins/libcalendaring/localization/pt_BR.inc | 29 ++ plugins/libcalendaring/localization/ru_RU.inc | 29 ++ plugins/libcalendaring/skins/larry/libcal.css | 51 ++++ 33 files changed, 909 insertions(+), 771 deletions(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 4bfe0d92..1d40efe5 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -1334,18 +1334,8 @@ class calendar extends rcube_plugin $event['valarms'] = libcalendaring::to_client_alarms($event['valarms']); } if ($event['recurrence']) { - $event['recurrence_text'] = $this->_recurrence_text($event['recurrence']); - if ($event['recurrence']['UNTIL']) - $event['recurrence']['UNTIL'] = $this->lib->adjust_timezone($event['recurrence']['UNTIL'], $event['allday'])->format('c'); - unset($event['recurrence']['EXCEPTIONS']); - - // format RDATE values - if (is_array($event['recurrence']['RDATE'])) { - $libcal = $this->lib; - $event['recurrence']['RDATE'] = array_map(function($rdate) use ($libcal) { - return $libcal->adjust_timezone($rdate, true)->format('c'); - }, $event['recurrence']['RDATE']); - } + $event['recurrence_text'] = $this->lib->recurrence_text($event['recurrence']); + $event['recurrence'] = $this->lib->to_client_recurrence($event['recurrence'], $event['allday']); } foreach ((array)$event['attachments'] as $k => $attachment) { @@ -1389,70 +1379,6 @@ class calendar extends rcube_plugin } - /** - * Render localized text describing the recurrence rule of an event - */ - private function _recurrence_text($rrule) - { - // derive missing FREQ and INTERVAL from RDATE list - if (empty($rrule['FREQ']) && !empty($rrule['RDATE'])) { - $first = $rrule['RDATE'][0]; - $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 (is_a($third, 'DateTime')) { - $diff2 = $second->diff($third); - if ($diff2->$k != $diff->$k) { - unset($rrule['INTERVAL']); - } - } - break; - } - } - } - if (!$rrule['INTERVAL']) - $rrule['FREQ'] = 'RDATE'; - $rrule['UNTIL'] = end($rrule['RDATE']); - } - - // TODO: finish this - $freq = sprintf('%s %d ', $this->gettext('every'), $rrule['INTERVAL']); - $details = ''; - switch ($rrule['FREQ']) { - case 'DAILY': - $freq .= $this->gettext('days'); - break; - case 'WEEKLY': - $freq .= $this->gettext('weeks'); - break; - case 'MONTHLY': - $freq .= $this->gettext('months'); - break; - case 'YEARLY': - $freq .= $this->gettext('years'); - break; - } - - if ($rrule['INTERVAL'] <= 1) - $freq = $this->gettext(strtolower($rrule['FREQ'])); - - if ($rrule['COUNT']) - $until = $this->gettext(array('name' => 'forntimes', 'vars' => array('nr' => $rrule['COUNT']))); - else if ($rrule['UNTIL']) - $until = $this->gettext('recurrencend') . ' ' . format_date($rrule['UNTIL'], libcalendaring::to_php_date_format($this->rc->config->get('calendar_date_format', $this->defaults['calendar_date_format']))); - else - $until = $this->gettext('forever'); - - return rtrim($freq . $details . ', ' . $until); - } - /** * Generate a unique identifier for an event */ @@ -1570,22 +1496,9 @@ class calendar extends rcube_plugin return; } - if (is_array($event['recurrence']) && !empty($event['recurrence']['UNTIL'])) - $event['recurrence']['UNTIL'] = new DateTime($event['recurrence']['UNTIL'], $this->timezone); - - if (is_array($event['recurrence']) && is_array($event['recurrence']['RDATE'])) { - $tz = $this->timezone; - $start = $event['start']; - $event['recurrence']['RDATE'] = array_map(function($rdate) use ($tz, $start) { - try { - $dt = new DateTime($rdate, $tz); - $dt->setTime($start->format('G'), $start->format('i')); - return $dt; - } - catch (Exception $e) { - return null; - } - }, $event['recurrence']['RDATE']); + // convert the submitted recurrence settings + if (is_array($event['recurrence'])) { + $event['recurrence'] = $this->lib->from_client_recurrence($event['recurrence'], $event['start']); } // convert the submitted alarm values diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 44681bad..a8642617 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -81,6 +81,7 @@ function rcube_calendar_ui(settings) var date2unixtime = this.date2unixtime; var fromunixtime = this.fromunixtime; var parseISO8601 = this.parseISO8601; + var date2servertime = this.date2ISO8601; /*** private methods ***/ @@ -142,23 +143,11 @@ function rcube_calendar_ui(settings) date.setHours(0); }; - // turn the given date into an ISO 8601 date string understandable by PHPs strtotime() - var date2servertime = function(date) - { - return date.getFullYear()+'-'+zeropad(date.getMonth()+1)+'-'+zeropad(date.getDate()) - + 'T'+zeropad(date.getHours())+':'+zeropad(date.getMinutes())+':'+zeropad(date.getSeconds()); - } - var date2timestring = function(date, dateonly) { return date2servertime(date).replace(/[^0-9]/g, '').substr(0, (dateonly ? 8 : 14)); } - var zeropad = function(num) - { - return (num < 10 ? '0' : '') + num; - } - var render_link = function(url) { var islink = false, href = url; @@ -530,55 +519,6 @@ function rcube_calendar_ui(settings) $('