From 984c001bd81c4266db5367eaea1c3347fed6670a Mon Sep 17 00:00:00 2001 From: Patrick Fic <> Date: Thu, 10 Sep 2020 15:55:25 -0700 Subject: [PATCH] Modified render styles to improve printability --- bodyshop_translations.babel | 21 ++++ client/public/kavia.png | Bin 0 -> 13428 bytes client/public/render-styles.css | 95 +++++++----------- .../job-totals-table.component.jsx | 7 +- ...-template-editor-save-button.component.jsx | 1 + .../shop-template-editor.component.jsx | 23 ++--- .../shop-template-test-render.component.jsx | 20 ++-- .../shop-templates-list.container.jsx | 1 + client/src/translations/en_us/common.json | 1 + client/src/translations/es/common.json | 1 + client/src/translations/fr/common.json | 1 + client/src/utils/TemplateConstants.js | 15 +-- client/templates/helpers.md | 0 server/job/job-totals.js | 1 - server/render/renderHandlebars.js | 92 ++++++++++++++++- 15 files changed, 187 insertions(+), 92 deletions(-) create mode 100644 client/public/kavia.png create mode 100644 client/templates/helpers.md diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 83ba120e0..16f1c57c2 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -15213,6 +15213,27 @@ labels + + additionaltotal + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + allocations false diff --git a/client/public/kavia.png b/client/public/kavia.png new file mode 100644 index 0000000000000000000000000000000000000000..be947430a4e40cc4dab87b416274e40874740cac GIT binary patch literal 13428 zcmbWe1z4NG(=Q4XcPBuwV8IFQZbgc_hTt09-MvttSfPYs#apbU#R*Wn#oY=NDNcb> zIP`Dloco;n-S3_}&ztPK`)7zd=m{)`c z1`!fw6cy)%hzJUai*qvy@I%D-_{I1jf;MH!@eA+?2=F{2czl99e4&9n9zM+f=AdNn1M_x< z`#O7iF#hETwe|G#l?FY|^q(rY!~et9!{=XSdNdecAQa9A;pP9U(m#N3Cr@8bA1BZM z7x;gM|2HB#*ngPA{k+}&F=IOzpS_#CyS<06&m$J{9|4c1)zbP8{Qo!?clZCGeSDSu zAJzDmLH>_uAA=ycJ)fSvkEfqE%wF05Q6lqSZQv4$-u6&mPj3THPq%+NO6T9|F)Awl zb&NP8SPKes_V}wa$NxfQuLSkAmj?ZH9S?+`M?la3A}S#ak>D5N;TMtM=l>^E>v1vI zL4BeBJ+P;pvqRATC-grSmQeI`^Yqs8w0oR~Ac*mQ_CHlr)baLoaCUnf@X=FMV0@~q zC;|}|5#bTwg@73CU=j|V-tN#xvpKs%9qswx9*+N*u9lX>Qx6|ss0YmcsggA4(L%h= z&UO+4FsPlattgC#UmR-7BLsC2<*^mB7vd4M7ZDJL3ESDj1RlBm!)+2uo-n_^F8w#X z-TzN|ZExqtIE1?WU-Nm4m;Y&qe{+$4)X3-2(LVo*CIzVDzglk2GJn5TtazY8z41@B0Z#UhO#h2D`cIgTr-N?*)Z1R( z@zHbty+Gjmw-x@W4B!7#&wtqJe@Qw2hCk-9zs>(7(8rtqq+olG$Gq$Pm|&5TM_*A; zcs-sf$r}U~9lZ)FVo}cj)s<;%7;rgyak0$bhyMh7h=Y+4kwPd@8;#9*kXDO(fO^JB zU;Cw$yS{$&L+v1E?LiNsy%;aLiZL`ihJMPFjJ8~_Ut8F=xh&VmT`H@ zXELj%*AHPRrvt@5g8uixPZv)C@lJJ9i#Dn9g||Ls!i#y^ExEs1kN|xl{@r``TPdONZr!i%271BN5#9ER+MpqW(3#BB`V|?-spgNcm#< z+RPjQX2EAhfI;}oz1x1kxL92!AiDx6J&7y|N{R|i9RMiS`W=1npun%&?}C_=(JuZd zpnl_*DvSwp1F^UrS=4F?0lbjl!5%MQHnYMr4y-v{u_WITJ4FTP+b&Padc#Sx0@u7$Tld`EMW!ID$8h0U;!91~EnwXYh*D_ZH z47~b-^&pwz-3=_%&SO{|Ych!5^bdUEWO8yf{Xl|k%7RUy#ms&}`q#ESd&#Gohz_85 zvA{ICa*G*V3Ic5M=fp*7t+HWy@MK8MRt8}E1j*Ta$uHKQo^Z;Y&byTd0h(i4BB$&> z1p@dMqg*)yg8>r;r(@tRE@;R`N-0BD_*)aKT1VY4dIt71uPCc;>lXj@B2L#F)ff zo1V1!oF8BOCR_hzOFH1aAN;vO6TttsKwXOgC&g;em1Mqj$W{H#fcJJFjgF`^BGFcx zDB$jju>N*dRQ&g{&%#5uViG4)I*)#0>t_5Cyv7`xv+%TrmLoRi`jo$z9w}ND7>qw* zgqrdWGcG4VodFk^GmnbPMM!kY3U(%tt0DSYkwD6n^~q?KZGwmMR0DuF%ZblDpK?$Hej?7{)%=wH26V02bRzCGIx^S5T)N*bz7{=R(zpZkxN!=Dd;-Gyt6{4_ z=<<_I?&-h?=PJBpaIc@`rdWjuw}6lUk}SZYuZTL=o11KnlWNPin4cpXt>|MU+yZWy zs2MY?h=OPIYm;ucDQoGZKK@%QZR@9+W~2} z`dD%cMPhVv+=20Eg`T}VKt#YYUf@)Ub@q?n! zn_V?b`R}U?CI+`n225ZB02lK@(kJNEE%;Ibf~>K4YM=+YSRQUD#T{r9zo z?UO#DiQr72_&q|${P7YanKcUz4hCOctp5(Lm;o@Jtj8M?iq;#E;}N6dTAYMluO6>| zb)^uMMnCSP5g~}71zQkBTg?kNeAqPRH$a`!R>_fB-rk7x{=U(^-j4gd!kzq!A-JKm zE=KH`<+gNXN23M_do&1NQEEavlzgC-NESO!IwZ2~(|4Zy-w%TF^|#wYscdOz<@~dH zdq3m{dF$tdLD)lYE~Eys#B)W%`ZlQX$Q`8_jOamJH)%wiB82kQD06FA#}cTN;|ZC% z*L!X24?m-+=-vc=!<~eHb9{*^g#%D^*Nf^mnZGY-E$j!F@zXm)yOZ5m27E>{0@8(4ynUxDHz zMMSezR_NJeQ$RBdn1@1UwYF%Jtjkhz-@vqlljUYG;&xlKQ@ku+e(>4#+xO63|Ng20 zyIbTPPO^PBRpd(trzJvTG^$BcHIz_dF<0C_U4UykxN2V$R%TIY*983jX}2dyl%OFH zB@}mWWbz8S?y;`09z?y^;NTLy88n>t(UBs3P-VSLU(9oHlANA`KDt~7Y)hJJ%l=JK zJc*%K83d&NbOj#qBLdfV5shCbYu*+b%X>0T48DcW&T*?AVzkNPFLtL8=>nTAN`;TQ zkaqZfs%$O%PVS+|O)!g+D~sFP<^B&YSvK|RMWsmpNp3v`L)Rq=;*Rx`KW2cMhU=Qp<)dB``)XD{ z6UHI6j`U`nJ}LUVaZtga4^+;-*}7J zrTnUybtfwhafneB<=9o+pAWI=*mK{FRS|e({Dg0K{;Dg|TJu!mMUQef zlcZNT(ODsRrM-}Tx0pP%wp52(2TTsP6op7HzRG_#nJvgfDPKxu6@+epxV5NN(jh#^ zFd129sOv`6SdUBKbi@DBL`N@#jf=!dWs^s^d2^G{dz_0Ia*8d=p|Z^?K{Wx$_F`2X zu-g3~dWI!8m=HZ2_fyHRBqIZc70xG$K!GiBs&_u3e#z%iWoGGrXtOd4F?P|gw9g98 zqcj9tSI|SjLB%WIq=RbZWJbm})wbya%_a@nk$%#t5cJLr|1gV&Kj=Ddp&8TVYS{0CS*aACWk-nQ_rVMUXM8B6&!ceLDJN|%+6Bn`Xaa0K<_j_uMoH}7 z_#8~1D{ePX7+XkK)ikD4tj2v?MV~TbA78;9%(QDtij6wPYB~I787T@P9Ejp5`Ymh+ za?9%%=d%g+a3LPt-i_)i``ORUoW4T4XN6ZDo5#q<=5v^KPEw*n8H#OE(sX11A-m?* z7Zo=PRng2)K!s%uPu-HuOy99AZp0igl|I!*;EGCD<;ji+FzW^K zrW#ZUJ`&R(il79@x&+;E=B;3LOvHVr>hbVVHlKnBCvDumt;ZJ?6Mzt;Yrzg0v~Fo8 zaX}g_MgA|bsmzHGLLiR|T`^wyb#1jbXJJHhuMQQ~DAQz;!`ESnma?W&$=6h!lEdc? zXeEkl*S;GIi8x-+z9wrlYu3WDi@elD}Up0R` z%P6O6q(lI|7|y%aZ(dF`U3`4HX#zSSr(7bxBXe{B4m{Ea(s!;s)wvcMZ{`N@DY0=T zCfrSOT$~cv*~&oTeE3vGi@3$8lAhHLOrS;>E+PP#kks{>q(3=G*r*IJwJ;V+^lvl*77fx@iFsR_%o7cuBwJ-s zEMj%t5q#R^idPj$;-{Wd?K_{B1LCnR`9X(KYNfD?yJRmYiA&dY1WjFh$A#V@x}A8^ zEm?2)IvJX|YOoT2K(u6%pXA-{pQDpbwYwzmc43Q2!j@=>{cdx&r`)|MNl>pt_iNS} zL2{k1HiA2tfT_ zAnPeLI!5a0qbHqvYBcJNLoerW-I?I_h>j#;jzIVg0fI@%%qrmPXc|SO1E6Pk5KPHy zq>u^mu5%4{5PztNZz9HAME{hXb#I9kO0_egcL<@nvcgW_iBo*pduJ+#KEnwj*AvKn zq1Ra$23iDwXxS?gVvc{4;U>$*xEQS|6j>Zp1m1Hiy&Ch@KYsnQ?^=4Z=nfu#o-XI{ z6OSg{65|tQK5zw&2{Q0-J73+*4VT==NL+&%Z|SX5Q!j;MSI^)o4BcXoe&3G;`8`bN zEA+d}g2_!@6wq(c1x69MwsLg-kyIAWo%u|YA_u2o<4!y|=~xb)O=c7iju=3EX!Iba z99MM1qvHMDy7BJVOo}Smo!ik>S;IsKCB=a&cRVI43t;jZ2r6&Fei{N=TiTNw7~K_mWdC(*U+ zx+uZmYKjxu`;MXm#)580YTKA>a-(WT4;u_HKKU4KpoK72Q8a6pz%W`kHOQc218f%+ zsIK`OlR^25uOWI=MvJ_DpaH9l!dz6?PT$uLxlvifMJkE_VEpA0^jv3CvDr4+w--*m z`ipZQ$kW$Oy2b>~1B0Dpa`8O)#gwxXm#9frvGfN&n6-zbm6Jvtn_gMh2F_``aZ1w? zBICXk@@3!fXDNtPU)832W#(#2hDdacw(aFRsov0SRwOZP3C{ZnJ7CouM-4O`X%aXQ z*^WO}fpaqM2g1nhCfwmo+ zQS9r{H3Un8i@(YB0C?w)TqivK00R=tw%&)|pB`hcJ9YKc_h)mmVQ^=e&4$|)C!u-0 ziC5$1&}WJ`(B8X&J-d@Hv!iKd?ah=)&L{fdf};GD*vR7$?Uz4v6`G@rnYl*%UPwjI z3wXUJ4CjRlkGV7{1JX6koWkG0pEtVb{pn>{D62}eZJO65cB=C#v0@nLQ8QRiNpx-$ z-wJxk7}9Jv@IGsBeDiZ6PL_&1NJ+mv|7Ym}bs}60CvcYq=|i&OWA0DMhjs5odPK!& z*Zyi?D)Fh`snCTmlS@D#fNgY?WuN4_6FXUjr6#0kv`I)qAB?Y#yWFqveH^{;8WK$2 zb~o;QTV5b5W6Pn%qW$84D5K|zE6-Zj%vt`id42op+4bvKaX&EOfG?Gfjf!YdYNK!oAvy8o zCy3b@?SAQohZsrI$l9x>KYS#s$ohT-7Sd)e>f%=?;qR0+Djt6)-a{n|bW<3R;&nto`191a6ux+-s6`_HYK!8aJOLN;oPD z+$cTS>;pPnM0@N$xRU}X=TMJWI#YyhGsAP0y4C7cv18lQV_s(e^u%%>_06Xj)z|LV z8|r_+egU)RRYp9i1aaQ)i@58(*!uCY8kJD>oj&bYlm;?X%U^Bk8<6+&s&+a5Aqw%&Ja zY#Q#C9LXO297e=Kxu^ek8?$GpodgA#lvwz(RXOqL zS10W7-)mb+;$ z<$Bj{sOD>yLM|oFl4K+Q^5(@YFxo%2I>$-Xns0Rfg*&dOM;v&#ZnY#Ah}fNm4zSlZr5bL0)sOuREhtn_Xix6d@s`#r8AFd#Y*~xX6A5c) z5JP2BwAB2#<{~nx7(2#A!nXOUn=4XO^O(3YRfSisApKrZi8**o=psUvv~wkA{*@a^ zVI?ku94U6hx4I3xsW-Yqvk?W1*p297UR&sDrm2>}Lh!XM9C26n*V)e-XJv6RJSowr zC^?<4s<{aDU3tzOdY-CsjEBV8o}$Hhl!cmdmH4-Xiyd>$N0e@k?wWJ*s8=g^OZS3% zNoQYmkYVF`p&aWuRw!%62}uR@vP?vv+Rol#!N0JK|K@%7Mf>Wd5Vojo7rr}@>fwP( z@AU7?#@)N8R&69AKOEm)a=+UYh&{={2w=>A|KhW$n|B&_R|v^zj#P;=n{5jTIU5HH zZK8^vKhoNG1j+G^C;|QRveN%78|C)QzA`b8Y)ClI!84cs^^_ z4@amYU0o~R6aSD0*J>ru5YE#%{OX+v=yok3h@#QH)yA8Xdj&7|3n8k5>{Np+q$8gf zj?24U3}5r!=2&Is7N;|`>Qn;~0i zpH~eTyf>6ypR@BZsra$?O}*bGF*w$s#xRvK4TK%5I@L&vA!VBhm0QciYi>zSP^8Gu=e^=-QW-+u zHQ7lrz__l_h;L;nKQjF=hCyZowgC(YPJj+HbCQRi@%3l#^vm(Ojfpvfk{i%uOEz2D zo~JF$C)aA2r{)1o%Y+!CJstHHVX+cxb@z_Rc#*q5`!A8DoxhyQxh1m(A)Uw2Q!lBu z+|q^kANYy;Jg69PBDo*lQ+Uc)d3_6Ot$sJ-%Lw0C70xxbunGF*oGhrFJ%5P!0Niw}`p95WpN_WuzfaLwQ7Ky!N|W*aT_;wNm0Zi6vYBB(BN;!?4{ ztmON9)?#;F^x0?7Puf{W0W|WVGRfoAbg5V11XE3HCr`3*_mvQKhDOdvdv|LBm*YA5Oncp~>6d`|$T?*l05b{p+z(y@?krQY zr1f4d?qB!A@F`jfA53!p(RZ6_0~DQovZ2fHTSsB*@WMXS5H!O{rgiX6F3a~n^Pg>Q zq=x<7S#mh!{_e5cCS`4YlzH6vpqlfeUVevBH>T8?Tr&At?*-!LJQ8IhTaF=;izVY_{p$vd)fvxyKq#ELJiD>ZZ=TuQMEcM4u{(Ds42TD73O z%Nb`N?V#4IUZ>7zN`eiWRDMd`+GCQpz?;?WjLr6hDEoB-wj^?|D$tzkk{ykqc)9qR zSpd9WjORg8-?`xZ0L#^QnA)g%(w(~@j>Sf%%j zHHoTTzVxBdA_}tl#`*QLjF!k?Y!iPCI^HhFcxasMgEao}pRDgwX_GG@JQV;nz$L;H z@YA%c{Y04X{1)0Zkj%A;8c-Ki`15`30{3H+o4_Ns;^~1L@$;3SRgUmXt&S)p!4*fM%I{}yvaorCYJ6LHri>{_V zUn(*44)T)h0umX@hgbcO{u$fLU4U>d9nf|+v(G0MMLwrRksQ1(2h3wzSkuR$Gvjc% zPZ_@EYiZRn)QR7v+c=TMTMx4qxI6REsLo5v*kENF3GirH?lL-WniB_JYC>WNEin^# zRcF!g`gQ6eXK>P%zC1{r>X8gWa@46O*mQ{|UVc`P==QS|@mTD?yEz9_3K|-ArH*g3 zBwlS-{c&1V+m-+5LxtjQ|ya;+B`S>&kRz;~N($5rt^_A~@E>+f2o^OT6+D(htVhG&N z3f(NIZ6I=Z1{)Lw!YT>IqI=DN-&w{byTr$Ur21v@Wln*X-#BZhyGJ`Y8ZV#({Ae0f zob{nyeS=-j*AoX>0>RWyxWf8&(w{bb;?JMyeYyzig&hoVw403D`b9HXTVYKE59$#5}QgQhuSwMYx^nu7qHOw#L z1?CU>6n#1~q*ZvJq!xHZMF69RetK<^q`9ub^s(s59Q26-$NAZtBLc?7`2(8tqqs)? z22A>=$l{&vqiR+q>2RmczCfnarxl%j=Bk=vf3o$q6rz7@s|)hxFjY%(DD(lk^`$;8 zymPk;W!r0a)%oRY!u%#>I$D?J9$Id@5ISO7BIw3ILB{+o!JDPvY-MTV-VgqR%O2~! z8oQr>rgvtmSsVygk<&27vF{C9t{_teg5=Mi_a9sIu?PHh`^5mAUC&akdycn;O zd3?gaBy|a82pKz*=)MF>PDfta9Z!MrzoDFnnYf-xXWZYLuEhJYjSbi_zd_M30|XH0 z*<9l8i$2tlkZl)|UF6RU71lm!{C1$y93C_C)WTJOY1n_r43nro=(Y}Ll~%d)*dxb4 zXe$g%#?xx*yUzYRgz?h-4O0v`5$HatL2r!>^4e4lz~X#zhCf#*;KESR)-ds^%Z6#d zmgwRB!^GK1LCYw>a)8~MoWGJq**EIr0(2k8_DfVL0TA0IF(G-u+N21vPQL9I=d%)fYa0*p;T^ihdSeU1Psqx+zy+dE( zhw2uU#G?1D<2%m02~FVGSU`da@mn>k)3cXbH!>-dJc}gg^5vG6$y1rSyzSQtSF0ht zU%YuYhktsCck&?!1Nsz{w4`%RMQ@6+8y;qH#tpGoLfUe-zA2-*T0#R<5gaQbN-{;K z`{#DTsYJ}I*OD6!`yt`@jD%ye2i%GxUY+F{)?Cj|+?YkaT6Oz*vt5Bc@I0u!f6moL zZ618by&YgR3%{$8!cah?K_6HSI+r1f-(c4W6TD8C>x%M>_@k~8pKvo!5E*b+m5`F& z0PkLY?p@1oG#qPSE8=7$&%j-*rRO#$;>MN==ld$HUi!@QX>*d;Wt!;1FUrCbCL)VP zMkcorW>$^z2?9hi3kf0jWmR(&fA+ylZ0rniT5r}CJfjO=*ijrsyViVA{5TNn@$3#= zzPqo+C~VwpN$6>gUTS(Oe5f?xY#EkubRk_bww*H3yh*O4)BG$oy#GTB%?I%S#--lHt>;ud^4JnC&KjpX08I-5PvraFVyRKwX8N!R8uW#*%uk(5WACMAkR~XbtykC~D zRIC+W^;*`2uL90Nb$vM+xxC-EjXRSW!j3x(-ZK4i|FN-LGPYBa4%lEFY1M@b8}fvl zmn%az#fAZX&sX}$piGhp8il83admi!Ec;XVL3Ebx-DU3b_cL+~Nuk-%7hX#~R;lQe`MN;EZ~1vG_9# zA|*8{IU!z1F{s^+;fRV8l|z!zrG8(MwrsO<^2|=PZhDK1aerSU6MGof&hU%`I>pOt zmvxXZy^a`v^lb(3+kMLVM0h)|jNOXBW*D2uJ&lMf9aXAo74G?ReK(V=IO4dyJ# z&(mE&;O+OVDju_pIKFM{4cf~4B2s+Ru2JK|ew@^<5<7*@F>C-NVG5A7Jf44Yy{pDq+Qj6K+v2J8+ z#kfuMN_l*IeBiI3!8(s*?9GZq9c*F=0k~z)pBBkg6$R*?z)iM@~T~Jx7Dpb z=1DT!GYM&Wx~`X6ZSee5gwRqz1a%I^L=V@vP5d#b zSb_EZ9c5?W&G+TY1X-QKAEi2AlQ*lIalWVP0Zg{e{^7Do&uYYnv_zG5X9C~lxy(AG z);{O|^V`W}zcc-ZQvbBxH`>z5(hQGA-!3YDYPNUMs!dniuA>btke4)d0knC737wrX ztsX1ALnr*{u1(LnEx&&bnm-(oDVHbwY1y~h!#vuoXd_QcbkL4ND?mc5KBGyb@nt90 z%szkiV^Ql((56+Dsx-I4NWHR{9CccmVy$lKN4y1zUF_B|@pP95!Bf1?qu3Uq>^o7v z>9-|~EeFzMe^Wm`hwdLd@xtxI;wZ>sRwexSLg60I)l&dzQQHz;){=XFzi@GtTV?P? z&-$C_wN*FFfm++(mwhn}j4y&`WTuaM9TI#&IQ$;2F(gY3H28KYc>%K=@h58uGll@*y9 z4L+mN`vz=Htpj$h`wlDUVVU8HQPt-W@SBPJdT9;1%G znRA-PCZ6N?%jcgzR@2b%=W}w2nzc^>eBMEBkIW9JXv-if`qc&iI=a#ZPs~5>9R+Ll zzUhOBZ#z!&x{9=VPDg!JsQEJliDmjz&p4B3TG}^^NYDvQ*q^t*brF(wxVDO-pDW!1WYfd?$d*h#?=$`EI?j;l^ykS@$B081 za1N*(lrWM+dO$xs&aDEHgY-ON>E#w8~+lSIU0S#`^>-r`!e`Qm zgf@Xkmmy|@TV&wegz9MAe+Tjw6aEP;e0^%`Be_B9*8+EQnn8wdGXFRb)TPxplm3m7Y=f+SiARy5@+aurVzBWF;=j6_pZrkM4 z=MtEZ_I3^F)rseC`Enxnu^1OqQ#ESPu$vW`7a=%HpVCr^5^*dxeg?*0XbhLmkiG?{ z`*4-(B@JlgHik|}FL-u^Exy88X39VUJ{{&;79*tQl9^qq`4 z{5&DUZPu*j;&1CU22gHGh(6ZCmI{@9UXbghNj}Ub?FB6JE6T1tSBVO713rv8h4Co( z70;^6K9&gb*c#`g(kmuMS@C6Kg@9-2lQz-Uei31|7z5*L&D+uqYmB^(w8Ntz@uq@~ z?|c{Zu9khopPcXbtVdz7UP{u{Li)Wlff{4@9JN~}gI@H_Ml03XA5qK0YqDLmu7@+3 z2cKp)R(ZiBV7o2nYyxJ>`OK+gQ!hxpXZc`B8GX6;DSmhsQ@>rmqSw> {t("jobs.labels.additionaltotal")} - {Dinero(job.job_totals.parts.additional).toFormat()} + {Dinero(job.job_totals.additional).toFormat()} @@ -293,6 +295,9 @@ export function JobsTotalsTableComponent({ bodyshop, job }) { /> + diff --git a/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx index 10fd77f4f..51bab241b 100644 --- a/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx +++ b/client/src/components/shop-template-editor-save-button/shop-template-editor-save-button.component.jsx @@ -20,6 +20,7 @@ export default function ShopTemplateSaveButton({ emailEditorRef.current.exportHtml(async (data) => { inlineCss(data.html, { url: `${window.location.protocol}://${window.location.host}/`, + preserveMediaQueries: true, }).then(async function (inlineHtml) { const result = await updateTemplate({ variables: { diff --git a/client/src/components/shop-template-editor/shop-template-editor.component.jsx b/client/src/components/shop-template-editor/shop-template-editor.component.jsx index d6071859d..f46845fbd 100644 --- a/client/src/components/shop-template-editor/shop-template-editor.component.jsx +++ b/client/src/components/shop-template-editor/shop-template-editor.component.jsx @@ -1,28 +1,16 @@ -import "codemirror/addon/hint/show-hint"; -import "codemirror/addon/lint/lint"; import "codemirror-graphql/hint"; import "codemirror-graphql/lint"; import "codemirror-graphql/mode"; - +import "codemirror/addon/hint/show-hint"; +import "codemirror/addon/lint/lint"; import "codemirror/lib/codemirror.css"; import "codemirror/theme/material.css"; -import "codemirror/addon/hint/show-hint"; - import React, { useEffect, useRef, useState } from "react"; import { Controlled as CmEditor } from "react-codemirror2"; import EmailEditor from "react-email-editor"; import GqlSchema from "../../graphql/schema"; import ShopTemplateEditorSaveButton from "../shop-template-editor-save-button/shop-template-editor-save-button.component"; import ShopTemplateTestRender from "../shop-template-test-render/shop-template-test-render.component"; -// CodeMirror.fromTextArea(document.getElementById("gqlcm"), { -// mode: "graphql", -// lint: { -// // schema: myGraphQLSchema, -// }, -// hintOptions: { -// // schema: myGraphQLSchema, -// }, -// }); export default function ShopTemplateEditorComponent({ templateId, @@ -58,7 +46,7 @@ export default function ShopTemplateEditorComponent({ setEditorLoaded(true)} options={{ // customCSS: [ @@ -75,9 +63,9 @@ export default function ShopTemplateEditorComponent({ ], }} /> -
+
diff --git a/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx b/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx index f57d1b678..69f86eead 100644 --- a/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx +++ b/client/src/components/shop-template-test-render/shop-template-test-render.component.jsx @@ -19,7 +19,12 @@ const mapDispatchToProps = (dispatch) => ({ //setUserLanguage: language => dispatch(setUserLanguage(language)) }); -export function ShopTemplateTestRender({ bodyshop, query, emailEditorRef }) { +export function ShopTemplateTestRender({ + bodyshop, + query, + emailEditorRef, + style, +}) { const [variables, setVariables] = useState({ id: "uuid" }); const [loading, setLoading] = useState(false); const { t } = useTranslation(); @@ -31,6 +36,7 @@ export function ShopTemplateTestRender({ bodyshop, query, emailEditorRef }) { emailEditorRef.current.exportHtml(async (data) => { inlineCss(data.html, { url: `${window.location.protocol}://${window.location.host}/`, + removeLinkTags: false, }).then(async function (inlineHtml) { try { const { data: contextData } = await client.query({ @@ -59,13 +65,11 @@ export function ShopTemplateTestRender({ bodyshop, query, emailEditorRef }) { }; return ( -
-
- setVariables(e)} /> - -
+
+ setVariables(e)} /> +
); } diff --git a/client/src/components/shop-templates-list/shop-templates-list.container.jsx b/client/src/components/shop-templates-list/shop-templates-list.container.jsx index c012c2296..d435fed47 100644 --- a/client/src/components/shop-templates-list/shop-templates-list.container.jsx +++ b/client/src/components/shop-templates-list/shop-templates-list.container.jsx @@ -64,6 +64,7 @@ export default function ShopTemplatesListContainer({ visibleState }) {
{TemplateList[item.name].title}
{TemplateList[item.name].description}
+
{TemplateList[item.name].drivingid}
diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 5594e7528..0569d44f4 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -942,6 +942,7 @@ "scheddates": "Schedule Dates" }, "labels": { + "additionaltotal": "Additional Total", "allocations": "Allocations", "appointmentconfirmation": "Send confirmation to customer?", "audit": "Audit Trail", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 952af7924..23e282751 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -942,6 +942,7 @@ "scheddates": "" }, "labels": { + "additionaltotal": "", "allocations": "", "appointmentconfirmation": "¿Enviar confirmación al cliente?", "audit": "", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 58f62d391..4142611d4 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -942,6 +942,7 @@ "scheddates": "" }, "labels": { + "additionaltotal": "", "allocations": "", "appointmentconfirmation": "Envoyer une confirmation au client?", "audit": "", diff --git a/client/src/utils/TemplateConstants.js b/client/src/utils/TemplateConstants.js index 023ef4ba9..a902ce478 100644 --- a/client/src/utils/TemplateConstants.js +++ b/client/src/utils/TemplateConstants.js @@ -4,6 +4,14 @@ export const EmailSettings = { }; export const TemplateList = { + //Verified Completed items + estimate_detail: { + title: "Estimate Detail", + description: "Est Detail", + drivingId: "job", + key: "estimate_detail", + }, + //Non Completed Items appointment_reminder: { title: "Appointment Reminder", description: "Sent to a customer as a reminder of an upcoming appointment.", @@ -23,12 +31,7 @@ export const TemplateList = { drivingId: "partsorder", key: "parts_order_confirmation", }, - estimate_detail: { - title: "Estimate Detail Lines", - description: "Est Detail", - drivingId: "job", - key: "estimate_detail", - }, + cover_sheet_landscape: { title: "Cover Sheet - Landscape", description: "Cover sheet landscape", diff --git a/client/templates/helpers.md b/client/templates/helpers.md new file mode 100644 index 000000000..e69de29bb diff --git a/server/job/job-totals.js b/server/job/job-totals.js index e8d790f2a..be08fafd7 100644 --- a/server/job/job-totals.js +++ b/server/job/job-totals.js @@ -41,7 +41,6 @@ function CalculateAdditional(job) { jl.lbr_op === "OP15" ) .reduce((acc, val) => { - console.log("val", val); return acc.add( Dinero({ amount: Math.round((val.act_price || 0) * 100) }) ); diff --git a/server/render/renderHandlebars.js b/server/render/renderHandlebars.js index 79dce7572..65d0b8f8b 100644 --- a/server/render/renderHandlebars.js +++ b/server/render/renderHandlebars.js @@ -8,12 +8,25 @@ require("dotenv").config({ }); var _ = require("lodash"); const Handlebars = require("handlebars"); +const phone = require("phone"); var Dinero = require("dinero.js"); Dinero.defaultCurrency = "CAD"; Dinero.globalLocale = "en-CA"; //Usage: {{moment appointments_by_pk.start format="dddd, DD MMMM YYYY"}} +Handlebars.registerHelper("round", function (context, block) { + if (context && context.hash) { + block = _.cloneDeep(context); + context = undefined; + } + try { + return context.toFixed(2); + } catch { + return context; + } +}); + Handlebars.registerHelper("dinerof", function (context, block) { if (context && context.hash) { block = _.cloneDeep(context); @@ -26,6 +39,77 @@ Handlebars.registerHelper("dinerof", function (context, block) { return ""; }); +Handlebars.registerHelper("phonef", function (context, block) { + if (context && context.hash) { + block = _.cloneDeep(context); + context = undefined; + } + var ph = phone(context)[0]; + if (context) { + return ph; + } + return ""; +}); + +Handlebars.registerHelper("partType", function (context, block) { + if (!context) return ""; + + switch (context.toUpperCase()) { + case "PAA": + return "Aftermarket"; + case "PAE": + return "Existing"; + case "PAN": + return "OEM"; + case "PAO": + return "Other"; + case "PAS": + return "Sublet"; + case "PASL": + return "Sublet"; + case "PAL": + return "LKQ"; + case "PAM": + return "Remanufactured"; + case "PAC": + return "Chrome"; + case "PAP": + return "OEM Partial"; + case "PAR": + return "Record"; + default: + return context; + } +}); + +Handlebars.registerHelper("lbrType", function (context, block) { + if (!context) return ""; + + switch (context.toUpperCase()) { + case "LAA": + return "Aluminum"; + case "LAB": + return "Body"; + case "LAD": + return "Diagnostic"; + case "LAF": + return "Frame"; + case "LAG": + return "Glass"; + case "LAM": + return "Mechanical"; + case "LAR": + return "Refinish"; + case "LAS": + return "Structural"; + case "LAU": + return "Detail"; + + default: + return context; + } +}); + Handlebars.registerHelper("objectKeys", function (obj, block) { var accum = ""; @@ -41,7 +125,10 @@ Handlebars.registerHelper("dinero", function (context, block) { block = _.cloneDeep(context); context = undefined; } - var amount = Dinero({ amount: Math.round((context || 0) * 100) }); + var amount = Dinero({ + amount: Math.round((context || 0) * 100), + currency: "CAD", + }); return amount.toFormat(); }); @@ -50,6 +137,9 @@ Handlebars.registerHelper("moment", function (context, block) { block = _.cloneDeep(context); context = undefined; } + + if (!!!context) return ""; + var date = moment(context); if (block.hash.timezone) {