From 792937d561ef173f54879926980ee1d938156e6f Mon Sep 17 00:00:00 2001 From: siva kumar Date: Wed, 12 Jul 2017 16:34:59 +0530 Subject: [PATCH] [ADF-918] Activiti Start Task - Refactoring (#2065) * [#DW-60] Task-create Task * Updated en.json with new form fields * Refactored start Button(Disable/Enable) * Migrated from mdl to md * Added documentation * #DW-60 Task- create task * Changed component name ActivitiStarttaskButton to ActivitiStartTaskComponent * activiti-start-task to adf-start-task * [ADF-918] Activiti Start Task - Refactoring * Removed unwanted activiti-start-task.png * Renamed component name in test * Refactored CSS * [ADF-918] Activiti Start Task - Refactoring * Added condtional parameter passing and added a test case * [ADF-918] Activiti Start Task - Refactoring * Removed trailing space. * Refactored Spec file. * [ADF-918] Activiti Start Task - Refactoring * Created startTaskModel with form feilds. * Modified testcases after adding startTaskModel. * Removed @input property. * [ADF-918] Activiti Start Task - Refactoring * Fixed tslint issuse (Exceeds maximum line length) * Refactored date field. * [ADF-918] Activiti Start Task - Refactoring * Changed property name date to dueDate. --- .../ng2-activiti-tasklist/README.md | 29 +- .../docs/assets/adf-start-task.png | Bin 0 -> 11455 bytes ng2-components/ng2-activiti-tasklist/index.ts | 29 +- .../src/assets/start-task.mock.ts | 34 +++ .../activiti-start-task.component.css | 38 ++- .../activiti-start-task.component.html | 102 ++++--- .../activiti-start-task.component.spec.ts | 285 ++++++++++++------ .../activiti-start-task.component.ts | 79 +++-- .../ng2-activiti-tasklist/src/i18n/en.json | 7 +- .../ng2-activiti-tasklist/src/models/index.ts | 1 + .../src/models/start-task.model.ts | 44 +++ .../src/services/activiti-people.service.ts | 2 +- 12 files changed, 460 insertions(+), 190 deletions(-) create mode 100644 ng2-components/ng2-activiti-tasklist/docs/assets/adf-start-task.png create mode 100644 ng2-components/ng2-activiti-tasklist/src/assets/start-task.mock.ts create mode 100644 ng2-components/ng2-activiti-tasklist/src/models/start-task.model.ts diff --git a/ng2-components/ng2-activiti-tasklist/README.md b/ng2-components/ng2-activiti-tasklist/README.md index c36398bb05..122423d04a 100644 --- a/ng2-components/ng2-activiti-tasklist/README.md +++ b/ng2-components/ng2-activiti-tasklist/README.md @@ -40,6 +40,7 @@ * [Properties](#properties-8) + [Events](#events-7) - [ADF Comments Component](#adf-comments-component) +- [Start Task Component](#start-task-component) * [Properties](#properties-9) + [Events](#events-8) - [Build from sources](#build-from-sources) @@ -489,12 +490,38 @@ This component displays comments entered by involved users to a specified task. | --- | --- | | error | Raised when an error occurs while displaying/adding a comment | +## Start Task Component + +This component Creates/Starts new task for the specified app + +```html + + +``` + +![adf-start-task](docs/assets/adf-start-task.png) + +### Properties + +| Name | Type | Description | +| --- | --- | --- | +| appId | string | (**required**): The id of the app. | + +#### Events + +| Name | Description | +| --- | --- | +| onSuccess | Raised when the task is successfully created | +| cancel | Raised when the cancel button is pressed by the user | +| error | Raised if there is an error during task creation | + ## Build from sources You can build component from sources with the following commands: - ```sh npm install + npm run build ``` diff --git a/ng2-components/ng2-activiti-tasklist/docs/assets/adf-start-task.png b/ng2-components/ng2-activiti-tasklist/docs/assets/adf-start-task.png new file mode 100644 index 0000000000000000000000000000000000000000..e9ccecce860f940a9b0cb796d2fb47b0c3754d6f GIT binary patch literal 11455 zcmd^lcT|(xwr{McAc&|aps+!(AVs=VkpQw0kRqXjB1OO;y$D1^34(#GC`ea85CViM zB{Zc;Z-y4C^jSrL)_8M+<}% z+WxTxpOd+xg$3Hl+TMBoK$$E8!GTag%ImmC&-Quf-CK)UUu^Cxc=n{*BHWu%b3gxO z|AHz$emzm8&<{M51Qp>O?$8x+<2Fm4tQe~>*Pf(y>1Gk($GO3ePTIyGhgrB=k^20{ ztPjSY&~H%ugR-BQ-|a@3oI1PzF9Rli{`pSRa3}h4FNP4ufi*kpQ;LiT#1psnU7ye3OTN)DOgQa32D3;yLv<>YrY4z?WMm;LC4t*RvA`5r~`r&~4vHGvs{x3jgDT z;-xx026$eh1ruTal{~w(HZQ=(m#244GKODNH1Fd_4n97$7(*1wZDpc0&$e@OYYP*R z-evdo*RKcR^?6T*zSob-u6CKzV~1@9h|ZI3H5Z=F@Q8UX{;GQW_GEay3)28CqWtmr zm|wY_7-ow+fVQ<|jnvZ9Ti=`}>`f@kc`nsnl9G}lt<8_thhu6v)+aSEMK04FSazTF zKzTE*KoZZ3*s5EQthyBqvg}F2rEfR$@qi>adhv8KmHID6uhgeyV@i* zzrMK{7|=eso$BvCd#_}%niZXI=)JQuj~RH7B@Gi*m^^X%H09p$1Bho*U22ErU0ht0 zm9YWEyPMMraoX{Z|mTY8acG&-V7l zGN*#O-a5S11eFcBFmk?Cp#M9N8Pp>+=;sf-qg}L>6Bo`GK zB(x%xl=?AyJ8S(<=SR25ZEZ_!ssfbN)x(Dm?+(lDn%}{0MU#hOG47hD>K3o;VOuBOX_;D6o5`mzB^jQotEne-hRp9N;w~woR zm~D_gm9hylfo;p_-iDR@LOU`#N+OY9u)qM4O*$UWDtY#aUq(rluvL@v(hn|OyoIV_e)b6yUYXw z0@Rb481u<8nBDE+nh@qQXJi*EnLdC1%!|r6^@fB;g@=XF=Y7W&%$=denL&ET744*% zt}OHBSed=u`8`>;x!#$XnIYbk^mOluPuR%F$dgP=d+RlF^u|I*5#=!>V**#ViDg^F z7cX9z?o6S^o8$HtLonL{drJaA%mO|`FPVQ04-*Qu!}tu5BetenJ*omFiRuy8&8q`X z^U7|`2vZP#N(q|D_C2{*I5~eM(YOv9t}HGxzVY?lm)sr^8!PMZs}iD|!PKwnfqt2f zx3aRbu5QP?&l+)Xa8N+*DguF)7vE#sk5kHVo$cXL4z}wr_86^u&w{gr1yT*?m+@Sg zI2}$%O+ESMG_Nk5TI)2$X}sxt)`z$_Q;0*gkSRjXFD4D?`$7>-u`)!Toz33fUiR%l z8ra5)PO~gM$eE?3rGBqvH5({4G+WsWJZ(04PGb!o6cS2qVM2 zeeeI=blD>|Ha7lch5j#I6fbY;1JLj%|Kp@L5=_VW00Wc{q4Yj*S_SFlNrJ1CK zM?`E)CdW}@xvXsOJ<3EsAKmv!0ZY#&A!y%UoR*fBk&(gbg=uVT+?ln<5UrYHp|X~k zU?6f?*+!;FctS}PL;|&5Lz?~e+izk~>1Ac6$XK7v$)Wo7tu6cR>`~T%b^mTVpY4pa?U`%ttKC*R z+uNQ`pJL_wCyFwNRn!<}6-U1g4xXEv6Jx>UST=5k?5&63SjB_&LgL~E#u}rnnxY@& z8Ip4RMnnz2!z?|#qkgTxPJrMamLTj%&<*g2UNVCq*(khV#Jj@0PB9l;Oginu7iL> zii(PX@$QyRSCiZIwY7&`i4@PB&#K`7K(rd@^N45UfPUd9mEV7dB6|x!Pf4jdK!0av zr>d%oS-`}(&yi01z6`9Fg~)j)+=(Jgs?X>G^C}ag`pr_ z%|%%7sj0}s{QUgPOhKRmZj0Rci~W#!keUq9)?ELm{X_4T|Q92{4#){)7E z$nW33r|IGYev(LsXlO3+@Ysk%mY0{WtgJw>#p!Ky=U6EyC_ttfYiSA9ZP5U~X;4U} z(Pdsd{qM4JS(vj}1fn5>iV`rrEdWu(Ic+Tzh{o(H57K zFkjQVYihbT7G*!zM-;z$^(rr~?FyCwQGWjR@DTRUKB)O8F!hkkRL=Vhs>t7`!2vY8 zJ@*w9Dy;4I19g-)GU}a3k5*kW(7aoqXwzl^4+A`$0I6w4^J{k*UcxNKYLb!g=-&TP%M6}!4l98fU^(nW@>5*6jPbqTjWt&Vv2UM z&nT-93$8N*c#pn;L1c7v8p%eDryT_f3xQU?aBP2!`uOxTFQ<=>&(P2iBO@c0{(N9a z2*c5%4w5mJIfW@Hwdj1TzkgHo4dKg|ZzF+A$nLCYM>UR3PfNiNub3`TIVs=Ot2U1x zQx+F%8yfCtXt@1Zx$2vn#iJU#ySqzEOKXD9lQZutczb(85L;S~S;cvGbapZ`F$q6i zwPW;vl`-P)B-@wCcyF!%a={Z&A71?cbg!?g1ELP4NlUBkXNtBc3$EMl!r8M6tE*r2 zt{pgVptiO)fe~=#bzxSaKZlr@n1n<@X{iaa!O{tZ>RcMF2mLa%u(0s``z=LHcvFMr zG6(=rD-w`Vz`>fD)D<=9*=5V>CXJ-oqRmGER6i1eu@J%9cjWRZ)rbF{3tL2^5v;nzFJ4uWZ1SeRIDW}~H)`-0i;zt>eT$Q1*Nh5=Jk zuexvp--pFLbm$P2lpEfg&Q?~*Sd1j1Sm*4C6D?%&v@6lp);1?Q+soVAMba4P z6b6G)RjnT!{1|W+r-V~tI&H~|omM6v-)(AL&&j*}xaEv>DE;Bfb7 zW~QgfB$DXwa-e3b|G=uBGg8+)1tcz~J6e6*_W+H5^VH;|in@AmP|#L;-0ms(G)zpP z(a|%bqZWAvIHiPdW_Ou`f`iX6hSzg*qKa9{0b;C0QVFo-kHyHO!|mql-TD9rMn=)0p$QkpH8eB`Kw#(Q zT#0?6qM}6CSw{)B@unCu(aqk?E#K4kJ_b`(R)*2j)4O@|8IbyJJAfQW3*xH6DcB}O z#h2}qGn11bitfdEeY_Al0k4ADsPbIA=BzdKz$U{$N`iPyQjsTnjMg=Wqf{95C6V`zeDRYb)&0{hH|m5q{Hm0}ds}azlPF8$X)6#NK<7MNB@hc`E9NqY!3-b* z11&8reSLhK%E4@fzl8ew`rwCGK|w(wA!`$Zh?}s8b$TKD3MxpQomN&>ZZ0l;Kfe3= z`i_o{itIx$48PkaI5jmrZJ&7XU|rVHBY9JTv4t zLN!@nJDt;%_q{F(H}%mkjHTjb8usWQ|L7+o-C-IUUS3{S78c0DR%<#2hUU6DC>To( z9c76zQf{ftSlc`UcJ?^1J{lStK+xM_P-<#w!0B|QR%>4x{tl_O*{p&r_=G4=uV9iF zl#p28-I^!%%>iB>K6Hq(wg$>|zB^~!m*zsj9C?b56ULK~>6>&0FN117fd{ZW-V9~4 zq-RMzIVU$)~j4*Jy$vZqAEZdMhEEJyGQ!@6IABL#>VK#NM%(O?yMnTjf2A?;H@!#_$ChM zK=}Og@bGXLjGFu(KAg?z_5vwP!|ruAxgAV{_nck4`06*`~h;6b4EFnsTdCom#Ff0TsaAbR*!GXby?9?ox-x692z@340>zZ9PuL*t?@P7wi#_Lgy zV5c$2th9i}0dQ4SRaG1T4gfqk5*##$M#;xLxuESqSiC-K_~_9j1Pv&k&U8a7!Lxxu zLG}+rlI}zZ2@1BfwZ&hq8>+wp>WbTSWj?4192*;(nzD&e&$sIqVx)RW1_lQ9_V)Mh z-v?pG6(XJOzW58&3aO*Rr#tQnn)meS)8;ZS3_Bsmz%*rIVw#?sDsAut0+->?LSOEJ z+hp9Ys0j!}@GiXROucdgE?&BX($xiHV`X&}XaT=|cBPph2nsMQ4$#m`umuClc=qfW zEIQ*+dU{ZcRBJ9#B@{A6jVIKE!2G7TSei1K2}%hP0dyqeo35^|A3uJ;bBu9K%S%hA z6gADcuV2sl@?}EFwa!`u#$Q`mK`JVqK6UCW-C-b!pBr(l69E0K&x z>F9v%$+^uLIXW&K-#g+f)iF3|rmfvxvepj?YG7j0-`mS}?p#U}WWR7!BURu^ut9L0 zJ9lmhvyE3{_o@2`!2~gc$JY-GV5(oAd;k8uyu3X47E^O`{jf@Jxm7{P8WlvqC+7#J7{hTv%i?)~|B znhg6Xm`L($X|>Sq?k?s6&P0HdKOCQ&Tmu)7ly+DqmNPOkGElP=2CRi5Qt^1ji@dz} z%*=)FFKJs_TY*qaVa)L)n=Cz$Lf9~rh9sTUe-f7ByS++^nm>)H-a8Z$(5*@d4iapj zxVXY{|Eez|zZ2dPyYYllN$119yvL{%tbLN_&WDffliw>Ufd65i4~A;UIushM4PeSz zt#kFRfiVD+hWDVNWOJLoeftKc6%a{2(^9V|Pcn0JbHRm@kxJQ(13uAMUr$R*Yl}wr zmtinSB+|>PIQ}xoK;Md?AI;5c6iRwV#xA(wVFIQXPM!MM*_n^o+XZqA&Uk?lKcx6z zx$ix^?xb_k^^H&a5-OQGPeAqu2M2#*I(Rjo?2V(H%Q$l)JdR6e4-1#v`k9aLKVlArHpW(GR{ zBOVWHEGQr#aN~x4LhHM*FcTl$TZGPWEp5Ox7h@C?obeNIia0g46uZ7MESi^dh`=MFf}cGlK+ z8MgMBnmm3yOX~LqIRJKuj4+*sk-`aP=Cy9CIN)y43sv=12A@q-ZnKgeR{dIxv9j4n3$fPo}F#{@dMJE z({ZxxGiz@G$Po-?4=mOEyu5R`YT$pL5)Oq6*a=1WGbEIi#i_<27$-q8IZtXmco4ry z=U-4Dp{U8i!t%2)D=Q0%oL0yXfEz3`fTHak_O|wR&<$96ZtxC*B}62)>5^Klbui6F zMb0Y8?J1%hoGdsVY3bsG1cjK>EG(%V&jMbviZ=}ml$Dfti}>&qNEy!>4}^+x#NN0i zXi@hLb`@F&YH_kM7cU}9W;65hC{*C=$$t&d15c%;T@x2~gYAJL#Lurz=)83CB0yg1 z_@I=eB)H>Iz@IPIfz5D9Jz4_Nm$A@!@@?(IlW(9L1Mmy-^Ycqe7QtH=hAIGd*(I-B z<^*!@SyKA>a}~TlB_#!Zm~@t8qt9dTXJuo{?Y0Yy2Y3U)kXl&iG4%Z<_)5*q&FFj} zCSZilHADzQ_EXKH8lka*$rg^_1<_mU5oo~C@y9;!JiZFJyQ1P5$? zeHb79%NGfcrH3FKAYXtKfS4sXTs2N;?FEX&&CLx~bmue$Hn}}ngPAe3Rs@V}P_)oE z0>%c*PVtQ2SRN05_fAJg2R!l2%*-23V*$7C+-U$I9TXS{Hay5(a09WO&jJ9-BZRGD zr9Im0#A>Rm`Smi*_I7uqTxZ;&N23(o^d&7#2cyl3s|H>LK4?nvMJ`TGEp6?!neK$n zY1ljW`I5B@5>IaOh5S`2Xu#{fJwF6KLVWypa0S780w3v=PeXxAxPq|1&j?35045fu>$VeaCHY zO0Oo~0`Kvhuw}!C>%&X>_2B~Sp0m@_Ta`>2UkC^G??1z5;JmQ}Ya2dbbPBSde^UJU zX3#Lp0aXYU6_sGA=i=izgR0)Xc{2n}NBB#Be}+k#Q`KYz3c7T#)2hG!o}>|n&L;znA|(eJ8$xhF z@3S>QnPhm3#LAp}C*mzkJ}gYv*m$S*QrtsJ%PGnxBrZxvM|z?Bz|{L!01cTiLJ!^=kE@+1~<1P*nUQfZwZQtKqfi~BqxeWhcST*B* zgxe`>1rYM!FJCTGOkzQs=p?in?YiATye_ByZzR|;l%t7Y%XuHUuDtF$%}Ldd%CS1| z4ejt(K}jd@2dXj+uDrn<>S{DC( z8}{FGXyG4Mm;d@n2~N+D$0@)Ap{>6(nPb%qB$v`92=4f(H1omKL$qfmD449)^75Mu z)CSh;!ATA%QwvZG7nJrP%JV!Vk7QJjI>x}60U-X6AK>Fb7K1klU3gHWnB8&AT-n|( zV6ES`Os|cl5ZTS!NMK}OE3`w}Le+svshzCuy}L2aAI^LIy2DsQgn0=BXRjstJ;!B! zezdjq2T@yHYwHPU_JHb|bC$Gf`0xpA#6$o-P>@vnG}qv=D03UEC z;49GZpAv$4^XkNJ6E3v(;4SDg;b_y{e!H=UnJ?-n)RcO+d z{z?PK2fEA*AvB1}W%&iLkzRkueo%D`TQTHHtoZ)jp9cs6fGVDp+ED>5T`VRD`iFP# zfgZ58pZ}x}l@)4Jf~e;p{*UPBYn^Yt-!=UC9oEnx@>SlidC}vx=x^EC|6d^sAs_ zFhZWeV_Vzl7JWbHyF(q1xRVqc8=G~WRnYS%k2M;d1n(&{u+_m7@!FLdjf8!_pk52CY zhQ=`Zye?k!`t`+}W?9y0-(DP;UFD~NdJXLDu7UYWr4UU`{h9YGK*-m4-p%*xKfJLp zy);QN z`hNWR&G{_8eF!u&oNj=#Mjl(U`P5pWUN|266p9X50?5iy#~pIn4jD=W7(tNoJ}U|A zKv7@)sC&;#d+ZprF@W2Fv(A87uYigZc-z~1XJBtQg(B{l=hv9N>F1f0y%aR?{v#bDqj_e-R>{vY-X@>!GA)DPS{jDm ze;GvV4YV0tRov6)xr&_UI*Na|N>H?Vw`r`kaz0{R?F#u~4u(5!+tfj7)XgWm=bAi| zviAa<1H?=|9oXvkV~};vE3_}&7=w}p#@I4s+Q9ahIMiHFMw;&k-m|t~K;dw>!1(PU z2F#DzT5#!Ml0boAk~a4C&^!Vnp&W9-rO*hxYAAG}jh43d_84fimTmRTUkz;Q>x=p0 zkGs%i&yv{*yg~D>@mrnpz}=Y`)Q2slXIf>3ny0E}wZ1A{sTx4BiB)YDE@3Zz{$&*y ze;K#+PJI76E{!WCYJs+QZ%|Y%YIH(yG1`X_&)%@GvO;%+Am#?%8XUvZxP2Rn*K|iZ zY>SPJjg}RkQGuYCm@d+?F_HwI2Koyi&Y@ZQomSu=4UI;W*lb>>3CM6@s7Tn9wbC^i zAS+;*z;>4P!P!0N=wMy#S0-L(kH{3d8~L#F&-Y#WEcZ6-7w@&C);hn_LXSfyyesA8 zAB5L^&X#LtnF&k52n;_!+AfTgzogEw{*eeva=S-fAsqK(E?cj9!=(&l9@>WiU9+w( zy6)};o8PTP0)GG?nwx`L@)24OlHMRuIJ3=b=&==m7uUV=z%T&mlaMJMd)k2@t;2mj zc{GTjO6&4_x$vW^7OnKH6T1(x!cJb=fwrDbRlL7L3-#-#cYdi3DQ|`ajTveo#cR*}3YE zp*<3N?OUkDl2e;LHzu0%IFZ|jwAVB%%|(N%_a>;;DYZ_GuG6+T?KbB~`p&IU7 zK;%{+rf3*0u*ohqiVqkOUDM+)17p+!RDJj`F~DdyN%oeVU7F|I%^gQLtOH#Z@TzkR z(gBfTzL=;89@`pnzwc2~|dkb>$*t^oPvJYK0XUsDbWqva#3Ak;WGOpzA0)^Tv z5pW+mevp`Ron^Z&_wL=Zuo%_AY_`X3k6Z#On5&ck$g4R|F9CiHj zH;d^Y;u-JyMl)s?PFZ5$bAu-FfK#2#(Km8jrgbS|-U*jG4o%-8Mik(%UmVcAXlN_&Cbtb;Dnk?(bI&B z656^x7r$C|6YqRg`=gIGu}tw;aNxi}#y78%6IZZ~?taL|_bYo`^JBH-NAZ-m9)^kI zPTggWBRxFQ9FhrkL6nBy4mOS^y8?^r^Z(a7LVut72K?Bg8D8ub^gqNO1S}h&qNt9{ JxMlYIe*sVdiQ@nO literal 0 HcmV?d00001 diff --git a/ng2-components/ng2-activiti-tasklist/index.ts b/ng2-components/ng2-activiti-tasklist/index.ts index 3ee2627887..04cfd0add0 100644 --- a/ng2-components/ng2-activiti-tasklist/index.ts +++ b/ng2-components/ng2-activiti-tasklist/index.ts @@ -17,7 +17,17 @@ import { DatePipe } from '@angular/common'; import { ModuleWithProviders, NgModule } from '@angular/core'; -import { MdButtonModule, MdIconModule, MdInputModule, MdProgressSpinnerModule } from '@angular/material'; +import { + MdButtonModule, + MdIconModule, + MdInputModule, + MdProgressSpinnerModule, + MdDatepickerModule, + MdGridListModule, + MdAutocompleteModule, + MdNativeDateModule, + MdSelectModule +} from '@angular/material'; import { ActivitiFormModule } from 'ng2-activiti-form'; import { CoreModule } from 'ng2-alfresco-core'; import { DataTableModule } from 'ng2-alfresco-datatable'; @@ -32,12 +42,12 @@ import { ActivitiCreateTaskAttachmentComponent, ActivitiFilters, ActivitiPeople, - ActivitiPeopleSearch, - ActivitiStartTaskButton, - ActivitiTaskDetails, ActivitiTaskHeader, - ActivitiTaskList, AdfCommentListComponent, + ActivitiPeopleSearch, + ActivitiStartTaskComponent, + ActivitiTaskDetails, + ActivitiTaskList, NoTaskDetailsTemplateComponent, PeopleList, TaskAttachmentListComponent @@ -59,7 +69,7 @@ export const ACTIVITI_TASKLIST_DIRECTIVES: any[] = [ ActivitiComments, ActivitiPeople, ActivitiTaskHeader, - ActivitiStartTaskButton, + ActivitiStartTaskComponent, ActivitiPeopleSearch, TaskAttachmentListComponent, ActivitiCreateTaskAttachmentComponent, @@ -81,7 +91,12 @@ export const ACTIVITI_TASKLIST_PROVIDERS: any[] = [ MdIconModule, MdButtonModule, MdInputModule, - MdProgressSpinnerModule + MdProgressSpinnerModule, + MdDatepickerModule, + MdNativeDateModule, + MdSelectModule, + MdAutocompleteModule, + MdGridListModule ], declarations: [ ...ACTIVITI_TASKLIST_DIRECTIVES diff --git a/ng2-components/ng2-activiti-tasklist/src/assets/start-task.mock.ts b/ng2-components/ng2-activiti-tasklist/src/assets/start-task.mock.ts new file mode 100644 index 0000000000..eb1f153c13 --- /dev/null +++ b/ng2-components/ng2-activiti-tasklist/src/assets/start-task.mock.ts @@ -0,0 +1,34 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export let startTaskMock = { + 'name': 'fakeName', + 'description': 'fakeDescription', + 'assignee': {'id': 2001, 'firstName': 'Jhon', 'lastName': 'Adams', 'email': 'jhon@app.activiti.com'}, + 'dueDate': '2017-11-03T15:25:42.749+0000', + 'formKey': '11201', + 'category': 'fakeAppId' +}; + +export let noDataMock = { + 'name': '', + 'description': '', + 'assignee': {}, + 'dueDate': '', + 'formKey': '', + 'category': ';' +}; diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.css b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.css index ff0f8dd865..253809829b 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.css +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.css @@ -1,7 +1,37 @@ -:host { - width: 100%; +.adf-new-task-heading { + padding: 12px 20px; + font-family: Muli; + font-weight: bold; + border-bottom: 1px solid #eee; + font-size: 18px; + float: left; + text-align: left; + width: calc(100% - 40px); } -.activiti-label { - font-weight: bolder; +.adf-new-task-layout-card { + width: 66.6667%; + margin-right:calc(33.3333%/2 - 24px); + margin-left: calc(33.3333%/2 - 24px); + margin-top: 10px; + margin-bottom: 10px; + padding: 0px +} + +.adf-new-task-footer { + padding: 4px; + font-family: Muli; + font-size: 18px; + border-top: 1px solid #eee; + float: left; + width: calc(100% - 40px); + text-align: right; +} + +.adf-start-task-input-container { + width: 80%; +} + +.adf-new-task-text-width { + width: 90%; } diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.html b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.html index 1bcae17ba6..cf6be4eabe 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.html +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.html @@ -1,39 +1,63 @@ - - - -

{{'START_TASK.DIALOG.TITLE'|translate}}

-
-
- - -
-
- - -
-
- -
-
- -
-
-
- - -
-
+ + + +
{{'START_TASK.FORM.TITLE'|translate}}
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + {{'START_TASK.FORM.LABEL.NONE'|translate}} + {{ user.firstName +' '+ user.lastName }} + + + + + + + {{'START_TASK.FORM.LABEL.NONE'|translate}} + {{ form.name }} + + + + + + + + + + + + +
diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.spec.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.spec.ts index ae70df803d..8c48a9f298 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.spec.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.spec.ts @@ -16,94 +16,199 @@ */ import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { MdButtonModule, MdDatepickerModule, MdGridListModule, MdIconModule, MdInputModule, MdNativeDateModule, MdSelectModule } from '@angular/material'; import { AlfrescoTranslationService, CoreModule } from 'ng2-alfresco-core'; import { Observable } from 'rxjs/Rx'; +import { StartTaskModel } from '../models/index'; +import { ActivitiPeopleService } from '../services/activiti-people.service'; import { ActivitiTaskListService } from '../services/activiti-tasklist.service'; -import { ActivitiStartTaskButton } from './activiti-start-task.component'; +import { startTaskMock } from './../assets/start-task.mock'; +import { ActivitiStartTaskComponent } from './activiti-start-task.component'; declare let jasmine: any; -describe('ActivitiStartTaskButton', () => { +describe('ActivitiStartTaskComponent', () => { - let activitiStartTaskButton: ActivitiStartTaskButton; - let fixture: ComponentFixture; + let activitiStartTaskComponent: ActivitiStartTaskComponent; + let fixture: ComponentFixture; let service: ActivitiTaskListService; + let peopleService: ActivitiPeopleService; let element: HTMLElement; - let startTaskButton: HTMLElement; - + let getformlistSpy: jasmine.Spy; + let getWorkflowUsersSpy: jasmine.Spy; + let getcreateNewTaskSpy: jasmine.Spy; + let fakeForms = [ + { + id: 123, + name: 'Display Data' + }, + { + id: 1111, + name: 'Employee Info' + } + ]; beforeEach(async(() => { TestBed.configureTestingModule({ imports: [ - CoreModule.forRoot() + CoreModule.forRoot(), + MdInputModule, + MdIconModule, + MdButtonModule, + MdDatepickerModule, + MdGridListModule, + MdNativeDateModule, + MdSelectModule ], declarations: [ - ActivitiStartTaskButton + ActivitiStartTaskComponent ], providers: [ - ActivitiTaskListService + ActivitiTaskListService, + ActivitiPeopleService ] }).compileComponents().then(() => { let translateService = TestBed.get(AlfrescoTranslationService); spyOn(translateService, 'addTranslationFolder').and.stub(); spyOn(translateService.translate, 'get').and.callFake((key) => { return Observable.of(key); }); - fixture = TestBed.createComponent(ActivitiStartTaskButton); - activitiStartTaskButton = fixture.componentInstance; + fixture = TestBed.createComponent(ActivitiStartTaskComponent); + activitiStartTaskComponent = fixture.componentInstance; element = fixture.nativeElement; fixture.detectChanges(); - startTaskButton = element.querySelector('#start-task-button'); }); })); beforeEach(() => { - jasmine.Ajax.install(); service = fixture.debugElement.injector.get(ActivitiTaskListService); + peopleService = fixture.debugElement.injector.get(ActivitiPeopleService); + getformlistSpy = spyOn(service, 'getFormList').and.returnValue(Observable.of(fakeForms)); + getWorkflowUsersSpy = spyOn(peopleService, 'getWorkflowUsers').and.returnValue(Observable.of([ + { + id: 1, + firstName: 'fakeName', + lastName: 'fakeName', + email: 'fake@app.activiti.com', + company: 'Alfresco.com', + pictureId: 3003 + }, + { + id: 1001, + firstName: 'fake-name', + lastName: 'fake-name', + email: 'fake-@app.com', + company: 'app' + } + ])); }); - afterEach(() => { - jasmine.Ajax.uninstall(); + it('should create instance of ActivitiStartTaskComponent', () => { + expect(fixture.componentInstance instanceof ActivitiStartTaskComponent).toBe(true, 'should create ActivitiStartTaskComponent'); }); - it('should show start task button', () => { - expect(element.querySelector('#start-task-button')).toBeDefined(); - expect(element.querySelector('#start-task-button')).not.toBeNull(); - expect(element.querySelector('#start-task-button').textContent).toContain('START_TASK.BUTTON'); + it('should fetch fakeform on ngonint', () => { + activitiStartTaskComponent.ngOnInit(); + expect(activitiStartTaskComponent.forms).toEqual(fakeForms); + expect(activitiStartTaskComponent.forms[0].name).toEqual('Display Data'); + expect(activitiStartTaskComponent.forms[1].name).toEqual('Employee Info'); + expect(activitiStartTaskComponent.forms[1].id).toEqual(1111); + expect(getformlistSpy).toHaveBeenCalled(); }); - it('should show start dialog on press button', () => { - startTaskButton.click(); - expect(element.querySelector('#start-task-dialog')).not.toBeNull(); - expect(element.querySelector('#start-task-dialog').getAttribute('open')).not.toBeNull(); - expect(element.querySelector('#start-task-dialog-title')).not.toBeNull(); - expect(element.querySelector('#start-task-dialog-title').textContent).toContain('START_TASK.DIALOG.TITLE'); - }); + describe('create task', () => { - it('should close start dialog on cancel button', () => { - startTaskButton.click(); - expect(element.querySelector('#start-task-dialog')).not.toBeNull(); - expect(element.querySelector('#start-task-dialog').getAttribute('open')).not.toBeNull(); - let cancelButton = element.querySelector('#button-cancel'); - cancelButton.click(); - expect(element.querySelector('#start-task-dialog').getAttribute('open')).toBeNull(); - }); + beforeEach(() => { + jasmine.Ajax.install(); + getcreateNewTaskSpy = spyOn(service, 'createNewTask').and.returnValue(Observable.of( + { + id: 91, + name: 'fakeName', + formKey: '4', + assignee: {id: 1001, firstName: 'fakeName', email: 'fake@app.activiti.com'} + } + )); + }); - it('should attach a task when a form id slected', () => { - let attachFormToATask = spyOn(service, 'attachFormToATask').and.returnValue(Observable.of()); - spyOn(service, 'createNewTask').and.callFake( - function() { - return Observable.create(observer => { - observer.next({ id: 'task-id'}); - observer.complete(); - }); + afterEach(() => { + jasmine.Ajax.uninstall(); + }); + + it('should create new task when start is clicked', async(() => { + activitiStartTaskComponent.onSuccess.subscribe((res) => { + expect(res).toBeDefined(); }); + activitiStartTaskComponent.appId = 'fakeAppId'; + activitiStartTaskComponent.startTaskmodel = new StartTaskModel(startTaskMock); + activitiStartTaskComponent.start(); + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200 + }); + })); - let createTaskButton = element.querySelector('#button-start'); + it('should send on onSuccess event when the task is started', async(() => { + activitiStartTaskComponent.onSuccess.subscribe((res) => { + expect(res).toBeDefined(); + expect(res.id).toBe(91); + expect(res.name).toBe('fakeName'); + expect(res.formKey).toBe('4'); + expect(res.assignee.id).toBe(1001); + }); + activitiStartTaskComponent.appId = 'fakeAppId'; + activitiStartTaskComponent.startTaskmodel = new StartTaskModel(startTaskMock); + activitiStartTaskComponent.start(); + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'json', + responseText: + { + id: '91', + name: 'fakeName', + description: 'fakeDescription', + formKey: '4', + assignee: {id: 1001, firstName: 'fakeName', email: 'fake@app.activiti.com'}, + dueDate: null, + endDate: null, + duration: null, + priority: 50, + parentTaskId: null, + parentTaskName: null + } + }); + })); - activitiStartTaskButton.name = 'fake-name'; - activitiStartTaskButton.formId = '123'; - startTaskButton.click(); - createTaskButton.click(); - expect(attachFormToATask).toHaveBeenCalled(); + it('should send on onSuccess event when only name is given', async(() => { + activitiStartTaskComponent.onSuccess.subscribe((res) => { + expect(res).toBeDefined(); + }); + activitiStartTaskComponent.appId = 'fakeAppId'; + activitiStartTaskComponent.startTaskmodel.name = 'fakeName'; + activitiStartTaskComponent.startTaskmodel = new StartTaskModel(startTaskMock); + activitiStartTaskComponent.start(); + jasmine.Ajax.requests.mostRecent().respondWith({ + 'status': 200, + contentType: 'json', + responseText: {} + }); + })); + + it('should attach a task when a form id selected', () => { + activitiStartTaskComponent.onSuccess.subscribe((res) => { + expect(res).toBeDefined(); + expect(res.formKey).toBe('4'); + }); + activitiStartTaskComponent.appId = 'fakeAppId'; + activitiStartTaskComponent.startTaskmodel = new StartTaskModel(startTaskMock); + activitiStartTaskComponent.start(); + expect(getcreateNewTaskSpy).toHaveBeenCalled(); + }); + + it('should not emit onSuccess event when data not present', async(() => { + let onSuccessSpy: jasmine.Spy = spyOn(activitiStartTaskComponent.onSuccess, 'emit'); + activitiStartTaskComponent.startTaskmodel = new StartTaskModel(null); + activitiStartTaskComponent.start(); + fixture.detectChanges(); + expect(getcreateNewTaskSpy).not.toHaveBeenCalled(); + expect(onSuccessSpy).not.toHaveBeenCalled(); + })); }); it('should not attach a task when a form id is not slected', () => { @@ -115,60 +220,56 @@ describe('ActivitiStartTaskButton', () => { observer.complete(); }); }); - let createTaskButton = element.querySelector('#button-start'); - - activitiStartTaskButton.name = 'fake-name'; - startTaskButton.click(); + activitiStartTaskComponent.startTaskmodel.name = 'fake-name'; createTaskButton.click(); expect(attachFormToATask).not.toHaveBeenCalled(); }); - it('should load form when dialogs open', () => { - let loadForms = spyOn(service, 'getFormList').and.returnValue(Observable.of()); - startTaskButton.click(); - expect(loadForms).toHaveBeenCalled(); + it('should show start task button', () => { + expect(element.querySelector('#button-start')).toBeDefined(); + expect(element.querySelector('#button-start')).not.toBeNull(); + expect(element.querySelector('#button-start').textContent).toContain('START_TASK.FORM.ACTION.START'); }); - it('should create new task when start is clicked', () => { - activitiStartTaskButton.onSuccess.subscribe(() => { - expect(element.querySelector('#start-task-dialog').getAttribute('open')).toBeNull(); - }); - let createTaskButton = element.querySelector('#button-start'); - startTaskButton.click(); - activitiStartTaskButton.name = 'fake-name'; - createTaskButton.click(); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200 - }); + it('should fetch all users on ngonint', async(() => { + activitiStartTaskComponent.ngOnInit(); + expect(activitiStartTaskComponent.people).toBeDefined(); + expect(activitiStartTaskComponent.people[0].firstName).toEqual('fakeName'); + expect(activitiStartTaskComponent.people[1].firstName).toEqual('fake-name'); + expect(activitiStartTaskComponent.people[0].id).toEqual(1); + expect(activitiStartTaskComponent.people[1].id).toEqual(1001); + expect(getWorkflowUsersSpy).toHaveBeenCalled(); + })); + + it('should not emit TaskDetails OnCancle', () => { + let emitSpy = spyOn(activitiStartTaskComponent.cancel, 'emit'); + activitiStartTaskComponent.onCancel(); + expect(emitSpy).not.toBeNull(); + expect(emitSpy).toHaveBeenCalled(); }); - it('alert message is showed on start error', () => { - spyOn(window, 'alert'); - activitiStartTaskButton.onSuccess.subscribe(() => { - expect(window.alert).toHaveBeenCalledWith('An error occurred while trying to add the task'); - }); - let createTaskButton = element.querySelector('#button-start'); - startTaskButton.click(); - activitiStartTaskButton.name = 'fake-name'; - createTaskButton.click(); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 403 - }); + it('should start button disable if name is empty', () => { + let createTaskButton = fixture.nativeElement.querySelector('#button-start'); + activitiStartTaskComponent.startTaskmodel.name = ''; + fixture.detectChanges(); + expect(createTaskButton.disabled).toBeTruthy(); }); - it('should send on success event when the task is started', () => { - activitiStartTaskButton.onSuccess.subscribe((res) => { - expect(res).toBeDefined(); - }); - let createTaskButton = element.querySelector('#button-start'); - startTaskButton.click(); - activitiStartTaskButton.name = 'fake-name'; - createTaskButton.click(); - jasmine.Ajax.requests.mostRecent().respondWith({ - 'status': 200, - contentType: 'json', - responseText: {} - }); + it('should cancle start task on cancle button clicked', () => { + let emitSpy = spyOn(activitiStartTaskComponent.cancel, 'emit'); + let cancleTaskButton = fixture.nativeElement.querySelector('#button-cancle'); + activitiStartTaskComponent.startTaskmodel.name = ''; + fixture.detectChanges(); + cancleTaskButton.click(); + expect(emitSpy).not.toBeNull(); + expect(emitSpy).toHaveBeenCalled(); + }); + + it('should enable button if name is not empty', () => { + let createTaskButton = fixture.nativeElement.querySelector('#button-start'); + activitiStartTaskComponent.startTaskmodel.name = 'fakeName'; + fixture.detectChanges(); + expect(createTaskButton.enable).toBeFalsy(); }); }); diff --git a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.ts b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.ts index f894c3fe30..db1de77781 100644 --- a/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.ts +++ b/ng2-components/ng2-activiti-tasklist/src/components/activiti-start-task.component.ts @@ -15,20 +15,20 @@ * limitations under the License. */ -import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { AlfrescoTranslationService, LogService } from 'ng2-alfresco-core'; import { Form } from '../models/form.model'; +import { StartTaskModel, User } from '../models/index'; import { TaskDetailsModel } from '../models/task-details.model'; +import { ActivitiPeopleService } from '../services/activiti-people.service'; import { ActivitiTaskListService } from './../services/activiti-tasklist.service'; -declare let dialogPolyfill: any; - @Component({ selector: 'adf-start-task, activiti-start-task', templateUrl: './activiti-start-task.component.html', styleUrls: ['./activiti-start-task.component.css'] }) -export class ActivitiStartTaskButton { +export class ActivitiStartTaskComponent implements OnInit { @Input() appId: string; @@ -36,19 +36,18 @@ export class ActivitiStartTaskButton { @Output() onSuccess: EventEmitter = new EventEmitter(); + @Output() + cancel: EventEmitter = new EventEmitter(); + @Output() error: EventEmitter = new EventEmitter(); - @ViewChild('dialog') - dialog: any; + people: User [] = []; + + startTaskmodel: StartTaskModel = new StartTaskModel(); forms: Form []; - formId: string = null; - - name: string; - description: string; - /** * Constructor * @param auth @@ -57,6 +56,7 @@ export class ActivitiStartTaskButton { */ constructor(private translateService: AlfrescoTranslationService, private taskService: ActivitiTaskListService, + private peopleService: ActivitiPeopleService, private logService: LogService) { if (translateService) { @@ -64,20 +64,22 @@ export class ActivitiStartTaskButton { } } + ngOnInit() { + this.loadFormsTask(); + this.getUsers(); + } + public start() { - if (this.name) { - this.taskService.createNewTask(new TaskDetailsModel({ - name: this.name, - description: this.description, - category: this.appId ? '' + this.appId : null - })).subscribe( + if (this.startTaskmodel.name) { + this.startTaskmodel.category = this.appId; + this.taskService.createNewTask(new TaskDetailsModel(this.startTaskmodel)).subscribe( (res: any) => { this.onSuccess.emit(res); - this.closeDialog(); - this.resetForm(); this.attachForm(res.id); + this.resetForm(); }, (err) => { + this.error.emit(err); this.logService.error('An error occurred while trying to add the task'); } ); @@ -85,46 +87,35 @@ export class ActivitiStartTaskButton { } private attachForm(taskId: string) { - if (this.formId && taskId) { - this.taskService.attachFormToATask(taskId, Number(this.formId)); - this.formId = null; + if (this.startTaskmodel.formKey && taskId) { + this.taskService.attachFormToATask(taskId, Number(this.startTaskmodel.formKey)); } } - public cancel() { - this.closeDialog(); - } - - public showDialog() { - if (!this.dialog.nativeElement.showModal) { - dialogPolyfill.registerDialog(this.dialog.nativeElement); - } - - this.loadFormsTask(); - - if (this.dialog) { - this.dialog.nativeElement.showModal(); - } + public onCancel() { + this.cancel.emit(); } private loadFormsTask() { this.taskService.getFormList().subscribe((res: Form[]) => { this.forms = res; }, - (err) => { + (err) => { this.error.emit(err); this.logService.error('An error occurred while trying to get the forms'); }); } - private closeDialog() { - if (this.dialog) { - this.dialog.nativeElement.close(); - } + private resetForm() { + this.startTaskmodel = null; } - private resetForm() { - this.name = ''; - this.description = ''; + private getUsers() { + this.peopleService.getWorkflowUsers().subscribe((users) => { + this.people = users; + }, (err) => { + this.error.emit(err); + this.logService.error('Could not load users'); + }); } } diff --git a/ng2-components/ng2-activiti-tasklist/src/i18n/en.json b/ng2-components/ng2-activiti-tasklist/src/i18n/en.json index 5a8f83c021..b0fb9049f6 100644 --- a/ng2-components/ng2-activiti-tasklist/src/i18n/en.json +++ b/ng2-components/ng2-activiti-tasklist/src/i18n/en.json @@ -71,13 +71,16 @@ }, "START_TASK": { "BUTTON": "CREATE TASK", - "DIALOG": { + "FORM": { "TITLE": "Start Task", "LABEL": { "NONE": "None", "NAME": "Name", "DESCRIPTION": "Description", - "ATTACHFORM" : "Attach a Form" + "ATTACHFORM" : "Attach a Form", + "ASSIGNEE" : "Assignee", + "FORM" : "Form", + "DATE" : "Choose a Date" }, "ACTION": { "START": "Start", diff --git a/ng2-components/ng2-activiti-tasklist/src/models/index.ts b/ng2-components/ng2-activiti-tasklist/src/models/index.ts index 45b713f383..890d8f4c5e 100644 --- a/ng2-components/ng2-activiti-tasklist/src/models/index.ts +++ b/ng2-components/ng2-activiti-tasklist/src/models/index.ts @@ -22,3 +22,4 @@ export * from './user.model'; export * from './task-details.model'; export * from './task-details.event'; export * from './user-event.model'; +export * from './start-task.model'; diff --git a/ng2-components/ng2-activiti-tasklist/src/models/start-task.model.ts b/ng2-components/ng2-activiti-tasklist/src/models/start-task.model.ts new file mode 100644 index 0000000000..b4f808e872 --- /dev/null +++ b/ng2-components/ng2-activiti-tasklist/src/models/start-task.model.ts @@ -0,0 +1,44 @@ +/*! + * @license + * Copyright 2016 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * + * This object represent of the StartTaskModel. + * + * + * @returns {StartTaskModel} . + */ +import { User } from './user.model'; + +export class StartTaskModel { + + name: string; + description: string; + assignee: User; + dueDate: any; + formKey: any; + category: string; + + constructor(obj?: any) { + this.name = obj && obj.name || null; + this.description = obj && obj.description || null; + this.assignee = obj && obj.assignee ? new User(obj.assignee) : null; + this.dueDate = obj && obj.dueDate || null; + this.formKey = obj && obj.formKey || null; + this.category = obj && obj.category || null; + } +} diff --git a/ng2-components/ng2-activiti-tasklist/src/services/activiti-people.service.ts b/ng2-components/ng2-activiti-tasklist/src/services/activiti-people.service.ts index 4d02be6806..4efbdbfa7e 100644 --- a/ng2-components/ng2-activiti-tasklist/src/services/activiti-people.service.ts +++ b/ng2-components/ng2-activiti-tasklist/src/services/activiti-people.service.ts @@ -28,7 +28,7 @@ export class ActivitiPeopleService { private logService: LogService) { } - getWorkflowUsers(taskId: string, searchWord: string): Observable { + getWorkflowUsers(taskId?: string, searchWord?: string): Observable { let option = {excludeTaskId: taskId, filter: searchWord}; return Observable.fromPromise(this.getWorkflowUserApi(option)) .map((response: any) => response.data || [])