From: Jan Schneider Date: Wed, 8 Apr 2009 13:17:29 +0000 (+0200) Subject: Fix dragging of events, and correctly update cache and other dates of the same event. X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=891fcc5eccb543e10358c61fbb995f2de63d87da;p=horde.git Fix dragging of events, and correctly update cache and other dates of the same event. --- diff --git a/kronolith/ajax.php b/kronolith/ajax.php index d6b16c0b9..e39736e9f 100644 --- a/kronolith/ajax.php +++ b/kronolith/ajax.php @@ -49,6 +49,26 @@ function getDriver($cal) return $kronolith_driver; } +function saveEvent($event) +{ + $result = $event->save(); + if (is_a($result, 'PEAR_Error')) { + $GLOBALS['notification']->push($result, 'horde.error'); + return true; + } + $start = new Horde_Date(Util::getFormData('view_start')); + $end = new Horde_Date(Util::getFormData('view_end')); + Kronolith::addEvents($events, $event, $start, $end, true, true); + $result = new stdClass; + $result->cal = Util::getFormData('cal'); + $result->view = Util::getFormData('view'); + $result->sig = $start->dateString() . $end->dateString(); + if (count($events)) { + $result->events = $events; + } + return $result; +} + // Need to load Util:: to give us access to Util::getPathInfo(). $kronolith_dir = dirname(__FILE__); if (!defined('HORDE_BASE')) { @@ -114,7 +134,7 @@ try { break; case 'GetEvent': - if (!($kronolith_driver = getDriver($cal = Util::getFormData('cal')))) { + if (!($kronolith_driver = getDriver(Util::getFormData('cal')))) { $result = true; break; } @@ -138,8 +158,7 @@ try { break; case 'SaveEvent': - $cal = Util::getFormData('cal'); - if (!($kronolith_driver = getDriver($cal))) { + if (!($kronolith_driver = getDriver(Util::getFormData('cal')))) { $result = true; break; } @@ -160,24 +179,11 @@ try { break; } $event->readForm(); - $result = $event->save(); - if (is_a($result, 'PEAR_Error')) { - $notification->push($result, 'horde.error'); - } - $start = new Horde_Date(Util::getFormData('view_start')); - $end = new Horde_Date(Util::getFormData('view_end')); - Kronolith::addEvents($events, $event, $start, $end, true, true); - $result = new stdClass; - $result->cal = $cal; - $result->view = Util::getFormData('view'); - $result->sig = $start->dateString() . $end->dateString(); - if (count($events)) { - $result->events = $events; - } + $result = saveEvent($event); break; case 'UpdateEvent': - if (!($kronolith_driver = getDriver($cal = Util::getFormData('cal')))) { + if (!($kronolith_driver = getDriver(Util::getFormData('cal')))) { break; } if (is_null($id = Util::getFormData('id'))) { @@ -210,14 +216,11 @@ try { break; } } - $result = $event->save(); - if (is_a($result, 'PEAR_Error')) { - $notification->push($result, 'horde.error'); - } + $result = saveEvent($event); break; case 'DeleteEvent': - if (!($kronolith_driver = getDriver($cal = Util::getFormData('cal')))) { + if (!($kronolith_driver = getDriver(Util::getFormData('cal')))) { $result = true; break; } diff --git a/kronolith/js/src/kronolith.js b/kronolith/js/src/kronolith.js index 502ca0f2e..1496f1681 100644 --- a/kronolith/js/src/kronolith.js +++ b/kronolith/js/src/kronolith.js @@ -386,7 +386,7 @@ KronolithCore = { // Build new calendar view. while (day.compareTo(dates[1]) < 1) { - row = tbody.insert(this.createWeekRow(day, date.getMonth()).show()); + row = tbody.insert(this.createWeekRow(day, date.getMonth(), dates).show()); day.next().week(); rows++; } @@ -400,16 +400,20 @@ KronolithCore = { * Creates a single row of day cells for usage in the month and multi-week * views. * - * @param Date date The first day to show in the row. - * @oaram integer month The current month. Days not from the current month - * get the kronolithOtherMonth CSS class assigned. + * @param Date date The first day to show in the row. + * @param integer month The current month. Days not from the current + * month get the kronolithOtherMonth CSS class + * assigned. + * @param array viewDates Array of Date objects with the start and end + * dates of the view. * * @return Element The element rendering a week row. */ - createWeekRow: function(date, month) + createWeekRow: function(date, month, viewDates) { var monday = date.clone(), day = date.clone(), today = new Date().dateString(), + start = viewDates[0].dateString(), end = viewDates[1].dateString(), row, cell, dateString; // Find monday of the week, to determine the week number. @@ -431,22 +435,36 @@ KronolithCore = { cell.id = 'kronolithMonthDay' + dateString; cell.writeAttribute('date', dateString); cell.removeClassName('kronolithOtherMonth').removeClassName('kronolithToday'); - if (typeof month != 'undefined' && day.getMonth() != month) { + if (day.getMonth() != month) { cell.addClassName('kronolithOtherMonth'); } if (dateString == today) { cell.addClassName('kronolithToday'); } new Drop(cell, { onDrop: function(drop) { - var el = DragDrop.Drags.drag.element; + var el = DragDrop.Drags.drag.element, + eventid = el.readAttribute('eventid'), + cal = el.readAttribute('calendar'); if (drop == el.parentNode) { return; } drop.insert(el); + this.eventsLoading[cal] = start + end; + this.loading++; + $('kronolithLoading').show(); this.doAction('UpdateEvent', - { cal: el.readAttribute('calendar'), - id: el.readAttribute('eventid'), - att: $H({ start_date: drop.readAttribute('date') }).toJSON() }); + { 'cal': cal, + 'id': eventid, + 'view': this.view, + 'view_start': start, + 'view_end': end, + 'att': $H({ start_date: drop.readAttribute('date') }).toJSON() }, + function(r) { + if (r.response.events) { + this._removeEvent(eventid, cal); + this._loadEventsCallback(r); + } + }.bind(this)); }.bind(this) }); cell.down('.kronolithDay') .setText(day.getDate()) @@ -849,7 +867,7 @@ KronolithCore = { 'color': event.value.fg }); $('kronolithMonthDay' + date).insert(div); - if (event.value.ed) { + if (event.value.pe) { div.setStyle({ 'cursor': 'move' }); new Drag('kronolithEventmonth' + calendar + event.key, { threshold: 5, parentElement: function() { return $('kronolithViewMonthBody'); }, snapToParent: true }); } @@ -1122,6 +1140,7 @@ KronolithCore = { end = viewDates[1].dateString(); this.eventsLoading[cal] = start + end; this.loading++; + $('kronolithLoading').show(); this.doAction('SaveEvent', $H($('kronolithEventForm').serialize({ 'hash': true })) .merge({