diff --git a/plugins/tasklist/skins/larry/sprites.png b/plugins/tasklist/skins/larry/sprites.png index 5224f6f7..b20b2db0 100644 Binary files a/plugins/tasklist/skins/larry/sprites.png and b/plugins/tasklist/skins/larry/sprites.png differ diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css index caa50676..70ab8da9 100644 --- a/plugins/tasklist/skins/larry/tasklist.css +++ b/plugins/tasklist/skins/larry/tasklist.css @@ -66,7 +66,7 @@ body.attachmentwin #topnav .topright { } #taskselector { - margin: -4px 0 0; + margin: -4px 40px 0 0; padding: 0; } @@ -336,6 +336,27 @@ body.attachmentwin #topnav .topright { background: -ms-linear-gradient(top, #eee 0%, #dfdfdf 100%); background: linear-gradient(top, #eee 0%, #dfdfdf 100%); border-bottom: 1px solid #ccc; + position: relative; +} + +#tasksview .buttonbar .buttonbar-right { + position: absolute; + top: 6px; + right: 8px; +} + +.buttonbar-right .listmenu { + display: inline-block; + cursor: pointer; +} + +.buttonbar-right .listmenu .inner { + display: inline-block; + height: 18px; + width: 20px; + padding: 0; + background: url(sprites.png) 0 -237px no-repeat; + text-indent: -5000px; } #thelist { @@ -547,11 +568,24 @@ body.attachmentwin #topnav .topright { border-top: 1px solid #219de6; } -ul.toolbarmenu li span.add { +ul.toolbarmenu li span.add, +ul.toolbarmenu li span.expand, +ul.toolbarmenu li span.collapse { background-image: url(sprites.png); +} + +ul.toolbarmenu li span.add { background-position: 0 -100px; } +ul.toolbarmenu li span.expand { + background-position: 0 -258px; +} + +ul.toolbarmenu li span.collapse { + background-position: 0 -280px; +} + ul.toolbarmenu li span.delete { background-position: 0 -1508px; } diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html index 9196d028..b85f7fbd 100644 --- a/plugins/tasklist/skins/larry/templates/mainview.html +++ b/plugins/tasklist/skins/larry/templates/mainview.html @@ -59,6 +59,10 @@
  • + +
    + +
    @@ -92,6 +96,13 @@
    +
    + +
    +
    diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js index 631494c6..742f23a7 100644 --- a/plugins/tasklist/tasklist.js +++ b/plugins/tasklist/tasklist.js @@ -92,6 +92,7 @@ function rcube_tasklist_ui(settings) this.add_childtask = add_childtask; this.quicksearch = quicksearch; this.reset_search = reset_search; + this.expand_collapse = expand_collapse; this.list_remove = list_remove; this.list_edit_dialog = list_edit_dialog; this.unlock_saving = unlock_saving; @@ -519,6 +520,30 @@ function rcube_tasklist_ui(settings) }) } + /** + * Expand/collapse all task items with childs + */ + function expand_collapse(expand) + { + var collapsed = !expand; + + $('.taskitem .childtasks')[(collapsed ? 'hide' : 'show')](); + $('.taskitem .childtoggle') + .removeClass(collapsed ? 'expanded' : 'collapsed') + .addClass(collapsed ? 'collapsed' : 'expanded') + .html(collapsed ? '▶' : '▼'); + + // store new toggle collapse states + var ids = []; + for (var id in listdata) { + if (listdata[id].children && listdata[id].children.length) + ids.push(id); + } + if (ids.length) { + rcmail.http_post('tasks/task', { action:'collapse', t:{ id:ids.join(',') }, collapsed:collapsed?1:0 }); + } + } + /** * */ @@ -1781,6 +1806,8 @@ window.rcmail && rcmail.addEventListener('init', function(evt) { rcmail.register_command('search', function(){ rctasks.quicksearch(); }, true); rcmail.register_command('reset-search', function(){ rctasks.reset_search(); }, true); + rcmail.register_command('expand-all', function(){ rctasks.expand_collapse(true); }, true); + rcmail.register_command('collapse-all', function(){ rctasks.expand_collapse(false); }, true); rctasks.init(); }); diff --git a/plugins/tasklist/tasklist.php b/plugins/tasklist/tasklist.php index e6b5d1cd..68d82c4f 100644 --- a/plugins/tasklist/tasklist.php +++ b/plugins/tasklist/tasklist.php @@ -248,13 +248,15 @@ class tasklist extends rcube_plugin break; case 'collapse': - if (intval(get_input_value('collapsed', RCUBE_INPUT_GPC))) { - $this->collapsed_tasks[] = $rec['id']; - } - else { - $i = array_search($rec['id'], $this->collapsed_tasks); - if ($i !== false) - unset($this->collapsed_tasks[$i]); + foreach (explode(',', $rec['id']) as $rec_id) { + if (intval(get_input_value('collapsed', RCUBE_INPUT_GPC))) { + $this->collapsed_tasks[] = $rec_id; + } + else { + $i = array_search($rec_id, $this->collapsed_tasks); + if ($i !== false) + unset($this->collapsed_tasks[$i]); + } } $this->rc->user->save_prefs(array('tasklist_collapsed_tasks' => join(',', array_unique($this->collapsed_tasks))));