From 5cdeed5c6829fe870689a2db2a83d0f31f1c31a8 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Thu, 31 Jul 2014 16:24:21 +0200 Subject: [PATCH] Add filters for my tasks and assigned to others; allow combined filter selections (using shift+click) --- plugins/tasklist/localization/en_US.inc | 4 ++ .../skins/larry/templates/mainview.html | 6 +++ plugins/tasklist/tasklist.js | 45 +++++++++++++++---- plugins/tasklist/tasklist.php | 10 ++++- 4 files changed, 55 insertions(+), 10 deletions(-) diff --git a/plugins/tasklist/localization/en_US.inc b/plugins/tasklist/localization/en_US.inc index a7ec1ea3..99a11b05 100644 --- a/plugins/tasklist/localization/en_US.inc +++ b/plugins/tasklist/localization/en_US.inc @@ -43,6 +43,10 @@ $labels['today'] = 'Today'; $labels['tomorrow'] = 'Tomorrow'; $labels['next7days'] = 'Next 7 days'; $labels['later'] = 'Later'; +$labels['assigned'] = 'Assigned'; +$labels['assignedtitle'] = 'Tasks you assigned to others'; +$labels['mytasks'] = 'My tasks'; +$labels['mytaskstitle'] = 'Tasks assigned to you'; $labels['nodate'] = 'no date'; $labels['removetag'] = 'Remove'; diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html index 727d31fc..ad018eb3 100644 --- a/plugins/tasklist/skins/larry/templates/mainview.html +++ b/plugins/tasklist/skins/larry/templates/mainview.html @@ -84,9 +84,15 @@ + + + + + + diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index a0ff22f9..ffb0129e 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -40,6 +40,8 @@ function rcube_tasklist_ui(settings) var FILTER_MASK_OVERDUE = 32; var FILTER_MASK_FLAGGED = 64; var FILTER_MASK_COMPLETE = 128; + var FILTER_MASK_ASSIGNED = 256; + var FILTER_MASK_MYTASKS = 512; var filter_masks = { all: FILTER_MASK_ALL, @@ -50,11 +52,12 @@ function rcube_tasklist_ui(settings) nodate: FILTER_MASK_NODATE, overdue: FILTER_MASK_OVERDUE, flagged: FILTER_MASK_FLAGGED, - complete: FILTER_MASK_COMPLETE + complete: FILTER_MASK_COMPLETE, + assigned: FILTER_MASK_ASSIGNED, + mytasks: FILTER_MASK_MYTASKS }; /* private vars */ - var selector = 'all'; var tagsfilter = []; var filtermask = FILTER_MASK_ALL; var loadstate = { filter:-1, lists:'', search:null }; @@ -245,9 +248,21 @@ function rcube_tasklist_ui(settings) list_tasks(); // register event handlers for UI elements - $('#taskselector a').click(function(e){ - if (!$(this).parent().hasClass('inactive')) - list_tasks(this.href.replace(/^.*#/, '')); + $('#taskselector a').click(function(e) { + if (!$(this).parent().hasClass('inactive')) { + var selector = this.href.replace(/^.*#/, ''), + mask = filter_masks[selector], + shift = e.shiftKey || e.ctrlKey || e.metaKey; + + if (!shift) + filtermask = mask; // reset selection on regular clicks + else if (filtermask & mask) + filtermask -= mask; + else + filtermask |= mask; + + list_tasks(); + } return false; }); @@ -606,11 +621,10 @@ function rcube_tasklist_ui(settings) if (sel && filter_masks[sel] !== undefined) { filtermask = filter_masks[sel]; - selector = sel; } var active = active_lists(), - basefilter = filtermask == FILTER_MASK_COMPLETE ? FILTER_MASK_COMPLETE : FILTER_MASK_ALL, + basefilter = filtermask & FILTER_MASK_COMPLETE ? FILTER_MASK_COMPLETE : FILTER_MASK_ALL, reload = force || active.join(',') != loadstate.lists || basefilter != loadstate.filter || loadstate.search != search_query; if (active.length && reload) { @@ -623,7 +637,16 @@ function rcube_tasklist_ui(settings) render_tasklist(); $('#taskselector li.selected').removeClass('selected').attr('aria-checked', 'false'); - $('#taskselector li.'+selector).addClass('selected').attr('aria-checked', 'true'); + + // select all active selectors + if (filtermask > 0) { + $.each(filter_masks, function(sel, mask) { + if (filtermask & mask) + $('#taskselector li.'+sel).addClass('selected').attr('aria-checked', 'true'); + }); + } + else + $('#taskselector li.all').addClass('selected').attr('aria-checked', 'true'); } /** @@ -1876,10 +1899,14 @@ function rcube_tasklist_ui(settings) } }); + $('#edit-tab-attendees').show(); $('#edit-attendees-form')[(allow_invitations?'show':'hide')](); $('#edit-identities-list').val(identity_id); $('#taskedit-organizer')[(organizer ? 'show' : 'hide')](); } + else { + $('#edit-tab-attendees').hide(); + } // attachments rcmail.enable_command('remove-attachment', list.editable); @@ -2238,7 +2265,7 @@ function rcube_tasklist_ui(settings) return cache[rec.id]; } - var match = !filtermask || (filtermask & rec.mask) > 0; + var match = !filtermask || (filtermask & rec.mask) == filtermask; // in focusview mode, only tasks from the selected list are allowed if (focusview && rec.list != focusview) diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php index 6dacf6f3..9aca0df7 100644 --- a/plugins/tasklist/tasklist.php +++ b/plugins/tasklist/tasklist.php @@ -32,6 +32,8 @@ class tasklist extends rcube_plugin const FILTER_MASK_OVERDUE = 32; const FILTER_MASK_FLAGGED = 64; const FILTER_MASK_COMPLETE = 128; + const FILTER_MASK_ASSIGNED = 256; + const FILTER_MASK_MYTASKS = 512; const SESSION_KEY = 'tasklist_temp'; @@ -44,6 +46,8 @@ class tasklist extends rcube_plugin 'overdue' => self::FILTER_MASK_OVERDUE, 'flagged' => self::FILTER_MASK_FLAGGED, 'complete' => self::FILTER_MASK_COMPLETE, + 'assigned' => self::FILTER_MASK_ASSIGNED, + 'mytasks' => self::FILTER_MASK_MYTASKS, ); public $task = '?(?!login|logout).*'; @@ -1077,7 +1081,11 @@ class tasklist extends rcube_plugin else if ($start > $weeklimit || ($rec['date'] && $duedate > $weeklimit)) $mask |= self::FILTER_MASK_LATER; - // TODO: add mask for "assigned to me" + // add masks for assigned tasks + if ($this->is_organizer($rec) && !empty($rec['attendees']) && $this->is_attendee($rec) === false) + $mask |= self::FILTER_MASK_ASSIGNED; + else if (/*empty($rec['attendees']) ||*/ $this->is_attendee($rec) !== false) + $mask |= self::FILTER_MASK_MYTASKS; return $mask; }