From 8af6f289881dae725e95ab96280eccffba0664ea Mon Sep 17 00:00:00 2001 From: Doug Bell Date: Tue, 4 Mar 2008 21:26:30 +0000 Subject: [PATCH] fix: GalleryAlbum and Photo were not showing correct confirmation messages on editSave add: Ability to edit comments to Photos add: Ability to choose which rich editor for Albums --- docs/changelog/7.x.x.txt | 2 + .../root_import_gallery-templates.wgpkg | Bin 0 -> 124416 bytes docs/upgrades/upgrade_7.5.4-7.5.5.pl | 29 ++- lib/WebGUI/Asset/File/Image/Photo.pm | 212 +++++++++++++----- lib/WebGUI/Asset/Wobject/Gallery.pm | 15 ++ lib/WebGUI/Asset/Wobject/GalleryAlbum.pm | 23 -- lib/WebGUI/Help/Asset_Photo.pm | 26 +++ lib/WebGUI/i18n/English/Asset_Gallery.pm | 20 ++ lib/WebGUI/i18n/English/Asset_Photo.pm | 48 ++++ t/Asset/File/Image/Photo/comment.t | 87 ++++--- 10 files changed, 340 insertions(+), 122 deletions(-) create mode 100644 docs/upgrades/packages-7.5.5/root_import_gallery-templates.wgpkg diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 4ea03f4d5..9dec20fec 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -2,6 +2,8 @@ - fixed: Several typos in the new Calendar help documentation. - fix: List View now starts at the beginning of the day passed in. - Removed some spurious warnings from the calendar. + - Added ability to edit comments. Entirely changed how comments work in prep + for turning it into a mixin. 7.5.4 - fixed: unable to remove calendar feeds in IE6 diff --git a/docs/upgrades/packages-7.5.5/root_import_gallery-templates.wgpkg b/docs/upgrades/packages-7.5.5/root_import_gallery-templates.wgpkg new file mode 100644 index 0000000000000000000000000000000000000000..7771d9a96fd0b4e9ab7d5a939cca17c5af327e40 GIT binary patch literal 124416 zcmeEP2VB#~7f0)=+PbZE5pi1rNeG0c$OchBmZ%7ZBtRs~43;9!YTa9F-PTpN)?N4B zTkFKFRjYN2BKhClZzsP5M4;o3e#G$0{qEk~y?giG_q}`PU{m^kcs!oS+1bVh{x9ND z|8vMcJR3ew`NzO%@N170cpKL(v%tOcZ{%Mz0fa?9-%_C4qv_=7r! z{C~zcr4iKbA{0{d4t_^`fKR_bg6&WEP&oXML2d+ zxlW@HXGY2O3iPra-wwTkf2|Pf^!^zdwN@{adZU+B28DuNLZX$4!IwUnux2|a#@k?F z>akiihD3#2mm-rgzE{c8d&pH%bvk;N$M{Z{sZwina@IE0=_;8vS|`&6OIcc#W$3ly zAemSiB~E62-Jn&V*R*Q2-chcEy>mIctD=zV0G}HWtJ#S)V6CN@@Ht|iNO=}Ea!!2aDv|5DswJsJe@#c7J|c)0+}uQN zZq6bBlU%I~@{U^NN31x$fG2cuaTbY$j1dB?DVC%Xv%y^K1n*nn7?CTZHknGI&D7|_ ziTao{>BY%-RT(0`Xklt}s;?$W$#s#LIzR!-s?dQ2>aEbEh!bUc zFkuP>CTp0D$#s~V5+||>GBiHK7@LSGB*GYD$9EGsIq_UfdaDs@Whz1pg!`abCD#)A zAYgP!qm`@lke z{QY{y_$hpPx%Lb0?(N3y*PT)P6ZUY~_ zaoRW)`lt7V8+}5WSj)kB6rk2B6QGTx#|r7GD#TKyT-8GhHZ7Sp&W?lh22isej6YYb zkSD9$6|y8fv-T80r}$u%UZz!{ty8RM*Onj3!a04a%TEl?xCQy$Se=$97nKpgliCErtkeL(?A6-HH(T&9p(p-nGk zRqDi_^n-U|D`-%@m87a*du?y#xn+4wutanj&A=pVBPxYk0wKGV zVr{Zq#f5U)o$sv4@JLdt^xSkA?4WxhFwQ*i5{YWPUafQ&fHI_r1?0G8p zJs4(rCr)AV6(@=VCWd8>IdOK3x@ikq-YL$`0q1^dtgyjo!R2xiWuQkKU5XeW1spE7 z6WYIsT?2c}hawsd1M{(f{V@{g=A{91U?Yl}24ew>psg0)X2azYy#aKSC2j$)1?(-r6mAW8QX*5p-9{o;C1ZOY)-JYz zM_{wfY!yivg<7p)=Lt#@0j^0%2=ntxNB}cS$reC3szRpFfn}uEk|QTp&=&$I=7`G4 zljz++8!*9gX%Jchb{VcR=+znz)IE28YY#X9Vor)ymIV4maX-+|z@&Hblq-`tI<189 zoj%2&OjL>GifB}b0|)}&(-tnK8@TJ#3b~Y%r~vjXhYuKCBbG|R__@Q+9E{1`IZoIw z8C;Aaj)2DlPe5g0i8+et@&k?-9267r_&$uewx!8HJB#j5SpMxpnhxYWX%QNTdJX9}l= zK?1h0Xq8eOjni|v^xv?ikQ}481*q!^#?HZ@iBj`Pf*g_-YT+5upbT5*^&5v@!+I7!Yp(pOXyeGaTrP0ngxCcf<-g z;)40pn!&-MVl+gqo8CZ<1^aVEeTqc@>SuynCMpIAKv(Sz7Ogy~4^U3c_(X>LUC{6s z-OIoixbj7=Otxcs8JIx5E=8Rltb(8v<}qRNGu-Q;B8>4mzHl5_7EV!J51K@v#zD^r zTIl!>W}8-A4<+qYa1)65F3hoFcoi%-7p-{(FabvX1pa^YxkRG?K#kV$f1ZnzzzqKv zmgE1Q1M3(0-E#cjEbaiPhDeB6-!V+_e-NMmQSU^9QpZh${$)!M0OBm){(ijRe$wud zif&F~t-vkSInvadS>y-+rY!mtPXKP00{}n=1)Kwb{2kEt5T>G;Q4)avXaN95Q-cX5 zi~=|qz625qfFt6K281+3s8=v-0;+4IU5Y(|qMhMyKn4+8p+vDxF2Q8Gg<3GgjRuAx z>#L0_QK#`>Q~trsCty@Sc)_9xN)=-;bek zI&zR`02rgn1TQ0Kl!#T{QYjomnu!c5V7J>70J?*CvCt7F3R)dfnvqVk>uBQ%7>&^t zd_==gcns_j&V-aU(_lI7?N?f(j*vnbYa;|y^#2gvwBB>)<4+6u;JfO70$ z1(>io9rwZJ49*`phd`)O4j}3&W46ixzH)$%z<3=9xGoy^i7?<;YU`)rn#3C=2=D<$ zXYwk6%t6EickCc1sfqiL3w?~V?H?@|3p+TaPDbc}?-F;m5n_)L^@U>4$Q0Eg0lE@#A2jl7q{LiTjAbbC(L5;i0!9BqL)QulbzZmg*x4xlY)-$mRxviFoZM! z#}EzU;i_)D)*kp-7fO z+I|5=1N>`oLBkp4(9acE;(1QIU%NQF*4-RiOC4MHjI*<+Xr>=^?F0@LF(Ty&3P2~> zMGsv4R9z|%YAn-+CHbnA0B!&g^&H|86F36ZQGiMC;yCVg=Sf z$|8icGII>jal;Y~X@#IM1|T!KRKn1)vq{Vx>`w8+S}oB0UjmJZ^~#(Sn2x1*L7w1* zzcbI78LCvm;4!ks9O2wBi2j#i$09d?w=+6YTG+7#{8w1E_^)aHC!tU%D9`^;d{npS zZop}4a*v< z`JaG-v9J+J1EvQ%mV?1q8WxCRmV?0-5g8i7TPQS331&;cQPHBeNr<=57Ri#I)nM6! z!N?vZ5T(*ck^p3Tp%5^Jl(A+!K!O5~eu*MZ{F_FK)6*4z=4fa0$pi!DhxEB5p0QQ1%MDx#4wb+59x7Ew7C{~`s}VqHN$EfNN6`4qS~ zi_^Ln11m;k(D7yf7+ajtLWUIq=_WHs;^#ERD5M$&YEByjHoTe`Z78KoS~f?nt&gH< zd28a#;t1j70@RzHv4&VZRP;QyIz=F}i3t;8+919DBG%<5XzfvyrEcAMgw_kYUm!sY z4?02kfs#gasf~6XI1Oy8o!pl2)lSG={3Wy1kBb&s77~_h5nySP>F4L3L?^7w_24`tdwwkS|!a%rIXp<=i`Bp|97_e^WhQnl1B91Dtqex*N*e4HFoRS}3hcE+ z{(lMgWzNgz;k~YW7e;lZhWA=vtA8o-D*!o{nbG^Dh5TX|p#}WcxeW1NA>Y}_{QSR5 zIsRL86u0;#%kkfm$A3wqpCJJ0@NbBBH>o^Y+9fl!Uno!D8y=*|>=jlH|I+hTB9*ip z{{4@@zYs$y2X~2dRFpAZ4({USzXh|JG>!kBNZ(Hk!A&3~zcqZM&|qVT*I0yO0LNIX z+_Hg+zJbOlWsnj;!`}t)lGGq%g_IG>OkXj$p+*PuvQsmFKjKQ%;LaTt2)8tWhZsnv zge;u0-zUchrDBP*BhudC-GXQqA`9LE#ls4UDvyL5L3w?FSE&3@Qn{>WQOJi>1Nf#tL0Kc-q>Y1M;Qo+H(eA zJ%O*vIUPBC^d7d$vmQmzr^t06*%qp)o&3A+>^W^I0KX+52Advu@efElNgr5pbx}G5 zg!ysg7)whH4kbZ)0K&__g|ms_BRiv4Cnqap;b8r>Bl`fd_Oxq3^xq*_rU$9W;O%dj z?b<>|5-i-dJy|+VPZkA08@Ol*FVfB#01FryaeAy_J zZ%dQ#;O({&g2@-Jc%4bw5RssDMZp4n{C-&M%Hh_A2&*)$dA?pZj-Qv`8iS5LZ z_+U1ah&51tX)C!~D2`*P5hRg@?8eYW7>T73^TGY!ya*DljvY8*z@x2&r&8gKA*9N} z>EKB8-GS%;WixT8XVB2$DCC?0h%e&wnAaWbe(;71&^)=VP_K}t7fUrzpTyN5rI@@h zL+B>NtBcda$Ha+9=5u)Gj5`PJ!pxT8tqouZ%=Z$yp#Q`~Ht@DVKA-7gDK*~|ySV-L zx~5#2zSYuoO%>m%QT}F;N5F#r&!r6ge*zG#X72w3*MOGa|6Sy1EOxx0gFAY#1sD%(BLG94pc|}OxQE1){7>#Ipu^nndnThi6d}?&J2qeESkNGsc zd5r-6K(DaBAl*3$EYg5j2;<<%OWm=nzASoZpd<)@f&k=phe_QnTpCNuNdbigx~2@j z?fE-ctI`MSB+W+ zEJ(G=9hfx0!b*d=LP&s?Ab`M)abS{4Gr|H(lCC=(n=Hmfe4tjQKLDR1L^$ERf>~7n zC`qJgG3_OMg~CeNqViD*M_8v>e}MtQ`WT|mMEhi#6mlr>%k98ThVBAj{m}2aGf#Jm zcgcEA6^ukWWRAUtFGU6^7OvWZ)W8cpi$ab07+Pd@$bz2~W6ub%H;JvM@jZ=CK_}V0 z!_2sL(-3tlSB@g0P0JU>t4fYK<_4l=J*H*|V>bM{H1h6DbAJU$%%e|%iwxi8P?b1l zkKdx^JZcWg~019NIP@MMv#xM zPUI&+QVpwzc_FJZ6Ti#}2E(%mCMz659~(42l;?{k7l<=NmV_04VhEulv~xAY#hvKd zP{z%o$y#wHyjT>;Fm}c^zqFE`Cl7)j*qxT}o;}u+FN`a3B`E;b#4g;meAzDhq(R5F zjQy@{aJw#zw*X6+I6%>e(j86Mw9?)IOiW#k4lA&H41s*B7|v5t29~EkDo=m(4@rMS z@-wxD7@SShFF)7O51jLGJER&i5p{*85@#Nm0aEJ|v*J_h9`7|xQlKYvM?U>CA{i@T zzDfRVcX~1pFVOMk5>0^A6@u^qQ2KI!wZMVq0s{sp;lnW^VM+QG3nTu&h*aa#`i zTZR2;SOBIr(-3PM-2-Z~UafS;Z`ZO2;Xs}>!E3No_c&T(qMFkYf41yQ2*U*Nqu^>z zMw)wuTLKH#HUab5@x5ZCJ)+2GL>pVEzj&$dKdlX=I8_#zqSopq29WsQ`oWF_dSMce zWNVLRTmi!i#|eq6NC^Xsj#3vR%Ra*43MCnpDhjR8K%^Oh_-~ZqM*ui~r{4-0v7W3M zha@tE0yqOCa#b=2$>sqA87&9wy5IVo54QBk6c0i+9B;I$;JcfIhJ-EQlpyD5_=b7%yX$Z6JUFS=-#}K@)(e48d5~ z8{i!}j(|x-cL8wPaWKan6C;5WLtL3k=Hp=&q0xXZEu1zMP}VAB4&vufp7=s#F3~MI zHjcmCRjt-AU4Gb1b8(rkQ-c6yj!v!sJjR%D==@=uLO8zE5G1OlnNc7-ot~kZqy`^a zVx?M57iA@36y6hdw-G7r2=tqr9fq@rLdRJq0Zxy_O^-EQ6^F#)NsdOxFv!M97cI;X zS7_tdc+$4Q-fSzyfM@pe#n=LhTA1h$w$O)T@eOR#qTb=CRVWxANF}Wd+-ITUfN0w! zxmMY(t;I1QW&o>;c)@Hr!h{twH%ql=#p>`*1;j%1WFkiGqM)Di`Gc+eGcP7AD zx7-4KO31-uE@yJG@!TVMBMht#3!X#JE24x#3=VX%$Ve;Fgf5iK*x!VDsHf3gVc4vIVKpHdKF2OF z!86ivDEVx1eMu2o0FBb~e!*-fLsigHOKGn3}lCYTbd4W33US{*92SwF#eL!A*wOiK|$<}00jj*7vZ7I$@p zT7u5Tu#synW1!rj78&s_=#ZH_Vxyd%J&+-lncRww&HKj&2XLffy_h(ALv2Txt!2Wf z7*!}BM3x~>!Zcodz&T_@jhSSp%_|ge)Et?R#OSwPoXpx~MxivZ!XRTU24ySW5T%je z8z_)$7DtJu12IO=s`-#A%S=~mrRHK5+`A|+8AFpkw*aT0h}XfV2=pA3c z6FR#Ics%BvQ6=ouhW_m0U+)v^7U>d{;+qkmPFFfdt9e0wSrMV8H!nwKf}`?E)F&Q; zO~J|S3=KeVVT3x?WyaS?C6`HA<3i}>0ro22P2}e4CKNJ9>u+;rTk!w7mYx5XBXR0bW_=V(LFR)VTCoNscp+d9Oi>|kmjM{2To)=!_lEh+E!#^V(+FvG;E~$s z4LlVMRI6y}xkU>G4q~D8khYiQFlXd-hq{ub$|#K)>o19)C7ED;_}A!g5&@5(VT*!~ zfD45kjn_JNrT_g=xHa4=If3ljx#FtbZPLw2J7K7DXd%q5xAu4-)-yXF8;XI-rK$Iu(HZ z1mxf&E~KmAxaR~OjltX|E#2JQ=uQ(ZerkqM1z=^$=YXiftOkp7hsS`BiK+`3C{#JE z3C!%ETV1A|$J%GO+3~wk!nDaIv;*o9v%#bh2oweD8c~)&*oLqg5-_=z4l`tr#@kSpGZuZ3^*tx(!FYTCGSFYeAM5kgHGcs07Eu zqBUfKH)6HoGmn0Chc{z`HH!s2M{AH@6q%s-$b;c660K61DXCI$hsh@r>jz%>1ae_< zieM(0a+SuQC-R4A#Zo!E1_pVpk<;Gttdl~GZJ6LeMaVcholGArC7BvjjbIY+6~zb? zBjFG>+D_2UK)%>Xk|L9&%B0{${1d2wlJTYo02$6*%QiHzXy9@uge-RA3y5T}Bq$ma z5`4p=L!cZv^7SfIJgUHkjq5HAOSSr8#p}VNqxB7PG(bB%)5}Cgf0SsNho^> zV|#8U9m#|8v=}SULVv zlK79tYW%;bi*J;-+`x}cNQ`n*NVP7`&OU$ZrO%&${~$-mzZm~P^aC{N?*V==m72iP zu(8A~0a_?dQGgfVp#Yh9^)ik@0~7fo>&`OBMRRaMK!`G9v1kjzFhYDlq2pL?T@1 zGe{(=C@m6cv0|S=C9Rgi2xY-^N(Rkg;CSRE8wA>Bk&Q6e$E@#`ge^$5#qne`g&{;V zV9#PxI&qr$y0X#`E^g^)8-{){S6Px8K)<+Sq72a|bGU}E^;v!V$>6RUO|TTkxF8ol zGo}U!b@bd%mLvwJgg8VdBWR$PdQgnOSy+-mF&1bpN1s4=h$HTE;SxHU&Jk%d|1k8) z#mSAy5haX1p-3IbC;tKP$yMO&D)>*QonXg*_`EX2e?U5Rz8U_*cP@|rDGLOs9RDdH z{0Eq`T-+RG2tM2eiZlRTtgyS2-ls=&VuC(J7n7*#ndO#Y8iok&ThgncTLgQBQJGv9 zB$rBMD)bdoisM=c61*I-xW0LXgQN6Kn9ImBufj6#H@V~U-|GOR$W z5}uSJ6;`tvH84CIR!7qn0j2_O!B7*?E1nwC+lwAEJiS;!Pe)J>Rs+*3i=NTzhSzyv zu2Oil74Z^w>Wl%MluaxUF^8WE{aA?02h)Ho;^Lz*g#kkp7z364UL3dEu@DU80c%%n8bz$$`(%ZkE`%HoqrKmealDp6DE(Mq$ji%c#R zrhwKctqS(|G3IF;JXWG)40NW|YB8{aRkol*y0}m)qwoqo)16vs;T7IeDF=sm8M|1? z9{b?CmZ*hmiRf|@_upgUirn~2<*0;BTr9u>a0(lD|7*i6oJ7o9vC6|N%EAEqo7=Ep z|MSbx{ues)gl6`?Ku~V~mj!E-+y7>^GB~7+%w#R_J~+z3W%I1it`tM_xdiA7Q@3$- zc%nCkxDicquzIMt zbHji7Q9m9W&To^C)8aEOeLj9!(n-NP4}-+o>ExN^&6ms>vUJHS88xd#rGLwA)4 zQMhs*OGy965@8mS0U$amG(Z+3@<|X!`bH>~ z;sD?N!kB+r1^{OMT)NtcpJ<2o2$B{7P^{@^ER`~y4rtzy@PNE8T4go{6EERp3i3XOMzU(Ih=d@*|ehkyi z#k@bo*Oo03U9K$uo0Mf|<~3g>tSn=00*qA{%k|%@Cz}k||Bs%`P@4WjzgW=!oyt=G zcM-7Y|DtmIzbx3ST>mdw{T~JgF=Ra*{m+uba?^vOC3;?Df=a^|W@LnUbN@N$KNjC( z4n@7DAeiTR3vVr$bmM`k|7FnKA_~gVwg=$*U5sd0PF-> zvKGQqVSWiTa6u4>cxjF74JG7N_)pnMCgb(bwUaF9|H3lV{{_x2PG<2x zPP}sczg+)M?;%%#9E!*dXA-oWsZwinavl6i1yViQDXN;ee-|zOhvEHYY{ztsznf35kc6(`FLhX#k)C+1WeAS-vEV*@qy>x$%*G8VrEUW3TEPS3lEB+cp(RgSfdA7{ry$oz&&RG z=3~JfCFt5Nm|~WTt`I~91!fY$hjDs0V7Pg}H?kR{E)j!to>5?O)CN5^sxCZcPyU@S zD9cd)bGP?Gw-9puVr!XL#m;58|GV(`E@u0`z@>cuFLd%spg=kPS4{j5NqLx5lp*x! zdw)WTe^+I2m!#xG@66bM(Ej0>-kP#G?fZA_{pRtACAasR4RtB(`+SizQx*I)=!2al z{*jx0OGGOk_f72gw6F=d=c7G6PLB}UB(YMi$aEKLIfmTAi=~kQfb<5S34j~v z2Vgn`4c{fShisyh13g%T@j|*xo}8k0PgE7m48dY<5Q;i}@%qJ8ZDT3SM^engF!ip&d z$77bjEez!3nQ@XU5B|jo)u?rHsE50QRN3Gz$21xK9B-LNkw}YTq8<_*g0W51(~&vBQGdm>0Gmx}73<^aDgf@t3AV3_xTc$?M%oLs(;Trc?SxR{Lq zdH(~mbvh5?UBXzT3xxc0g5CJKWNzpp+533|YUjD=&_CdG!@jTopnJ#_^HEAN1UsAh(i zR&JX92P4@_z!>^Jtipo*?^1U5Ke+6V<@~R(JpQLlxUt;+FQ)yED>r6lDFXp;OOVOM z;mH|U0SOri294f@8*X;(=zj|RXS#{$i1uftPPH`HrGNnlfjD9)3!jDoSfaF)PyhkX z$%XGKaxNb9AE$5W7Z#a-YtMv+$TazZjUyGS#JF;Wf5$ZYp%Z{KP+F5ENlnwlmLXMh zljd7uH-mG;CWN5I+@Nj^-3`zZ)nirQzcBhhRDzv?9)K06Q;jM@m5>$>e)pd%-xYXV zX!fY(Rw#UfUNxUE03e~54ougIaj|(u9IdsoZgTn#~37lO(|bqW7o|4&V&F z9>tmK7{id_#5RbfNFdF+v^2kTny`_8HYx}H;{yW#ejs^=6$)Ss31dWv;ckh|AzqCo zLTC&|%#wjHgYfw@xBc z=!+T~a|~nqq&}Ed>43*%Qlm;tCjeRSnypS7AptOONvZ}ZEo2xp#-R*MvJf^P7E2M> z3ywNcrZQu7b4(`=O*>=lnopi-$K6xFt(K&lmSBFmtg*!U=5-T{L0c3IEEHc-G_gqa z2lSEFA23j6;FiA+{7cRS+x$>Voi3W`2%HLBfD2(~l4~vRELagZru2XKi$v$c_G@Xa1W z0RxGp2&DtCE&Y7pU&iE`^@NV&P;*bOlP0qmVwr|x$LTw8QuIm%$Gn#Wo<<|m@&psp zs)zMN$@O5t4qy?T3^J_9bT)=$?$T60O{U6Erjt-@Q(Vm9%ar73)5JVYWHUB0hLnc^ zHe7r_7!?uEoE%(f)k84=m?YhulY;UBS3F>L=5S z<@6nmHUee~8M|j!t`{rh5^`*?v4<^@k7&bXI_~%ycF?7W0VXN{P6q6g6ZuJK&#}D1 zEpb#F;GiVEJC`o5;hMo7uy!76mru>T*@|iD8vy^(6jqa6)wFYH6Ck=~tzsWH_?Kmx z@xie6u3G^7Yw=y7wRag#3K}QCR7Vb&Cny{QhS5YSHkC9l1jTi9MUN&r=vs)iCa~rx zYAME}^Bseo%{MWIXljXDZRDNAX8k}HfzwtnjXsu_#SZ!ugEEmK5hI36T{lf~JcCTM zgJZ&&-0Sd#?@S*w%-9l9Tok7#B>_Va#OZO>f$)rw3{A}jo%2~X9DE*;q#)n6-hCiy zOb394V!UHCuMeqd(Z`9cO$VJq4(^LjQKy>@u_XsCv2nWczzzwk#Qvgn7YEMpU|t9` zpybHYSkq)XG4cB;f$UWPQ=kx1Sr}yiv31b|A2rdmQFZ{AlhgWYre`H3C7Ca5Giit$ z#}P6exQ9l^prvzwH&Ahb(?q!=H*gcb zB@`NZy;|u`x7aXKjV>QqhL>(6nvbs)rI8#+f`jl`pmoE68JB=u-XK1jRB>rbfxhh# zHY7$rZKBXXvVamufSHIRpuQkk0Jb;=kojNrdb+u~x|zgC|BC~1%f#zLHDba4Cn`Jt zA4eeKo8SNJRG$Bfnxsk{8VNAlF4^>HwLn zUt!`&41j<1HS^jCbkxd%bV8B~xPknD{K8&kAG@NcBJ{(H8ZC$ehV(?j6nZA>k7abh z<$0fziqz8nk3BCLEdbQzA{5%#fd54z9`!$#Ko#!)rssd1c_M!K`JYnU_Q|R(?*DcQ zURoEuJ~FVUJUA-S%|#Q|B{)UU9r0Qp#ISbYn2AQF)q`{=Z~>s2uqn0szu)*BwK|k6Oe+c1Y*w7-z?Vm)dav1O~ps2R6=*(GbF0Rlp$;Nu1$zW^MvS zy`-6K-gH1;0^l~j!&z7tbQ%81>H*(LWUjmvJ?9D=(f=j|!Ic@lWL-fpgE5#BtrsWb z6QxN6z=#fP(TFkeAIuHDbX0>Ru!vNEt&v*5HaEr69W0m(pP7anTeRd);{2}&Jt?6q z;Giz+`@fK7|1ZD)m)xUE^MmF6zh6K+K)oBhS0Zffkd8=CXfmv+=E?;ErftjMYSeil#BzsRY*G0J+X8l2FtgpP@Qf zWCI4K@OgRxx$`sge_;E631tB;bpLnao82_rcd*`>XKt6ltXCdno_k9D6kcYM#=Cs~$1;W{Nu{p( zK>v))nDn4bt&eMjPhv2@*vn56 z>F?V`K#OdML;`#;eg#`g6on7@Uk@mc#nD^Z`e z{|op$Q}=c$<{Ni4$&*sP|I_E+65ww-YK;A#l?VRD{lA2=fEBv`gWy0uPvin}qPmFq zAn>2>4B`;V@&D4?_ldeK@BjLq8Q|Dbte;zAtTH^+zn4y~3I>1Ls{(j_`k2J-{GOj-|7#$|s5Y3#4E|&M|8xpVO%GtE4=Z&&z|x?9iY{Pb znb7xwB7_4n{r~i_W+*A2rVsF4L}lm*Fx}b8^#M8$6i*+p#Goao6IihST}vkNAKPUL z+5eqfg!KDAK;R!p2`VhV|BKk7OZ9(?`+t%4`NCuQtZ4#Jnqfh*|H1=)QdyE1WKrPa zsYAHvN>?t3_GJicdd#4*n^R)H@C13Fn=Z{+)jd%d$rtInGm2Xe>9e8>SdaE2;8zs7 z;OUhC(lFtn(IB9n@4$<*=o3m!yA1#n&C?7YyOvYwzvw88>d82dt!B37wn z3hWmYRM*K9-A9`y)^hOQ9kKsm>Htp=1ei)I0pO8No{s1t`kHobkXDNE)RF!hN=E?e zCGWuHKwByS-mi<%1nvS*mM(QV{1Q6Q5mVAUlMQlkL9i}d26C5m1ziUNtJfN2jH`XI zF@Pm8I>9o4$H{2@2cwTYaU{M&gXKu|&EyVXPe;bQz;h^_7%XO0sUnV>G2SRb^d>WY zAFXR&z#hpK&dyoauMp25R`tWy7>7t@5hItSb5OQRPDErRgUBN2SRh1C3Q|z9AN6BK zPP+1#nrLBq7gK%v1hTQnx|G`Aem=dV7ss+jw24^2_H*QRzI7}y#xOG*Ey1A5V zfvK1VL|3CIZIbcSOw~df5v2tpMO;@_Dxh`J{=c+9W;_U8#bC|vQd}*tD_Cim7N{$2 zHIUDAOn#mkXpQcFryl4kay11Q!$DRx@`h-Jwpt85&=C$9QU-PZ6-Cf&$o^(UkX`>1 z@XAvE6EW`p#q>Wx`TakHidL%sm+OBessBL)O2-9Bk+}w7)?3vBx!$2&HR>q;aIQ)i z9_B5L$nedIU`7y?qk-_A4H_C|UD-0x1K|uLpb04}U9cPudQq}v2%FFe?64L)5vzI`R*;h-)@WoZnY68aTjaw^2v1S#)ot5*csgPpSx|`qIDILo zj?n=4Rw1V;d+1B#A_hOmcaSaziaLUtkP8@mL|@92u-{QebP77eX9T*R5&(Ro)#Go0 zD!?F+zkpv+EzoyOenH`Fr;DC!X z!J0)$5_KsunI6P#fH2e~@GRcZL#tNn9py@xZQGFuN+DLLj(7sEs|9cAGc__8kN`N_ z5qsjuj1r*F|0nr}1w5gPi<4XF`iG(B=Ljc-jggA#B6gL8N4rKx_V48s6Ub8te4W$e zf?#F}kJ3pGXzn5ggXZkU6F4!~U}>v;pY9L4zT>5_ua904SiPL3?AP~oLdxd?E6lpBEG5Ba><6ya}f6_O$W2#}~eDP=R z%&2+~8qRA~ubS`fwJ(K<)q-BjCm%U39rEJJ;G=dOn}`3ra8uIyNhyOT4nNSbvtQJ& zo!wLyTt@X$ZoD1wIA&J0#6G=zQy;IZ%Kh!i#Z6ZhUA%L)!_GaO6zfhU`+nu@p6j)5 zqI#?DS^BfL+ushFQESVtJv{q5KiJIw(0)kH0PR!fMz#0W<&R#-vu{|T>4NZ4!8Tv> z_kUb$ja{x)dvv(aW=fOgcJEpo zT$_70^tasWRp0Ip3z{`?S5Paz;f>aHcLg^bzIssmnm$K2BR}tH+mGE>4)&>AExUfb zNxF9wt?msY3eW~V>9v17oS zC+m8x(z}2Bb8~L|CdK6e&vv|hv|`QEtDD#C+`03&-+o)Nq>V_FUXY*nlZ&#~+P)Rm zo&PQKWz(+@UD=o#(xpqx%GmC)v0KFZzQ4Xb-Ko*oD_5@EJ2qoY@6D<|&Mr>ckoo4x ze!hlY-yH*cQLg4ivZ zTLm9K)Tmy4@4kH=9v(Rbc@LaZFE(}6%wMoz!Sdzuiz|CR+hrW&?|&f7>*K5I>A7>< zbV>J*{}?jeKJ(tR9u>d%LVbOk|7`CmZMwM+e7APOgjy9m;s^ZcJgv(;@aNAzJBs&K z+I~GgE>5xG@}RtXGir5ucXOoepk=F97u^3z9XiL|S#ogfnw{?-9dq1e|J`?sB9QFOJTXV0GfUGe5u`8mD&_1#0h2%GIHUKblW z*K_%ql+bydxHFE`YVJAePDV&bh@ap7+Xu#cQL$pHy1`w#R38_xJ@aK!L`2;wM+Sa; zeF;#vId@Q#rcHlKIkWKjokO+075uzv)t@Isx%mYjp7mHA=a&8c)mGhuL2oW6gK?-| z{lKM5GY%xSsCM?ojq&1{F)MaxZuvweI{aMVp`sHf?$92SjZS zwHfQtc}Fde#b@rfORnU7e_Yeud*|1+oiuq*h2Q4)y?^51n!pS1cs<6n`FV5yc5a+e z{{Fu_Y1r#kr#4mBu5s`6IAlscxAEG9UP0%YHodvNVqmKcudmok_MUuD;5POvn}*+Z z{y3^m^Y}T{94^-UYMRTFb*(S%|0}Rp<2m}&pw2OUo2-~#-C?}<<=^MGws-C*JZ{^& z=WbaRf7qqNix-PJyPs>@c*BWbruS?yZ-2sWBuu>O%Go@nrh!EdcnTz7P~pMzHQveuHNuem(z`BUYqdM zo3nSjH{RLmk88~Ws$2@?*65XeWz&Y+BSsH7@9K6o=GoZ9s)06_T5buBA2utt^1P$# zC%Aq+a{s2-&Vyx(!hM{EdG+^u5oy0@S#Wf-MZZ;d{QaBxHcnT3Z1TU4G4AEgS#(As zn18z51FXyr19tyQMXEuHQee z^7)FjxBt9utlOIGz>1w^V>d-^e)>mTqvvr+m-h@F`tI1GN<-i6=IG1GV`wuwnx36`8%E$ZRq`Dy@P*U6l^^t+0?XeW-a^m$5ss*b56OwOWTIh zw?9QTo4D)?*L&?-c*H(#IDGt?Z5y6u-1So`e@WkYA@s`?8`ch7;(hCnF>}A=PxBS? zR`u8&^s4Zy#;M9W$rb*nD3i) zY@vHHdgZFCUsoS_t@@0w=D+NFY)jq)!Q_e?&b{?mrg%SV@ul!8zu#}LdU@SmLmocr znmql*FQ-|3GHEHGF{_?QBbKdNJ@$IqE?xB7j4J+8XPwr>a zIN$DYm#>=h?oVFyOSk)v4}>lque-SJ#crn~e{d^A{`}^RFmuMDkT-@mFC3~bj;Ina zaPPJB=anAVI*(nq;;Q|xTLK(LRP=m2`Hk1KIVY~{jjMcWN4wL8{E>Tjx2jAonD=4x z-DiL0_N{B2^lrlboE^^-E}a`^+;+0#g?DRG2VOWg);O!0P0($xx3+t8?o=Nb*?sQz z8EyZXw<6E>hf$-91M~%ld~X}K#Gm>urt#RkDsN?jtL4>ev8?KYoc(`&e4fyCRK~!9 zrMC4S*J-C}T(ypOrRDt(9CdBksoRKe4m4Oku1%jo&DWe>Hgdgd-THNFKV9Guw&2h- zr%IFj5-ObW?Of>#NoB`h8XTz?S=n!FRCvni2X{J5;nZo6vZO}+Wl8VbDQC$iH#`<} zw7uZVDbBHpRfI{`QkHE#^kv7XHp^dCs5F0_Lp{zG^>bBL*1%jZ?=N3eYrl1~LiE*y z&J(j|`^-spd365ixsR&#%@-PdW`@7Hk(X2dfaeY4+nOI|_)P4QJlrp_eHHnMq+#tt zIh=M6j9J%*%u^rF+wo@mFVAYtnG`gkbG4cwnY_Ke!+)&SxUJ9ao3Wk7b_th1kuJM> zw6j}4+?WS-J8u7T>XG>|k2D>Zeoz~J=&3xu@AZ=H>dbx{kM2MB;Jak~sVnE|yLOph ztHH^7E!K{zD)E`Qba409wR#-5?b_zR{w-Z9^Pg?*(s)jMcKY|tZ{PgAYoj0b?eE`i zZ`(IcXWIBC#tmyPtXp~E+4&L9UE|{G?5WnF!FNI*&xX;v-|nnAJ*`%Ne}5mot$#J2 zQG4w64tzcE$A+TkPn++l)Z*=vz4Pq68;$wlXWqi82Rmq-_t-BFTDAX&#nFw%FYK^* zTUe`CXQocv=Q;6ZLeHd zB+DL9@U+0Tr_uXj&cxTY(vMY%kJ%of9aZNgwT*c#3w-;wc;mM}$FsU|(repR1udWF zX1|-T(wH&pan6zVwbmExyTh3iQt2n%R}QbAg(P3Pv#VO0R?l)?jkw@2;g1PTsskEY zK7G=u!t)&OoRk^I?4CK_e16=xU}0N3p4F)E*0 zQ2R|hyW92Mc?}!_r?$#&GiS^8VT~(SX>_R0@Pz@_L(dLL@$sqapbqc9``fQ>uFE*~ zaM`Hp8NHhi7Sw27zr(%ko2wqLioJbgXXjh4TSku>SLMUUNuk?5?07pM_v6mDBTk8T z0<+Jq+Si8$HrSIBztyqHaqqs9YVYGUYIwV;!%)taiTf(|nW^qyrRCzPr|YKljGF!E z#7pP5P3^z__5Fbh3AvtU+rAz?ueSe@d%y14&FRp&R*Uh*Bk6x_kN-M;y{)G4U-LM% z>+cydUsETl(v1fd`w4Pq-u9Z8`Or48O3k|7zmIG*s@Xof_O*T6HqPtbq4kuTKb^^` z-*#e~H?|E%5B|3A>v_Seg=7D;b)8v1(xK@$Cl_(=dl(D`pvY$c8*KwHRyt+Bzk6iL zp$WE^E?(@E_3GiReIuQnoq-{;CC6B>W5C;|!03B$a?aJw>fCLH$M;YCBvM`5GU(&` zjld|3-;s6i=(J-q922(b{{Z&NHx6;GIR*K^@;EuS;{af0om(0<&)x6{G|)D5wkt4* z)=3VHZ{D$2bhP2_;Ys^O*6I-x6B8BH)HCBRU=MwG`z&{}Isuq`J$v?)%l`l^zkPB! zG9n@(E-o%A>Q_KapY3UXUfZfWG`<-mXp{2l#Z|pGD=x1G#%niVabDZff8Y0CjTkYa za^=c-d3nH=N!Sdm+l{F&U%UXO;FOb>v7-V91_b95Tbc z=lYE2xBbU75$>=|15<%3hFPM(}AQr`egJ~;lP6R>`Pv2*y}0s6 zr{t3}`7Jwk?8xOR-@p1}`SRuGmUR0G^m%G~NciL_Q`&~j^^~9e85miiGkN0tchBzt zLkn0t;M>H+L?0iYfddD|#mz?6Zq|-YE-o=k&&fAlnK`r3xPV15D*`7pUlp-@;i5&0 z7A~CHrFFM+)kpX^%s3_$j9wTpuCX()sp_;0@CyhC@beo!a%3&rPM*N{dU$#PFuuIK zy@w1LQlUbHh~?)`om!KyYmnWfYX048_xZ9?MO)i>V0hu5tgNhzj4j)@Z{NE0^^?mR zKzj}j4!}H5PfJVF>z|xmJZ9LiVXIat!I*pKANG~W4*b@2(68TKv%Na_p7PeaS#@R_ zhDv%II+Lbt-EG*QkJV>zKVEjsxx9N#)y46@cjHtG~swTY%xcB=OW9+t^ zO`CIme*Ap@Nw4HLAD6e<@;LjHP1~IvCVY2sK$}{xCO5p_Y}>B4+a0s_UGo3AL6*ny z=XT2e*W_y@n>gFF;>@fy6Z4k+;|LbkoQQ@v}VkPpeidph~Q9Y2x$U`auDGzq}^zsacY3ytdYPf_yR?iv`(cUy7UQih{h#%0 zZCtT!*Q%EfFMl)thVk7WBeiP=Ce(WDxO3dYS&y3fX`5|N9V%IzuqOIYugm(`kD^o$ zW~X%N->7N-LH)i-ZMF4$@a-pa6TfiV>%ZyZnJ-atm|3vZN z;i0^rzViI>oZI;|cgOTSc4&QdI2y9W=ziN+3lBQQ{8{8zN71PpI=r~)jy4lQC?S$`j~g&i;vBC=C2vG+uqZd+9J=Z%c}dW z4;!*pjo(_6chjq2Q~sLT4PA~HZ&s`RPJKCVo=f=3TJzU?$4wn<6BRr(ZsF2^_RBJY zJy(gA{mTE%bw}gICmV<-c3!$9iZ5_(ZQD{)^;z}ZO)3uM>>sM>b>FsOJDVSCde07B zwYYv2Z=3d`##NoS?s-55VZ8hO4})7Yju+1U`TXk%L#t#vjwsl6XYj1bohPep2LI5z zX6MsVt<&6tJ5G6UyuCP+XPleGA7~S>^FeL>*zRi<{&+6iX=TzY+acY5`=LNG^WHpT z?DqvzYX2PmM+={z+u^^SS>_Z}sp8<-xteQ7E-wVa)RA@z z+O=sB{-yo>eKV`IJTPhE<)fXuXLXo$cChF~+R^!o?se#L!a1jE@;ASB`aYt`qnrbS z?=Bm%^y1M&GXs?hLG>@rj2wEqPP?vu^=&#NQ_yJ2%XTAXF4WZhCZc*}Y3}(B?W6l` z8#FvXv(~kKKMw%kcRPw3?m4i?qEewCpmeZjXu8Tln93cx>99 zpSL;%1l4X~>sz7r=^t(Gujns3Gj&LhXG1GYoRM~G4(G6cqY*!h_&K8Hv7nmM#{@U_ z9&R_hVMTjkgiQzK~_6<{!GZu-l(r%c_X)cqMH;%X81G zBbl%%*4E?D)%JbUJUqXZ&Cf09wPJ3?kLp_mwk>y0KfV6(t}Axy&URQW)T?TWj%$9L zJS^$YU2At1Jf8O6YeCTO&4DSv{dI-Gr}lpTwePp|T6Ffbr)2W@Dgy@9AK7kB=&H$) z0TZj$PPrFw<*-wu*TPYIy`H9RG>nlA*cC8jR~x^X>nd_D=F|_k`37k8uZ_-`67|4d z_4~TK%w2nN`k|a`D{Cx9lW21N9*&H(lyys_rtaRIGj5KnG zu1mXRyy~;PSKDT5&gZOqovZjL>TNu6F=xZ;+Yls_yBFr? zWOMeQZxtUm_iXU{d-Y#N$4v#>=UmEZ;=Jvml9Rh2{n$&dcH`GR*!8UQ<%_${Hf%eU z`@n1b#xXB*ynCngcr3kn?zmCnxBalOw~g^?;>Z`B-sd{JFgDz6yx6nWCQ(R*=@qAU z9b&9-Dcz>0O?Xk%sefG=_UlW^RR4G4nce^FB5*Fx|5PTtMAQF!r7G(CH%*Y&&}Y`4 zG^5(9>Z3b z_2ZqXTd`V)y470r>pXO{=kU5MYIpwYLalBChi(YG`E{=?S2qo~b@b%Ot6O(u=G(sf zko(NbDgIzyMVpEKlf)~R);t?_>O{px6%N<+sbh3k-1i55TG?XAU{#~9yZHavLOlD8$H%$7s*0|Mb?o-h zadgG{ygu!kS2+6Xj*-32<=viY+;MWujc=SdF-hGMYTg~+ePY8=`y0Rdah>#h?|RkU z7k75a52<#ep|Q?%c_Yp9XHx^u-Z?qfDdhR2I>$BlQyMJ#epcF(_uJO5e>CQL)qWDS z>i4yGj!qk&-a{F`vEPX$-R3nbcys7uLUXqZgT$xi4l^t`{N~RO4)OV`HoQEwxZ8@W zo1UhoUd?`*@0ffles#{BIW@i+^zqj3-zty1_+n(J;@Z3CqLJg*^f4ZJbaB%zW8T|$ zKRD%P=V-5Pnsc?&^Xv5-pxNde>;%zB4-{ zZF_z8><`~=(LMW4_QTt-Fy-0lKh~P&kbV2FMgEV@oH!H~INsBF)q;CF4*szxB+^U$ z%Z&l66JHG55GHqgCbIqZx1GN%`%`*vYX3za3q}Uk@~fljCEdOIj3lOJvpaoyZ50S) zm8y+zDp;2om-_NfgL)&!+Bc7O8GCO=bZFl(Q@h`pXU~oPzMHDq?yn=ebeZ|QqC@x5 zRe(0WASLR{>7##4Tt4vZ>h*%f^=E`=4oVKRY%M-L&3owGVLKl*TCz`+w(?o6cE^_` z%{>`)eCxKJy=}X@B`+GBoi7O<>`*Z0WmeW*VS&eYee!d2-o0)7)tOiQG)t16XaAHp z&px6c;dEZYkiT;3eyuyw*|W|Vj~NvrjCZ!*%c(n6btflw{+jBujrS_VX4_oKY~F5t zR8)@OX4pjk#`3>J55H_#e~k9^54;Zx0|V@BYfTA{`fAGVx;uw%x+kv@U*F%>IC=HS zLE^9Hb#0UPKEpLYIBd;N2QH2HBe~BzgSbUX9B)Ho&xBLK2jlt=a{h2U|3^iSgL{%1 z?5+BYQ|ZO!hC`nP*o3U^`t{U4cK(lie^C8+W%A-$O@F#mJL`Pc;ra(_)jv$CY^>P% zolAbp;eGNSJlu1`IWjh;M(fz_5xm~1v-dtO}&q4&*vKarZ=oM zcyEQn-r@>=gX+8=a;nC}vGsF(E{+x`x(z))xtdabpnc2LRef4LS@$Sw(ekznTPc3t z>2K)cv_)gTc7Nm70o}h`_{6v6>}o>}SFpDUt=w*RofCo8V%GWz$2GgsC#w4Qd$amY zZBnsfZbh4qu`gOaT%0;<`UrcQ+I{D9<_(W-P$RY~hqIz_rO_*^M*nc_{MYSbl3Ts6 zd}Iu#!S`tmi2IiJgGaDRHn#3_xoElU}7)28;i@zDzp`$ft-F8d*NNKnJ9 zRsqjqreED&+rIYL)^_{#F%i|LZhzr5Vd=2~+m0Mf-n!r3x&7TqRVAr<~jO(R& zyVjn{S;o&BIDf@}UH9Lo%?<3_KEBzP{`!*xxvS63woRPA|IV%O!87$O2T!Qn_4?hK zP75L%&dq%#?BRSZt>dqqFP)gUb3(;U&ua~-S)-s}w?JF1BMvWcNk^YD?hE3?`8Y& z(es>S8M{rd9O*P(ZEcNh%`x4r6~QZ9J4a9Vaj z)pa+Y8sF@_y*2&Bp|2Nb8zosuxwYPTsqa_lv-QKa?bF{T6-?MaXp-@p!N!-97QCut z{Ag!%v@xcCQ}0^(>dJ97uGuzxXM1?s_Bl44%VftXZ{(je0_?ZhmaYB=gM*m)KV5{p za{RYU*o3D4^&Su&72Rl8hlcTny-yb3+hTWj%=Hh0o;<3*WXY&uZDwBXdhh!68c(*Y zecWkxkJdh;Yfbcz;ze{l7U+~Tu4BRJ<-d+}>n6`x{^O6F7qQZwY2HJoo$PbK&*%5) z+t+8Dvc0zBn(pM=InUl^=jNSEKiR$W?QiP)e>-|8=hl(=#!j;I>ea>VeCt&jvatSF zM|d?`ej8L})~JM)Ni~uyu3Y@`QL7cJbyek>~EY*KKR@54qJKcYWBNU zb?fMwM(S z&X{Sfcl}|Xp1pOwqT9fa>+*jY`@^_|hu_77Dm=57br2OC{9{MX;|2|y+~1rv>zY^g zz;jARr{O)4=1)sK?cU_x;YEGCn!h?feN$AzvJ>7-6L#bdyp{T)*Z$XMejB6qcMqvM zd&JRW_uF&tElu@0|7(`##wKl|k~rgXrB^OZInm?fdFlAHro1hq8@)aC;n&+2}NdUDK_45XCY^J$`3@!LH}0o2=q?`zF50JZx_K7MZx6f4Oi?^r#v~cTfpM9Y+*_)}ywv9?1(f^I&+Sczb zzP|o-SoX&4qgGuGy7*1|$JN^%O3Hu#!?;W94^8Xc@=2!CW9_^(@lLDThpzoZ|ENxD7lN59Njd;4^~ba~;U>ND?qP1v+a=rLwdv%I6TUf;DHV|S9<$RN8= zqsNS}Wt&dC{{7U2`)3S!U3Gsru3EL~_T$*o;f-`Hf3~gk=dgv9##jDnu+N{TuX&$3 z;Xd$>-m=+GhI#*fq(#*#zJVPAhOZviqJg@D)$R_te&d@gfCY!ZlbZqqkQ$myGGX?@pD)6XVnaNF4%38^I}k5LgNF^ zjuWBPSlmwTsCHKV*u25k+xVfcPpn#a9CL2%77h1&dsXRarDn8s^pwY>TUnr>6)xLBYyYQDW=iuLWCUE(Z@E7Di>H%29n<^F3xD6$Rvy;-=KVKEmo^#Lx8vc!CecHN zHMco4!QoxhnBYTWl0Q^T?en|W_qX3(@$#NHTxuM&`^uk7>}#eP+RR+ovu^07*s)0s zhT7EYaqY^}s776b(|hk)^X7(Z0Q1e4GakSg^rRm4UI0|iZE<5%8YN+?pk$e z_jr~Wp;+V{_~BUc)k@91`q?~d{)0)2QEu`AW=WBEo~g+g!N}h4qWMWaHbPxV5_ zlB$cBD^rU{_Gg(U{WV@eL@W3oaDmId5<2iakmr7<@2K9(#O-|jF4h3GbGLS1 zY|G*iam3vpU6*@JEl9x<{e*?;Q@t1)G21Xp3>X^h_1{H=!38m0FFbC$jxx>0lK`{KKQGbIJDkM3vndx#;A=7@cl(=YUJ=G$U)d4y6co@ z<7HUcN8~d=-wOP(xA+434Z!zH@X;%4y8GzL5Tp~oCtFn^OiN_>DT!93?Ukn(AfO_{ z0*$(Kb8c6pEwkxH2%L>>ea}cQ(3O;%hu0**>2{bq=$C+TbZ$35OHLvMFqhN_lIu~l zNra-wVq0YI{=l%`Q2cv#7c{QdeInM*HVFj%|FH=E=J$Ygh)s*;V-IR?|w(_A^(UvJd6+eMU0g zJyoQYCF^1ZsgIF`frXlmk4#nP;~yvRSWQfLByYkVoI9s_E}NmP920f z$?a-L4$TC+cj1lQuTS(XYs%EL8f<(RtTyUKG&YGpeedjAyM5ojWg)z2lfWEAFe5Z;yu0)h9PkFALh9;hi&h1pD>Ww~uVJ|2g|H8fBs-QAz` zvu*yZrx1IjUHzTyUW> z(f?MPgOz7pDnB;begk~p$HUZdId%HFRo9_o3aZ{P}z+&kT zhZOy5rYpkcGXn94hHee0x46?F=YR)9Ea714ts(f@C_}!~ZQNIs&g`8*=BfN^JF#7F zm&4*+7oD!O_|l5hZR{IK=67K;YHdAxGv`heP7~omB|$h!O~aN~%18ILhj&?)u$r1SEv9)>Q)S+CFNf|y}+LB?FekF@Np z9Khj4eiQazP zz-lyIbe>M+P)X*^?aS=TS-ZJ&14prdL~kHz&f5HH!sSM$YdT_MOZ_Gp)L2Vq4)sWj zjFY@VX~1n6cuDIHkZfbxd-DcARhwNEtA;+gC$e}5s2>qLa<>8gEA#lo&nFUJ1N zVksR)!ih$XqbkwoyzkbQb`(IH1F-RVo}C(9AxTkxj+wexzt1y!Dz#0tlnYY(36K+A z$-A6@Z4z?(`)-i*aFOAk{MSEy{@Xqb-hn>{xb7o`;~6jm(n zn@mH=7p-SyKFXV2R4nZtS3vPIvH&^c%}F)QDRH(?e5m>8rb%C^*A=8ru;RDhlv=F$ z7s7(kFK-PUPx}ni&rNJavlO6Pr48nlsI1|T6Cjs}qKxd2=0lo5BZcTXIAc3uG`nq3 zyiUQ8CKuVGo>YDXle68!NdkPF8`huwh(uH>x_rpv=q*uVZmKO156*vdLvFzH(bJ`9 zZcYIw25x9Gj1P;a9WF!<7NPmhu&7RY(e(L(JIJVf#}u}~i^YO9SBFI7Zg&mVgg)6x zbP&booauO}f1A&}8vL=4;Jm|ZdSR8mUVQ+iUQ|?6Y1cH_98B1n`3$l)=l52)lifx}~lT1(41Xxs};CIYnOGl(KJDz4r~qqW%V?n;^P8 z-kQmlak=U1doYC2`B83*I>R4+2D5r#?r!3PD~KsUsCh}zojbNOaBnd>JKNUKFg_(^ z1k`^T8X6OiYtz%yZOSXk%ASHCwBpWZ@V=3~s35h0EyKsx=_VoZweAx!knUYZxuyZ* z2kyqmjAQg82~t|YLs|>?eo=2^uC>IWd&#o7Us3oM^!$(jyD}dx<;ABSw43N*UG7Hd zrOOh>z0S&-c;+$NQa#+_vr_b23N!ahMYe{t-KP%a0bb|({DRby1Dtw7x^tNnKheH+ z_`KEXkMYSDuT^`hYGiZ&M$Sa~bx)go;*m$$h}E)>_qUd9iaOT1Sb(Exo7RZwQPnTG zSk>^Zb0^LjACrB4YE!3C8v0hqpf4^Q+mevxJ$9|$xpFdFrh#LV+ja5s@47d|@9@7S zn%TF?Cjgo;B8#!7f2K<0 z=C{fkom>Av_;eC^HKH&6LVaJj;1JhDp;NtC$2{WqqJ!&PL#v}#$>DdbWPH%kF+Z&L z_kho$YeLwYg**>sz3vI6<3WN5A!`aQJ&K8uDJe1s!YlK z*wCaG!<(jNR2w7k-T&l_t+rBWK0V*rN7fqib#@tvkubj3+|!ET?YuuOdzX%|;+wvB zdp4VZw;<9-PzCt^V3I1Y8gJWWuIVS~={IjwtBSAh>=jt( z+XkFU6CUIWTo{hvu4xN-Re9BT!!7OnW+>*>t6$RI=B_@Ks2Tdl}Eg{%26^X4@Z8p)Dt3g{8j)LzlS->JJ6r5-QB zG?54S{M1SmzbIhrUnr>K#HkB!YA0tvQ(lU5)Y(5OgJQ;v`}gOnY5IiQqL_tuk*s`5 z{SKO55QKF^O0g;5mm*lGzO!_Zfx4qOqyk~0e(G*tHL7xerGcNy>`0vHTu0W4!laCIj)%8#2QDPDt@p2LY1 zQl^B@dVE3GCb=y|irGa&AEf0_D8s|N^qTB27RkcKbS$f>!o7mhSq#vq_RorH!CfNz zh(xLz21*UH^u92F?l-$Ij5vbX9W%c`tV`?qaTGt>3*-)O_!D2SD7Ch@%>m=uBv%S~ zITfeoG^MpqB$K}wWbqzi8Vxy55yUxdKoQB?)DEC%8&ps-86>H?FaiSyXjxKACuG$x@hz3w z=F>I*GupO}Z)Z}Qf$y&lUQ$fG^aCDw6hlCppz_Lmx(Z##0Fy?`QNRrW%p~OpK}b)v w&gN(i=9JglzTFdS)oo1^+JWPIICcNqGqr!Dar^Tne=6{&0)Hy-A6DRh0Ey!*WdHyG literal 0 HcmV?d00001 diff --git a/docs/upgrades/upgrade_7.5.4-7.5.5.pl b/docs/upgrades/upgrade_7.5.4-7.5.5.pl index 942632c84..cda1ef914 100644 --- a/docs/upgrades/upgrade_7.5.4-7.5.5.pl +++ b/docs/upgrades/upgrade_7.5.4-7.5.5.pl @@ -23,17 +23,44 @@ my $quiet; # this line required my $session = start(); # this line required # upgrade functions go here +addGalleryEditCommentTemplate( $session ); +addGalleryRichEditAlbum( $session ); finish($session); # this line required -##------------------------------------------------- +##--------------------------------------------------------------------------- #sub exampleFunction { # my $session = shift; # print "\tWe're doing some stuff here that you should know about.\n" unless ($quiet); # # and here's our code #} +#---------------------------------------------------------------------------- +# Add a column to the Gallery +sub addGalleryEditCommentTemplate { + my $session = shift; + print "\tAdding Edit Comment Template... " unless $quiet; + + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN templateIdEditComment VARCHAR(22) BINARY + } ); + + print "DONE!\n" unless $quiet; +} + +#---------------------------------------------------------------------------- +# Add a column to select rich editor for albums +sub addGalleryRichEditAlbum { + my $session = shift; + print "\tAdding Select Rich Editor for Gallery Albums..." unless $quiet; + + $session->db->write( q{ + ALTER TABLE Gallery ADD COLUMN richEditIdAlbum VARCHAR(22) BINARY + } ); + + print "DONE!\n" unless $quiet; +} # --------------- DO NOT EDIT BELOW THIS LINE -------------------------------- diff --git a/lib/WebGUI/Asset/File/Image/Photo.pm b/lib/WebGUI/Asset/File/Image/Photo.pm index 7373a98d1..586fbae21 100644 --- a/lib/WebGUI/Asset/File/Image/Photo.pm +++ b/lib/WebGUI/Asset/File/Image/Photo.pm @@ -111,22 +111,53 @@ sub definition { #---------------------------------------------------------------------------- -=head2 appendTemplateVarsForCommentForm ( var ) +=head2 appendTemplateVarsCommentForm ( var [, comment ] ) Add the template variables necessary for the comment form to the given hash -reference. Returns the hash reference for convenience. +reference. Returns the hash reference for convenience. C is a hash +reference of values to populate the form with. =cut -sub appendTemplateVarsForCommentForm { +sub appendTemplateVarsCommentForm { my $self = shift; my $var = shift; + my $comment = shift || {}; my $session = $self->session; + # Default comment + $comment->{ commentId } ||= "new"; + $var->{ commentForm_start } = WebGUI::Form::formHeader( $session ) - . WebGUI::Form::hidden( $session, { name => "func", value => "addCommentSave" } ) + . WebGUI::Form::hidden( $session, { + name => "func", + value => "editCommentSave" + } ) + . WebGUI::Form::hidden( $session, { + name => "commentId", + value => $comment->{ commentId } + } ) ; + + # Add hidden fields for editing a comment + if ( $comment->{ commentId } ne "new" ) { + $var->{ commentForm_start } + .= WebGUI::Form::hidden( $session, { + name => "userId", + value => $comment->{ userId } + } ) + . WebGUI::Form::hidden( $session, { + name => "visitorIp", + value => $comment->{ visitorIp } + } ) + . WebGUI::Form::hidden( $session, { + name => "creationDate", + value => $comment->{ creationDate } + } ) + ; + } + $var->{ commentForm_end } = WebGUI::Form::formFooter( $session ); @@ -134,6 +165,7 @@ sub appendTemplateVarsForCommentForm { = WebGUI::Form::HTMLArea( $session, { name => "bodyText", richEditId => $self->getGallery->get("richEditIdComment"), + value => $comment->{ bodyText }, }); $var->{ commentForm_submit } @@ -605,6 +637,53 @@ sub prepareView { #---------------------------------------------------------------------------- +=head2 processCommentEditForm ( ) + +Process the Comment Add / Edit Form. Returns a hash reference of properties +that can be passed to C. + +Will die with an i18n-friendly error message if something is missing or +wrong. + +=cut + +sub processCommentEditForm { + my $self = shift; + my $session = $self->session; + my $form = $self->session->form; + my $now = WebGUI::DateTime->new( $session, time ); + my $i18n = __PACKAGE__->i18n( $session ); + + # Using die here to suppress line number and file path info + die $i18n->get("commentForm error no commentId") . "\n" + unless $form->get("commentId"); + die $i18n->get("commentForm error no bodyText") . "\n" + unless $form->get("bodyText"); + + my $new = $form->get('commentId') eq "new" + ? 1 + : 0 + ; + + my $visitorIp = $session->user->userId eq "1" + ? $session->env->get("REMOTE_ADDR") + : undef + ; + + my $properties = { + commentId => $form->get("commentId"), + assetId => $self->getId, + bodyText => $form->get("bodyText"), + creationDate => ( $new ? $now->toDatabaseDate : $form->get("creationDate") ), + userId => ( $new ? $session->user->userId : $form->get("userId") ), + visitorIp => ( $new ? $visitorIp : $form->get("visitorIp") ), + }; + + return $properties; +} + +#---------------------------------------------------------------------------- + =head2 processPropertiesFromFormPost ( ) @@ -656,31 +735,37 @@ sub purge { #---------------------------------------------------------------------------- -=head2 setComment ( commentId, properties ) +=head2 setComment ( properties ) -Set a comment. If C is C<"new">, create a new comment. C -is a hash reference of comment information. +Set a comment. C is a hash reference of comment information with +the following keys: + + assetId - The assetId of the asset this comment is for + commentId - The ID of the comment. If "new", will make a new comment. + bodyText - The body of the comment + userId - The userId of the user who made the comment + visitorIp - If the user was a visitor, the IP address of the user + creationDate - A MySQL-formatted date/time when the comment was posted =cut sub setComment { my $self = shift; - my $commentId = shift; my $properties = shift; - croak "Photo->setComment: commentId must be defined" - unless $commentId; croak "Photo->setComment: properties must be a hash reference" unless $properties && ref $properties eq "HASH"; + croak "Photo->setComment: commentId must be defined" + unless $properties->{ commentId }; croak "Photo->setComment: properties must contain a bodyText key" unless $properties->{ bodyText }; $properties->{ creationDate } ||= WebGUI::DateTime->new($self->session, time)->toDatabase; $properties->{ assetId } = $self->getId; - $self->session->db->setRow( + return $self->session->db->setRow( "Photo_comment", "commentId", - { %$properties, commentId => $commentId } + $properties, ); } @@ -725,7 +810,7 @@ sub view { my $session = $self->session; my $var = $self->getTemplateVars; - $self->appendTemplateVarsForCommentForm( $var ); + $self->appendTemplateVarsCommentForm( $var ); # Keywords my $k = WebGUI::Keyword->new( $session ); @@ -743,6 +828,8 @@ sub view { for my $comment ( @{ $p->getPageData } ) { $comment->{ url_deleteComment } = $self->getUrl('func=deleteComment;commentId=' . $comment->{commentId} ); + $comment->{ url_editComment } + = $self->getUrl('func=editComment;commentId=' . $comment->{commentId} ); my $user = WebGUI::User->new( $session, $comment->{userId} ); $comment->{ username } = $user->username; @@ -759,38 +846,6 @@ sub view { #---------------------------------------------------------------------------- -=head2 www_addCommentSave ( ) - -Save a new comment to the Photo. - -=cut - -sub www_addCommentSave { - my $self = shift; - my $session = $self->session; - - return $session->privilege->insufficient unless $self->canComment; - - my $i18n = __PACKAGE__->i18n( $session ); - my $form = $self->session->form; - - my $properties = { - assetId => $self->getId, - creationDate => WebGUI::DateTime->new( $session, time )->toDatabase, - userId => $session->user->userId, - visitorIp => ( $session->user->userId eq "1" ? $session->env("REMOTE_ADDR") : undef ), - bodyText => $form->get("bodyText"), - }; - - $self->setComment( "new", $properties ); - - return $self->processStyle( - sprintf $i18n->get('comment message'), $self->getUrl, - ); -} - -#---------------------------------------------------------------------------- - =head2 www_delete ( ) Show the page to confirm the deletion of this Photo. Show a list of albums @@ -1016,19 +1071,74 @@ sub www_edit { #---------------------------------------------------------------------------- -=head2 www_editSave ( ) +=head2 www_editComment ( params ) -Save the edit form. Overridden to display a confirm message to the user. +Form to edit a comment. C is a hash reference of parameters +with the following keys: + + errors = An array reference of errors to show the user. =cut -sub www_editSave { +sub www_editComment { my $self = shift; - $self->SUPER::www_editSave; + my $params = shift; + my $session = $self->session; - my $i18n = __PACKAGE__->i18n( $self->session ); + return $session->privilege->insufficient unless $self->canEdit; - sprintf $i18n->get("save message"), $self->getUrl, + my $var = $self->getTemplateVars; + + if ( $params->{ errors } ) { + $var->{ errors } = [ map { { "error" => $_ } } @{ $params->{errors} } ]; + } + + my $commentId = $session->form->get( "commentId" ); + my $comment = $self->getComment( $commentId ); + $self->appendTemplateVarsCommentForm( $var, $comment ); + + return $self->processStyle( + $self->processTemplate( $var, $self->getGallery->get("templateIdEditComment") ) + ); +} + +#---------------------------------------------------------------------------- + +=head2 www_editCommentSave ( ) + +Save a comment being edited + +=cut + +sub www_editCommentSave { + my $self = shift; + my $session = $self->session; + + return $session->privilege->insufficient unless $self->canEdit; + + my $i18n = __PACKAGE__->i18n( $session ); + + my $comment = eval { $self->processCommentEditForm }; + if ( $@ ) { + return $self->www_editComment( { errors => [ $@ ] } ); + } + + # setComment changes commentId, so keep track if we're adding a new comment + my $isNew = $comment->{commentId} eq "new"; + + $self->setComment( $comment ); + + # Return different message for adding and editing + if ( $isNew ) { + return $self->processStyle( + sprintf $i18n->get('comment message'), $self->getUrl + ); + } + else { + return $self->processStyle( + sprintf $i18n->get('editCommentSave message'), $self->getUrl + ); + } } #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset/Wobject/Gallery.pm b/lib/WebGUI/Asset/Wobject/Gallery.pm index 4a08402b6..bd162c98a 100644 --- a/lib/WebGUI/Asset/Wobject/Gallery.pm +++ b/lib/WebGUI/Asset/Wobject/Gallery.pm @@ -118,6 +118,13 @@ sub definition { label => $i18n->get("maxSpacePerUser label"), hoverHelp => $i18n->get("maxSpacePerUser description"), }, + richEditIdAlbum => { + tab => "properties", + fieldType => "selectRichEditor", + defaultValue => "PBrichedit000000000001", # Content Managers editor + label => $i18n->get("richEditIdAlbum label"), + hoverHelp => $i18n->get("richEditIdAlbum description"), + }, richEditIdComment => { tab => "properties", fieldType => "selectRichEditor", @@ -157,6 +164,14 @@ sub definition { label => $i18n->get("templateIdEditAlbum label"), hoverHelp => $i18n->get("templateIdEditAlbum description"), }, + templateIdEditComment => { + tab => "display", + fieldType => "template", + defaultValue => "OxJWQgnGsgyGohP2L3zJPQ", + namespace => "GalleryFile/EditComment", + label => $i18n->get("templateIdEditComment label"), + hoverHelp => $i18n->get("templateIdEditComment description"), + }, templateIdEditFile => { tab => "display", fieldType => "template", diff --git a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm index c7a4880e3..b4781de61 100644 --- a/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm +++ b/lib/WebGUI/Asset/Wobject/GalleryAlbum.pm @@ -814,29 +814,6 @@ sub www_edit { ); } -#----------------------------------------------------------------------------- - -=head2 www_editSave ( ) - -Save the asset edit form. Overridden to give a nice message when a photo or -album is added - -=cut - -sub www_editSave { - my $self = shift; - my $form = $self->session->form; - my $i18n = __PACKAGE__->i18n($self->session); - $self->SUPER::www_editSave; - - if ( $form->get("assetId") eq "new" ) { - return sprintf $i18n->get("addFile message"), $self->getUrl, - } - else { - return sprintf $i18n->get("save message"), $self->getUrl, - } -} - #---------------------------------------------------------------------------- =head2 www_showConfirmation ( ) diff --git a/lib/WebGUI/Help/Asset_Photo.pm b/lib/WebGUI/Help/Asset_Photo.pm index 1744f613a..4b2ace319 100644 --- a/lib/WebGUI/Help/Asset_Photo.pm +++ b/lib/WebGUI/Help/Asset_Photo.pm @@ -260,6 +260,32 @@ our $HELP = { ], }, + 'help editComment' => { + title => 'help editComment title', + body => 'help editComment body', + isa => [ + { + tag => 'help common', + namespace => 'Asset_Photo', + }, + { + tag => 'help commentForm', + namespace => 'Asset_Photo', + }, + ], + variables => [ + { + name => 'errors', + description => 'helpvar errors', + variables => [ + { + name => 'error', + description => 'helpvar error', + }, + ], + }, + ], + }, }; diff --git a/lib/WebGUI/i18n/English/Asset_Gallery.pm b/lib/WebGUI/i18n/English/Asset_Gallery.pm index 1c21ad3e9..15130d8ad 100644 --- a/lib/WebGUI/i18n/English/Asset_Gallery.pm +++ b/lib/WebGUI/i18n/English/Asset_Gallery.pm @@ -77,6 +77,16 @@ our $I18N = { lastUpdated => 0, context => '', }, + "richEditIdAlbum label" => { + message => "Rich Editor for Albums", + lastUpdated => 0, + context => 'Asset property label', + }, + "richEditIdAlbum description" => { + message => "The Rich Text Editor to use for Albums", + lastUpdated => 0, + context => 'Asset property description', + }, "richEditIdFileComment label" => { message => "Rich Editor for Comments", lastUpdated => 0, @@ -147,6 +157,16 @@ our $I18N = { lastUpdated => 0, context => '', }, + "templateIdEditComment label" => { + message => "Template to Edit Comments", + lastUpdated => 0, + context => '', + }, + "templateIdEditComment description" => { + message => "The template to edit a comment.", + lastUpdated => 0, + context => '', + }, "templateIdEditFile label" => { message => "Template to Edit Files", lastUpdated => 0, diff --git a/lib/WebGUI/i18n/English/Asset_Photo.pm b/lib/WebGUI/i18n/English/Asset_Photo.pm index ef1df426e..638894f39 100644 --- a/lib/WebGUI/i18n/English/Asset_Photo.pm +++ b/lib/WebGUI/i18n/English/Asset_Photo.pm @@ -21,6 +21,12 @@ our $I18N = { lastUpdated => 0, }, + 'editCommentSave message' => { + message => q{The comment has been updated. Back to Photo.}, + lastUpdated => 0, + context => q{Message after a comment is edited.}, + }, + 'help commentForm title' => { message => 'Photo -- Comment Form', lastUpdated => 0, @@ -463,6 +469,48 @@ our $I18N = { context => 'Label for "save" button', }, + 'help editComment title' => { + message => 'Photo Edit Comment Template', + lastUpdated => 0, + context => 'Help page title', + }, + + 'help editComment body' => { + message => 'These variables are available to the Photo Edit Comment page', + lastUpdated => 0, + context => 'Help page body text', + }, + + 'helpvar errors' => { + message => 'A loop of error messages to show the user', + lastUpdated => 0, + context => 'Description of template variable', + }, + + 'helpvar error' => { + message => 'The i18n error message', + lastUpdated => 0, + context => 'Description of template variable', + }, + + 'template error happened' => { + message => q{An error occurred while processing your request.}, + lastUpdated => 0, + context => "Text shown when friendly error messages are being displayed", + }, + + 'commentForm error no commentId' => { + message => q{No comment ID was given. This indicates a problem with the template. Please notify an administrator.}, + lastUpdated => 0, + context => q{Error message when no comment ID was given. This should never happen unless the template is made wrong.}, + }, + + 'commentForm error no bodyText' => { + message => q{No text was entered. Please enter some text to create a comment.}, + lastUpdated => 0, + context => q{Error message for Photo comments}, + }, + }; 1; diff --git a/t/Asset/File/Image/Photo/comment.t b/t/Asset/File/Image/Photo/comment.t index 80099a2b9..5254711ae 100644 --- a/t/Asset/File/Image/Photo/comment.t +++ b/t/Asset/File/Image/Photo/comment.t @@ -31,6 +31,7 @@ my @versionTags = (); push @versionTags, WebGUI::VersionTag->getWorking($session); $versionTags[-1]->set({name=>"Photo Test, add Gallery, Album and 1 Photo"}); +my @addArguments = ( undef, undef, { skipAutoCommitWorkflows => 1 } ); my $gallery = $node->addChild({ className => "WebGUI::Asset::Wobject::Gallery", @@ -39,21 +40,11 @@ my $gallery my $album = $gallery->addChild({ className => "WebGUI::Asset::Wobject::GalleryAlbum", - }, - undef, - undef, - { - skipAutoCommitWorkflows => 1, - }); + }, @addArguments ); my $photo = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", - }, - undef, - undef, - { - skipAutoCommitWorkflows => 1, - }); + }, @addArguments ); $versionTags[-1]->commit; @@ -81,17 +72,12 @@ ok( ); ok( - !eval{ $photo->setComment("new"); 1 }, - "Photo->setComment fails when no second argument given", + !eval{ $photo->setComment("lulz"); 1 }, + "Photo->setComment fails when first argument is not a hashref", ); ok( - !eval{ $photo->setComment("new", "lulz"); 1 }, - "Photo->setComment fails when second argument is not a hashref", -); - -ok( - !eval{ $photo->setComment("new", { lulz => "ohai" }); 1 }, + !eval{ $photo->setComment({ lulz => "ohai" }); 1 }, "Photo->setComment fails when hashref does not contain a bodyText key", ); @@ -101,9 +87,10 @@ ok( # - All else is defaults my $commentId; ok( - eval{ $commentId = $photo->setComment("new", { userId => 1, assetId => $photo->getId, bodyText => "bodyText", }); 1 }, + eval{ $commentId = $photo->setComment({ commentId => "new", userId => 1, bodyText => "bodyText", }); 1 }, "Photo->setComment succeeds", ); +if ( $@ ) { diag $@; } is_deeply( $photo->getCommentIds, [$commentId], @@ -142,9 +129,10 @@ like( # - userId is visitor # - all else is defaults ok( - eval{ $commentId = $photo->setComment("new", { userId => 1, bodyText => "bodyText", }); 1 }, + eval{ $commentId = $photo->setComment({ commentId => "new", userId => 1, bodyText => "bodyText", }); 1 }, "Photo->setComment succeeds", ); +if ( $@ ) { diag $@; } cmp_deeply( $photo->getCommentIds, superbagof( $commentId ), @@ -156,6 +144,7 @@ ok( eval{ $comment = $photo->getComment($commentId); 1}, "Photo->getComment does not croak.", ); +if ( $@ ) { diag $@; } is( ref $comment, "HASH", @@ -202,63 +191,67 @@ TODO: { } #---------------------------------------------------------------------------- -# Test www_addCommentSave page sanity checks +# Test www_editCommentSave page sanity checks my $html; $photo = $album->addChild({ className => "WebGUI::Asset::File::Image::Photo", - }, - undef, - undef, - { - skipAutoCommitWorkflows => 1, - }); + }, @addArguments ); # Permissions -$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { +$html = WebGUI::Test->getPage($photo, "www_editCommentSave", { userId => 1, formParams => { bodyText => "yes?" }, }); like( $html, qr/permission denied/i, - "www_addCommentSave -- Permission denied if not Gallery->canAddComment", + "www_editCommentSave -- Permission denied if not Gallery->canAddComment", ); -my $i18n = $photo->i18n($session); +my $i18n = $photo->i18n($session); +my $errorMessage; -SKIP: { - skip "www_addCommentSave needs to check for bodyText", 1; - -# Required fields -$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { - userId => 1, - formParams => { }, +# Required: commentId +$html = WebGUI::Test->getPage($photo, "www_editCommentSave", { + userId => 3, + formParams => { bodyText => "bodyText" }, }); +$errorMessage = $i18n->get("commentForm error no commentId"); like( - $html, $i18n->get("www_addCommentSave error missing required"), - "www_addCommentSave -- Must have bodyText defined", + $html, qr/$errorMessage/, + "www_editCommentSave -- Must have commentId defined", ); -} +# Required: bodyText +$html = WebGUI::Test->getPage($photo, "www_editCommentSave", { + userId => 3, + formParams => { commentId => "new" }, + }); + +$errorMessage = $i18n->get("commentForm error no bodyText"); +like( + $html, qr/$errorMessage/, + "www_editCommentSave -- Must have bodyText defined", +); #---------------------------------------------------------------------------- -# Test www_addCommentSave functionality -$html = WebGUI::Test->getPage($photo, "www_addCommentSave", { +# Test www_editCommentSave functionality +$html = WebGUI::Test->getPage($photo, "www_editCommentSave", { userId => 3, - formParams => { bodyText => "YES!", }, + formParams => { commentId => "new", bodyText => "YES!", }, }); my $successMessage = sprintf($i18n->get("comment message"), $photo->getUrl); like( $html, qr/$successMessage/, - "www_addCommentSave -- page shows success message", + "www_editCommentSave -- page shows success message", ); my $ids = $photo->getCommentIds; is( scalar @$ids, 1, - "www_addCommentSave -- Comment was added", + "www_editCommentSave -- Comment was added", );