plugins/tasklist

Thomas Brüderli bruederli at kolabsys.com
Thu Jul 26 09:21:24 CEST 2012


 plugins/tasklist/skins/larry/tasklist.css |   24 ++++++++++++--
 plugins/tasklist/tasklist.js              |   51 ++++++++++++++++++++++++------
 2 files changed, 64 insertions(+), 11 deletions(-)

New commits:
commit f3efd7b95b11ae8749e81cd3b4a95129026c4c0d
Author: Thomas Bruederli <thomas at roundcube.net>
Date:   Thu Jul 26 00:34:46 2012 +0200

    Allow to select tasks by multiple tags (AND); show tags in task listing

diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css
index 621150d..4619914 100644
--- a/plugins/tasklist/skins/larry/tasklist.css
+++ b/plugins/tasklist/skins/larry/tasklist.css
@@ -67,7 +67,7 @@
 	display: inline-block;
 	color: #004458;
 	min-width: 4em;
-	padding: 0.2em 0.6em;
+	padding: 0.2em 0.6em 0.3em 0.6em;
 	text-align: center;
 	text-decoration: none;
 	border: 1px solid #eee;
@@ -324,7 +324,7 @@
 	-webkit-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5);
 	-moz-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5);
 	box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5);
-	padding-right: 11em;
+	padding-right: 26em;
 	white-space: nowrap;
 	overflow: hidden;
 	text-overflow: ellipsis;
@@ -367,6 +367,26 @@
 	background-position: -2px -23px;
 }
 
+.taskhead .tags {
+	position: absolute;
+	top: 4px;
+	right: 110px;
+	max-width: 14em;
+	overflow: hidden;
+	padding-top: 1px;
+	padding-bottom: 4px;
+	text-align: right;
+}
+
+.taskhead .tags .tag {
+	font-size: 85%;
+	background: #d9ecf4;
+	border: 1px solid #c2dae5;
+	border-radius: 4px;
+	padding: 2px 8px;
+	margin-right: 3px;
+}
+
 .taskhead .date {
 	position: absolute;
 	top: 6px;
diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js
index 0264389..71cca8d 100644
--- a/plugins/tasklist/tasklist.js
+++ b/plugins/tasklist/tasklist.js
@@ -47,7 +47,7 @@ function rcube_tasklist(settings)
 
     /*  private vars  */
     var selector = 'all';
-    var tagsfilter = null;
+    var tagsfilter = [];
     var filtermask = FILTER_MASK_ALL;
     var loadstate = { filter:-1, lists:'', search:null };
     var idcount = 0;
@@ -146,20 +146,43 @@ function rcube_tasklist(settings)
         // click-handler on tags list
         $(rcmail.gui_objects.tagslist).click(function(e){
             if (e.target.nodeName != 'LI')
-                return;
+                return false;
 
             var item = $(e.target),
                 tag = item.data('value');
 
-            $('li', this).removeClass('selected');
-            if (tag != tagsfilter) {
+            // reset selection on regular clicks
+            var index = tagsfilter.indexOf(tag);
+            var shift = e.shiftKey || e.ctrlKey || e.metaKey;
+
+            if (!shift) {
+                if (tagsfilter.length > 1)
+                    index = -1;
+
+                $('li', this).removeClass('selected');
+                tagsfilter = [];
+            }
+
+            // add tag to filter
+            if (index < 0) {
                 item.addClass('selected');
-                tagsfilter = tag;
+                tagsfilter.push(tag);
+            }
+            else if (shift) {
+                item.removeClass('selected');
+                var a = tagsfilter.slice(0,index);
+                tagsfilter = a.concat(tagsfilter.slice(index+1));
             }
-            else
-                tagsfilter = null;
 
             list_tasks();
+
+            e.preventDefault();
+            return false;
+        })
+        .mousedown(function(e){
+            // disable content selection with the mouse
+            e.preventDefault();
+            return false;
         });
 
         // click-handler on task list items (delegate)
@@ -439,11 +462,16 @@ function rcube_tasklist(settings)
      */
     function render_task(rec, replace)
     {
+        var tags_html = '';
+        for (var j=0; rec.tags && j < rec.tags.length; j++)
+            tags_html += '<span class="tag">' + Q(rec.tags[j]) + '</span>';
+
         var div = $('<div>').addClass('taskhead').html(
             '<div class="progressbar"><div class="progressvalue" style="width:' + (rec.complete * 100) + '%"></div></div>' +
             '<input type="checkbox" name="completed[]" value="1" class="complete" ' + (rec.complete == 1.0 ? 'checked="checked" ' : '') + '/>' + 
             '<span class="flagged"></span>' +
             '<span class="title">' + Q(rec.title) + '</span>' +
+            '<span class="tags">' + tags_html + '</span>' +
             '<span class="date">' + Q(rec.date || rcmail.gettext('nodate','tasklist')) + '</span>' +
             '<a href="#" class="actions">V</a>'
             )
@@ -822,8 +850,13 @@ function rcube_tasklist(settings)
     {
         var match = !filtermask || (filtermask & rec.mask) > 0;
 
-        if (match && tagsfilter)
-            match = rec.tags && rec.tags.indexOf(tagsfilter) >= 0;
+        if (match && tagsfilter.length) {
+            match = rec.tags && rec.tags.length;
+            for (var i=0; match && i < tagsfilter.length; i++) {
+                if (rec.tags.indexOf(tagsfilter[i]) < 0)
+                    match = false;
+            }
+        }
 
         return match;
     }





More information about the commits mailing list