From d7f0fa5aa0b74e31f0bcc478c1111a97e8d3fb54 Mon Sep 17 00:00:00 2001 From: dhrn <14145706+dhrn@users.noreply.github.com> Date: Fri, 25 Sep 2020 17:12:37 +0530 Subject: [PATCH] [AAE-3493] Update the documentation to provide the proper guidance on custom forms widgets for APA and APS developers (#6158) * * improve docs * * assets fixed * * links fixed * * versions fixed * * assets added * * fix links * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Update docs/user-guide/aae-extensions.md Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> * * example fixed * * minor changes * Make stencils document step-based Co-authored-by: Mark Hulbert <39801222+m-hulbert@users.noreply.github.com> Co-authored-by: Mark Hulbert --- demo-shell/src/app/app.module.ts | 8 +- .../form-demo/cloud-form-demo.component.ts | 16 +- ...omponent.ts => custom-editor.component.ts} | 26 ++- .../cloud/process-cloud-layout.component.ts | 13 +- docs/docassets/images/aae-form-widget.png | Bin 0 -> 14053 bytes .../docassets/images/aae-form-with-widget.png | Bin 0 -> 34579 bytes docs/docassets/images/aae-resolved-widget.png | Bin 0 -> 7628 bytes docs/docassets/images/aae-simple-form.png | Bin 0 -> 5590 bytes .../images/aae-simple-override-form.png | Bin 0 -> 7638 bytes .../images/aae-unresolved-widget.png | Bin 0 -> 8662 bytes docs/user-guide/aae-extensions.md | 172 ++++++++++++++++ docs/user-guide/aps-extensions.md | 184 ++++++++++++++++++ docs/user-guide/extensibility.md | 175 +---------------- 13 files changed, 411 insertions(+), 183 deletions(-) rename demo-shell/src/app/components/cloud/custom-form-components/{sample-widget.component.ts => custom-editor.component.ts} (71%) create mode 100644 docs/docassets/images/aae-form-widget.png create mode 100644 docs/docassets/images/aae-form-with-widget.png create mode 100644 docs/docassets/images/aae-resolved-widget.png create mode 100644 docs/docassets/images/aae-simple-form.png create mode 100644 docs/docassets/images/aae-simple-override-form.png create mode 100644 docs/docassets/images/aae-unresolved-widget.png create mode 100644 docs/user-guide/aae-extensions.md create mode 100644 docs/user-guide/aps-extensions.md diff --git a/demo-shell/src/app/app.module.ts b/demo-shell/src/app/app.module.ts index a881122c5e..3e4434206f 100644 --- a/demo-shell/src/app/app.module.ts +++ b/demo-shell/src/app/app.module.ts @@ -82,7 +82,10 @@ import { ProcessServicesCloudModule } from '@alfresco/adf-process-services-cloud import { FilteredSearchComponent } from './components/files/filtered-search.component'; import { RouterModule } from '@angular/router'; import { ProcessCloudLayoutComponent } from './components/cloud/process-cloud-layout.component'; -import { SampleWidgetComponent } from './components/cloud/custom-form-components/sample-widget.component'; +import { + CustomEditorComponent, + CustomWidgetComponent +} from './components/cloud/custom-form-components/custom-editor.component'; import { registerLocaleData } from '@angular/common'; import localeFr from '@angular/common/locales/fr'; @@ -188,7 +191,8 @@ registerLocaleData(localeSv); ConfirmDialogExampleComponent, FormCloudDemoComponent, ConfirmDialogExampleComponent, - SampleWidgetComponent, + CustomEditorComponent, + CustomWidgetComponent, ProcessCloudLayoutComponent ], providers: [ diff --git a/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts b/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts index c4966f25ba..0f890812cf 100644 --- a/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts +++ b/demo-shell/src/app/components/app-layout/cloud/form-demo/cloud-form-demo.component.ts @@ -28,7 +28,10 @@ import { FormCloudService } from '@alfresco/adf-process-services-cloud'; import { Subscription } from 'rxjs'; -import { SampleWidgetComponent } from '../../../cloud/custom-form-components/sample-widget.component'; +import { + CustomEditorComponent, + CustomWidgetComponent +} from '../../../cloud/custom-form-components/custom-editor.component'; @Component({ templateUrl: 'cloud-form-demo.component.html', @@ -60,7 +63,16 @@ export class FormCloudDemoComponent implements OnInit, OnDestroy { private automationService: CoreAutomationService, private formRenderingService: FormRenderingService) { this.formRenderingService.register({ - 'custom': () => SampleWidgetComponent + 'demo-widget': () => CustomEditorComponent, + 'custom-editor': () => CustomEditorComponent, + 'custom-string': () => CustomWidgetComponent, + 'custom-datetime': () => CustomWidgetComponent, + 'custom-file': () => CustomWidgetComponent, + 'custom-number': () => CustomWidgetComponent, + 'custom-something': () => CustomWidgetComponent, + 'custom-boolean': () => CustomWidgetComponent, + 'custom-date': () => CustomWidgetComponent, + 'custom': () => CustomWidgetComponent }); } diff --git a/demo-shell/src/app/components/cloud/custom-form-components/sample-widget.component.ts b/demo-shell/src/app/components/cloud/custom-form-components/custom-editor.component.ts similarity index 71% rename from demo-shell/src/app/components/cloud/custom-form-components/sample-widget.component.ts rename to demo-shell/src/app/components/cloud/custom-form-components/custom-editor.component.ts index c730460bf3..83ad39a908 100644 --- a/demo-shell/src/app/components/cloud/custom-form-components/sample-widget.component.ts +++ b/demo-shell/src/app/components/cloud/custom-form-components/custom-editor.component.ts @@ -17,14 +17,29 @@ import { Component, OnInit } from '@angular/core'; import { FormService, WidgetComponent } from '@alfresco/adf-core'; +// tslint:disable:component-selector + +@Component({ + selector: 'custom-editor-widget', + template: ` +
+ ADF version of custom form widget +
+ ` +}) +export class CustomEditorComponent extends WidgetComponent { + constructor() { + super(); + } +} @Component({ selector: 'app-sample-widget', template: `
- Look, I'm custom cloud form widget!

- Value :: {{displayValue}} + + {{field.value}}

@@ -37,21 +52,20 @@ import { FormService, WidgetComponent } from '@alfresco/adf-core'; [value]="field.value" [(ngModel)]="field.value" (ngModelChange)="onFieldChanged(field)"> + {{field.placeholder}}
` }) -export class SampleWidgetComponent extends WidgetComponent implements OnInit { - - displayValue: string; +export class CustomWidgetComponent extends WidgetComponent implements OnInit { constructor(public formService: FormService) { super(formService); } ngOnInit() { - this.displayValue = this.field.value; + this.field.value = typeof this.field.value === 'object' ? JSON.stringify(this.field.value) : this.field.value; } } diff --git a/demo-shell/src/app/components/cloud/process-cloud-layout.component.ts b/demo-shell/src/app/components/cloud/process-cloud-layout.component.ts index c7478f7a5c..7df8d0e247 100644 --- a/demo-shell/src/app/components/cloud/process-cloud-layout.component.ts +++ b/demo-shell/src/app/components/cloud/process-cloud-layout.component.ts @@ -18,7 +18,7 @@ import { Component } from '@angular/core'; import { FormRenderingService } from '@alfresco/adf-core'; import { CloudFormRenderingService } from '@alfresco/adf-process-services-cloud'; -import { SampleWidgetComponent } from './custom-form-components/sample-widget.component'; +import { CustomEditorComponent, CustomWidgetComponent } from './custom-form-components/custom-editor.component'; @Component({ template: ``, @@ -30,7 +30,16 @@ export class ProcessCloudLayoutComponent { constructor(private formRenderingService: FormRenderingService) { this.formRenderingService.register({ - 'custom': () => SampleWidgetComponent + 'custom-editor': () => CustomEditorComponent, + 'demo-widget': () => CustomEditorComponent, + 'custom-string': () => CustomWidgetComponent, + 'custom-datetime': () => CustomWidgetComponent, + 'custom-file': () => CustomWidgetComponent, + 'custom-number': () => CustomWidgetComponent, + 'custom-something': () => CustomWidgetComponent, + 'custom-boolean': () => CustomWidgetComponent, + 'custom-date': () => CustomWidgetComponent, + 'custom': () => CustomWidgetComponent }); } } diff --git a/docs/docassets/images/aae-form-widget.png b/docs/docassets/images/aae-form-widget.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b9a2dbe8ad56e69cbd5c18271b84750ef3af67 GIT binary patch literal 14053 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 z zqO*s(R&JPcF8!R&=953>t6Uv_s@- z*w^d%$h1YZYBKoGD|-8S>jshd{B@aDLa&RXqN$IV7Qz1Qi!&UjZFgWBNp{h>T4#O> zplb6EXx`Ek56BCA80Pn3p21AF(d^XjAc}YZUl3i?drX;?BbUG}XpZUjn95}P*k6(k z`i-LT!FR3Cc^SHsa(Ix*xX1feYBb-4nDz^TQj3JALfN+s)YiVA7VR&8Q2ZYT&i!(Z z^ZC++*F`%CH4exGMs3)2a-;o`n(qF73H=`LMOq8AQUb+ayfWudYiGa1X0p7{?#vkZ zYAT?Wa=)bC%Vk~VLMOY#(J#lg1W>wvO_Gg?`Z|BnQ}*g!v6jsP0%KcQ*^}-}zJaPN?>O;d)_51^@r+ldtxm;n ziVKVb?rH3~P*Ui%rL}9=ORV&?_np2AaT_%>L_*5^E?SosjUWH|;roD@_MPIdBf>}I zpT#+(oh!qkV1~&XKIr0u+WY_>Rt>W}33W%&!9UIsq^qEQ5x44VYH!`tmClpLtwo8G zWGJ$?4U_jp*j>yzXm~M8w!%V)&Bb}hlmqi)>N0SuVXyZ_k=T}!%koJ_Z`k34cfHUA z)#o$G12Jby8`O5#u#O~%6S|NN;uvLES`j8XI2x3+9?Q=^T{6jlxw+EN)cs?NG3}{Qiej7WD8>*lVwnevZQ-eWE)vCjLA9} zTOlEPnuf8Cb(pb?VHnJF#(n;T=ZEL}Jm-g*IcMIV&pDs>c`xVv`n(9j zJco>~>)qzz+4mCsrt<#=J_|TcXTjHAf2ffKKR^G_xY-yFk3^)Ap035?G}>^G1#D`h zaoH8Uf6sBf)l8XZ2V_2u7g-sf>J%UO4u7n0`%VY%Vx5aWX>16q9)cUWsIZ7N8THA? z_d8>HMEF+Y{@?c;-KRID)D|$ARyL{=nBIYqzaSO6=vr<43DxBvmTFzdyzjag|DeLU z#moYB6fA`&!v1~MnIx3QEf{FgO}fc@z+j_S_L-QQ`FDi%&4ppGLxF^02c={226c9d zA!^)<+|De3F*u&&8C+*)F8nO(jBKLOng#c-o=>w(Fo-*vVuvFhcHs{F6>EnBqELQ` zq>EfFM99k~w!!g*7)+w}ey)Iun_%=ce%(~=)DfZO$GKzQ4FB`HuCKMZkHWK6bN0p~ zA^5qo-#!+d#|Nn?SIo~1jMHU#Dd|k3qh7o~WDHq|Ay-adzk4zKy^?;^w4$tQ;x=rq z|IiD+_w2rrIgI(WkbA2!{4}`$vmSkVMgmv+^XZP0%@ww@VV&*@pPNW*%kc2F)dtz~ zYuxdcmKLYhSG3;jRt1uhva&y&Tz&ZPVKZ&!57XM((o(;Tm8s*$k9Vf1vghqN)QJf{ z<2>%x__Si=u_$jhKi#jYO(y&$mn$1v?&}1FHG8E}HN)OsC6_q0PIsm<7!2=$D3Mra z#&oBVk&*iPirk&N+Vzo;LMvQ`PI#E}6mw^oyIdCP?$(X3h%YAjM-n;5dwnyz*TOS2 zs<5+xf`JMR?K3X@d8UOQKUU2b6T;#NOI7UHPr zkAozv#o1{GdIYna6l*3!6wO{Hy>&j-Z(&)(i%(5a=C z{`&Q+E@WL(T#zulv)n3`+BrSfpD!SN`_3IaeAwF7c42Xm)3{e?A0MB9^aO=sRdn}4 zz-&)UOw2ZW-O9qExw*OMZpp+Bdl6SuWODPSnppf^KEZ|22F^PLn>E^ytBM%k!DE@} zvOpOTmkn2@1ptFNSVil4t@eEa0s z1a@rw+lhpeva-eY4fXyrUC($AX`(jEZ{{nD#T#Uo)Yg(aI)FRgFc%gQ5{hm4HWjy?%(OJ|#I}IBzEj@b-mxtYF229AwbbCojCQFYH>4)~$xkl?y{uc1mCJUks}HBG}m&BH{t ze}PmMEhJU%-k%5LYpSa5Vt*RMi*0Odn5L?EQGXN+UazmO2L>$|-9#kfKYsiOB&VjP zDk>_#O~kc>S4}wwxkf_v6Udj~Y-Wo~>!IBmp2oGOHHlVGx|D__QaNoDL-AKq#D+40 zD@*%IY2HA_@3(R6PLcDrckkWP00vWDUQQdrCrD~*Dk&|Ms@mDv2}Wm|p|8lv$-R8} z($Ue;+1dHYlP4kTbkiF*z_zuwwUMg*^C4e`hKAsHzTbZbS9^1IwvFG(17{tuvR6=4 z#1Y1UqJRk<6&7CYR3A;dfq_9@e!iih zA)CeGm##s~R{~1{)*&6)>n02}$$fbx5LFFxZFdY6>c+R}1LR#ww0kT!^z{PuTJXPILYuXM9=x0Zjm_By|GR(3Xp zLQ#j4S;NRtcSjPijq#>v0ckOHc+sKJYX6yf6#Ia5Fq4`qk?`_m@2gZ3S+B?7VR?{( zX7-7YEDU*VH37*hb!^8rQ^bYwRjOXzRx32#j~AP5=cVS{{sy?-0Ek<5 zb%RY!PP0896zf)RgRq3NCFK|$p$RB7rj3dnuzuNlU!vo>mDyZ0L|00h>%v{JM0@DB|&v zjt*mU;h8OvajiIW+%>;GSv8-K!1Mja*%0KnC+c`4`uz_Z@1E^XlV=@Wl;rkEXrDCM zKvM@?c6N4v_r%A>8ehNuA~x2h+HVTPnIuJfJG8cfNGxMMD@#T?GP*Tn&A&WF%IG+SEjH?yx?xi|=D1XK%KbU_D9&nsGPyK+acN2xCT|a|b z-`VT!IbR=sZM=5bu(;}nnV#S>g2{qqIB;Tr%!ie!di>1E%?0*Wx3f9_r<$jazyIaO zOAaW>^D>clYXatSjgulFz=ek@y^cUvfrrzdj?{(3qTz`CR|~@g=+fuX(o*e^wKs3ywlp_~uJ#%-#b>ejk(H&T>!zm6 zm6a4t1eH%J)Q9w&sAv*Uw^HWyu2K=F_knL&e;xrbqFkJ>{XWfteqV(cWB9lXr0;r(zk3-2rU-yXLLSm&B>X`WqgjI`@*9i>|D>fGj7Ae!~%g{d02)zG|mw>#1!G z6xzi>F9)vtt#HlsKU8~l9%Y4(EXQoEwx=9Ojm8ytAr)~hvZU<$biqyXL9U?KUo`)+ zVC{VFX7czL_xyV%l-fP^@T~OyZ|^pG|N5F}k7r{j1h#9tq#nQY&3Eb4+VYuioxP>J zchf8A-GschU?k7S(}M?jdLm3l)t#0$4IZ8TfXz|GHQe#3@@E!P3)KW z3O`nY$zX4Z?|*KzV_#V~Ba5Fb+B0T(;hQ8l5DevfwPY~ouvoH6;Ak@?^Qy|cTmL*?c6lKZJv^F^2fvb4g={WzX%6KLDu~}k1WMYanhujDh z6MH;*XOxp$m8ZwQY==Hxw;ddothw$98-LmNJ}We#5E(b~U&`qjS{4D5-&<;}YP5A^9w#%f5*SJ; z^Mtw~`mB!j%6xA)ZEFDymHPRv0HcW-jYFJPuQ^W6+G2C+Mma16{_|-8H~7sh?yES^ zwhf&Gg<+xt67E(z89*)!&1uS_#Hw?MDQ_4BcLL1{D+g43mv^+NiGd?thVWN(cY20p zs8&OkLuhpJGf_b__N;tEfNy6{ZoFxH#X9Qp@_nzwNk+jUXFR=Su45--^KT61?@mpQ ze`71$0RMMt_9C2w1e47MX8&~Yt{RWB@vl_Wk|a#*+?8%NwtH%KnW$U`JT@{PO00eZx`tX|}_Jk(M6H?{dO;y-*c!r zX~ND5rdp_Cv+>K6{j#oVrh;?1vWjkVS-tJdm0n+?^}ZBvjtdpRt)vE@@kTvmjX|52^LsGj0v%TZLco5I#tF2kFiW;j#M<| zg>uq5;R4pe@BFU7U;|Psl!FYdi^io3f+3TABSE4J7%X1#*ZPkx9iqfBo=K3KFvZ2w zVahyLpDlUOU%fItky5R81ZqORv}|uEYU`0JBTS1W)-)t51>@IFH?v3aYTCyyIQA|B zBbmNqLl-)>kcA|@V-Hh{m72-MAUUTvf+)s&Mo zYzUiKOHJ{JKN)#lu}z7fMl9YC7x(ejog!WIcyHG`I$Vl_$n>1ZeD9%5`=jS-cSLRb zRw11;{C-i&lVNXn-fl3#!-JlXug1#nt_bUj;!SsS8$;RnRnFLHQJhyoPpSk{3UIL= zF~-5phZa;^p4Y(A@g;mcptQ&t+EP77duTL*-fMvQy z;A7X#jR&7P#k#Dg%0()j*)-z~orMSB2;ZxNEavy58WfF$1{<&bOg0*)oQ_H$zAA(w z0yB%d`m5tKv;B3458*0yE@E!IABDLH*UT0X5ZIA*pS?#Ui&FY55V zpy_jdDn61EmOCV%PF`wzu|IrBr~grd@Zd>3{tK7JM$7~`#{3^J)VJN+mme7^6I9WC z8wEl;OLSsBUNb=mE^#!q!~_OQZK_;tZr8=~*>Oz6r#C-iv+K3i-VQs8LQkU24ny~; zz|-%goQnJvx|!+`Kk2?AU!-|DlHa3m$J5!-pl!c&bH-DaOL6^RI-=qFn{dvdd^Iau z3v#RmH$R@Ea?BUW25JweMTkIv-R5NKI`@s5h7m57R7O?xNb-I_I zKW#6IJ})i;Z5CbV@2ZP;_1Vac1*s7FqJ6L(WH>~(7!Q44D4dsvwasSr@j zYHDxHR<=3~CLD&wZMww8j^t)lW+9w7zpr-@CHo$ug!Tz>7<6~3HMTu%h_pQt9!T`p zwjyH>AoO~Ap6qPTpYJ-Wy|GX{vl=r}JjfYY4^L}Fzex6}J(=CHas_iMdnjH^B!I&l zU3D!Emw5m+Fmjo3*48$a+_v8OV8bY0WWK+!He|F%5=&5D495Qb75U=$26Gnn-UG?; zW%o(PN^;Ry^gLSnKG3W)oa zZoOHHcx~<_c{kkePK4onjfd=Wos8h|TMYy2!S8EjQW59N-pwI4e|;ACidxUPIm^o$ z9d06<@_!)CSsl8s#f(nEc*0_C+0oV}oLy1=M}BKm$oYr~roh0_tig2HYIRuaK|Gp( zUeM(kOOY3eB@iwXRes}%7)@2_C;@>_x)~U%s3HvF!V`9+Di0j#wnoyad6#;n+h*4Z(dFg zi^aN&wY0LbA`IKv*vwB)iwFxptg!Cy??1!~kS3@FG$lmua)O6hY!B=A1<$k!7TX@p0+MOb{M` zavtLII#+}10x9nyGAb&oJs-GF0nlwr%akVW5h%_K45Hro>+0%S=WsXb>Rw1DRW0(C#db^e*Z^y52|msn_bzM6zST-;|9n^KWmv{Dw_z5o#(ZQ zISjV8Td(x^+>;jpnk;tzKl9-K5qo#Al#gp!5q}mI6lfr*7J#=TB$!>j8UeCkgJ$4D zaza7^8jZ$a0Fnc4jfP zW%u&g%M+hL_utBONuar<1&|GWL&JIICY4HMu^x+xiqdd`;+MuK6#uma($l9;0ksWW z96Qx2$;$(@3x*>KNCQMqp;FH>Op4>#yRJ%}6BmqTpusu;oV|GL zAe6swAQ*5l0I{D(MgkCQ&wm&KaZpPY62FvLr=+c2mzO7d@#1Z^nzFL;32vhROy}1% zImp^AyBpKtjS+k1i8%CSB>d{tt3EzHdU|@<2Jw*)09)1Gn{at0xoUZ3szcGPc6NNc z7i)tDW8n5Z05<@2XlapyXcIy@TbaWj^ZMtY*RDBd^d0@zl#rS_It{1Mp%>M6o1C2c zXg%tPtO-!RF<=o4M#uN>!qBR!s+^ph)x}XA8JP#`^kF_B$%BG|UESSM7azXxM;j%| z4wn#B`gREbJwR1eHC{~hfFQTghY9P^Qenx7iB3w#+S}Vb)odIcKR}@7ZvZ?5IGpI9 zqz7TJ5n~ud zg$M{J0RjPu6;TnHhcJa8GYKTj0YbuEXWE5^P_8g4^0ajD?+yj7-m0n|=gQh_^U#+%7D2l1=by zn`e(r3*3raFi4{JH`^6)Wf$VYa^lmsZ}i&N(#-wCtnNj-H7+tW=i_TSHQnt4)jIeW z-~14wXT)-+X42EkZ_+oUa&tDEdMm&8yPG!x?ro(V`+5C(kI+UnUTw8mbMEmOd$&T< z$82nrNE8{ev}3kGP;`6kI=N_hj7$th9b)s_xNGxmvy5z%tbW>e(vMqvULO7Hj!kRL zNq8Znu}&XBZn$gQKeaQl_QZC$ZHU3ZO>skviw@bEdfL+Re2yL7Mh3oG`Dr+y+@&Bd zPbW+r^bNob*&i4HZi$GFc~rQk*A0*%irO%)Jf@!C#?}JnwS}`GwrU!Gsd%z^2^*MD@!Q!;;+s(JW#!6YpB`YU!ff0vcW5?oICvIPL4p8$}Dt6MRH!mR???12u8$ zHg21unu;}(EH^0|y`t|1M4{a(l8?A8CJ2o$KeW0<3Ll$`D>!_3>xRNrj%xzD>e4_> z(#L>GVZhc6xY35R+0jN$v5&2f&v=ZYn^7>g?Zo!ixSrBYN{3v6nop`ntBJ?VaX6e| zU)Z2D4Gl*HcYiYA=H?Y#_4Osp)b6I^Iq1vp|LCH5p;V2_2=&hRH}lgU)i{h`UwixZ zVKO$V+lQ*+&n$ei&>h%lB7_N213qi&do?H@2^#y}AqAdVvQEz~5p~F-_QEK8d;8!X z96d&!%i}5TyZFkNRdA{LmTSa#*0W#kZBXCmSTuCsT$O^3jDTd^QP6U7cJ^va7k}E3 zK%9=lUi0Xp-<(;ua!{cg<_$7M!DQ2#9PW&IGCN2uLJcA0s*7DXJ^!sg`XN5YaD zjRx=fv}WVFi!~`$j~+^|33f$j)05+qlasekJbn3cUrK%awgZ>HzKfw)d3G23q!{8G zJoMJdDQ`0l^E;GM@1ZB`BM9ckTglqa3$Wy1Jl7TrSu7din533SKAP&e5?P(n>^Q9UUE4dKdU?!c_lXM+KF$ zP}b#789;e{Z6-l=-K*lddiCg8uM1Lmu5?!o%z6 z*4EbE@yp$djG%FV2Gu%^5k5Pj=oY3Py+3TK-$lnTVCWOn?n=!a1(fNEU*_4xzfe)H zLIr(hhKqE_7OY$KaKKQ;>dL5ecN#L6&X}8jw27KY++iIiWQVfa+hgRd(Mv<~JeKao zS5FEG_>iZ(moHb?f+z=PX9CMLba-}2Kw1@bT?>KgsYf?7Gyn%MGc&)AQ!{jQ#<|>N z*q#s_3HDaBd~!+(o+(~X(7Ir}(CJ=-%8XUp0l5k)p$EmtFQcqDQ~iq>RelYB=zo5v z9=_0`mMm9K3VvKk%X>MU(W9m~3W92O^Eip2Ny?$m_u3VA%3jC6B2=_OjSWLv5-gErLvMyGU8DUM!eo3_f6}t!4y9Ex$WVUllrdtt5P3V@&ApX35Et zi#|W-`*DuR^~q!hwVo*{DFNEaFeODfI(ESpWs2AW)#>8eE!IYvi%%Y3V%xNi2gzhU zd-jY_pJ;PCrapj5j=X;e13I@v6a7XMW}%9 zRs=bezezCu26;>UKxx$yC1ouL>SE;kE|!jZVTto39b-a`?NQaTka^S81w{=vm#)Hz zK}NGUwxyNVq)J+uzIE$XjxAL(6>Cc5=1`Y~0_N5BT+G)`bgQKsBMoVU{ zQPgqShA|TM2BKWQR?arauC8t_8+ed)n%t0f)G&I#U;kV6*gbA1LmtcOR_>49kMFC5 zG|FQRr9_TUyf88~v)k4nH*9`uIlhY=8EPkN4L&Vg;f<0_{3f|X{*;qN_GX$Sf27k| zm>%))_7YK&PT+UFb~itBre2ep+S1n6*4Kv)pBduoBc{pF48pl>In>kuOEWVw;BROT z=!m(oD|L^83;l+Z93;~Tq?dVlDaPS5ov+n*PI?sLSY~Y1%CIiIxVUm-l&FEIYJ zW)-iXLe4qUCIcNf+VF;X$omJ=@*0*LY@|+`P@)oTw?jV1WKY z+pTi(O;yxS2-0s>J1R>OvlmRoEA=W$l36)Yt;ga-+nvJRbGCu}ez(+oXQ43jr2m25 zOLxezQmN>oM|m6}eg(>?r?fPf;O=bh>)?20q?opD(~$$MJ)@FX)cbJ6$3^XH)dH>w(k4Sl*VphX1+28M@+>y6t`5M^7Fy~TI_zT`1D z+$8Y)>i9Bn7iiKAn{K${L3OG}-%~P_Q#P7R6_ zu)3g;sHv^3a_HK{$Vf4?sB~*8kH_=9dKG#>TUQsQZumpI3L!`+i>O&O7T2GpRfq{7_6`8s;+4=g}^XDGDW&SEEDiB&nng1Z5 zbQbVZT3l?EYINZKsfph5KzJd?E|JsOkg2ePB6s7N9f z(dl$DnXFc$vgQ~Hy2B)gNgDicPd)nbtu)X(z`CHHXsPN{#o@HIv_RKm&CIHs*_sIPA}ChSeR&RrQSh};elO@Qe7fJe^=7ehDu)9++}+(} zE`9n_eSUtvB4m;~X|cwrY9}ZO*R`7vq$#eb>za>`PYbIOp!nV_6Hxpf^RFDYvlA6p zmsw1-Qy}8k``JT}!mG}?{1lWnME>)M}dP2s&+imr@iAh>@7k-CE{&vsb95gU6Ssr_)9t{S! zq`275&hAUHL0)n3!RS{YLcG$$Jz;aQTmsK*zu#FI9_a2qIMGF`z&d09zRsPS2CeB} zZ@(*1kbXK0q{d$9sR9ZI8VG^`bqvB*BottaJS@N--!YAtZ+EDxtK&q8CbP4%GtFYt zBNw`$Z?ek+M=f@zZN&iC01Am3XDp?P*pcQ5^1RTHQ!5HkfekXX{?EqIiq%P0A-K}k z7O4!R(E{hW?O+Tpfv5n-hmip!7v|K7o^V5^I*;eDMLaeJR8{|brqbG4Zi+o4%)vm zFc$~nD(JKGg(Q;^nzF**xoB!`Ziax)LBL?TLB3UhZ#2aBrCL*+otzj92H2?YF{gHJ z&byG$0EON%J_oG@T0%-nN-Rpvt@7u|Eyty7l7UDq6d3XxYI--!2=*R&6C=HbS_N>(1v0sOnVVO^vY@tlrTYH@DFjpM=;U++Vg^;- z-qr?lepDsA6iu_L7D~XNx(ij&H%>s?JbCgYJ^`ZkTlxIYnGGL*6|BY+*1!K;>;FG< z+X*d9hs>KiAk|&A(1*d0EE-Wx?F(>x#$fQM^-z*=@~NFt4*?!~T%RuN9XvBT%yl&C`7h{Z|k69t%GZ~hPTuQR*= literal 0 HcmV?d00001 diff --git a/docs/docassets/images/aae-simple-override-form.png b/docs/docassets/images/aae-simple-override-form.png new file mode 100644 index 0000000000000000000000000000000000000000..10465d5e0e3558d3ffca09672a06fd020e113c51 GIT binary patch literal 7638 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 b7LoK|rP&o>482*4b&}RS-MdA1?4JJ*ve%#v literal 0 HcmV?d00001 diff --git a/docs/user-guide/aae-extensions.md b/docs/user-guide/aae-extensions.md new file mode 100644 index 0000000000..743dd6153a --- /dev/null +++ b/docs/user-guide/aae-extensions.md @@ -0,0 +1,172 @@ +--- +Title: Form Extensibility for AAE Form Widget +Added: v4.1.0 +--- + +## Form Extensibility for AAE Form Widget +This page describes how you can customize ADF forms to your own specification. + +## Contents +There are two ways to customize the form +- [Replace default form widgets with custom components](#replace-default-form-widgets-with-aae-form-widgets) +- [Replace custom form widget with custom components](#replace-custom-form-widgets-with-custom-components) + +## Replace default form widgets with AAE form widgets + +This is an example of replacing the standard `Text` [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) with a custom component for all AAE forms rendered within the `` component. + +1. Create a simple form with some `Text` widgets: + + ![default text widget](../docassets/images/aae-simple-form.png) + + Every custom widget component must inherit the [`WidgetComponent`](../insights/components/widget.component.md) class in order to function properly: + + ```ts + import { Component } from '@angular/core'; + import { WidgetComponent } from '@alfresco/adf-core'; + @Component({ + selector: 'custom-editor', + template: ` +
Look, I'm a AAE custom editor!
+ ` + }) + export class CustomEditorComponent extends WidgetComponent {} + ``` + +2. Add it to the application module or any custom module that is imported into the application one: + + ```ts + import { NgModule } from '@angular/core'; + import { CustomEditorComponent } from './custom-editor.component'; + @NgModule({ + declarations: [ CustomEditorComponent ], + exports: [ CustomEditorComponent ] + }) + export class CustomEditorsModule {} + ``` + +3. Every custom widget component should be added into the the collections `declarations` and `exports`. If you decided to store custom widgets in a separate dedicated module (and optionally as a separate re-distributable library) don't forget to import it into the main application: + + ```ts + @NgModule({ + imports: [ + // ... + CustomEditorsModule + // ... + ], + providers: [], + bootstrap: [ AppComponent ] + }) + export class AppModule {} + ``` + +4. Import the [`FormRenderingService`](../core/services/form-rendering.service.md) into any of your Views and override the default mapping, for example: + + ```ts + import { Component } from '@angular/core'; + import { CustomEditorComponent } from './custom-editor.component'; + @Component({...}) + export class MyView { + constructor(formRenderingService: FormRenderingService) { + this.formRenderingService.register({ + 'text': () => CustomEditorComponent + }, true); + } + } + ``` + +5. At runtime the form should look similar to the following: + + ![custom text widget](../docassets/images/aae-simple-override-form.png) + + +## Replace custom form widgets with custom components + +This is an example of rendering custom form widgets using custom Angular components. + +### Create a custom form widget + +To begin, create a basic form widget and call it `demo-widget`: + +![custom form widget](../docassets/images/aae-form-widget.png) + +**Note**: The `type` is important as it will become the `field type` when the form is rendered. + +You can now design a form that uses your custom form widget: + +![custom form widget form](../docassets/images/aae-form-with-widget.png) + +### Create a custom widget + +When displayed in a task, the field will look similar to the following: + +![adf form widget](../docassets/images/aae-unresolved-widget.png) + + +To render the missing content: + +1. Create an Angular component: + + ```ts + import { Component } from '@angular/core'; + import { WidgetComponent } from '@alfresco/adf-core'; + @Component({ + selector: 'app-demo-widget', + template: `
ADF version of custom form widget
` + }) + export class DemoWidgetComponent extends WidgetComponent {} + ``` + +2. Place it inside the custom module: + + ```ts + import { NgModule } from '@angular/core'; + import { DemoWidgetComponent } from './demo-widget.component'; + @NgModule({ + declarations: [ DemoWidgetComponent ], + exports: [ DemoWidgetComponent ] + }) + export class CustomWidgetsModule {} + ``` + +3. Import it into your Application Module: + + ```ts + @NgModule({ + imports: [ + // ... + CustomWidgetsModule + // ... + ], + providers: [], + bootstrap: [ AppComponent ] + }) + export class AppModule {} + ``` + +4. Import the [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and provide the new mapping: + + ```ts + import { Component } from '@angular/core'; + import { DemoWidgetComponent } from './demo-widget.component'; + @Component({...}) + export class MyView { + constructor(formRenderingService: FormRenderingService) { + this.formRenderingService.register({ + 'custom-editor': () => DemoWidgetComponent + }); + } + } + ``` + +At runtime you should now see your custom Angular component rendered in place of the original form widgets: + +![adf form widget runtime](../docassets/images/aae-resolved-widget.png) + +## See Also + +- [Extensibility](./extensibility.md) +- [Form field model](../core/models/form-field.model.md) +- [Form rendering service](../core/services/form-rendering.service.md) +- [Form component](../core/components/form.component.md) +- [Widget component](../insights/components/widget.component.md) diff --git a/docs/user-guide/aps-extensions.md b/docs/user-guide/aps-extensions.md new file mode 100644 index 0000000000..9e523a779d --- /dev/null +++ b/docs/user-guide/aps-extensions.md @@ -0,0 +1,184 @@ +--- +Title: Form Extensibility for APS Stencil +Added: v1.9.0 +--- + +## Form Extensibility for APS Stencil +This page describes how you can customize ADF forms to your own specification. + +## Contents +There are two ways to customize the form +- [Replace default form widgets with custom components](#replacing-default-form-widgets-with-custom-components) +- [Replace custom stencils with custom components](#replacing-custom-stencils-with-custom-components) + +## Replace default form widgets with custom components + +This is an example of replacing the standard `Text` [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) with a custom component for all APS forms rendered within the `` component. + +1. Create a simple form with some `Text` widgets: + + ![default text widget](../docassets/images/text-default-widget.png) + + Every custom [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) must inherit the [`WidgetComponent`](../insights/components/widget.component.md) class in order to function properly: + + ```ts + import { Component } from '@angular/core'; + import { WidgetComponent } from '@alfresco/adf-core'; + + @Component({ + selector: 'custom-editor', + template: ` +
Look, I'm a custom editor!
+ ` + }) + export class CustomEditorComponent extends WidgetComponent {} + ``` + +2. Add it to the application module or any custom module that is imported into the application one: + + ```ts + import { NgModule } from '@angular/core'; + import { CustomEditorComponent } from './custom-editor.component'; + + @NgModule({ + declarations: [ CustomEditorComponent ], + exports: [ CustomEditorComponent ] + }) + export class CustomEditorsModule {} + ``` + +3. Every custom [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) should be added into the collections: `declarations` and `exports`. If you decided to store custom widgets in a separate dedicated module (and optionally as a separate re-distributable library), don't forget to import it into the main application: + + ```ts + @NgModule({ + imports: [ + // ... + CustomEditorsModule + // ... + ], + providers: [], + bootstrap: [ AppComponent ] + }) + export class AppModule {} + ``` + +4. Import the [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and override the default mapping, for example: + + ```ts + import { Component } from '@angular/core'; + import { CustomEditorComponent } from './custom-editor.component'; + + @Component({...}) + export class MyView { + + constructor(formRenderingService: FormRenderingService) { + formRenderingService.setComponentTypeResolver('text', () => CustomEditorComponent, true); + } + + } + ``` + +5. At runtime it should look similar to the following: + + ![custom text widget](../docassets/images/text-custom-widget.png) + +## Replace custom stencils with custom components + +This is an example of rendering custom APS stencils using custom Angular components. + +### Create a custom stencil + +1. Create a basic stencil and call it `Custom Stencil 01`: + + ![custom stencil](../docassets/images/activiti-stencil-01.png) + + **Note**: the `internal identifier` is important as it will become the `field type` when the form is rendered. + +2. Create a simple html layout for the [`Form`](../../lib/process-services/src/lib/task-list/models/form.model.ts)`runtime template` and [`Form`](../../lib/process-services/src/lib/task-list/models/form.model.ts)`editor template` fields: + + ```html +
Custom activiti stencil
+ ``` + +3. Create a test form based on your custom stencil: + + ![custom stencil form](../docassets/images/activiti-stencil-02.png) + +4. Create a task using the test form. It will look similar to the following: + + ![custom stencil task](../docassets/images/activiti-stencil-03.png) + +### Create a custom widget + +1. Load the form created in the previous steps into the ADF `` component: + + ![adf stencil](../docassets/images/adf-stencil-01.png) + +2. Create an Angular component to render the missing content: + + ```ts + import { Component } from '@angular/core'; + import { WidgetComponent } from '@alfresco/adf-core'; + + @Component({ + selector: 'custom-stencil-01', + template: `
ADF version of custom Activiti stencil
` + }) + export class CustomStencil01 extends WidgetComponent {} + ``` + +3. Place it inside a custom module: + + ```ts + import { NgModule } from '@angular/core'; + import { CustomStencil01 } from './custom-stencil-01.component'; + + @NgModule({ + declarations: [ CustomStencil01 ], + exports: [ CustomStencil01 ] + }) + export class CustomEditorsModule {} + ``` + +4. Import it into your Application Module: + + ```ts + @NgModule({ + imports: [ + // ... + CustomEditorsModule + // ... + ], + providers: [], + bootstrap: [ AppComponent ] + }) + export class AppModule {} + ``` + +5. Import the [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and provide the new mapping: + + ```ts + import { Component } from '@angular/core'; + import { CustomStencil01 } from './custom-stencil-01.component'; + + @Component({...}) + export class MyView { + + constructor(formRenderingService: FormRenderingService) { + formRenderingService.setComponentTypeResolver('custom_stencil_01', () => CustomStencil01, true); + } + + } + ``` + +6. At runtime you should now see your custom Angular component rendered in place of the stencils: + + ![adf stencil runtime](../docassets/images/adf-stencil-02.png) + +## See Also + +- [Extensibility](./extensibility.md) +- [Form field model](../core/models/form-field.model.md) +- [Form rendering service](../core/services/form-rendering.service.md) +- [Form component](../core/components/form.component.md) +- [Widget component](../insights/components/widget.component.md) diff --git a/docs/user-guide/extensibility.md b/docs/user-guide/extensibility.md index 7d84cc308f..a00271578f 100644 --- a/docs/user-guide/extensibility.md +++ b/docs/user-guide/extensibility.md @@ -18,10 +18,7 @@ _Note: it is assumed you are familiar with Alfresco Process Services (powered by - [How components and widgets are rendered on a Form](#how-components-and-widgets-are-rendered-on-a-form) - [Component type resolvers](#component-type-resolvers) - [Default component mappings](#default-component-mappings) -- [Replacing default form widgets with custom components](#replacing-default-form-widgets-with-custom-components) -- [Replacing custom stencils with custom components](#replacing-custom-stencils-with-custom-components) - - [Creating custom stencil](#creating-custom-stencil) - - [Creating custom widget](#creating-custom-widget) +- [Form Extensibility for APS/AAE](#form-extensibility-for-apsaae) - [See Also](#see-also) ## How components and widgets are rendered on a Form @@ -102,173 +99,9 @@ formRenderingService.setComponentTypeResolver('text', customResolver, true); | Attach | upload | AttachWidgetComponent or [`UploadWidgetComponent`](../../lib/core/form/components/widgets/upload/upload.widget.ts) (based on metadata) | | N/A | N/A | [`UnknownWidgetComponent`](../../lib/core/form/components/widgets/unknown/unknown.widget.ts) | -## Replacing default form widgets with custom components - -This is a short walkthrough on replacing a standard `Text` [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) with a custom component for all APS forms -rendered within `` component. - -First let's create a simple APS form with `Text` widgets: - -![default text widget](../docassets/images/text-default-widget.png) - -Every custom [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) must inherit [`WidgetComponent`](../insights/components/widget.component.md) class in order to function properly: - -```ts -import { Component } from '@angular/core'; -import { WidgetComponent } from '@alfresco/adf-core'; - -@Component({ - selector: 'custom-editor', - template: ` -
Look, I'm a custom editor!
- ` -}) -export class CustomEditorComponent extends WidgetComponent {} -``` - -Now you will need to add it to the application module or any custom module that is imported into the application one: - -```ts -import { NgModule } from '@angular/core'; -import { CustomEditorComponent } from './custom-editor.component'; - -@NgModule({ - declarations: [ CustomEditorComponent ], - exports: [ CustomEditorComponent ] -}) -export class CustomEditorsModule {} -``` - -Every custom [widget](../../lib/testing/src/lib/core/pages/form/widgets/widget.ts) should be added into the following collections: `declarations`, `exports`. - -If you decided to store custom widgets in a separate dedicated module (and optionally as separate redistributable library) -don't forget to import it into your main application one: - -```ts -@NgModule({ - imports: [ - // ... - CustomEditorsModule - // ... - ], - providers: [], - bootstrap: [ AppComponent ] -}) -export class AppModule {} -``` - -Now you can import [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and override default mapping similar to the following: - -```ts -import { Component } from '@angular/core'; -import { CustomEditorComponent } from './custom-editor.component'; - -@Component({...}) -export class MyView { - - constructor(formRenderingService: FormRenderingService) { - formRenderingService.setComponentTypeResolver('text', () => CustomEditorComponent, true); - } - -} -``` - -At runtime it should look similar to the following: - -![custom text widget](../docassets/images/text-custom-widget.png) - -## Replacing custom stencils with custom components - -This is a short walkthrough on rendering custom APS stencils by means of custom Angular components. - -### Creating custom stencil - -First let's create a basic stencil and call it `Custom Stencil 01`: - -![custom stencil](../docassets/images/activiti-stencil-01.png) - -_Note the `internal identifier` value as it will become a `field type` value when corresponding form is rendered._ - -Next put some simple html layout for [`Form`](../../lib/process-services/src/lib/task-list/models/form.model.ts)`runtime template` and [`Form`](../../lib/process-services/src/lib/task-list/models/form.model.ts)`editor template` fields: - -```html -
Custom activiti stencil
-``` - -Now you are ready to design a test form based on your custom stencil: - -![custom stencil form](../docassets/images/activiti-stencil-02.png) - -Once wired with a new task it should look like the following within APS web application: - -![custom stencil task](../docassets/images/activiti-stencil-03.png) - -### Creating custom widget - -If you load previously created task into ADF `` component you will see something like the following: - -![adf stencil](../docassets/images/adf-stencil-01.png) - -Let's create an Angular component to render missing content: - -```ts -import { Component } from '@angular/core'; -import { WidgetComponent } from '@alfresco/adf-core'; - -@Component({ - selector: 'custom-stencil-01', - template: `
ADF version of custom Activiti stencil
` -}) -export class CustomStencil01 extends WidgetComponent {} -``` - -Put it inside custom module: - -```ts -import { NgModule } from '@angular/core'; -import { CustomStencil01 } from './custom-stencil-01.component'; - -@NgModule({ - declarations: [ CustomStencil01 ], - exports: [ CustomStencil01 ] -}) -export class CustomEditorsModule {} -``` - -And import into your Application Module - -```ts -@NgModule({ - imports: [ - // ... - CustomEditorsModule - // ... - ], - providers: [], - bootstrap: [ AppComponent ] -}) -export class AppModule {} -``` - -Now you can import [`FormRenderingService`](../core/services/form-rendering.service.md) in any of your Views and provide new mapping: - -```ts -import { Component } from '@angular/core'; -import { CustomStencil01 } from './custom-stencil-01.component'; - -@Component({...}) -export class MyView { - - constructor(formRenderingService: FormRenderingService) { - formRenderingService.setComponentTypeResolver('custom_stencil_01', () => CustomStencil01, true); - } - -} -``` - -At runtime you should now see your custom Angular component rendered in place of the stencils: - -![adf stencil runtime](../docassets/images/adf-stencil-02.png) +## Form Extensibility for APS/AAE +- [Form Extensibility for APS Stencil](./aps-extensions.md) +- [Form Extensibility for AAE Form Widget](./aae-extensions.md) ## See Also