From d525574c48c107ae8c9014be73cf66953e0a73d5 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Wed, 23 Oct 2013 17:12:42 +0200 Subject: [PATCH] Add UI elements to expand/collapse all tasks (#2291) --- plugins/tasklist/skins/larry/sprites.png | Bin 3016 -> 3741 bytes plugins/tasklist/skins/larry/tasklist.css | 38 +++++++++++++++++- .../skins/larry/templates/mainview.html | 11 +++++ plugins/tasklist/tasklist.js | 27 +++++++++++++ plugins/tasklist/tasklist.php | 16 ++++---- 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/plugins/tasklist/skins/larry/sprites.png b/plugins/tasklist/skins/larry/sprites.png index 5224f6f7b6d6733ba78808d24de9f801f7bd3c4c..b20b2db08e723fa8693e1bd01ee42fd4e415adf8 100644 GIT binary patch literal 3741 zcmV;O4r1|%P)z%^6M2M(lF*QVi@mP!?^BIjIQe8>^B=9?aMfebJUCN zlNtYz!|-biKe~74s9^j}8|t;Qq3$;r5xOdF+s)Y6mKtByc_{x|$vq<&_j9a&H09-X zs;)e4G~W3)8)|#qhMNCAvisinS6goU$%by&zuAc4k($6eRFH8NJ%`(SX1>{IG~V=z z4c+|<8)oCRzqg@Fzhhz-E06Ovf0mj=X7A*e+k57Zztxi&UpAQWvKMXWs+(&q>w8K~ z;NQJTL6zwF!z-1?o5#G|Zq9h=Z*1tosFB@0ckUeJYeq^*VB{m7gy?z4YF$-psIJQJ z%E<1P5MPE>A^Bu%^Kz_jcztAd_vOmtUH>aC;W~FL#nzJI67<|i zK(1kUt^0Iw3EbYC+`oq)g2{J%k*-SYy-xCpC>q*W|Ib%jYX9~4a^v$qig(G$a^4L; zY*-gxhB1fR;T5HC$0ISrG2S(wIM!ocSmS}@ZU_mgY}_V13*NB?f!{KmtYTahRh}D} zF=K}F+_`g`=FOW&0LrM7-LR9BlikdjGwlNc0%|vI+}L~K#0dgWMjhIqBO8JF^XHSF zpC9SKAi&jp~2IH#aw};>KNFT{TOWE-mMHfL5+t zNedP%P?iLTVXlY`Gcz-VhY~-QuPNqs4-b#h{QUgbOP4NDPEHOL6ckWPIZPnG))X~vVZrr|=eatxs>EIqWBP>ryNVvv^ofS2{fB*hwJPG&g z*`u7>VLUN0vG>a_ziduVPp7=RJZ0U^uBMEP3}MDAW*p-0@1M$(?Lk#ll@NSlwku|w z-}f}Uwz~=o3){K(4T|<05)>2^jQ2h^-hJ}q$tFdOLwMY;oIih_Iy*a?#gI%n<6<0G zB>d(?X~U|hqRKB)-hKC7JHDUT4g2CLQ>G9fAH$?clZ<7%r~C{AFLdV2nP=b70&`r< zaUgkmdiDeA(Dt<6fhcr!I-L-}R#sL%8<7haE|lV8b3m_#;6;Hj^m%)iLPJ9-J3E^$ zU%osvB2WTzTx<%|4dn+6B(Q4LDvFMdruFOB3o*vUix;0x1WI6zivg73$|269Cla`F z<;v3uKml&Ug#gM!9mm0jfZr>gZ7$#fum&)G&#;pEO~N6$d@wJ-Wx%ui04!sy7EES~ z_mweT=z(H4B6D7leRo_HRa8;sxs^wc9u@WW_7?T@^b}c(0CjhF3$O|S?m2aJbqTNv zfd>yBU}sE#RS57d3AMJi(*67QNr~~+KYaL57;m^7y@v6YmKOT?=bx#uv61fHy-T-l z-4eic(oW2?XV32B8Q+fpdJg0F?%nGV|PY-4C;pBGI{O~QD?3szYLa6JfM%&kHIs{roDP*{ZkPxLwt z$?Nz9rOw7mqBVgks{D#1TC4*vD5vG;vDrRb#_t{C@}u;#`|poj3jV0)|n6}keWch-Wm<=E;;)cAtPiXU`hgF z&iF5zfVGCe>XXpA%h2jKqUYjP{9HVYR8d70DP+Qo*(2;{%+c`iMMVuyn&qzfXueOe z)54|X?CVcBex&s&R*Zn#vJl^St79m2-$DAe;u1ye%q91*X!_X0*I5w)-r;fei`H$S zn|B+(<}gBAYq(v7bN{&YCln#z5w(td*Ka`#V~cbA=1iBknL<)BZp&``W6wo@Sjfh7 z++!!5zx_lPH+v^ve|w*V6bjm$+4`Z@XOyf27OsxcqW4QuGRZY0f~GGH6po8FY$dPQ zB;xtuDl364xp@h`>(eM;Yc?%T-bN_n=%1EFy2MmMySxN;=O^gc=(3FeJOtxuA+FRuc!UxAqgC#l_CLrNuaYr1f@Ilz?_sWQT7e-;k2Fk}f`(bP@5DiV|45 zF`dHq9H7X(hbb(lfMRy$HYrMAMS3>H6n;ao`;Sp%-VqAR$nI2>KupfQJ_1quj#5y1 z)uOqZW5Bic4a9$%)35eN` z`#|)*uY_~dqaAwCmz2QH!h?QT`!I%?KN!#sJ?KkHpu4AMVs}q3_4Ga+(1X6zq1X$I z5zl}Z)JL`|vhMR(91&T%&tq{!Wa&PS#SxLE`#cs$M3(OJSQHUSvCm^sL?p#Nk3|uY z6#G0DMMReD^GFgA4QHQ6(uim{`#h3HM8nzVku)M2&OVPC5vlS#1~M-&UQ+xQRz~^I z-E-Ph@5MqO^Rb7n?0why%I*=JE-Ux`>hu{}m%EQVqu0}{z%T?eg_B&|G>Q=L4vUP) zJ64>@%dPmQ>o+MTJCC&bc$&T_paS8Ztj6DW^U!?iA1pk=XRlmyHE~yN91|(a`l^T) zL?$wcWfig#_&k6AU;lgl0&OWgOr9|tXl`gExdevoWD+~m_8$>E;o!MQFB<{(Wx=jl z2aY7Sw6!0qs=rAAo3@cV2e>nrhw59}+79`r@Ofxt*A!QoHY;Wa1lP@67D_J5SG5$L zIO%!q_MKK3ox?+tus!RIf|75$JTNi+gMwutaOBi?_2HS>q~-Bu*S8)%dD@|%W(6?;ycA}v4r=Y>Y(H8wTJ zdBr8uXK_glh_sidWKd+rt_Ep0s240eG;Qe$ni;s7X02FVQG4^&c271MxFPj69^?B? zoTU8YB{#*V=T%0bqy%OxUqzn$8iuH8c1Wb~PI0m3Dz&t>of3`eWzBh;mVbbJlQZeF zO*<%*V?fcUy<+(+u+BUAKQcPH9uWVpN|{w2LQLW%#wa!7QAM(dXt;Ys7Dq&u?h#oW z5m~xNWN}1f$sUm;5s@W(L>5OxmhKT*91&T%M`UqCWa%D}#SzhP_lP8mh=%*OK$1m7 z!~I(z$s(fR{w%eRN)e-Pz4g}Ez8G)z z?7*p0ry3j`9SzRT&RTOik_soY3ZFP}qG7^>3E$h>+lNn|KE0OHLmT)LA|O!1_2FoP z4s<0az^R~%`7gMjhIq120UQ zHqEeb;liW=p_y6Zs2`NT;lqcM*rk1Aj-!i)15F_~OEyv)2^73+Jdv6qeQJIBgh}P)6Q8dB9!Mm-} zdlPwGy*;aJ_P5f2ILO%5qdptt1NoZo&&RVwus~J{B6-DL$Bn`aiD%ODS00000NkvXX Hu0mjft_dS$ literal 3016 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 KMNUMnLSTY4wW&q` 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))));