From 0790b36a49c1a4731c3b81e5540b2edd5f040b7e Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 13 Jul 2012 11:21:35 +0200 Subject: [PATCH 1/6] Add categories to fulltext index; use unique tags for task properties --- plugins/libkolab/lib/kolab_format_task.php | 4 ++-- plugins/libkolab/lib/kolab_format_xcal.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/libkolab/lib/kolab_format_task.php b/plugins/libkolab/lib/kolab_format_task.php index 629f9ac4..4433cf68 100644 --- a/plugins/libkolab/lib/kolab_format_task.php +++ b/plugins/libkolab/lib/kolab_format_task.php @@ -129,10 +129,10 @@ class kolab_format_task extends kolab_format_xcal $tags = array(); if ($this->data['status'] == 'COMPLETED' || $this->data['complete'] == 100) - $tags[] = 'complete'; + $tags[] = 'x-complete'; if ($this->data['priority'] == 1) - $tags[] = 'flagged'; + $tags[] = 'x-flagged'; if (!empty($this->data['alarms'])) $tags[] = 'x-has-alarms'; diff --git a/plugins/libkolab/lib/kolab_format_xcal.php b/plugins/libkolab/lib/kolab_format_xcal.php index f8247e0c..e1bfdd7c 100644 --- a/plugins/libkolab/lib/kolab_format_xcal.php +++ b/plugins/libkolab/lib/kolab_format_xcal.php @@ -28,7 +28,7 @@ abstract class kolab_format_xcal extends kolab_format { public $CTYPE = 'application/calendar+xml'; - public static $fulltext_cols = array('title', 'description', 'location', 'attendees:name', 'attendees:email'); + public static $fulltext_cols = array('title', 'description', 'location', 'attendees:name', 'attendees:email', 'categories'); protected $sensitivity_map = array( 'public' => kolabformat::ClassPublic, From 6d588e7b70f68fb4370a10274b2345d96b1026b6 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 13 Jul 2012 11:21:50 +0200 Subject: [PATCH 2/6] Fix tasks counting --- plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php index 897ce185..0a875956 100644 --- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php +++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php @@ -219,10 +219,10 @@ class tasklist_kolab_driver extends tasklist_driver $counts = array('all' => 0, 'flagged' => 0, 'today' => 0, 'tomorrow' => 0, 'overdue' => 0, 'nodate' => 0); foreach ($lists as $list_id) { $folder = $this->folders[$list_id]; - foreach ((array)$folder->select(array(array('tags','!~','complete'))) as $record) { + foreach ((array)$folder->select(array(array('tags','!~','x-complete'))) as $record) { $rec = $this->_to_rcube_task($record); - if ($rec['complete']) // don't count complete tasks + if ($rec['complete'] >= 1.0) // don't count complete tasks continue; $counts['all']++; From cc7e76d2b2bdfb94c478b1b133d263b9fd3295ad Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 13 Jul 2012 11:22:54 +0200 Subject: [PATCH 3/6] Refetch tasks when searching; sort tags list alphabetically --- plugins/tasklist/tasklist.js | 31 +++++++++++++++++++++++++++++-- plugins/tasklist/tasklist.php | 4 ++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 530f2014..02643897 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -49,7 +49,7 @@ function rcube_tasklist(settings) var selector = 'all'; var tagsfilter = null; var filtermask = FILTER_MASK_ALL; - var loadstate = { filter:-1, lists:'' }; + var loadstate = { filter:-1, lists:'', search:null }; var idcount = 0; var saving_lock; var ui_loading; @@ -310,7 +310,7 @@ function rcube_tasklist(settings) var active = active_lists(), basefilter = filtermask == FILTER_MASK_COMPLETE ? FILTER_MASK_COMPLETE : FILTER_MASK_ALL, - reload = active.join(',') != loadstate.lists || basefilter != loadstate.filter; + reload = active.join(',') != loadstate.lists || basefilter != loadstate.filter || loadstate.search != search_query; if (active.length && reload) { ui_loading = rcmail.set_busy(true, 'loading'); @@ -333,6 +333,8 @@ function rcube_tasklist(settings) listdata = {}; loadstate.lists = response.lists; loadstate.filter = response.filter; + loadstate.search = response.search; + for (var i=0; i < response.data.length; i++) { listdata[response.data[i].id] = response.data[i]; } @@ -379,6 +381,12 @@ function rcube_tasklist(settings) $.each(newtags, function(i, tag){ $('
  • ').attr('rel', tag).data('value', tag).html(Q(tag)).appendTo(rcmail.gui_objects.tagslist); }); + + // re-sort tags list + $(rcmail.gui_objects.tagslist).children('li').sortElements(function(a,b){ + console.log($.text([a]), $.text([b])) + return $.text([a]).toLowerCase() > $.text([b]).toLowerCase() ? 1 : -1; + }); } /** @@ -1130,6 +1138,25 @@ function rcube_tasklist(settings) }; })(jQuery); +// from http://james.padolsey.com/javascript/sorting-elements-with-jquery/ +jQuery.fn.sortElements = (function(){ + var sort = [].sort; + + return function(comparator, getSortable) { + getSortable = getSortable || function(){ return this }; + + var last = null; + return sort.call(this, comparator).each(function(i){ + // at this point the array is sorted, so we can just detach each one from wherever it is, and add it after the last + var node = $(getSortable.call(this)); + var parent = node.parent(); + if (last) last.after(node); + else parent.prepend(node); + last = node; + }); + }; +})(); + /* tasklist plugin UI initialization */ var rctasks; diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php index a8d19f58..00a42d52 100644 --- a/plugins/tasklist/tasklist.php +++ b/plugins/tasklist/tasklist.php @@ -313,7 +313,7 @@ class tasklist extends rcube_plugin */ public function fetch_counts() { - $lists = null; + $lists = get_input_value('lists', RCUBE_INPUT_GPC);; $counts = $this->driver->count_tasks($lists); $this->rc->output->command('plugin.update_counts', $counts); } @@ -389,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, 'tags' => array_values(array_unique($tags)))); + $this->rc->output->command('plugin.data_ready', array('filter' => $f, 'lists' => $lists, 'search' => $search, 'data' => $data, 'tags' => array_values(array_unique($tags)))); } /** From 58ab2fdc8bc4b4bb6d032a7ffe54d515dd530159 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 13 Jul 2012 11:24:10 +0200 Subject: [PATCH 4/6] Fix query to kolab storage --- plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php index 0a875956..66e4912b 100644 --- a/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php +++ b/plugins/tasklist/drivers/kolab/tasklist_kolab_driver.php @@ -265,9 +265,9 @@ class tasklist_kolab_driver extends tasklist_driver // query Kolab storage $query = array(); if ($filter['mask'] & tasklist::FILTER_MASK_COMPLETE) - $query[] = array('tags','~','complete'); + $query[] = array('tags','~','x-complete'); else - $query[] = array('tags','!~','complete'); + $query[] = array('tags','!~','x-complete'); // full text search (only works with cache enabled) if ($filter['search']) { From c20a07f31462d16fd3d5437117c838ec63004ab3 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Fri, 13 Jul 2012 12:48:36 +0200 Subject: [PATCH 5/6] Some tasks icon artwork --- plugins/tasklist/skins/larry/buttons.png | Bin 0 -> 3670 bytes plugins/tasklist/skins/larry/taskbaricon.png | Bin 3889 -> 0 bytes plugins/tasklist/skins/larry/tasklist.css | 10 ++++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 plugins/tasklist/skins/larry/buttons.png delete mode 100644 plugins/tasklist/skins/larry/taskbaricon.png diff --git a/plugins/tasklist/skins/larry/buttons.png b/plugins/tasklist/skins/larry/buttons.png new file mode 100644 index 0000000000000000000000000000000000000000..909530ff21b55b8f7acfd40d96ec1751296522e5 GIT binary patch literal 3670 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 diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css index cb674394..621150d8 100644 --- a/plugins/tasklist/skins/larry/tasklist.css +++ b/plugins/tasklist/skins/larry/tasklist.css @@ -13,13 +13,13 @@ */ #taskbar a.button-tasklist span.button-inner { - background-image: url(taskbaricon.png); + background-image: url(buttons.png); background-position: 0 0; } #taskbar a.button-tasklist:hover span.button-inner, #taskbar a.button-tasklist.button-selected span.button-inner { - background-position: 0 -44px; + background-position: 0 -26px; } #sidebar { @@ -165,6 +165,7 @@ display: inline-block; color: #004458; margin-right: 0.5em; + margin-bottom: 0.4em; min-width: 1.2em; cursor: pointer; } @@ -215,6 +216,11 @@ white-space: nowrap; } +#taskstoolbar a.button.newtask { + background-image: url(buttons.png); + background-position: center -53px; +} + .tasklistview #quicksearchbar { top: -7px; } From c5f31be0953df3ebf41be1006e21dce5b70a7da7 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 16 Jul 2012 09:41:43 +0200 Subject: [PATCH 6/6] Remove trailing ; from RRULE in iCal blocks (#881) --- plugins/calendar/calendar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index f63ce426..caead9b3 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -1340,7 +1340,7 @@ class calendar extends rcube_plugin $rrule .= $k . '=' . $val . ';'; } - return $rrule; + return rtrim($rrule, ';'); } /**