Implement alarms for Kolab backend driver
This commit is contained in:
parent
d61041e96e
commit
f650ca55bd
3 changed files with 151 additions and 14 deletions
|
@ -73,6 +73,8 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
$delim = $this->rc->get_storage()->get_hierarchy_delimiter();
|
$delim = $this->rc->get_storage()->get_hierarchy_delimiter();
|
||||||
$listnames = array();
|
$listnames = array();
|
||||||
|
|
||||||
|
$prefs = $this->rc->config->get('kolab_tasklists', array());
|
||||||
|
|
||||||
foreach ($names as $utf7name => $name) {
|
foreach ($names as $utf7name => $name) {
|
||||||
$folder = $this->folders[$utf7name];
|
$folder = $this->folders[$utf7name];
|
||||||
|
|
||||||
|
@ -82,12 +84,13 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
|
|
||||||
$name = kolab_storage::folder_displayname(kolab_storage::object_name($utf7name), $listnames);
|
$name = kolab_storage::folder_displayname(kolab_storage::object_name($utf7name), $listnames);
|
||||||
|
|
||||||
|
$list_id = kolab_storage::folder_id($utf7name);
|
||||||
$tasklist = array(
|
$tasklist = array(
|
||||||
'id' => kolab_storage::folder_id($utf7name),
|
'id' => $list_id,
|
||||||
'name' => $name,
|
'name' => $name,
|
||||||
'editname' => $editname,
|
'editname' => $editname,
|
||||||
'color' => 'CC0000',
|
'color' => 'CC0000',
|
||||||
'showalarms' => false,
|
'showalarms' => $prefs[$list_id]['showalarms'],
|
||||||
'editable' => true,
|
'editable' => true,
|
||||||
'active' => $folder->is_subscribed(kolab_storage::SERVERSIDE_SUBSCRIPTION),
|
'active' => $folder->is_subscribed(kolab_storage::SERVERSIDE_SUBSCRIPTION),
|
||||||
'parentfolder' => $path_imap,
|
'parentfolder' => $path_imap,
|
||||||
|
@ -132,7 +135,17 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// create ID
|
// create ID
|
||||||
return kolab_storage::folder_id($folder);
|
$id = kolab_storage::folder_id($folder);
|
||||||
|
|
||||||
|
$prefs['kolab_tasklists'] = $this->rc->config->get('kolab_tasklists', array());
|
||||||
|
|
||||||
|
if (isset($prop['showalarms']))
|
||||||
|
$prefs['kolab_tasklists'][$id]['showalarms'] = $prop['showalarms'] ? true : false;
|
||||||
|
|
||||||
|
if ($prefs['kolab_tasklists'][$id])
|
||||||
|
$this->rc->user->save_prefs($prefs);
|
||||||
|
|
||||||
|
return $id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -158,7 +171,19 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// create ID
|
// create ID
|
||||||
return kolab_storage::folder_id($newfolder);
|
$id = kolab_storage::folder_id($newfolder);
|
||||||
|
|
||||||
|
// fallback to local prefs
|
||||||
|
$prefs['kolab_tasklists'] = $this->rc->config->get('kolab_tasklists', array());
|
||||||
|
unset($prefs['kolab_tasklists'][$prop['id']]);
|
||||||
|
|
||||||
|
if (isset($prop['showalarms']))
|
||||||
|
$prefs['kolab_tasklists'][$id]['showalarms'] = $prop['showalarms'] ? true : false;
|
||||||
|
|
||||||
|
if ($prefs['kolab_tasklists'][$id])
|
||||||
|
$this->rc->user->save_prefs($prefs);
|
||||||
|
|
||||||
|
return $id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -326,7 +351,90 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
*/
|
*/
|
||||||
public function pending_alarms($time, $lists = null)
|
public function pending_alarms($time, $lists = null)
|
||||||
{
|
{
|
||||||
// TODO: implement this
|
$interval = 300;
|
||||||
|
$time -= $time % 60;
|
||||||
|
|
||||||
|
$slot = $time;
|
||||||
|
$slot -= $slot % $interval;
|
||||||
|
|
||||||
|
$last = $time - max(60, $this->rc->session->get_keep_alive());
|
||||||
|
$last -= $last % $interval;
|
||||||
|
|
||||||
|
// only check for alerts once in 5 minutes
|
||||||
|
if ($last == $slot)
|
||||||
|
return array();
|
||||||
|
|
||||||
|
if ($lists && is_string($lists))
|
||||||
|
$lists = explode(',', $lists);
|
||||||
|
|
||||||
|
$time = $slot + $interval;
|
||||||
|
|
||||||
|
$tasks = array();
|
||||||
|
$query = array(array('tags', '=', 'x-has-alarms'));
|
||||||
|
foreach ($this->lists as $lid => $list) {
|
||||||
|
// skip lists with alarms disabled
|
||||||
|
if (!$list['showalarms'] || ($lists && !in_array($lid, $lists)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$folder = $this->folders[$lid];
|
||||||
|
foreach ((array)$folder->select($query) as $record) {
|
||||||
|
if (!$record['alarms']) // don't trust query :-)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
$task = $this->_to_rcube_task($record);
|
||||||
|
|
||||||
|
// fake object properties to suit the expectations of calendar::get_next_alarm()
|
||||||
|
// TODO: move all that to libcalendaring plugin
|
||||||
|
if ($task['date'])
|
||||||
|
$task['start'] = new DateTime($task['date'] . ' ' . ($task['time'] ?: '12:00'), $this->plugin->timezone);
|
||||||
|
if ($task['startdate'])
|
||||||
|
$task['end'] = new DateTime($task['startdate'] . ' ' . ($task['starttime'] ?: '12:00'), $this->plugin->timezone);
|
||||||
|
else
|
||||||
|
$task['end'] = $tast['start'];
|
||||||
|
|
||||||
|
if (!$task['start'])
|
||||||
|
$task['end'] = $task['start'];
|
||||||
|
|
||||||
|
// add to list if alarm is set
|
||||||
|
$alarm = calendar::get_next_alarm($task);
|
||||||
|
if ($alarm && $alarm['time'] && $alarm['time'] <= $time && $alarm['action'] == 'DISPLAY') {
|
||||||
|
$id = $task['id'];
|
||||||
|
$tasks[$id] = $task;
|
||||||
|
$tasks[$id]['notifyat'] = $alarm['time'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get alarm information stored in local database
|
||||||
|
if (!empty($tasks)) {
|
||||||
|
$task_ids = array_map(array($this->rc->db, 'quote'), array_keys($tasks));
|
||||||
|
$result = $this->rc->db->query(sprintf(
|
||||||
|
"SELECT * FROM kolab_alarms
|
||||||
|
WHERE event_id IN (%s) AND user_id=?",
|
||||||
|
join(',', $task_ids),
|
||||||
|
$this->rc->db->now()
|
||||||
|
),
|
||||||
|
$this->rc->user->ID
|
||||||
|
);
|
||||||
|
|
||||||
|
while ($result && ($rec = $this->rc->db->fetch_assoc($result))) {
|
||||||
|
$dbdata[$rec['event_id']] = $rec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$alarms = array();
|
||||||
|
foreach ($tasks as $id => $task) {
|
||||||
|
// skip dismissed
|
||||||
|
if ($dbdata[$id]['dismissed'])
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// snooze function may have shifted alarm time
|
||||||
|
$notifyat = $dbdata[$id]['notifyat'] ? strtotime($dbdata[$id]['notifyat']) : $task['notifyat'];
|
||||||
|
if ($notifyat <= $time)
|
||||||
|
$alarms[] = $task;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $alarms;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -338,7 +446,28 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
*/
|
*/
|
||||||
public function dismiss_alarm($id, $snooze = 0)
|
public function dismiss_alarm($id, $snooze = 0)
|
||||||
{
|
{
|
||||||
// TODO: implement this
|
// delete old alarm entry
|
||||||
|
$this->rc->db->query(
|
||||||
|
"DELETE FROM kolab_alarms
|
||||||
|
WHERE event_id=? AND user_id=?",
|
||||||
|
$id,
|
||||||
|
$this->rc->user->ID
|
||||||
|
);
|
||||||
|
|
||||||
|
// set new notifyat time or unset if not snoozed
|
||||||
|
$notifyat = $snooze > 0 ? date('Y-m-d H:i:s', time() + $snooze) : null;
|
||||||
|
|
||||||
|
$query = $this->rc->db->query(
|
||||||
|
"INSERT INTO kolab_alarms
|
||||||
|
(event_id, user_id, dismissed, notifyat)
|
||||||
|
VALUES(?, ?, ?, ?)",
|
||||||
|
$id,
|
||||||
|
$this->rc->user->ID,
|
||||||
|
$snooze > 0 ? 0 : 1,
|
||||||
|
$notifyat
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->rc->db->affected_rows($query);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -615,15 +744,20 @@ class tasklist_kolab_driver extends tasklist_driver
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public function tasklist_edit_form($formfields)
|
public function tasklist_edit_form($fieldprop)
|
||||||
{
|
{
|
||||||
$select = kolab_storage::folder_selector('task', array('name' => 'parent', 'id' => 'edit-parentfolder'), null);
|
$select = kolab_storage::folder_selector('task', array('name' => 'parent', 'id' => 'taskedit-parentfolder'), null);
|
||||||
$formfields['parent'] = array(
|
$fieldprop['parent'] = array(
|
||||||
'id' => 'edit-parentfolder',
|
'id' => 'taskedit-parentfolder',
|
||||||
'label' => $this->plugin->gettext('parentfolder'),
|
'label' => $this->plugin->gettext('parentfolder'),
|
||||||
'value' => $select->show(''),
|
'value' => $select->show(''),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$formfields = array();
|
||||||
|
foreach (array('name','parent','showalarms') as $f) {
|
||||||
|
$formfields[$f] = $fieldprop[$f];
|
||||||
|
}
|
||||||
|
|
||||||
return parent::tasklist_edit_form($formfields);
|
return parent::tasklist_edit_form($formfields);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,9 +41,9 @@ $labels['tabrecurrence'] = 'Wiederholung';
|
||||||
$labels['tabattachments'] = 'Anhänge';
|
$labels['tabattachments'] = 'Anhänge';
|
||||||
$labels['tabsharing'] = 'Freigabe';
|
$labels['tabsharing'] = 'Freigabe';
|
||||||
|
|
||||||
$labels['editlist'] = 'Ressource bearbeiten';
|
$labels['editlist'] = 'Liste bearbeiten';
|
||||||
$labels['createlist'] = 'Neue Ressource';
|
$labels['createlist'] = 'Neue Liste';
|
||||||
$labels['listactions'] = 'Ressourcenoptionen...';
|
$labels['listactions'] = 'Listenoptionen...';
|
||||||
$labels['listname'] = 'Name';
|
$labels['listname'] = 'Name';
|
||||||
$labels['showalarms'] = 'Erinnerungen anzeigen';
|
$labels['showalarms'] = 'Erinnerungen anzeigen';
|
||||||
$labels['import'] = 'Importieren';
|
$labels['import'] = 'Importieren';
|
||||||
|
|
|
@ -1408,6 +1408,9 @@ function rcube_tasklist_ui(settings)
|
||||||
rcmail.enable_command('list-edit', 'list-remove', 'import', !me.tasklists[id].readonly);
|
rcmail.enable_command('list-edit', 'list-remove', 'import', !me.tasklists[id].readonly);
|
||||||
me.selected_list = id;
|
me.selected_list = id;
|
||||||
})
|
})
|
||||||
|
.dblclick(function(e){
|
||||||
|
list_edit_dialog($(this).data('id'));
|
||||||
|
})
|
||||||
.data('id', id);
|
.data('id', id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue