From 63063699fdd486dbe7febf06d04fe61657494b7a Mon Sep 17 00:00:00 2001 From: siva kumar Date: Tue, 14 Apr 2020 14:22:57 +0530 Subject: [PATCH] [ACA-3000][ACA-2999] FE - Provide way to show ContextMenu on Task/Process list (#5596) * [ACA-3000] FE - Provide way to show ContextMenu on Task list * * Updated docs * * Added unit tests to the recent changes --- demo-shell/resources/i18n/en.json | 6 +- .../process-service.component.html | 10 ++ .../process-service.component.ts | 33 ++++- .../process-instance-list-context-menu.png | Bin 0 -> 18517 bytes .../images/task-list-context-menu.png | Bin 0 -> 22736 bytes .../components/process-list.component.md | 44 +++++++ .../components/task-list.component.md | 46 +++++++ .../components/process-list.component.html | 2 + .../components/process-list.component.spec.ts | 118 +++++++++++++++++- .../components/process-list.component.ts | 15 ++- .../components/task-list.component.html | 2 + .../components/task-list.component.spec.ts | 115 ++++++++++++++++- .../components/task-list.component.ts | 14 ++- 13 files changed, 394 insertions(+), 11 deletions(-) create mode 100644 docs/docassets/images/process-instance-list-context-menu.png create mode 100644 docs/docassets/images/task-list-context-menu.png diff --git a/demo-shell/resources/i18n/en.json b/demo-shell/resources/i18n/en.json index 9c2ba8c9ce..3b33c436f0 100644 --- a/demo-shell/resources/i18n/en.json +++ b/demo-shell/resources/i18n/en.json @@ -270,14 +270,16 @@ }, "TOOLTIP_MESSAGE": { "START_INPUT": "Starting page" - } + }, + "TASK_CONTEXT_MENU": "Task List Context Menu" }, "PROCESS_LIST_DEMO": { "ERROR_MESSAGE": { "APP_ID_REQUIRED_ERROR": "Insert App ID", "APP_ID_TYPE_ERROR": "App ID must be a number", "NUMBER_GREATER_THAN": "Value must be greater than or equal to {{ value }}" - } + }, + "PROCESS_CONTEXT_MENU": "Process List Context Menu" }, "GROUP-TITLE1-TRANSLATION-KEY": "CUSTOM TITLE TRANSLATION ONE", "GROUP-TITLE2-TRANSLATION-KEY": "CUSTOM TITLE TRANSLATION TWO", diff --git a/demo-shell/src/app/components/process-service/process-service.component.html b/demo-shell/src/app/components/process-service/process-service.component.html index 680eac1af1..4b6263aa97 100644 --- a/demo-shell/src/app/components/process-service/process-service.component.html +++ b/demo-shell/src/app/components/process-service/process-service.component.html @@ -47,6 +47,8 @@ [state]="taskFilter?.filter?.state" [sort]="taskFilter?.filter?.sort" [landingTaskId]="currentTaskId" + [showContextMenu]="taskContextMenu" + (showRowContextMenu)="onShowTaskRowContextMenu($event)" (rowClick)="onTaskRowClick($event)" (success)="onSuccessTaskList()" (row-click)="onRowClick($event)" @@ -161,6 +163,8 @@ [page]="processPage" [size]="paginationPageSize" [sort]="processFilter?.filter?.sort" + [showContextMenu]="processContextMenu" + (showRowContextMenu)="onShowProcessRowContextMenu($event)" (rowClick)="onProcessRowClick($event)" (row-dblclick)="onProcessRowDblClick($event)" [multiselect]="multiSelectProcess" @@ -280,6 +284,12 @@ Multiselect Task List +
+ Show Task list Context menu +
+
+ Show Process list Context menu +

multiple diff --git a/demo-shell/src/app/components/process-service/process-service.component.ts b/demo-shell/src/app/components/process-service/process-service.component.ts index b80519620a..ebc8959b0e 100644 --- a/demo-shell/src/app/components/process-service/process-service.component.ts +++ b/demo-shell/src/app/components/process-service/process-service.component.ts @@ -36,7 +36,7 @@ import { import { FORM_FIELD_VALIDATORS, FormRenderingService, FormService, DynamicTableRow, ValidateDynamicTableRowEvent, AppConfigService, PaginationComponent, UserPreferenceValues, - AlfrescoApiService, UserPreferencesService, LogService + AlfrescoApiService, UserPreferencesService, LogService, DataCellEvent } from '@alfresco/adf-core'; import { AnalyticsReportListComponent } from '@alfresco/adf-insights'; @@ -118,6 +118,8 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit multiSelectTask = false; multiSelectProcess = false; selectionMode = 'single'; + taskContextMenu = false; + processContextMenu = false; private tabs = { tasks: 0, processes: 1, reports: 2 }; @@ -526,4 +528,33 @@ export class ProcessServiceComponent implements AfterViewInit, OnDestroy, OnInit this.currentTaskId = null; } + onShowTaskRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { + data: event.value.row['obj'], + model: { + key: 'taskDetails', + icon: 'open', + title: 'TASK_LIST_DEMO.TASK_CONTEXT_MENU', + visible: true + }, + subject: new Subject() + } + ]; + } + + onShowProcessRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { + data: event.value.row['obj'], + model: { + key: 'processDetails', + icon: 'open', + title: 'PROCESS_LIST_DEMO.PROCESS_CONTEXT_MENU', + visible: true + }, + subject: new Subject() + } + ]; + } } diff --git a/docs/docassets/images/process-instance-list-context-menu.png b/docs/docassets/images/process-instance-list-context-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..f64a927c5dd17b7d807a05973156750bdd1a6810 GIT binary patch literal 18517 zcmch<2{_el-!8mJDG|#Yw@65)L{dc3GLMN28A_&WA`0Gx0B_sD!PB!jd=UlA`wvJ8?)}n6b zU9GJh-Rzv)CpT5f69_y6HPUf?@B8E3wx-OTJ=9YhhhhtYQqEFruF13;lZ!O6q93 zSMOqQ@)yZ*k%?xfmiTzdva~ebV8xUA`t2#lH&F`eI6CH5R8;5+{+wN+trldy`QwMB z-&sPTineydl`B_t1^IXWt%7~{7O_{O}V2tL0{Oa%=$WCN?Kt;-VQtNUF#1iP0?E7%~a!bl(t%aBKsd*VNRSW0hMxb1{+!I+ZbriRO^#$KV`?F$x8wg+6J z1a!X|SjJd=zLh|~lFZV-CzCHMBqUFTdr41`kHz**D3{dQlR2>h?mJgD?>xBfq!z%- zpPW_nl8T_~H5$n1cl4S}GtU=JJ?6-hlIrp*aTTc(SE4s=s`oHhkOV~ct?Ygj`+l!=CH>zCbMHe!o@|LM z3knIb798Otp6su%S|%#(c$|8!{o}Qy@f>HbDAx9_k@302jOfMHK-=eYBQg>%){+Z; z_q#i2OZD;-6rN@esqy5ecI_Q#v6s4e$yC*j5S>pRL*3UFtON1Ubtw#yffWg zBrtJ*L|KkkNXSj|ww>I|e%$eekK(?&JBXpC6k5nt-aIH7%dxmS@@r7H58b*gg|hZE zvArtvciPO$R?nmRG%^QNM|Y`mJ&qE&{Z%XTbPV3cnA@j#+W`V$UP;c0>F5`wr**AE zE5r30k!c|ui~KoPm=6pG#;VCEnN{v>?0GAfl5x&9YGdf6&{Al-J##lr8rzMY*n?y0 zC#v5)k{XZ`w)I+OwffLMUN}ZqzVvF z%^17k-d*Xwzw%&`YqH+#xw%m);)kH#by;CY>U>)M)%D(}C*PuH?|fYka}*P?^%DIf zE4csL$WJ$S7d^U4E&@TTkA;=BVZb#@-~Pe{;|azzE*}rmy{*hkaRsi8ZEbD*jG?N0 zKc>A!8XE>?R##VV%8Tn|F}H|p%B1`9FC=sj0h(0|NsOjs^B~ zcbm1vd}Qg&vyeV?$g!tvss8TX(08w2zee#ed*zvs%hpa)xJ|)#^XAQ>#sz;SYHMkk zJv)0vIp^V-h4F7*%X1@hb90wx2Or4$FZaEgqpY-@kho5)lzF z^XTeswG`JEm%bGEE>3J`6Z<(Zur|}UKOuKV`%yj$yQ0a8702lxHPh46*-;Nv_wL;` zCV{ta-`Y)R`SI{Eh9)QX)`YR#s-c`W=8sZnDO|{*NT}l|YISF6n6BTO{CjE1e`Wk7 zP0hCq^-EpFF7u-u-(ET;A8`{Ps_`-M((Kq_{@fnvSaQmGT=7%CxA0-Hii8VJgG`xFvPu5F}7*pD~C3_GH z*Tu~(FFvV5Y291Icc`CVd6tIpSBj$UqS3>_C-dUgx6f)BKJrscbsqm(RDFYfFK?u3 zI~Ms=hPMBFhoNnA*-*R-*4%$-W?*KZ5p!i;?qjewW=$M>g@ui+x7g);W2|Un-2P5? zkCZ`!A3}O-$_+XJyQ?nnw%)U8N)WZE@N2$*gf!Q0n{Z2(Duqsbf`LG2XZ^R0 z=HIuUfB)H1^;_z6Q#xeS$Iumj?zoyPqyDLysXw65_F1}~a9&!_0-#NE~;{Vjv z{{8#@Uw>9%O*~-rcUPC`d{kFg*K~i~#cX*3H{;Rgw1gh(&Rnx?+qQ+Vit_TtYrb&o zE|v9~U^tm)UM`@OU}a?$9UJ??vgYQKCnB-dD!14Vxc*e#bvt9kr25!3K0**pce$^$ zkkDxV?PG)Hj^AEr@iC5ndwDxV`+>~-^87_v*;lV$ql@>hudOs%6=1;|tt9e|o_xT6 zzs^S(_W+KPy7+0zyDUl0H=E`*m#pV->+VpJ#HG*Tbf2`?$}Z2^e0$+w5x6$rkz*Jd zV*Ta0ZOcSYd19ih`>-yr&-&_-kI2f*7N84djnRq z+B{b8aUjMF05Hy~kZ#rdO9{ttGzr#+7+Zn)g=t%X*CJe>1r1vs+%i=i|qZ z&CL-ZJ_}#lG!1m0~KR`Tkz-qu^Zi#A0@s)J8diyG zo<4or({rIVoYT$Ct#WPQ+v%q!2WZ`JUQ$w0c1qg3t*H^kcv_O=e0+Qoo*rF2Rg^@f zmsKcn;B|dNLv}}l-|O||UwOiYxqdisTefUT$kk}-oAw^vyK6J$@hrt$Dtk3e&0ANl zyjhwZ+D=1*BKF*>KB^{+EiO8`_|>af@1v5E&voRN_;CI|eR^^H+LrEDUVGC#$G^tM z$ERmxoH=vmV(Ic!i`}5m$Nckk&GC{MTcnFGcIIN1{HJT!Ec~W}GctyL*55sK>eNN& z6_bg)%5|FU+cmVbx?eb)Ie9Yjan32pOAZb={84xBh7Oa9N}%21L^t+i!~DUtWPit{q(#-`}T!~hZjA6ezCWrTvyN!`-GVO z=+V!gKaGrx>`Eu5ZeJL@<%0D<{j9X_$mZyJ92VBN*c;fQ#eLYhFC#g?1eMf2S22}= z=GgnTepA|m4qpqgr6MCEu^(5&O}6;SALHRU`=!8|G4yS1?PF9~k`;E(!~~j{Jko5Ia8ZHVqsxHNl6La zq^OiF)*8bvKJoqal}&4_tGO1H^3Ht! z&Wwk_+uIvWf`9Mc{br?wj~c6^cd2WWRLm7Gl_X>((t+5u?^pk6#>t&$HS4BG#9em(QI$$F0fk zKK9vVcCaa(ru(l~$;g58we6SF-L;c3_PLR2Ee*b?;O%U&CMil`tfQ5sDe~EEe4o+% zuu(3KP^O~qRjx0GCBAt1GWl4bJh^!VE9T?$@tVB2giZ8ivT`F=R}j^lg@a@C*DqPT zD~i^ul9GMQH*e5$Gk!oD<78%Tukc?1;X--YCFesTkq%z^?2HmC(&)O_9xYnp{JrYw znU@O_-Hk)D^t+B0yA3sGoyrh1F5r`pC^%Pry{OY*er79wy=S8#4-<}0>z%JFOFl>y^}gS9N46J1B7q~>ut zvV|X)tn8Kb93yXa)PVW%Z*jjO1<$x*M$kTkf(X1(^;UG8hxpRa($;?W-;Rigz_FH+ zkjM`AlCy8m#8Bq11z?|JQ{HAL1U0ldGkW{_-o~N+@ir9mQdGFTV}v5sy3yRTYG_tN zRD?AwZoh@O{T{%YO81eEgH4Gzuz)M%bEn6znA%!XQ}gZH8ULq67dt`W%wKsrbeDQ; zXBE+v%D;H}%QbmG-*qD0ZH3OvlY4x9S4xk>eX9)IIB{bKkytIR67k1KZ)ITHV=XOB zO%!w`l6v|Kpad%`E6`rVty@1&e;2#^du6h+#&Y^yX3V50{^Q2?>Kn7O zv!Q~LlCxMnk;a}^UU@h|8|#aeaz~GfSyY%(PZ9|!H1hX*QWq2Cd_8q_TSJI@*sm}B zysJ|i!KFdsJaoyZ%zOH=Rw9WvGAHL(9d{tPiQ)`wtW<8CH-4cJCx*SDrlmzkL&FQ^ zJ>4YT%g)XoExPldovxl%NKW7IjN9iLPX8VhKvnVFfLZ4YQIj}xcpIZaWQ}#O>kPm8Lrl*g%4ZcSOTwPn+d3|?U7~B3&-a9CwujZ>B_mvA+ zJuEK%tho5|yLWbY^T&@Ln_jlD8GK@l!d-y&g+sHvI5~-)GdAW2IBnaK^whlk>({R` z=nk2gcJJ>U`0(LFo<-%t{Je*oTh4oJ@-e%A`1_9^RpmzmR*Pd|Sfsf)I7z-@qZ4*Ooo@?#;k~Tv=JE^jp%?(Q!hZzyUwcZc`t{pP!!(=!3r= zI&>(zd~UKgIq_XXgQf8&;6Q=9z-?arwc(`pQjd$AoQc>!mwL*M95~=I^Ru2@Zf9nE z>b6j1Z*rh))uXM}1f0V;zkTag*RyligtmkT9zN{dnsOWi0CFB`Nj9|5;Ee<&Igf#& zw&%ph8*6Hkr|yMQZv~)%`b1}Er}V*t(TNp4^Y*B5HI@g6a)Il9D+}YOGe>;p?0kGm z?Y;Kx+lT76I5%hd;*xP)1lM^>%N^YEmuziSNG>ie4^?hQgoI2jEcE1`SIOc+J85ZZ zazH=BNF=4Cn%=#8R#^CR+PlkCSU9J>y&dKMkW-Hz2m@eaz$C^)t41&x1+YOil=GS6 z;oZJ{`^AeFJD%hi<}LsJ?L4q!$Bxm9+o-MrR7qX>d?)0|lPADuY9xF;y7g$7lCrW7 znyj}s+IGy>ypj^o&L-?B4H8yldVbzuy#2$6e4JF$BN;bghOGenby^l>-XB_8Zij%S z;w&nVux|m9|AI^aCDC6`W@ta)<>k#aEphF8O_A#rVo)tkE1hcYXlrZht$HGj*#SIp{0v*wwKBH`R~59SS4fJ9iDj=R7gVgyG-@Rt0>04D z(aAG@Zj&to(aV$J@}{e0oEx8*>Hxz;rSoU_D0I(B7{T(5Sw# z@l1*9K(R}|elXrpK5)HEQ(#XTPij6WAy0Xr-6nZFsL zuCDIbTe0>*g&P1Kbc|m{CV>pcr$;+-njgqAMUr^y-@VKHut?4QMCc_8`GGL#LpaZN zA9!P}!~X&)XDuzOnrLWg?_(FEIB02U`Oc3TaQZIJ&YnTb!)`O+clh>#OUk}|_`^d^ z{E?xPT#!SxWlO-u+T!=`-+^qfgMNK_dZy&eU`09xkR)lV?c#EvS{zjbu#8lA_RUoQ z7~n8-KE}<|)Ih0?_P z2zp6{`hWBnzJK+X59-Gg2`LfLa>Y4u`UjsH1Lev1{dUG5`VNs8F$X(4daKXe@Q38U z^~=}^iH984*Cqoo(g~qFe9pM7X#H%~*Q=v9yd6us4*htg^CAoKtKId{&n6QZ4tMU} zeeN?q3W5eqmz2ZqmGHp&i(#I*v9WQ!h;XDT*pfPlwwjNRuh8y;VopyLwQ{-do%NU3 zR1M7QPXz8WiKMD}N5SWNf^wpCYwXCX+UMy+v zeAUJOYgc1I*X1xM9pbbPOGC-J53mK6eywt2<(R?uA2nfQCXjFBhvpaP^GZseu~WLS z`*N;N)^eQC`l`MFXCd#l5Y;1xZ%O6v;T39TxW0JyQdfxK^62Y^Q+@$=eh)w0B5EK+ zV86c4V=-viGNAyiUktF?sdpX91P-8b*%VIn+}y3Ou-U~$`t95M#WLw=Y5CHCpRh$X zrmE>Vo-EwZ5{t`O-&5Q#d%Lb5rOBWsJK`bz_piHmbsp}UzU-8=HCOZ0;pE-C0jnp? zN0qF5J+8LxdZMIb-h3iSB(Z2LXN==rW9gpX!gpdm>$JgEJn(azgXtl1*wFh zT>?ixC*&u;Z>)dhd=BirM6OVOgu1I=5?wX@p*u ze)3})8NXlV-rmKjsoz7H_Rh@Cf=i-5m0Q-(badeuY^S3b5>UwPHvw6B>A1C{Pd14 z4N}!Zvv&bBBk@yu`}e8HoefWzwb(Uy%qU~*)kJ0Eb9IUQQ=SPLN*AiwRg}WMuV%<* z37+_VIoU|rdtv)&E0gsIg8dDjYe5%j#A)|1hW@FzJ2_8jaglt^ySL-)rRl2y6N#CZ z8C{g3{NdW}}Up>FZ4WsU0#Y&gD<0%32aUezFJ{7XP91+JxR; z*5OjMuqt$Tht>!wdu`Ga7mbEM1N+Oh_FIXO$IqLqu@a~Cnk5|e5_J^(h_jIvqUBsc zUb;1eYH^xiMLtH~mB60;sK_DyHLPwuO9Yh3rpc8%g1eUBwDH8TUTk+*ys0$AuAj7HzT zW&Mw10e&_%0z_+T>n0p3s2C{m>+9>L++msmiN^xhK}6&?R^2*6TsaI!--|C^)AskK z4H9CY2}arY#gisvcH^cyH(@@(=1U+iw> zH@+|O9v|9X1ljT&gafE2Ij5h_EH3Uv$p-nULOXeI#H|*+7BT~AZgt5`MWqfsKt)-3 zaA-(HNs0L3$|mZ!meVMaXk?&ViFfX#e3zc(&VEj5nh5hJO^VRL$FLQ9XgQsFzQ}91 z@;C3}dP2a*eT-`CEA>^G$FDv&x3XGWXA!<}LGsF+X0VDpt8!rTq4h%YgPj8^F|ErC z4ps^XkSBISlE4{z@!|#PAmpftf>4G)qWP|^?Jj4F zN{%zzPi8i@i>17}ld#I-HETT>3>>zbd=N1xHq{NxD!q4OV-xd<2dbpEY(mGn-^EOsD^1TNb+*3>`pN{3Iy$OOf_|Jm zR6Dig2k&ca>{3VfEU@d5!1dKmi$F7bH6W6&?3uYT`gD}07dA;LX6d_@pUCFiu}*xd zdbPA>M&kSztzSTFFy+8i`eN)dTfpmH`L8H4U zgY5O37}_^3-WUyPRX8H3|J_pyzm`Vw-gdq@eX@KSat;K004@_FBWHd&-vz(9VWQXa zB9;M^yx%e2xY+p|o}hAhRJfxQLSQe1Lm~?^^B;0P?e+C)Op|?q(ccn2R4vf7s|*CB z32ls2xiA!VLO+|GnE?Z=EvKcW9sBUGuE4snVrh^wUGEFvrsL0Zm8b*Y-&*0(n0chz36vf_-#iFi}7{URdo z8yhe7l$AUd-a6mYlqj8e@PZ{UMR$@OC~4t^Q+k|9A^tF~EK>DXRaITRN~zU3@f5;=|6;dS7mq5K4kQHd4c4$4kJA*v ziU;gkc^uh~Hv{t8HYIpWbd?lr$GHQP$@H4+84Y$V@dFSAj%1_>=8d#_8$y(qmyhZ4 zH8nN8bm@{*9H0;|z9YUspC5RLjMbpH3Y8dZ9cNUalRR|jlRHbHw$h%~=_S9XKJss% zfR);J2sz5|@%;p5>gnm}(n#0a$FOy@Se`p@bsB`e@qq`xJEl5D2w**4l~2a?XGl_# zIbdPr9u@ZMSwGLGS(N+CqZ2oDK1~}~gl6YDpx)64uyHydk>gLu#~+z#aH1=qI|14s zy7ajfvMO*pz}njS$|S@T91}% z;=3c1j#t3*fG|#=G9dfVony`%78d>mGzzK%L6yW8sai~JJoNJ?S##UBPmPB`Gg-bo zaAW=UE;*Bzjt^pD3>+ODA<%wI*8plOJy*RYOMe+dPf6hci-Sg6R(6y(;lO!i;443W ze>P}rn2=-SGM;T<5wJ7>6~~}4=l12KJ9qBH#@5Om-Y+M&1}5A!Tqe>OyWBX|Q!abp zz=8ey^C0kL>F1i4n}GSj^T43xFKuN&L}!#GFE%GWgoun6}QQ$ORhHWpxlR_5At zz!mP^y$gY&rCLB_AAk%1 zb15kI9TI^XYhIXvVs_n^03FoSH$FU6$;iln1MmVki!t;kzQ0DS$OXu!Ad>L0*u+fV ziNA;N#42X0N}`~kn3$N@w1pPdBcAFTrZC$e$ENvy2~y*QfB1;-QAM={jx<6%R&wq${X* z>Xd_n!`-MT@Za?>w#h|Ky-6XU!wVoj-j^@WkF?c+)=03dKnH~OaL(TTE0h3uY^Mv2 zO7=+N+<*+FldLXW_=08q{Q2_>oC*7mn-{~3&YVHpjWr?LV?PiR;%OQ+fyQOC-* zFaBiWwKR_P9ot59c`!N3|3{?i&++l@%D}++DzqR_SQpS}%lyN9d{zz7`^b8#-_p!= zI!;AJMd&rXXKq0ICG(f6;O!vW3s6|5rUYNTSK;=bn;SV5uX*}~v2OO)QKy@}e`n|xThKd_P;sx*R$ZcG=W@Kd4zwH4Rx@%9!l3zu( zJWcSA?v?E0#W$G=Lg^@c*y;UZo-*)uq2-?`vWJB0yRq(1W~wlWL9!>wg4zkAOP8K# z3TS9(2nz|hy0|Q1sW98xB#h!W79a!8=%vrkFv|^N%OhT1hTTI)N5>C} zS|S6_vL6KiCiLyl(C?#9D*X1L#r|G{-GD%n+kj_zt{Zgzy$M0ureC^-;Xg^lqis88qyI1K1|GYbo>Td6<> zG3h7G&3hVRgsmmw6;toYcnA^Au!J=?Szx$|u#&mS=qvBp!SK<=0G!@95#uVYy#fMT zsHwM8QKsu1v2Ff?*VW65Ea<}#@EZS`ZsPyu>Sml+jw7y*6nI)YJJC}5XCbAuSQOfw zw6jBO10Q2F`xm|Z0U{xmLdlx>l~)NKFMas%=f=jc5c!ocN%(I38nLSov7l!5X|s=g zEzILQc7`UK2gEDrb(Vy049R3AJk`?kkT01yYwpqqB5iK>C&R*S!fArlGl)I;-3 zR3AIZW;J8vPpTquBXC3F~lg=4DjO4?h}w$16HS1 zIu0T7fmXMNm$%((4&Q}bCka(E!6sl=2iXE0-E;}NZQ)k zrlEOxd0XtaaPY@9;(65l4;_XGh$ly5I0Cgdf=l))Ue~V4$;naEaqz{c@6}3hhfuOd zCF1Di89o^q6Fx?lFA5}ycyc97N=h2tRL2CZ-W+e^Q2Ef6`zEEXuTU~|f(~VnYkB_( z=!|u8)cIIbAcNg$a2KY%%kJG{UvBB&vfs40Z+yIoF0#AmqM>8Wg|^2>WMvJ<|8#3Y zeailRRYQ(*dkT#{cSiPFp8{i0EPxnltWMI=3sCQ}j4ku;CF;tJ>IgD#*}OT6Tdz^x zC^F>9)2FZo%FD_QeiME8Ro3SQc{beAmu9I5Eb$W7>Iw=9K0Y$UeK8Hso;`c?=#gvO zSZ7`@IyPciUvN-d_(2*^3&oJ$%9%%ouicnX1==M z>gGnSAb)OSx=y?E$LMInojbZ8u6?AWq}(O%cNnA-fUT$4(rdO_pzhp z1qu3D4}F3le8E^j1G;<}$~gJO@sy|C2~L(yvb@8`N07pZG{GW`tjx>@9lMOmD~G#v z^4?yi3@UvnlL)cox1ap&Iwl%2e8BNRwa~4MJ%0J=+MQ9E;WAD*}?V5A*U`3Ph4yq{YSil3LzytwmDk(%`QW5@{Q&J#3*Q z$}1o{$Te7q#cdB(%uO{8KDAkuGRPz&AXHkq$!sHg*;s|7nELF}HG%>cbf2i8_Jqx- zygE9!!zgxCi*L*YoaduZFzc@hl2vCF)kBIJCH0H*13x+sCb2S#`V%KHL}d%dUNI{IIeMx3dk7Acx*0fA0axOe<)~O5?9Q|j;@L(xsL*kogfS_2++@EI z;7vX8veG9so0uXWWx(>{79SyVk9FeaY;oP>Etw$-Jc7PinLdQ*<*nyL^au|6C%I34 zF(z2YjBlK*3@dIpfWTFdOs)U1M!DgKT7=2d^}d_4oi!+;2nw6pD>LnA6y^MiK1q!P3BArp}?g z=cbE3^xBG0+5eO;`|HDQ>Le;MI&mM-laeNDc4=v899i^)Al8qu7jM8Q24EANIQ||q z&&$~v)>%<$9a=LiYXI-gQFDX=lTY)#0j{0wD(Q#FV`cTWU<`y6Ma*7y8xjd;(C>0y z5eS)VP!QKwXLSq>4H4quMI8V&IzY@9@kJ;M&Mf0e5G1IQ4`O3Imu9S)nC`;jEivr@ zi$~H-HT@&x#LwTpVZWka*1UcD2&eqnGiOk6t%QRo$9aMKfu@e`(&1yIVaD;+(0RJ}>+;6Y7oZF#prTH=?lU+o8PQxbFy4<=L5RwJoK=7#!9_);1g8dOvS zU#hFB0Awxg?Gw-i=Q}MpIXIM+l;r%E+iPlIL|CC~L+b|10X1L}&=i-HY^<-}Mo+(i z%v*_8z6d816DDL|q^h2t9_-tr@D(w+=-h>SU|z&5&j_mmQgpcLNYc{^oHpscQMR8*AB`+F{P!zU3? z)3YyoG5>4)#9A6lU2#vjZ?cR>c1lVRS{qr1M{EfG9z+LK2-#smU#R5hAZc{(t>ZpjL|Ly#j62M3iLBYNRW)wBRmaKH?9a8Uldcf8z z5;%=Pm$3^wG*IGRdHi~;E0|p}podftIlTx_Y->xdziz>B$?zYrv?$-+moAAI0>mC0 z92n>r>!DEp;FlN_0?-sHC?cYnr9ZQ@3YhZk+c#i}1H!`OaDqr9nN7eWo|NO2zVH!2 zo(bSn_4JP&9R>!?{nO~%SgO5ojhBy_!`liS#=GyJrw@b(ckjS?^`?Po@8;%asD$uM z1_uYNTh0Zsmb&zB@%nIFY8(p1$46?4-@oN4LtxHMoaTyFxBj9$Dr;qHn`e}t2Iff< zT!p64(NP4V_U6qS3iKZrPa!aN6^bZJ1IlpZPLMp;he+{SPsID|3F!OOR zT9K*ma<2?n(;q-?@TnckgajXN!Lw&mGc$V0){c(yEMdJX z+1NOD?j$P-?d{RRE$`pom%4}~RqWHJPeVi1HrCf3+`o@-CM2*~%mwH+VobI+Hmocx z;X5S-WMs(6J$zem`eVfq3N2y(nv$dBB%4f61 z0_I2bs87QfG}zEFCW|@{Fd?T1ldzcG6K}&!@=GaFH{QKV2`Ins&YN%109F z?OW16B6DlQ4{yWLf)>Ka#id2s4=Z+ll*Q{<_}@Nki8Qrt1bv1Uft&q`!ZXOw2zcd- zT(q)+KT65O#N>GT?AgAq5;tf=PLMQUWPbhp3aMu3bg#T7bA^C~$06}4-`>@YKR_;{ z&G^N|rw}cmr>93kfLq$p6q~Upe+?6XC3{s|eD54;POWpChKOmgGgPi$op}IYAOT(B zB1l&+qc@qEnIS50rfrh3Pt+VV$5bp%Jv}xyHX)bRF6*C`EAGcM7PyuiJ$9@zjb77% zo@=YeB{1KXDULsE_3rmd_ z_Yv1WW!rYl?`Q_SUvhPIC5H{XCQJ>~5K}^+EUWa5;saB$UNlHF*3oBIbBu9M70pXH|5Bs6%0H7g^R?_&5{*S{vtYIw=WZ8(sd`L)t{z*kwxsxDDjw4H5 zp0Ubpc~e!zd+btZEI>`tW&+p`tCB($3=ycCVnE zBp-IML>uaAyt!pMuHFib?ZJWb*Ry@~rPwwd-c-iv6jNT|2iB=C^_+7%Ajm=>gzB3p85`n09n8%S)$M%SMKV_ zXMHUNz3qjK1A%S=&cgV(KgQmW$4Ml*VCy&Rx6s!wL{>AgMf;cb_0Za-8^DB-~g4sapo| zk}Fq^V>~D}B@O^UAR~zPkrDb3EgfCp@9#HY_&`njy}Vot`ttZO+S}5@+w#kh zZK0o*mzSgc!Kcx$+t{44=MGg$IyxTS9U!xz8Tfkpwr$X{>JgsEfgVMU!=s90 z4Nl$I!G#J^f@3sa4*Xt>t&*PoR{Z_@cu6c=Cm^_ah2LcqD=2e+`yEIk@kR=w>H&d5 z{d0f>hUG=OXTKf~B!efw9+<&AKQ()G=D0tbi=Zs%miiH7!jHl1#%P|T3%oS_A zxI9vzvZS}&Yq<40+~)MyeMPLv8w)11Vq1#CA&yksQsuM%_^2LYxQ2szk@}YeLOY|W zEY;VG@G)T5Ajm;_^cOkSHK@iD{f{g zF-=NNw)jA;+)*<9#@WjYRYulp+ua>spPj2lUjaBiLBd`^>K4a}Ev$yjE}L-HMG@Tz+Ko!Aa=))N(G{V zKbQLEt6~fqM#D6+!Q9;3Xbeu3YY=q?5^^JK5b=FtQe=-Q>(cm}vw;gS{Rd~8g)OIZ zY%N;$#^mrYJ1gtsdX5tYNPq>o(t@Uaes(S)H&`HF&eaJLWO>ic2b90je*GrJdha)6qrjkiRh6NdsE875z ztuI}IkZ)z6=I6IMH_}Fyzi>?fihM_33PFZ)ktwKodUjUUdx}Tel!~0~#+ zIatvJA`whe6mJ=R{+gzyaL#+npg@>d^b(Rg$|7oc|3~E@FLJ{k1z}QCL!;3Nu>%5x z$}s8%w}IRR&}EwwrFBwuA^y{H%aiAT#Ehk3WOSYWp~QPLBEr+dqeFF#VsyKy5{=2Y z#l|w($%isQ?m(k|6shuo7jojdtn3fe{7~l?BOvAnjz{{fQ$b3GvXv z1b}4-9nzORPvr%!<+MKmTf_}C*G-FHBN_sCiIItkXAq`X{JbA`kq}V8wUDgEeH04D zafNcpgA9bBVWL$IHhSJ9wK z{Qd1?>nI9%731D!ZtI&j=TLxvWS+*wbz&=`b9vZ2=&|cge}{@>YHO=8K0U{SDzt(5dk6xCned1Z@eTF~8VpVd#KyQAhdY)4+Vu{) zsk(n0^>)VD1mwkfWnDXVb<02NwG)D3G3e(;CMGk8N~h!2Mkm)J)Pj5yMY`jY40iiE zh#4a2RXFlYC-JU8d?!fQ2(Swf;{njPgu{>INm+Th5-*YHG5$5?j0@%+<4)H;Y*Ff7 zUsrdd4#N8g3X&iBDdEt?Lxoo#KufO*~B4-(7&)vrFeOQqVNKm50#EM1l@*w_LB0+6yn4xqwh z4jWdY1!KkG)hI{&QR37q-(4nk4iAL}KyLiEc1j{WQ!LO9EHOASL5`I}Rt^9IPsrV) zzd7&OGhMMbjr5NK4hRTP;$}C9`0)e~gKm0$4j(e2Mf8pSpLzTV!L8v(@dzyHvb|CS1f_pN3cPra^|uJ`wKb`-^D mH~&q+G?bSN{jvGK(t! literal 0 HcmV?d00001 diff --git a/docs/docassets/images/task-list-context-menu.png b/docs/docassets/images/task-list-context-menu.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4990aee458749fcc1479b037ed1bccaf72f40e GIT binary patch literal 22736 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 | Emitted when an error occurs while loading the list of process instances from the server. | | rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a row in the process list is clicked. | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`ProcessListModel`](../../../lib/process-services/src/lib/process-list/models/process-list.model.ts)`>` | Emitted when the list of process instances has been loaded successfully from the server. | +| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | ## Details @@ -186,6 +188,48 @@ The Process Instance List also supports pagination: ``` +#### showRowContextMenu event + +Emitted before the context menu is displayed for a row. + +Note that the ProcessInstanceListComponent itself does not populate the context menu with items. You can provide all necessary content via the handler. + +```html + + +``` + +Event properties: + +```ts +value: { + row: DataRow, + col: DataColumn, + actions: [] +} +``` + +Handler example: + +```ts +onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { title: 'Process List Context Menu' }, + { ... } + ] +} +``` +![](../../docassets/images/process-instance-list-context-menu.png) + +This event is cancellable. You can use `event.preventDefault()` to prevent the default behavior. + +The ProcessInstanceList will automatically render the supplied menu items. + +See the [ContextMenu](https://www.npmjs.com/package/ng2-alfresco-core) +documentation for more details on the format and behavior of context actions. + ## See also - [Data column component](../../core/components/data-column.component.md) diff --git a/docs/process-services/components/task-list.component.md b/docs/process-services/components/task-list.component.md index adaa840e61..15ec26bf81 100644 --- a/docs/process-services/components/task-list.component.md +++ b/docs/process-services/components/task-list.component.md @@ -73,6 +73,7 @@ when the task list is empty: | start | `number` | | Starting point of the list within the full set of tasks. | | state | `string` | | Current state of the process. Possible values are: `completed`, `active`. | | taskId | `string` | | The id of a task | +| showContextMenu | `boolean` | false | Toggles custom context menu for the component. | ### Events @@ -82,6 +83,7 @@ when the task list is empty: | rowClick | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when a task in the list is clicked | | rowsSelected | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when rows are selected/unselected | | success | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`` | Emitted when the task list is loaded | +| showRowContextMenu | [`EventEmitter`](https://angular.io/api/core/EventEmitter)`<`[`DataCellEvent`](../../../lib/core/datatable/components/datatable/data-cell.event.ts)`>` | Emitted before the context menu is displayed for a row. | ## Details @@ -228,6 +230,50 @@ typical tasklist: You can customize the styling of a column and also add features like tooltips and automatic translation of column titles. See the [Data Column component](../../core/components/data-column.component.md) page for more information about these features. +#### showRowContextMenu event + +Emitted before the context menu is displayed for a row. + +Note that the TaskListComponent itself does not populate the context menu with items. +You can provide all necessary content via the handler. + +```html + + +``` + +Event properties: + +```ts +value: { + row: DataRow, + col: DataColumn, + actions: [] +} +``` + +Handler example: + +```ts +onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { title: 'Task List Context Menu' }, + { ... } + ] +} +``` + +![](../../docassets/images/task-list-context-menu.png) + +This event is cancellable. You can use `event.preventDefault()` to prevent the default behavior. + +The TaskListComponent will automatically render the supplied menu items. + +See the [ContextMenu](https://www.npmjs.com/package/ng2-alfresco-core) +documentation for more details on the format and behavior of context actions. + ## See also - [Data column component](../../core/components/data-column.component.md) diff --git a/lib/process-services/src/lib/process-list/components/process-list.component.html b/lib/process-services/src/lib/process-list/components/process-list.component.html index e67ec4916a..4469bec092 100644 --- a/lib/process-services/src/lib/process-list/components/process-list.component.html +++ b/lib/process-services/src/lib/process-list/components/process-list.component.html @@ -7,6 +7,8 @@ [selectionMode]="selectionMode" [multiselect]="multiselect" [resolverFn]="resolverFn" + [contextMenu]="showContextMenu" + (showRowContextMenu)="onShowRowContextMenu($event)" (rowClick)="onRowClick($event)" (row-keyup)="onRowKeyUp($event)"> diff --git a/lib/process-services/src/lib/process-list/components/process-list.component.spec.ts b/lib/process-services/src/lib/process-list/components/process-list.component.spec.ts index 16bac42410..f9ce269517 100644 --- a/lib/process-services/src/lib/process-list/components/process-list.component.spec.ts +++ b/lib/process-services/src/lib/process-list/components/process-list.component.spec.ts @@ -15,14 +15,14 @@ * limitations under the License. */ -import { Component, SimpleChange, ViewChild } from '@angular/core'; +import { Component, SimpleChange, ViewChild, OnInit, Output, EventEmitter } from '@angular/core'; import { async, ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; -import { of, throwError } from 'rxjs'; +import { of, throwError, Subject } from 'rxjs'; import { By } from '@angular/platform-browser'; import { ProcessInstanceListComponent } from './process-list.component'; import { AppConfigService, setupTestBed, CoreModule, DataTableModule, DataRow, DataColumn, - DataRowEvent, ObjectDataRow, ObjectDataTableAdapter + DataRowEvent, ObjectDataRow, ObjectDataTableAdapter, DataCellEvent } from '@alfresco/adf-core'; import { fakeProcessInstance, fakeProcessInstancesWithNoName, fakeProcessInstancesEmpty, fakeProcessCustomSchema } from '../../mock'; import { ProcessService } from '../services/process.service'; @@ -527,3 +527,115 @@ describe('Process List: Custom EmptyTemplateComponent', () => { }); }); }); + +@Component({ + template: ` + + + + + + +
{{entry.row.obj.startedBy | fullName}}
+
+
+
+
` +}) + +class ProcessListContextMenuComponent implements OnInit { + + appId: number; + @Output() + contextAction = new EventEmitter(); + private performAction$ = new Subject(); + + ngOnInit() { + this.performContextActions(); + } + + onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { + data: event.value.row['obj'], + model: + { + key: 'processDetails', + icon: 'open', + title: 'View Process Details', + visible: true + }, + subject: this.performAction$ + }, + { + data: event.value.row['obj'], + model: + { + key: 'cancel', + icon: 'open', + title: 'Cancel Process', + visible: true + }, + subject: this.performAction$ + } + ]; + } + + performContextActions() { + this.performAction$ + .subscribe((action: any) => { + this.contextAction.emit(action.data); + }); + } +} + +describe('ProcessListContextMenuComponent', () => { + let fixture: ComponentFixture; + let customComponent: ProcessListContextMenuComponent; + let processService: ProcessService; + let element: HTMLElement; + + setupTestBed({ + imports: [CoreModule.forRoot()], + declarations: [ProcessInstanceListComponent, ProcessListContextMenuComponent], + providers: [ProcessService] + }); + + beforeEach(() => { + fixture = TestBed.createComponent(ProcessListContextMenuComponent); + customComponent = fixture.componentInstance; + element = fixture.nativeElement; + processService = TestBed.get(ProcessService); + customComponent.appId = 12345; + spyOn(processService, 'getProcesses').and.returnValue(of(fakeProcessInstance)); + fixture.detectChanges(); + }); + + afterEach(() => { + const event = new KeyboardEvent('keydown', { + bubbles : true, cancelable : true, key : 'Escape' + }); + document.querySelector('.cdk-overlay-backdrop').dispatchEvent(event); + fixture.detectChanges(); + }); + + it('Should be able to show context menu on process list', async () => { + const contextMenu = element.querySelector(`[data-automation-id="text_${fakeProcessInstance.data[0].name}"]`); + const contextActionSpy = spyOn(customComponent.contextAction, 'emit').and.callThrough(); + contextMenu.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + fixture.detectChanges(); + await fixture.whenStable(); + const contextActions = document.querySelectorAll('.mat-menu-item'); + + expect(contextActions.length).toBe(2); + expect(contextActions[0]['disabled']).toBe(false, 'View Process Details action not enabled'); + expect(contextActions[1]['disabled']).toBe(false, 'Cancel Process action not enabled'); + contextActions[0].dispatchEvent(new Event('click')); + fixture.detectChanges(); + expect(contextActionSpy).toHaveBeenCalled(); + }); +}); diff --git a/lib/process-services/src/lib/process-list/components/process-list.component.ts b/lib/process-services/src/lib/process-list/components/process-list.component.ts index 502292995a..5cd9a1a8ca 100644 --- a/lib/process-services/src/lib/process-list/components/process-list.component.ts +++ b/lib/process-services/src/lib/process-list/components/process-list.component.ts @@ -27,7 +27,8 @@ import { PaginatedComponent, PaginationComponent, PaginationModel, - UserPreferencesService + UserPreferencesService, + DataCellEvent } from '@alfresco/adf-core'; import { AfterContentInit, @@ -110,6 +111,14 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC @Input() selectFirstRow: boolean = true; + /** Toggles custom context menu for the component. */ + @Input() + showContextMenu: boolean = false; + + /** Emitted before the context menu is displayed for a row. */ + @Output() + showRowContextMenu = new EventEmitter(); + /** * Resolver function is used to show dynamic complex column objects * see the docs to learn how to configure a resolverFn. @@ -284,6 +293,10 @@ export class ProcessInstanceListComponent extends DataTableSchema implements OnC } } + onShowRowContextMenu(event: DataCellEvent) { + this.showRowContextMenu.emit(event); + } + private createRequestNode(): ProcessFilterParamRepresentationModel { return new ProcessFilterParamRepresentationModel({ appDefinitionId: this.appId, diff --git a/lib/process-services/src/lib/task-list/components/task-list.component.html b/lib/process-services/src/lib/task-list/components/task-list.component.html index 33f805cf8f..4264ea60e3 100644 --- a/lib/process-services/src/lib/task-list/components/task-list.component.html +++ b/lib/process-services/src/lib/task-list/components/task-list.component.html @@ -8,6 +8,8 @@ [loading]="isLoading" [multiselect]="multiselect" [selectionMode]="selectionMode" + [contextMenu]="showContextMenu" + (showRowContextMenu)="onShowRowContextMenu($event)" (row-select)="onRowSelect($event)" (row-unselect)="onRowUnselect($event)" (rowClick)="onRowClick($event)" diff --git a/lib/process-services/src/lib/task-list/components/task-list.component.spec.ts b/lib/process-services/src/lib/task-list/components/task-list.component.spec.ts index a7c915514b..eee621373c 100644 --- a/lib/process-services/src/lib/task-list/components/task-list.component.spec.ts +++ b/lib/process-services/src/lib/task-list/components/task-list.component.spec.ts @@ -15,16 +15,16 @@ * limitations under the License. */ -import { Component, SimpleChange, ViewChild } from '@angular/core'; +import { Component, SimpleChange, ViewChild, OnInit, Output, EventEmitter } from '@angular/core'; import { ComponentFixture, TestBed, async } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { AppConfigService, setupTestBed, CoreModule, DataTableModule, DataRowEvent, ObjectDataRow } from '@alfresco/adf-core'; +import { AppConfigService, setupTestBed, CoreModule, DataTableModule, DataRowEvent, ObjectDataRow, DataCellEvent } from '@alfresco/adf-core'; import { TaskListService } from '../services/tasklist.service'; import { TaskListComponent } from './task-list.component'; import { ProcessTestingModule } from '../../testing/process.testing.module'; import { fakeGlobalTask, fakeCustomSchema, fakeEmptyTask, paginatedTask } from '../../mock'; import { TranslateService } from '@ngx-translate/core'; -import { of } from 'rxjs'; +import { of, Subject } from 'rxjs'; import { TaskListModule } from '../task-list.module'; declare let jasmine: any; @@ -807,3 +807,112 @@ describe('Task List: Custom EmptyTemplateComponent', () => { }); }); }); + +@Component({ + template: ` + + + + + + +
{{entry.row?.obj?.startedBy | fullName}}
+
+
+
+
` +}) + +class TaskListContextMenuComponent implements OnInit { + + @Output() + contextAction = new EventEmitter(); + private performAction$ = new Subject(); + + ngOnInit() { + this.performContextActions(); + } + + onShowRowContextMenu(event: DataCellEvent) { + event.value.actions = [ + { + data: event.value.row['obj'], + model: + { + key: 'taskDetails', + icon: 'open', + title: 'View Task Details', + visible: true + }, + subject: this.performAction$ + }, + { + data: event.value.row['obj'], + model: + { + key: 'cancel', + icon: 'open', + title: 'Cancel Process', + visible: true + }, + subject: this.performAction$ + } + ]; + } + + performContextActions() { + this.performAction$ + .subscribe((action: any) => { + this.contextAction.emit(action.data); + }); + } +} + +describe('TaskListContextMenuComponent', () => { + let fixture: ComponentFixture; + let customComponent: TaskListContextMenuComponent; + let taskListService: TaskListService; + let element: HTMLElement; + + setupTestBed({ + imports: [CoreModule.forRoot()], + declarations: [TaskListComponent, TaskListContextMenuComponent], + providers: [TaskListService] + }); + + beforeEach(() => { + fixture = TestBed.createComponent(TaskListContextMenuComponent); + customComponent = fixture.componentInstance; + element = fixture.nativeElement; + taskListService = TestBed.get(TaskListService); + spyOn(taskListService, 'findTasksByState').and.returnValues(of(fakeGlobalTask)); + fixture.detectChanges(); + }); + + afterEach(() => { + const event = new KeyboardEvent('keydown', { + bubbles : true, cancelable : true, key : 'Escape' + }); + document.querySelector('.cdk-overlay-backdrop').dispatchEvent(event); + fixture.detectChanges(); + }); + + it('Should be able to show context menu on task list', async () => { + const contextMenu = element.querySelector(`[data-automation-id="text_${fakeGlobalTask.data[0].name}"]`); + const contextActionSpy = spyOn(customComponent.contextAction, 'emit').and.callThrough(); + contextMenu.dispatchEvent(new MouseEvent('contextmenu', { bubbles: true })); + fixture.detectChanges(); + await fixture.whenStable(); + const contextActions = document.querySelectorAll('.mat-menu-item'); + + expect(contextActions.length).toBe(2); + expect(contextActions[0]['disabled']).toBe(false, 'View Task Details action not enabled'); + expect(contextActions[1]['disabled']).toBe(false, 'Cancel Task action not enabled'); + contextActions[0].dispatchEvent(new Event('click')); + fixture.detectChanges(); + expect(contextActionSpy).toHaveBeenCalled(); + }); +}); diff --git a/lib/process-services/src/lib/task-list/components/task-list.component.ts b/lib/process-services/src/lib/task-list/components/task-list.component.ts index 31f8411e00..ed851203d7 100644 --- a/lib/process-services/src/lib/task-list/components/task-list.component.ts +++ b/lib/process-services/src/lib/task-list/components/task-list.component.ts @@ -18,7 +18,7 @@ import { DataRowEvent, DataTableAdapter, DataTableSchema, CustomEmptyContentTemplateDirective, CustomLoadingContentTemplateDirective, AppConfigService, PaginationComponent, PaginatedComponent, - UserPreferencesService, UserPreferenceValues, PaginationModel } from '@alfresco/adf-core'; + UserPreferencesService, UserPreferenceValues, PaginationModel, DataCellEvent } from '@alfresco/adf-core'; import { AfterContentInit, Component, ContentChild, EventEmitter, Input, OnChanges, Output, SimpleChanges, OnDestroy, OnInit } from '@angular/core'; @@ -123,6 +123,14 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft @Input() start: number; + /** Toggles custom context menu for the component. */ + @Input() + showContextMenu: boolean = false; + + /** Emitted before the context menu is displayed for a row. */ + @Output() + showRowContextMenu = new EventEmitter(); + /** Emitted when a task in the list is clicked */ @Output() rowClick = new EventEmitter(); @@ -356,6 +364,10 @@ export class TaskListComponent extends DataTableSchema implements OnChanges, Aft } } + onShowRowContextMenu(event: DataCellEvent) { + this.showRowContextMenu.emit(event); + } + /** * Optimize name field * @param instances