Merge branch 'dev/kolab3' of ssh://git.kolabsys.com/git/roundcube into dev/kolab3

This commit is contained in:
Thomas B 2012-04-05 08:55:35 +02:00
commit 6fe30d09c6
5 changed files with 22 additions and 79 deletions

View file

@ -25,13 +25,13 @@
+ View: 3.9: Alter event with drag/drop
+ Option: 4.12: Set default reminder time
+ Option: 3.23: Specify folder for new event (prefs)
- Option: Set date/time format in prefs
+ Option: Set date/time format in prefs
+ Receive: 1.20: Invitation handling
- Jump to calendar view from mail ("Show event")
- Allow to re-send invitations
- Implement iTIP delegation
- View: 3.4: Fish-Eye View For Busy Days
+ View: 3.4: Fish-Eye View For Busy Days
+ View: 3.8: Color according to calendar and category (similar to Kontact)
+ Support for multiple calendars (replace categories)
@ -40,8 +40,8 @@
+ ICS parser/generator (http://code.google.com/p/qcal/)
- Export *with* attachments
- Importing ICS files (upload, drag & drop)
- Remember last visited view
- Create/manage invdividual views
- Support for tasks/todos with task list view (ordered by date/time)
+ Importing ICS files (upload, drag & drop)

View file

@ -2349,7 +2349,7 @@ function rcube_calendar_ui(settings)
event.end = new Date(event.start.getTime() + (allDay ? DAY_MS : HOUR_MS));
}
// moved to all-day section: set times to 12:00 - 13:00
if (allDay && !event.allday) {
if (allDay && !event.allDay) {
event.start.setHours(12);
event.start.setMinutes(0);
event.start.setSeconds(0);
@ -2358,7 +2358,7 @@ function rcube_calendar_ui(settings)
event.end.setSeconds(0);
}
// moved from all-day section: set times to working hours
else if (event.allday && !allDay) {
else if (event.allDay && !allDay) {
var newstart = event.start.getTime();
revertFunc(); // revert to get original duration
var numdays = Math.max(1, Math.round((event.end.getTime() - event.start.getTime()) / DAY_MS)) - 1;

View file

@ -60,7 +60,7 @@ class kolab_calendar
// fetch objects from the given IMAP folder
$this->storage = kolab_storage::get_folder($this->imap_folder);
$this->ready = !PEAR::isError($this->storage);
$this->ready = $this->storage && !PEAR::isError($this->storage);
// Set readonly and alarms flags according to folder permissions
if ($this->ready) {
@ -70,7 +70,7 @@ class kolab_calendar
}
else {
$rights = $this->storage->get_acl();
if (!PEAR::isError($rights)) {
if ($rights && !PEAR::isError($rights)) {
if (strpos($rights, 'i') !== false)
$this->readonly = false;
}
@ -271,7 +271,7 @@ class kolab_calendar
$object = $this->_from_rcube_event($event);
$saved = $this->storage->save($object, 'event');
if (PEAR::isError($saved)) {
if (!$saved || PEAR::isError($saved)) {
raise_error(array(
'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
@ -297,15 +297,15 @@ class kolab_calendar
public function update_event($event)
{
$updated = false;
$old = $this->storage->getObject($event['id']);
if (PEAR::isError($old))
$old = $this->storage->get_object($event['id']);
if (!$old || PEAR::isError($old))
return false;
$old['recurrence'] = ''; # clear old field, could have been removed in new, too
$object = $this->_from_rcube_event($event, $old);
$saved = $this->storage->save($object, 'event', $event['id']);
if (PEAR::isError($saved)) {
if (!$saved || PEAR::isError($saved)) {
raise_error(array(
'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
@ -328,29 +328,15 @@ class kolab_calendar
*/
public function delete_event($event, $force = true)
{
$deleted = false;
$deleted = $this->storage->delete($event['id'], $force);
if (!$force) {
// Get IMAP object ID
$imap_uid = $this->storage->_getStorageId($event['id']);
}
$deleteme = $this->storage->delete($event['id'], $force);
if (PEAR::isError($deleteme)) {
if (!$deleted || PEAR::isError($deleted)) {
raise_error(array(
'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Error deleting event object from Kolab server:" . $deleteme->getMessage()),
'message' => "Error deleting event object from Kolab server"),
true, false);
}
else {
// Save IMAP object ID in session, will be used for restore action
if ($imap_uid)
$_SESSION['kolab_delete_uids'][$event['id']] = $imap_uid;
$deleted = true;
}
return $deleted;
}
@ -363,48 +349,8 @@ class kolab_calendar
*/
public function restore_event($event)
{
$imap_uid = $_SESSION['kolab_delete_uids'][$event['id']];
if (!$imap_uid)
return false;
$session = &Horde_Kolab_Session::singleton();
$imap = &$session->getImap();
if (is_object($imap) && is_a($imap, 'PEAR_Error')) {
$error = $imap;
}
else {
$result = $imap->select($this->imap_folder);
if (is_object($result) && is_a($result, 'PEAR_Error')) {
$error = $result;
}
else {
$result = $imap->undeleteMessages($imap_uid);
if (is_object($result) && is_a($result, 'PEAR_Error')) {
$error = $result;
}
else {
// re-sync the cache
$this->storage->synchronize();
}
}
}
if ($error) {
raise_error(array(
'code' => 600, 'type' => 'php',
'file' => __FILE__, 'line' => __LINE__,
'message' => "Error undeleting an event object(s) from the Kolab server:" . $error->getMessage()),
true, false);
return false;
}
$rcmail = rcmail::get_instance();
$rcmail->session->remove('kolab_delete_uids');
return true;
// TODO: re-implement this with new kolab_storege backend
return false;
}
/**

View file

@ -161,8 +161,8 @@ class kolab_driver extends calendar_driver
}
// subscribe to new calendar by default
$storage = $this->rc->get_storage();
$storage->subscribe($folder);
$storage = kolab_storage::get_folder($folder);
$storage->subscribe($prop['active'], kolab_storage::SERVERSIDE_SUBSCRIPTION);
// create ID
$id = kolab_storage::folder_id($folder);
@ -227,13 +227,9 @@ class kolab_driver extends calendar_driver
public function subscribe_calendar($prop)
{
if ($prop['id'] && ($cal = $this->calendars[$prop['id']])) {
$storage = $this->rc->get_storage();
if ($prop['active'])
return $storage->subscribe($cal->get_realname());
else
return $storage->unsubscribe($cal->get_realname());
return $cal->storage->subscribe($prop['active'], kolab_storage::SERVERSIDE_SUBSCRIPTION);
}
return false;
}

View file

@ -157,6 +157,7 @@
<file name="config.inc.php.dist" role="data"></file>
<file name="LICENSE" role="data"></file>
<file name="README" role="data"></file>
<file name="TODO" role="data"></file>
<file name="localization/bg_BG.inc" role="data"></file>