Add individual notification methods for single events.
authorAlfonso Marín Marín <almarin@um.es>
Thu, 22 Jan 2009 17:57:26 +0000 (18:57 +0100)
committerJan Schneider <jan@horde.org>
Thu, 22 Jan 2009 18:16:18 +0000 (19:16 +0100)
14 files changed:
kronolith/docs/CHANGES
kronolith/lib/Driver.php
kronolith/lib/Driver/sql.php
kronolith/scripts/sql/kronolith.mssql.sql
kronolith/scripts/sql/kronolith.mysql.sql
kronolith/scripts/sql/kronolith.oci8.sql
kronolith/scripts/sql/kronolith.pgsql.sql
kronolith/scripts/sql/kronolith.sql
kronolith/scripts/sql/kronolith.xml
kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.mssql.sql [new file with mode: 0644]
kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.oci8.sql [new file with mode: 0644]
kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.sql [new file with mode: 0644]
kronolith/templates/edit/edit.inc
kronolith/templates/edit/javascript.inc

index 5130fb1..c20a242 100644 (file)
@@ -2,6 +2,8 @@
 v3.0-cvs
 --------
 
+[jan] Add individual notification methods for single events (Alfonso Marín
+      Marín <almarin@um.es>).
 [jan] Add Ajax interface.
 [jan] Store events in UTC and convert to the user's timezone on the fly.
 [jan] Remove alarm reminder code.
