diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css
index 8c642fa7..699a0e8f 100644
--- a/plugins/tasklist/skins/larry/tasklist.css
+++ b/plugins/tasklist/skins/larry/tasklist.css
@@ -34,7 +34,7 @@
width: 15px;
}
-#selectorbox {
+#tagsbox {
position: absolute;
top: 42px;
left: 0;
@@ -42,6 +42,19 @@
height: 242px;
}
+#tagslist {
+ padding: 0;
+ margin: 6px 8px;
+ list-style: none;
+}
+
+#tagslist li {
+ display: inline-block;
+ color: #004458;
+ padding: 0.2em 1em 0.2em 0;
+ cursor: pointer;
+}
+
#tasklistsbox {
position: absolute;
top: 300px;
diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html
index 927ee4b0..f7b896e1 100644
--- a/plugins/tasklist/skins/larry/templates/mainview.html
+++ b/plugins/tasklist/skins/larry/templates/mainview.html
@@ -14,9 +14,10 @@
-
+
diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index 2ef58b29..20255ee5 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -54,6 +54,7 @@ function rcube_tasklist(settings)
var ui_loading;
var taskcounts = {};
var listdata = {};
+ var tags = [];
var draghelper;
var completeness_slider;
var search_request;
@@ -140,7 +141,18 @@ function rcube_tasklist(settings)
this.reset();
return false;
});
-
+
+ // click-handler on tags list
+ $(rcmail.gui_objects.tagslist).click(function(e){
+ if (e.target.nodeName != 'LI')
+ return;
+
+ var item = $(e.target),
+ tag = item.data('value');
+
+ alert(tag);
+ });
+
// click-handler on task list items (delegate)
$(rcmail.gui_objects.resultlist).click(function(e){
var item = $(e.target);
@@ -316,6 +328,20 @@ function rcube_tasklist(settings)
listdata[response.data[i].id] = response.data[i];
}
+ // find new tags
+ var newtags = [];
+ for (var i=0; i < response.tags.length; i++) {
+ if (tags.indexOf(response.tags[i]) < 0)
+ newtags.push(response.tags[i]);
+ }
+ tags = tags.concat(newtags);
+
+ // append new tags to tag cloud
+ var taglist = $(rcmail.gui_objects.tagslist);
+ $.each(newtags, function(i, tag){
+ $('
').attr('rel', tag).data('value', tag).html(Q(tag)).appendTo(taglist);
+ });
+
render_tasklist();
rcmail.set_busy(false, 'loading', ui_loading);
}
diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php
index fd43b444..0ed47654 100644
--- a/plugins/tasklist/tasklist.php
+++ b/plugins/tasklist/tasklist.php
@@ -372,12 +372,14 @@ class tasklist extends rcube_plugin
}
- $data = $this->task_tree = $this->task_titles = array();
+ $data = $tags = $this->task_tree = $this->task_titles = array();
foreach ($this->driver->list_tasks($filter, $lists) as $rec) {
if ($rec['parent_id']) {
$this->task_tree[$rec['id']] = $rec['parent_id'];
}
$this->encode_task($rec);
+ if (!empty($rec['categories']))
+ $tags = array_merge($tags, (array)$rec['categories']);
// apply filter; don't trust the driver on this :-)
if ((!$f && $rec['complete'] < 1.0) || ($rec['mask'] & $f))
@@ -387,7 +389,7 @@ class tasklist extends rcube_plugin
// sort tasks according to their hierarchy level and due date
usort($data, array($this, 'task_sort_cmp'));
- $this->rc->output->command('plugin.data_ready', array('filter' => $f, 'lists' => $lists, 'data' => $data));
+ $this->rc->output->command('plugin.data_ready', array('filter' => $f, 'lists' => $lists, 'data' => $data, 'tags' => array_unique($tags)));
}
/**
diff --git a/plugins/tasklist/tasklist_ui.php b/plugins/tasklist/tasklist_ui.php
index b6232957..c3ec70bd 100644
--- a/plugins/tasklist/tasklist_ui.php
+++ b/plugins/tasklist/tasklist_ui.php
@@ -68,6 +68,7 @@ class tasklist_ui
$this->plugin->register_handler('plugin.quickaddform', array($this, 'quickadd_form'));
$this->plugin->register_handler('plugin.tasklist_editform', array($this, 'tasklist_editform'));
$this->plugin->register_handler('plugin.tasks', array($this, 'tasks_resultview'));
+ $this->plugin->register_handler('plugin.tagslist', array($this, 'tagslist'));
$this->plugin->include_script('tasklist.js');
@@ -206,5 +207,13 @@ class tasklist_ui
return html::tag('ul', $attrib, '');
}
+ function tagslist($attrib)
+ {
+ $attrib += array('id' => 'rcmtagslist');
+ unset($attrib['name']);
+
+ $this->rc->output->add_gui_object('tagslist', $attrib['id']);
+ return html::tag('ul', $attrib, '');
+ }
}