index 97e3e5b..cb49dab 100644 (file)
@@ -428,6 +428,13 @@ class Kronolith_Event {
     var $alarm = 0;
 
     /**
+     * Parameter of the particular alarm method overridden for this event.
+     *
+     * @var array
+     */
+    var $methods;
+
+    /**
      * The identifier of the calender this event exists on.
      *
      * @var string
@@ -1198,7 +1205,7 @@ class Kronolith_Event {
             $prefs = $GLOBALS['prefs'];
         }
 
-        $methods = @unserialize($prefs->getValue('event_alarms'));
+        $methods = !empty($this->methods) ? $this->methods : @unserialize($prefs->getValue('event_alarms'));
         $start = Util::cloneObject($this->start);
         $start->min -= $this->getAlarm();
         $start->correct();
@@ -1875,8 +1882,32 @@ class Kronolith_Event {
         // Alarm.
         if (Util::getFormData('alarm') == 1) {
             $this->setAlarm(Util::getFormData('alarm_value') * Util::getFormData('alarm_unit'));
+            // Notification.
+            if (Util::getFormData('alarm_change_method')) {
+                $types = Util::getFormData('event_alarms');
+                if (!empty($types)) {
+                    $methods = array();
+                    foreach ($types as $type) {
+                        $methods[$type] = array();
+                        switch ($type){
+                        case 'notify':
+                            $methods[$type]['sound'] = Util::getFormData('event_alarms_sound');
+                            break;
+                        case 'mail':
+                            $methods[$type]['email'] = Util::getFormData('event_alarms_email');
+                            break;
+                        case 'popup':
+                            break;
+                        }
+                    }
+                    $this->methods = $methods;
+                }
+            } else {
+                $this->methods = array();
+            }
         } else {
             $this->setAlarm(0);
+            $this->methods = array();
         }
 
         // Recurrence.
index 396dedb..a87b8ab 100644 (file)
@@ -281,7 +281,8 @@ class Kronolith_Driver_sql extends Kronolith_Driver {
             ' event_keywords, event_title, event_category, event_recurcount,' .
             ' event_recurtype, event_recurenddate, event_recurinterval,' .
             ' event_recurdays, event_start, event_end, event_allday,' .
-            ' event_alarm, event_modified, event_exceptions, event_creator_id' .
+            ' event_alarm, event_alarm_methods, event_modified,' .
+            ' event_exceptions, event_creator_id' .
             ' FROM ' . $this->_params['table'] .
             ' WHERE calendar_id = ? AND ((';
         $values = array($this->_calendar);
@@ -377,7 +378,8 @@ class Kronolith_Driver_sql extends Kronolith_Driver {
             ' event_keywords, event_title, event_category, event_recurcount,' .
             ' event_recurtype, event_recurenddate, event_recurinterval,' .
             ' event_recurdays, event_start, event_end, event_allday,' .
-            ' event_alarm, event_modified, event_exceptions, event_creator_id' .
+            ' event_alarm, event_alarm_methods, event_modified,' .
+            ' event_exceptions, event_creator_id' .
             ' FROM ' . $this->_params['table'] . ' WHERE event_id = ? AND calendar_id = ?';
         $values = array($eventId, $this->_calendar);
 
@@ -417,7 +419,8 @@ class Kronolith_Driver_sql extends Kronolith_Driver {
             ' event_keywords, event_title, event_category, event_recurcount,' .
             ' event_recurtype, event_recurenddate, event_recurinterval,' .
             ' event_recurdays, event_start, event_end, event_allday,' .
-            ' event_alarm, event_modified, event_exceptions, event_creator_id' .
+            ' event_alarm, event_alarm_methods, event_modified,' .
+            ' event_exceptions, event_creator_id' .
             ' FROM ' . $this->_params['table'] . ' WHERE event_uid = ?';
         $values = array($uid);
 
@@ -947,7 +950,9 @@ class Kronolith_Event_sql extends Kronolith_Event {
         if (isset($SQLEvent['event_alarm'])) {
             $this->alarm = (int)$SQLEvent['event_alarm'];
         }
-
+        if (isset($SQLEvent['event_alarm_methods'])) {
+            $this->methods = $driver->convertFromDriver(unserialize($SQLEvent['event_alarm_methods']));
+        }
         $this->initialized = true;
         $this->stored = true;
     }
@@ -990,6 +995,9 @@ class Kronolith_Event_sql extends Kronolith_Event {
         /* Alarm. */
         $this->_properties['event_alarm'] = (int)$this->getAlarm();
 
+        /* Alarm Notification Methods. */
+        $this->_properties['event_alarm_methods'] = serialize($driver->convertToDriver($this->methods));
+
         /* Recurrence. */
         if (!$this->recurs()) {
             $this->_properties['event_recurtype'] = 0;
index 3da4e8c..6bb5844 100644 (file)
@@ -1,5 +1,3 @@
--- $Horde: kronolith/scripts/sql/kronolith.mssql.sql,v 1.13 2008/10/22 21:14:07 jan Exp $
-
 CREATE TABLE kronolith_events (
     event_id VARCHAR(32) NOT NULL,
     event_uid VARCHAR(255) NOT NULL,
@@ -22,6 +20,7 @@ CREATE TABLE kronolith_events (
     event_end DATETIME,
     event_allday INT DEFAULT 0,
     event_alarm INT DEFAULT 0,
+    event_alarm_methods VARCHAR(MAX),
     event_modified INT NOT NULL,
     event_private INT DEFAULT 0 NOT NULL,
 
index 74b41fa..0fd4a0c 100644 (file)
@@ -1,5 +1,3 @@
--- $Horde: kronolith/scripts/sql/kronolith.mysql.sql,v 1.17 2008/10/22 21:14:07 jan Exp $
-
 CREATE TABLE kronolith_events (
     event_id VARCHAR(32) NOT NULL,
     event_uid VARCHAR(255) NOT NULL,
@@ -22,6 +20,7 @@ CREATE TABLE kronolith_events (
     event_end DATETIME,
     event_allday TINYINT DEFAULT 0,
     event_alarm INT DEFAULT 0,
+    event_alarm_methods TEXT,
     event_modified INT NOT NULL,
     event_private TINYINT DEFAULT 0 NOT NULL,
 
index 01d55e2..61e09f4 100644 (file)
@@ -1,5 +1,3 @@
--- $Horde: kronolith/scripts/sql/kronolith.oci8.sql,v 1.17 2008/10/22 21:14:07 jan Exp $
-
 CREATE TABLE kronolith_events (
     event_id VARCHAR2(32) NOT NULL,
     event_uid VARCHAR2(255) NOT NULL,
@@ -22,6 +20,7 @@ CREATE TABLE kronolith_events (
     event_end DATE,
     event_allday INT DEFAULT 0,
     event_alarm INT DEFAULT 0,
+    event_alarm_methods VARCHAR2(4000),
     event_modified INT NOT NULL,
     event_private INT DEFAULT 0 NOT NULL,
 --
index 86ac0b1..0fb5f18 100644 (file)
@@ -1,5 +1,3 @@
--- $Horde: kronolith/scripts/sql/kronolith.pgsql.sql,v 1.15 2008/10/22 21:14:07 jan Exp $
-
 CREATE TABLE kronolith_events (
     event_id VARCHAR(32) NOT NULL,
     event_uid VARCHAR(255) NOT NULL,
@@ -22,6 +20,7 @@ CREATE TABLE kronolith_events (
     event_end TIMESTAMP,
     event_allday INT DEFAULT 0,
     event_alarm INT DEFAULT 0,
+    event_alarm_methods TEXT,
     event_modified INT NOT NULL,
     event_private INT DEFAULT 0 NOT NULL,
 
index 13f269e..d3b1bc4 100644 (file)
@@ -1,5 +1,3 @@
--- $Horde: kronolith/scripts/sql/kronolith.sql,v 1.15 2008/10/22 21:14:08 jan Exp $
-
 CREATE TABLE kronolith_events (
     event_id VARCHAR(32) NOT NULL,
     event_uid VARCHAR(255) NOT NULL,
@@ -22,6 +20,7 @@ CREATE TABLE kronolith_events (
     event_end DATETIME,
     event_allday INT DEFAULT 0,
     event_alarm INT DEFAULT 0,
+    event_alarm_methods TEXT,
     event_modified INT NOT NULL,
     event_private INT DEFAULT 0 NOT NULL,
 
index 4720fc1..874fa19 100644 (file)
    </field>
 
    <field>
+    <name>event_alarm_methods</name>
+    <type>clob</type>
+   </field>
+
+   <field>
     <name>event_allday</name>
     <type>integer</type>
     <length>1</length>
diff --git a/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.mssql.sql b/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.mssql.sql
new file mode 100644 (file)
index 0000000..2189757
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_alarm_methods VARCHAR(MAX);
diff --git a/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.oci8.sql b/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.oci8.sql
new file mode 100644 (file)
index 0000000..a569f6e
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_alarm_methods VARCHAR2(4000);
diff --git a/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.sql b/kronolith/scripts/upgrades/2009-01-22_add_alarm_methods.sql
new file mode 100644 (file)
index 0000000..70feaed
--- /dev/null
@@ -0,0 +1 @@
+ALTER TABLE kronolith_events ADD event_alarm_methods TEXT;
index 2e7d37f..ba9baa1 100644 (file)
 <?php require KRONOLITH_TEMPLATES . '/edit/edit_timespan.inc' ?>
 
 <!-- alarm -->
+<?php
+if ($event->alarm) {
+    $alarm_set = true;
+    if ($event->alarm % 10080 == 0) {
+        $alarm_value = $event->alarm / 10080;
+        $alarm_unit = 'week';
+        $alarm_unit_title = _("Week(s)");
+    } elseif ($event->alarm % 1440 == 0) {
+        $alarm_value = $event->alarm / 1440;
+        $alarm_unit = 'day';
+        $alarm_unit_title = _("Day(s)");
+    } elseif ($event->alarm % 60 == 0) {
+        $alarm_value = $event->alarm / 60;
+        $alarm_unit = 'hour';
+        $alarm_unit_title = _("Hour(s)");
+    } else {
+        $alarm_value = $event->alarm;
+        $alarm_unit = 'min';
+        $alarm_unit_title = _("Minute(s)");
+    }
+} else {
+    $alarm_value = 15;
+    $alarm_unit = 'min';
+    $alarm_set = false;
+}
+?>
+<tr>
+ <td colspan="5" class="control toggle" onclick="toggleSection('alarm')">
+  <?php echo Horde::img('tree/blank.png', '', array('id' => 'toggle_alarm'), $GLOBALS['registry']->getImageDir('horde')) . ' <strong>' . Horde::label('alarm', _("_Alarm")) ?></strong>
+  <span class="extra" id="extra_alarm"><?php if ($alarm_set) printf(_("%d %s before the event starts"), $alarm_value, $alarm_unit_title); ?></span>
+</td>
+</tr>
+<tbody id="section_alarm">
 <tr>
  <td class="rightAlign" valign="top">
-    <strong><?php $ak = Horde::getAccessKey(_("_Alarm")); echo Horde::highlightAccessKey(_("_Alarm"), $ak) ?></strong>
+  <strong><?php echo _("Alarm") ?></strong>
  </td>
  <td valign="top">
-  <?php
-  if ($event->alarm) {
-      $alarm_set = true;
-      if ($event->alarm % 10080 == 0) {
-          $alarm_value = $event->alarm / 10080;
-          $alarm_unit = 'week';
-      } elseif ($event->alarm % 1440 == 0) {
-          $alarm_value = $event->alarm / 1440;
-          $alarm_unit = 'day';
-      } elseif ($event->alarm % 60 == 0) {
-          $alarm_value = $event->alarm / 60;
-          $alarm_unit = 'hour';
-      } else {
-          $alarm_value = $event->alarm;
-          $alarm_unit = 'min';
-      }
-  } else {
-      $alarm_value = 15;
-      $alarm_unit = 'min';
-      $alarm_set = false;
-  }
-  ?>
   <input id="noalarm" name="alarm" type="radio" class="checkbox" value="0"<?php if (!$alarm_set) echo ' checked="checked"' ?> /><br />
   <input id="yesalarm" name="alarm" type="radio" class="checkbox" value="1"<?php if ($alarm_set) echo ' checked="checked"' ?> />
   <label for="yesalarm" class="hidden"><?php echo _("Alarm enabled") ?></label>
  </td>
  <td>&nbsp;</td>
  <td valign="top" colspan="2">
-  <label for="noalarm" accesskey="<?php echo $ak ?>"> <?php echo _("No alarm") ?></label><br />
+  <label for="noalarm"> <?php echo _("No alarm") ?></label><br />
   <label for="alarm_value" class="hidden"><?php echo _("Alarm Value") ?></label>
   <input type="text" size="2" id="alarm_value" name="alarm_value" value="<?php echo $alarm_value ?>" onchange="document.eventform.alarm[1].checked=true" />&nbsp;
   <label for="alarm_unit" class="hidden"><?php echo _("Alarm Unit") ?></label>
   <?php echo _("before the event starts") ?>
  </td>
 </tr>
+<tr>
+ <td class="rightAlign" valign="top">
+  <strong><?php echo _("Notification") ?></strong>
+ </td>
+ <td valign="top">
+  <input id="nooverwrite" name="alarm_change_method" type="radio" class="checkbox" value="0"<?php if (empty($event->methods)) echo ' checked="checked"' ?> onclick="toggleAlarmMethods()" /><br />
+  <input id="yesoverwrite" name="alarm_change_method" type="radio" class="checkbox" value="1"<?php if (!empty($event->methods)) echo ' checked="checked"' ?> onclick="toggleAlarmMethods()" />
+ </td>
+ <td>&nbsp;</td>
+ <td valign="top" colspan="2">
+  <label for="nooverwrite"> <?php echo _("Use default notification method") ?></label><br/>
+  <label for="yesoverwrite"> <?php echo _("Use custom notification method") ?></label>
+  <div id="notification_options" style="display:<?php echo !empty($event->methods) ? 'block' : 'none' ?>">
+   <?php
+   // TODO: clean this hack up with H4
+   global $registry, $prefs;
+   $pref = 'event_alarms';
+   $_prefs = array($pref => array('desc' => ''));
+   $helplink = '';
+   $original_value = $prefs->getValue($pref);
+   if (!empty($event->methods)) {
+       $prefs->setValue($pref, serialize($event->methods));
+   }
+   include $GLOBALS['registry']->get('templates', 'horde') . '/prefs/alarm.inc';
+   if (!empty($event->methods)) {
+       $prefs->setValue($pref, $original_value);
+   }
+   ?>
+  </div>
+ </td>
+ </tr>
+ </tbody>
+</tr>
 
 <!-- description -->
 <tr>
index 010c232..936fb91 100644 (file)
@@ -219,6 +219,16 @@ function updateEndDate()
     updateWday('end_wday');
 }
 
+function toggleAlarmMethods()
+{
+    if ($('nooverwrite').checked) {
+        $('notification_options').hide();
+    } else {
+        $('notification_options').show();
+        $('yesalarm').checked = true;
+    }
+}
+
 function setStartDate(date)
 {
     var year = parseInt(date.substr(0, 4));
@@ -265,6 +275,7 @@ function toggleSection(section)
     }
 }
 Event.observe(window, 'load', function() {
+    toggleSection('alarm');
     toggleSection('description');
     toggleSection('attendees');
     toggleSection('recurrence');