From f5917e562d94c020c4340915de18b833c7e1f51f Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:57:13 +0000 Subject: [PATCH 1/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- bun.lockb | Bin 328171 -> 330218 bytes package.json | 3 +++ 2 files changed, 3 insertions(+) diff --git a/bun.lockb b/bun.lockb index f3958deba53561abeaa7fa90c144cd193f687c11..e5a6a1c739bc5e5f6e6b3b9697c4831fa5f8d3d4 100755 GIT binary patch delta 50845 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%0D_5gDe*oDZA>335oIRne zW3IaLc;RBWV>h%YQS-e>N8neyv4P9u7F?YWPVDaA!aTK{(!+`UFD7zl+pk^s6r5Bt zpt18f1Wvsi2ch9kFFew58?J$j$~oX0D=}D%4tL~2GZPb?irn;}X0qYm;$X~lt$}N> z>G~F~Zl){jn&O<>;bLFFZ2{8y1X@2@*aC~h;-VzEC9#%sbowK@V#qBJH|L%@nr_BqPRq^*pfOwK!MSq_G^T0IQeQ%2CM$Bq@aTc3y0mnis5<9^Xki+& zI`%`uc4|$e(;ZJ^JA${elXc1I0m4cn&-mSei{~To3xct0A@vpo!C|hY?+`p$XgfE# z&Z>C&%Tb_nMs)Om7H-~Wt%obv&&1?rvp!i%{n%>7K5R6GOgHUw?Jbj zwYJGup@l<3u@l0bO&q!wX!>#88Vaqw_;_%n^D)Ic%;n?=v5+~sI1S7BI-K1tXQeX527}-nWU~5p8B|6$9N&TIZP|75C=R^<&Yl+gHk?-U zdNrBiM3B*VQ_KpY@3fd3VES6-UCS1Gu8?|J9rv6v2jHkvt~j3Y(!U&--C$JGzrtx| zyo=j?#VId?Qx)NTIF)Jr^2KZtoL1I6_Q1ISRfC?=J`+Qm!`u83IUx^(RECU$@JHl; zO@Oc?OoZ@9tPYt=1;2lQng2B4|D|wN`ghIweMn-tnauwXWlnj$ia%4yfpEGJRPZCR zvLA!^$=Mb3TJq5fdZmAM@yKNRJqO|MZpd~#Vfy}0(5mPEVFG5>?-oDn@FZTJF@Gm5 z0AW?`DWwxxLxm7F!WjsErI91z3kV~;s1O@2^GD=@`VE95=sJYIVr2SE0E@3_fOXOQ z5g7pMjTtc(4pYa>YGwp8pBWA_kBOKuOdexgbHLV9@m@f8=+zb0R(xF`GnUx|4wkH$ z!a$%CdKi!yYYXI$NW1n*zZ=rOBmBz(y8$Zz2P=CbokJ83wfL$U9dyT7gozG0$WsrK z4|?hz@=;H{QZ)U>D8o2q_*Y1ivC59fDoFscDw2VA`LU;7jc*BSX}l<80Wy^ScaY(x zAsmBF$A!twR`L7=W|{#Wf*~WwQUQpp`G}Z{4ZAgBZ|Kpvg<5U{zNwQDy0+Y zlzLrUO~+rLbX3u6Wio$jRd^zu>y%DpzH$}+gyM-l;9mf8jGO?nTyFvKzjj(-Ar<_H z^nVA)3OuKHAT|?%ckWC-042Z0jK|lr^toXYj?S?6TBK46q3nt5`_Vu%=|rZPdc0CRTUAD2_6NKdR_5EI{B>#w^(O^>{}lKnUPQE z$@SWDSjdPzg$GOanQ35QHR!h#{~M5Yx0OGUI%8$Tc3kM?0Frkn`6pP8{m)Ywltu=u ztRkqQ{E3X1pUKd_s^W>vaCM~<>EyqYK&*`m!_@&YTwR6rfM)-vgH_W6$RCky)*Q$H zEfilGNd@D=&ej%K9%uj=t{0FA_5t!oWCr^K*%Tuc546T#DT4N;4gRstjKw1%W@Nld zurxBGiFTwNoKo|FEWt}aRxLjYV@6K`+567|@xS&yF09hefeiO8kaqma4gYK3 zo2JrC%_%<^#f!qEW80F8l6Fcip~cLB0*^Z+tIUmz2R237%%1v1=tAgAyd zK!#fYtP0$q{5Js^ev88GK%|qY<-@_89|3ZscLK-~y|3_dAZNm_flTNckP-a=WJZ2e z`Y#IkQ90u&2c&%kAPeLNWYg6EGTi+@H}=0eaNvKfq4H=9WYxC-GNQIX{I7-ca*xP_ zIw^Z1YcL8(ivOknGtip~`@iY<6J!bc(eQW31fmsBWP}5hPV|GGr1ZNX!zaVvT>q!Q zK_W#3AW~0NI+1#s(uvg5l}@Cdp>!hksY)kOpQdyo_2~{Z{^2lxrI7|Rl;KR}UmEE@ z3p`6c8^{|=sqF3@t@-C41Vn28D8b)_>-9Hs%#yBA_C$87jljCVBh=-fT550orZT%5 zvf@s_pV6ICc7F#M{w)>0P=zOwf7^j*b-4lgkSA*CK4$g4uZ&6~jn65b$bSBj(uwr{ z7|2Y1s`T?f+I^<<&w>0AY5#@NOJSxN!I#S5k}@DNz-5J36i>t~qJ5+IZxw$p$cz># zdm{Dk94J2%`d)dIM$T!!DxSyyx0Oz0IJ1d=hvaoMJ!`^^UEp`fc-$55o(Tut_u<01 ztSXQZR3oX7x{u<06;EVDeo8Nmw66i4HC0>L)d6zOYz*XN-U`TH2Ri7{P7y>#&|YB& zAiW}$-bGkDeNBx!A03h=@Na=%>9g+M{g~NbcHpc*2aq&Q|PP2fF ze-4np(nz~`?pkLvzw=?hd@oRjcSBalBg(%t>T+KljE9fv=#{wL*K%OPLab7@MDnYZ zPGnr`flPCQ;_rqGw^8|*Muyu2p6P5+{y=LyJPm>dTa^cq5p7re4#oc+A%O<{~ljgz#aU*$Jd-elX#Y)kn_jC$JdhQ zi~QaDdH4Ti`+twGtz&GS75;mC{qOPhzsJ|sG4{X5*PLko&MEUf*|+$+$JhCb+Uxi2 z%KYg_R=voL6RJJmBYtN7LyfI`qQubmTNcg>Km6f4Slp<&5))6M^8Vn^d-;3 zjvum{S1RJ)Evf$+Hw;wTAE=~)Eg4H6keAgag$5W1K2y$7@?Z<{|?|IXApd4A)&f# z{5`-=W&>pF8;IzO?-5Z=8T14A`{g1+EqQ@ZTei6Y@RvD+I`T51u8jB*P*1KQ)R#qs z2D1B4fQB-c&`91SG?vjf0ZrsKLQ|>V0yL8`gaDaG2$asB0nKGBK>Ga3g8q!`1WC_d zz_*kMgkV`fXeE7r1%${HLa01O2$TN50b0u$gf_B}&{j6S4QMB`3GL-MLWh+>wjp}Q zm5Xo$si&hj!LQbyPSUE~@B#tP(F8CPd!?CmI3hwiHtHJ2FL;u)14sddw>`u zQ#?R4DhuK)i6PS83F3Vc^PC`JWFd)#2k{e$E#*PP%OVn6D}oqQ0mOKjTLHw-N+28+ zK_tlNiXc2ZLF^+jN$QnA9PqSNkmD-Zdgzm79*GH+Vd3owi)0z=3Bsoeh@&J@q-SLi zZ;;5S3?fYykeKcTqJ9++88W2`h(_KZ&XSlW{k=fEPhy@Ih#9hw#KNi|LcBrDlG)xM zT2}+{1&P@*s49p{Bvw`hktr{bSnUI%Yc&wrGN&4dZoVLXAn~w_@B#4?i7h@L=E))w zTdRW@3C6NGmS5X)q2 z4G=!}gE&eeM|#!-@dk;EnjnNMAThlbi2C<~SSeHP2hpfDh_fW5^sfcteG>C(fmkC8 zNi6gS5mFn(I+rz96wd2Kj@yL}H~sh>h|BiPd#Mbgcs-SLW0K(XAc`b6`Fx zBkF?qiNuz=u-GDtNNlYSVo*I0Ps`kTAci&o;iwN{n~bgx!lNOGeI#~By#a^=B;p%@ z*eUZ!OlSncyCH~YWo$zbK8-;fC6OmR8-aL(L`EYJdt?EL=}kb?Zwz9eOlb_FQBx3S zN#slaCLrD?F|P@T=Vc*@h0Q>OGzD=`W;X@VIsn8MBwmz3%|Kitv9cM6!}0=&)qxz`)Lg^U{;tdiR!644a0us|h zK-6yq;;c+*1)@%baAIj`d5UpE-_=3d8GAInh zB@!#cKzu4MkXYRYMAz0JF36nLAiA{$F=z)S?$2aI8xTK{Fz1giWD$w2?P$>!LB5o^ zZ9xoe55mz7#AO-X4unSs5c^16m3n&+2S~)X2l2JcBQc>P2=5LczLl{ZFs)vb&l8HI zXGg$wnLzkX77)IdzTto$WD4PiJVy9Y`ga2SBxewA%0j{|**F65v&<&^BF_{q3c6o(px6965Z025|3#=Woh~O@}cLkJ@xdab+li-xm zQGl{?8=;)k4ZwX8|3c#stbKWgZJEQ4tzS9*n*y~&)@V0JKGgfD2AitHabdaq+@ZE= zc2h5h7nUp0JDI9JBfmp0naEY}W+nA|FwR$wPhSlx~e3a z;vblEbGrW2RoDCtLv7*q@~%H0)8hfW2+E|x?DFMqw&^sMEymb9^!4(>C|mR2={xjC z^Ouaa?a(dnr}1&Mml?nL2PIPRW~lWxpVEK{;wJDXz>rGaqTz z-p2fhakk-3mad;TAMPeMCEL7gj~tMvGHs7LUOtGxrKF?%`c+fUpcl>xA{`rV2Okb60J7GKfi72Yj%ReWOa|{aDULTSb*xui z(cKiu^Xqr#wm`+LR~+9u!`H^w^jwqzdc5nF{>0GV}shNpbw5f`;A{#cfj@o9I>6H-6g{$0nL+wXn8BacrWu z;O5WuWd`5wjs$16KR?r8B79woAAqsio>d&*8RiRethU|YXv6l6Q`~WI_@93iK?_jT zdP0T0ADkyR*3e1Cu^)_sur^NdQy)fH8`4RY?vgU}2N$8Z%ZjT5E*Ko&F~0(iVcB24 zhMPY(l$-^r2N|n4*B2M{!A(>gzrLVd1C~FYF8s#DYx0Kw#^o8(cMRr@h zQgsm$1-Aj|2I&sz0qF^0FWv;ng**Xy60%uF*Rls^J_qL>$X>`k$bLvZ-{9=J0c1(aIKsY8QLHN~4UkJZO;fH0tAiW`dY?@4~ZTIfMfpQvB2x$vx z2Wb!K0O<(n1nCUn;OPS4XKM{04IyYM?Y1>wiQ;lNIi2uNp0B%}+ZDIaRKKaC+o)$mwqr1hZDA z#wlqtgwqh;eC-SA2Z@I8mErGD+czP%AiqGaL-=m4|nc>^BKra>0j4gHxnzhwiL1qG8Zx)vKpy$f^Z7y z%oHIlAT1#w5Ps|267~2c@Dk(-nWDSHL|0F{aA)_E;ApB%$0AwI!kX@6n z*R^|R4u|ppWCVntBKC(2fDD9$gX;{L0ryPEEC}bUZy?tp-$8zW+<^QDIR}{!;Rk&W zLpYbkL&ifAAe_fWK==(MzkEHYYjSu!dq~JJD90ghLMp>^HE<1tpYJ{jSpr!K;pe@a z_r^hR>Q&F)JY)cz10jPT@o0i^kO`0k2&cm&2&cdlNIE0~GF28ez`$LOlpcd{z32MQ z^@QsO*NZ#|7csug{u>2uzDm#6?fD8m-_z&2`)48VLio|Z3CKxE0@|Z3upOj5qywZQ zWH4k1WGE!Yp~-LS+dU&jLKy`a4T*(}fy6<^LgFFgAmbquAPJC(kV%k4$YjU>xuL$j zS|-1d{|3Ux?BgJ>BEMWNxH@n(;Ox)Yo-;aUb57nBAeA7uVEZ%V7s!W@DUc*c5TqsK zDysHV2tN|O2H`iv{6Lu>BlE>Fd_1rSUZozD&LZ!WYyRLKZ<5Lmq_8hCBq}ThQ6=SPw@dr~FWJA7noy zA94V~k2r6mqWFQtdk}oqVLpEC2kZms3F!slhlBMY4Im96wIH=2T-|g?3gY1>(6=Dp zLw6fzI89pVlfe*E=0 zAt?G3jxZjiP=G7&hqZ>bD<77>htaNBVj0q#S9 zl?a>y_h-n&MaVeFT3s$}WN*@EAHwX1@Lucy@KKwg2o z3Yi3%45<#O<}TlEgjp~f>Cb^Y44H|143Zg*?M?4r0Ovx;BFJLMBalZSOCU=f^49(K z>TOrTy$Vth*-b|_6Co)m!V`%8aflD3FZ_Ms&reHhvx4z!-Cbf2(x68U?2kZ#z|Dfp zgs?3*v$2z~Q#=RZFz0YjN8Bl}=?^z!;?sd&AV2H*p-t=!yfV?jv}q8wKHc=B&NF%! zM|~>9W!n#tc|hDDw_)d{BBwhVZu<9yw1UvC41~5Cgm*S*F7u;#H?D_vkT!@8iADq* zm{lR(5C&l6PDo`)MMwomc}Q8veUNex`guYsL8?I1{nPCrxSJ!I7DPxOBmmM3(iDPC z!TsU(>W(IGH4?B@abVag0h z8uTK_G`KS$>5x=N3S#w1x3hAahFhbj8!}A;^Oe*CIR{ zZZ5J}kZcGS+qn>yY7t~1WIkj8WC?_|!mUq7|HmP0A~w$s$W{oOjvSk9J8&C>{8JEydlL8rBp7aN@l3l+8gGWO1w!Me zm4_=Z1JcG7QR&275xWvykFfNA7Q#M6|6LF^AroZ(a@nd3XPSmgga$58A|)TP55jRm zeJ_MF1>O502OuM%7XV*|9EKc(ya3@W5(B@1ke8sp2ss3y?&1gPvO=W2awZq!SK!B4 zXB%V&~DeJK)!%{4q<=$40sN50m6;Z2 zawf{maPZKL8QZMP50&4iz>jUX2}3SSgHM3nk&*uZS(>kbUqbjV=3E4_R97IEAeSNZ zzY6&Z!fg$=H{9kp?Q%>P`!McsvS{62@UH7*G zf*2GAK`pg-`7I1Wc$b9Jhpg*sJ~(n>dt8xe5EO{Jj1BO?fk@Vx16lpv3_kq5@(Bvk z_Q(zf;^vkZhZ$M!=RR5g$XM^GE`yfZMVSHvKCayqW3O5>#GH?Do{`m|>SvGocsHs9 zQ)D7AC{zoPhhZAh7qx^FnXIkN<}4oYy-y(c+Nro< zkR(03BM)R1&Duy>b)`Lf(V{>!JPn5gFyC&3D3pSqu&g zJ`W#uf`GPFLYDd;m<^v+Y)LF6awmc&xc=bvmt9Wyg?O!NZp9tiIlr?XCtV7M9Loa?2r$T1Wx9%mQ0-X z*oWg5RE1sZz)oZ>X~Z zd~V$e>VG^mzQnGvhdkdGx$Y<P4Cses%s)(u;0e#S-`dK3 z^2L(iOJpnz@BncZVXq82V+A}epCxfYdR}+M`h(1brvtH;bIRZP*?s(Kp&~h_e7P$9 zdT#iQgC)@h$)IQikCHtJF;aiWiZ)qhl6Y8ND2{f6?5jMVl_%lp_X=XIf>=E~J2pL_ zKX#%d)_0}eAE6gWKY-r~^l=dDANa&iICo{y=byY&;`6=Sz_`6oEcWSL&EsAqYr!VXjBA_Sgp z9%R7d$X_kQ-1^$Az7;AhD0I_X1%|fZAigZWg+Yh|6A+U==vB4yh-GW$lo-^84`-+F zGSTBw7akj1;?qWU7>KwB!Iw2Rr{~5=SGSezRbr4VQ(%DS+KBKw8d1u?6Y=}Q=fZ}xy8F&-dZr|3OIdyp;_e3nmha85 z0b4IFE{lH!)K$J@836-4Y#&a$-LPXG27Yolcft4B_{Th5cBkYr7=&Jd0T+ygsp}ek zys&%u5`!|R9(ZQm=umf9{VSIqEb;O8lb;Mi2abRRGZDS^n{PU8D*Ua)Vzl%ej7&Tv zn-bQ_u7feS+sVlbpmmi6>yfj6$FBCb#%^?sy|-HEo75fG(A-dE{eC*Gq`Q0y<<~J7 zA42*ML!Cb*BgO!Z$lP4OIT^GOa7!NCg(<#jV>x9XrobSX{S??pnMuzWS;T-TGVeKi zb=miIxEITyX8^lp_ASGqr7uT$e!JYC>i^6I)4 zM}L~*QQur=f;mxpHI-c+u($MUjAsp%U=j9Wnf!w_`o7ME1)DPLKHJEg2kc#)U0{G^ zKI?$|^a1-Qy^9PVVeehczAIObu#YP1GD57sjj)fzD>x%Y+WoOyWR66ZN6C~}d+@4J z_R6}MxnQR&_a#2X)KjwXb$i#}8+Kt;jH>Gjcb8JD`mlnRip^{QGo5=0Zq~cX@x9pJ zwE$+4DyE?_7T@s`i)araaqB^jt*ss-A+YBDuGHZC1I z^yOc^|B3JNS0AgSufwFy+3}Bc?DCPjd)U3*xjonLB1F8scc_k?3m*4nEy~_Cz1!OM zU!WJY!hQxZm4^@aBb&d?|6h zSX6{XVA%4Ip4$eFMO?v11$}jotT_&ITLBEbVep~XoU<37ym(C+VD))dM#Dh=LQVqI z_#Sr5)Y6n%v2)6=&QNwJk1bSg8fWii^9+^WjI*!B3pb0#+q(|gg%ML00S*AM&SzDf z7wVB)&py$n2h|R!&0953j1fi|aCl$M@lCUWZF+&S9UB~wo-jFHn-N;+;EH*h2HEuE z%IA!%KLJ~|6K$-ZA-Ad~#kIWef=$P$HGkjBB@m>$w9R&t> z2kb-It!i)OGGN!7^8W3P)Iza>LIPW3_1z>ZCfJ+SOAh$6Dt7sl?I1@c*nL8LI$*zq z;ygNF$mZ40t~rdTu!-b4UKc)WYTJ7$Su&y}_S%>*(AYS%kUJ9W!M2(Xc^*;t{kdVH ztTNFaT%&78t1>TbU0m_qcipGh^bjzdjF5{l6YX96rggG*YJcpC(`3O!yKmjoFyMwK zB*Mzn)AqM)>9>wpcQ&n<-3a+B($a^?ph;-Qyv|ky{IS=&=I=iyDh+@-+M9A9<1$!nAC-VT%`pqo5|KsDOIm_6-@ z;CK6M+;TGv#z9uoSjIm3A?Zv)nHR|pN$3^xs#$g8Om6?$mFTqxVILNVn}-(KQ!)hx zYH{90pS9O~rsjYk=ZnWHmsoU=o>P#C z7}*rymkK-X`bI{-xoTl#-%^4BZ4rmJu6Fh0hea6nE}wvC`O6gKzZ)#L z-`~6~b@R)6KzF!t(*uCZMRJ)ts>o8_*d|foI?X|bB^e~Nizpi~M-=gsi zS(I+CS_?#(0amHB5!cEmEc*4bX&TB!$9I6dKMk9%mh#i72x7?Sw31}9((G=CC1^UR zmU3f>Pb~~E?a)ALcCEKJq*r*p+ZjZv2C11#FL`*X-GOi;tcd;7F|_IpmhIC~iR}kl z1zno^+@N1)zlAlxTp!T@`(-i=LvEmOo+#YYLn9`#ABFRBZ-wa@ek_%r+fZv-|LXmR z^7B5Q^R`(A^X9X38I*BLq|9F9uirepz1t0|Z-lYJP2*rcAJu$Yo6QUl9{K`aBt!d} z)7B7Kk+q=e(#)8byLoI^TtCPgrZv=SoXnx^A2XmDDJ0+lt2MvAGTE!<#5wo-gq+WAl|!)9kJE*W|2em<~_NXQ!D*9luUPO$;4nO;D+Q@*c?h zWLG!Vgth1vcK|k|Ulz((8I_Ryr{m78|jFJjbl`u*c zl3XYc&nf{$-W3Yu0C(m~S?-e&46OpTyM@@(tSRotUdz4>`n>K0q!Gr0wIIz8KD_0h^yB_k9j|v@P~y{8 zE?b1~=O4n{)my5KN<@1gFmtl$}T3mnH{XjGUkJIz5G z*Pm`3LCq-I_x^|BhaNI5FnC&NOW=cjRMzP3apmeP8pQ64Wr{24X1QbzDrGYac&>HR zGk(%BQzEE_+J0{tjQJdD|>quc?~uV|*Vwv^p) z;e)wlKEvGu))ur5o}kN5VeZ%MLCc`ScQ5B1uM}eS4AWq#448`;&clFrCQX`m`{k$M zUbsg<*D)ueA7v~IkkTwdsqTi2pxiwdtCQzLxKBgaijh$tR_yRKCwg?d-}NH-%UpYP z+x-topLr;ZbzqD|#*EMRPom&vSM^CAI#_+O7TH#rR&~`s`qY4ieiPlSB-zvZN_{@^ znJf$EqyM&;Z-<|mPcH}etXZ-zyltKj$wwDr9XETwuWrWdEBDVwYnvfWi?8Ox!b%il zBGgLX7vD>nDRh-PB@(hu$BHAgVzOC10t-}24ej^t0`$Z`%Ta>tun-Nfc#btfV`grC z@dxiucDX7sRNE#~U{IWb%CcE6uAJM-TKyH@m6TtE(~o0vz#^Q%-%&chnRBhJ@W^x5 z0{d*LzNjPxRU)gZWv9g$^FK+?#VB2As#Hx3l%wDqGH#x=1--f>e#_%;Z`@zf3UlGZ zyS(JpZ&iF~VJ`_EJdELdytw{)`y>lIL4?!7Jis7Hrsrhc;uturtk)%`vC= zEmLZ~&(V)gpZ<-zbncphL$&oX?hy-gGctM!BK%6`t;U!aNS|Bdny1s{#HBAjjj~x82=#bW zZemPzAGNx9$cy#k?;qFiV=E@?p;~p6z1QGe=&L36X0=>X-=9p1@^&UhLWLD}57)$M z&8Rk&3Qh)>EJIv}mg0czE&0|`d$O8yT{C~gQfplq?Upnx;rsndToo0nnL&fmw+j$M z>B&Kj8?)N|$}h8af?2=4RISC9`FN1U7bn@u|8;4Jlp~fSW~;@DbF51L>T-J@H9N~@ zIhbDRER)@GFxJ%bs1-T(P+PNQ@_3HDmtTfT@?kl_^HT2iS5;5K^gTxgtw0(%vgZo) zOcVG((j-^Nlf{0;WRCO`_NHaa<>0L)6vB6f>?hD#4Oduq)(ege{iSZ*_TQ-#Fv*9= z+{aME>jiFY!(qh@`O>FmdrgjP^9`)bjR0OKl7#|u^)MK4tzI?s&9>Wmkj9G23T<^aO4rI|4 zi8U%+UH{G=7xL#r;J=Mg*YL_(gT*CXu3Li*$h~Lk&Y>zp*WOc+8m*OyYwb;(?bli@ zcwBB=iwW;TsFhLTZw7tlU1@d2S8RByWZqTb;qHfcxFf$p^mV_6l@F}Ctg{YsbDkH6 zPNo@U_?XDD9xMIVq02oi+X4JG!H&0fkC~X=)lNf zFDxrDa9@uDLHJzm<>>ddKJn!epT_IuOY1PEy2FBJD`y97I6k5Gm189q6J-%Iu~3#n z&TH&Yc5BKH_ATi4UF8xx*U~sb#;iw|8Yh>)-f!5NAf+#1 zz}w(`_kEWbaHa>&9b7?wkvTBHOtWKynXyl)O_Mh_U~s=D*PVoRLB>9A&;HBDLF)O> za5?HF1o*Fyfl{Qt>7EY$t>*=D{U&?VJwG=oHVoZr)r#-Dp^-HmBi}*ws>6<6ax$M~ z-T7qe&Sw+mLlIxUSj548c<9G1H)nhhv(sF4xTnQDn8_zvIkLkO_f(X-JY~s|<)6gU zDc56+zgO53^5Z9qPpZA$@CJ!`)S@2L4VO9j$e$`zx(we2ZI0Zz8DKq)ljk?zQ?;si zRZRaVY)kp<4y1c$g{vH@zH?{wmrCWoK5{Cqz&oQiBQzgB-pfO<-#v4?Yh9|GmVUhH zi`mqy*-{xU?tp*X3%Q#5&ZlCk#qOwJe0d*x099sov;X?2wB%{z@5+%aKi-X4RC<5a z40on(b^kjvaS!Ffz}|UJqrrR@>McjVX76zi(cXJ0{_^qkozqiE|KJ@ApK!XKQr}s4 zbF%u~qw9Of^ItZ^ojp|zggg6{%95Fvd+ES;?NWD*`Hmj@x0~4PtT@izgB!Ge(%knx zobOtqztO;@>+>&OL-_k`c@LvWW%I5x#((W>f1|noYDBBVzms`~(YMw3zN7K~<_hpv ziT%TNDV{&g388o(-tnHu-*2FQ(l75JmA~qccg`)PyPj)W`J0t}=M-_*w){tHj#_N) z>=k!($^RP}y;}uX@6h~>&V6SU+%?KOR>^y4!avMjt}f@dV2^dj`}&~{W8cY}@U9K- zgPJ$Ic<6vvf9@sQXXMdWOYP@Mt#S80>HWXhb@|Y|#_Kp;4R^b*qV3R8W^;$Xj2P3RJ2ZurRU@JD)QwK zb`Loh_mc8~Np=sfyS;=jD~+_*uIkjSV<6Wn{fGz02Qq7|y{Z{BaL0b@KH|W!=EH_o zJarQH5j;1?O~9WydEb)<34u~d%n1V5>`OL;9wK0@s=oBKw=OcV&_SOA(>zHJMc`pxn zi6SBo5s7$=IKREmx%Zla-~7Wl=dRyc`?2<3`|PuSiy&dn?O9@mETN(j5&s}cO${aD zo5I5HX!=j0uc^CQs^Tg&ZTJaPlg)T$pStcXs0%B8SoFF40cj#~z|?dK8jfE9!H7}k ztCxM1y6Qa3Il#wV_64a`opuQ(9s@Sn_q(nYr#vlx}xmr((XKFOyHApE}uf^|{4`e?1D_YCO3Iz$O1E|4s( z@w5;8W@n&5(vnY>D8I-ZJKB!oJ)1W({kV1g)pAH0b z;yYgjeYa&@%NGX3d`MWU!c!DsbM9AL8YKIRXjdsR807W~a(_If$K*csAG+6v_LS_) zr+8Z)4}v^C9G*PuV*@t;<6HU zG$Nbz0}gH>86pP)5-A75Mu}T}8U*fn8idO4En}%?3ys=C$2JSx=aR)C(juVB(;{p~ z;qD-`{{X*a9^Me&Zan6Sp*}oWLZ#rD61J>teX<1Zd9sAc&kQGt%&RfB|1}xzY~5|p z9wK)Fsyugsmpv2OtnBT|W6KwhnDTdnHqWSFXM0Ge;AQJGDqw)KvQ>V^<+3kyZ*pFr z6_skx9wNg6syxHOmQG(4ZR9{~Yi_A9x{9P1)T8GrwO++Ix6?==d0A!fsVI-hAgSVr zb25wfJ{oe-V6H}KsP?94N3r#ym9RoXL5-qa&__^Xe7j0qS(r#tM;*-(hOiOZR*rHpIniR5xI(yVRf8c~7h+@YnJ6)3SE3S*!!&;I2y=X<9aaZRqGOSx2H zVsAiCMEt7`kRUOF`Cvjh)z_k{{D5GE*;tk~m;T9ld%DHcRWI2JG7tQhfEh z1$MCMCvkTqceuMn*Gs|t2V7ZGqYGWnh3-@R3M6Cspmf-3hvNkKN-otnRtvmNfz{$G z{?9c?gUYmdzEg0#h*4f0obEX%posNBalB;A-*Zqq`{ zhBJ}?`y!0`SKT1<8g$wa!vu)gHz@=NA?_x*JUYf8Kq5471QlGY%yQs{zjPd2VymNGOG~y1euQQY; zz$+K)M0eBB7U`6?QbPmGQa7GmP*&oo`+1rQw*W(+v2CS}26TiRa0U-FJ6fgVmT|HB zvp;@27gQ2moXUa36^5;TDQ;N2$Qgt?okVB&ax1A(K-zV55<124y8bX#>1Wj5O7Yi4 z_h)!Sqn8?Ss+@COH1;Qqb~fb}=Cwa_ptfy1TF%Jcm^g#X12}_CS6zYVgJBJ#yPGab zK3PSC6dq-vF}FdSVX8ywEXY;<|9ee%q>(i5h9OkzP5-8$9XFoph@Bmj4}>n_>r9gQ zP0`+e=n&Kn2e5$ov(3vdWp%~hMo%HYunA})6PX~eMmxsxt5iZg_3on&!KoZ`3Zz7)lL5|{lYX48Vx zs0=%Z#w(0lmo${uo_Ohl$iRb)ZpwC)aGON`Nn}i#;{c6?`I6JlVZrgUwgM!R%`}jV zhh(ga?Ih>*Q8+BqNuDGEJOGx3(r15_jwU~x6%>A`Yx@I9hYcdtuW3!9`{=O%cmg;$ z*~nW@51PVmYXBYzu+#3a#3dQ2DTa)PE=X)4G5_?>b4Pqo5o(Z_cGH0-J>h2yra*Z_ydGGA3P6bO6g7qk@DrZ{g9=cb?n!t{OU6-`Nxy2MKd(aZbu~E5(d; zT;k(N*)8HEM!2eP!IV7!5Nog2A|TPqCVZA$B-Fp`BkNWj^-Lvv+ehnLF@xXlrvY3Q z33R*_EUWGPbg>mNxvXEBsj}GL?tx@?OoVGjad0)bLYNYK#dL*)RrpZ+yKCMXSmXo= zUfulBO0Ng>N*js@ctFeAFaeVWC>>XH-laAaHLj0tv!BuVj_u+mai5WbzGxSHoF*s~ zd=dNdqm0q+k(tO8;oXKdgeVl$)-G-Y>1D-Tq`-88Nn?q!KaSmVQeE{Uql&Oa72X{t zlKL*1RZAKM9NMuTiR9LS*NZ1jF-v}Uy$HiUIPJjTNK-0!n4jwW@|$Zv4GZU8zzG4B zl-GeB58uvMyTbRrgKucK#KxE`?!nyi*kahA?w>n&fB#GKlGpi*I!Ex`j0%b5i|*n4 ze9(;y$E~AJ0012Z$=ud1{HH$2t_by3a2Gg}8Y zkBqW-Xg#qu3eRjDp9@(0TJXD5%8mP_c1$-pTh%3cE4*S8V?ExEOZHl_a`n;>-9ysK z)ydH@35FlmB*!JhCC4pII&0D`27N;v;mT=ldbnQd<>95j_dqQ4^reG~m0_bEw+o!E z2oE1`st;F2Ow?OrH35KKJn+pD@h0YC|vNB{r; delta 49979 zcmeFa349IL`v*L8Z!Q^oNJIn?dyvQ?iTx%*#!l=@Emwqu$R0aM>`SRQ<=6?Wr6{Qq zTamVkZiG^$XxeHmZHcyu7Vr0&b8Zr?_NTw){eRxi+uJ_#JyG{{`hc6!Sd#QJ*TB^D7PwlYu6Wk{dACOQRr7Hv!93i8*XMp z5f>*#NuLxy!cf{~W_qN(T|!aHfGl59Q7QnVl82|p#EwulX^K)2Is;Y$rU9LSV0$d8D3{L^N0fz%ATt8rG;OLl?7^>e^5Yqd=m}=M+87KuT2Snwhj~o$` zq%dz&>9o4-bPdWG$NGTn_h3wY?$vz!O_CtZ5Kr4{!YXT{} zN&4p_yX2n>B>xRS_@|}Mgo7fm0c!)Tz*@k%K!i=#fRxZ3lpoIYb3o)ReLs-+l|V{p zA+RhkAwD@JGC5gssVnr-Kq`8iEiOI=o$u*RhBo*g_p-n4WbKf%|G1a22j<|a-#dt= zO^UKbrl9$=>I?mh$~rmJNL%0~x~$en^o*3`*qGrkn+v@hGV!3H7=vE}sY`EaEP{Uo zoqAk4!c&hL2&@Ne;v?F#JdoPc86%yBz_RK z1fce8;3pz_Uq-MMNF8RdzvvH<&}qyq0aAvVVxFOldjTn9?ov;VkBf^+Qk0~q$Y@(q zO7erIWaqA=j|lKii5VM}BvAp{l9Fr_m$D3tN7}|<5nXgFQcCaGrvU0|2kLfFrMPT5V7{|EN23|@y$^>7hL2@PV2C0x_qMQk)GB4d*$ptThX zYKdz99(oHE<1&z@-iDz;#>f&jO@W@?b}JLiV!5K+4r?Kxg3QFflEx z08;8B;v*?NR}4ROS-OL;d87-x3#6Q10a9Es$ws>%pRNiiwOXTTdZ zVjB}rWr&T5B2ZrJEJ_}2OOEy#ovaM#B6Vg?SOql6$ zKQ{Eh&OVzKx9%>Yzi_w9R8%2e?gQeHPUBnOk`60dZ~{c zk(v|>yJalX(KYSSAd!57p`yNAfmF;Eh=tm`B9Myp8&VFVuCD0E@RoZu)Fiee0h)o?86L%XrMQn?VPePi?Md)Pr^LSAcDHB8u3dYH)1)a3yz==&JjrN9V~RL$5=pF*ZEO78!+7 zRGA{|h5*Zf-vy*;&K5UutSu!n+Md8f*iubJGPShpfFGuc>@@&OBhmw9rnTAuNDb!( zzC5s$#C+IOdsx#&E_wi|xOw0!07oZBB}bwfPO!w%9%*x?i&mNlq&y7-dH_4k6s^)6 zI(3_2vqWAe+G1m4l2er4&?z^uvqftmPFt*PMAT5|lzL~NGtdeoyQ)CyhCv8NtzHL+ z-q99?PmV#(m5#Vjze`ApN=b={N}4%O1iY0bGBjzv@IMQkBKjHKgo;&;MU?SKOMg*V zU05J0#c7eS`cdk?L8qn|o$Ni)Ha1qVy(Eg;6G)ZU9!S|9zF6S6n3SlIsfv<1G9GzT zl)DH|Q*YFS+flpGa^oljf}wue#4 z4Z%~rT7VQ$`~Q^FT6q6Ictl2v`r80Hhw!3rM}ZDUfQ$ z8CVmz5(!a)-dUpLDYgXL@YpD2Hgu|~RWgGgZV(ylxe?PKRY?vAD&ctQPWb7sh#Ck2 zQiNIXuMAuuaT1XDnTU|ad+27F5$M!}ji8ggZHs7%jzH>peiEwzDZLU~a92Tw(Fj-# z*b_*4yVr!?2uM|I+9tZNecRSXCe%RMci%4T?f#EVBA$pHq9(3Er+7lW1fG)q&Sum< z<@iky?!XliGk}z1djR`3ZZvo*u|1*A(5VTUO8%W)B0jsn2Y4!}Jst~m8mre;(S&

lA;a1EK&jgkt_Gb-tN|;ru@&6YdgqAV69}X% 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

WYydaK&;&xOe`}T3YG)pp))aaG#2?}Zu@`qM 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 Date: Fri, 17 Apr 2026 01:57:26 +0000 Subject: [PATCH 2/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/integrations/supabase/types.ts | 3 +++ ...417015724_210748c1-113b-4c0d-883b-6a7ce98b67f7.sql | 11 +++++++++++ 2 files changed, 14 insertions(+) create mode 100644 supabase/migrations/20260417015724_210748c1-113b-4c0d-883b-6a7ce98b67f7.sql diff --git a/src/integrations/supabase/types.ts b/src/integrations/supabase/types.ts index 1432806..7d68dbc 100644 --- a/src/integrations/supabase/types.ts +++ b/src/integrations/supabase/types.ts @@ -221,6 +221,7 @@ export type Database = { late: number legal: number payment: number + sort_order: number transaction_type: string updated_at: string viol: number @@ -242,6 +243,7 @@ export type Database = { late?: number legal?: number payment?: number + sort_order?: number transaction_type: string updated_at?: string viol?: number @@ -263,6 +265,7 @@ export type Database = { late?: number legal?: number payment?: number + sort_order?: number transaction_type?: string updated_at?: string viol?: number diff --git a/supabase/migrations/20260417015724_210748c1-113b-4c0d-883b-6a7ce98b67f7.sql b/supabase/migrations/20260417015724_210748c1-113b-4c0d-883b-6a7ce98b67f7.sql new file mode 100644 index 0000000..b51c9df --- /dev/null +++ b/supabase/migrations/20260417015724_210748c1-113b-4c0d-883b-6a7ce98b67f7.sql @@ -0,0 +1,11 @@ +ALTER TABLE public.collection_ledger_entries ADD COLUMN IF NOT EXISTS sort_order integer NOT NULL DEFAULT 0; +CREATE INDEX IF NOT EXISTS collection_ledger_entries_collection_sort_idx ON public.collection_ledger_entries (collection_id, sort_order, entry_date, created_at); +-- Backfill: assign sort_order based on existing chronological order +WITH ordered AS ( + SELECT id, ROW_NUMBER() OVER (PARTITION BY collection_id ORDER BY entry_date, created_at) * 10 AS new_order + FROM public.collection_ledger_entries +) +UPDATE public.collection_ledger_entries e +SET sort_order = o.new_order +FROM ordered o +WHERE e.id = o.id AND e.sort_order = 0; \ No newline at end of file From 8f8f4598f4a320b8d49d9b42ff1fe7eb7c7181cc Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:57:57 +0000 Subject: [PATCH 3/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/ledger-row.tsx | 156 ++++++++++++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 src/components/cases/ledger-row.tsx diff --git a/src/components/cases/ledger-row.tsx b/src/components/cases/ledger-row.tsx new file mode 100644 index 0000000..e104fe3 --- /dev/null +++ b/src/components/cases/ledger-row.tsx @@ -0,0 +1,156 @@ +import { useEffect, useState } from "react"; +import { useSortable } from "@dnd-kit/sortable"; +import { CSS } from "@dnd-kit/utilities"; +import { GripVertical, Trash2 } from "lucide-react"; +import { Button } from "@/components/ui/button"; +import { BUCKETS, num } from "@/lib/ledger"; +import { formatCurrency } from "@/lib/format"; + +export interface EditableEntry { + id: string; + entry_date: string; + description: string | null; + account: string | null; + assess: number; + late: number; + admin: number; + legal: number; + viol: number; + interest: number; + bank: number; + payment: number; + runningBalance?: number; +} + +interface Props { + entry: EditableEntry; + onPatch: (id: string, patch: Partial) => void | Promise; + onRemove: (id: string) => void; +} + +const NUM_COLS: { key: keyof EditableEntry; danger?: boolean; positive?: boolean }[] = [ + { key: "assess" }, + { key: "late" }, + { key: "admin" }, + { key: "legal" }, + { key: "viol" }, + { key: "interest" }, + { key: "bank", danger: true }, + { key: "payment", positive: true }, +]; + +export function SortableLedgerRow({ entry, onPatch, onRemove }: Props) { + const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({ + id: entry.id, + }); + const style: React.CSSProperties = { + transform: CSS.Transform.toString(transform), + transition, + opacity: isDragging ? 0.4 : 1, + backgroundColor: isDragging ? "hsl(var(--muted))" : undefined, + }; + + // Local field state (for typing without re-render thrashing) — committed on blur + const [draft, setDraft] = useState(entry); + useEffect(() => { + setDraft(entry); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [entry.id, entry.entry_date, entry.description, entry.account, + entry.assess, entry.late, entry.admin, entry.legal, + entry.viol, entry.interest, entry.bank, entry.payment]); + + const commit = (key: keyof EditableEntry, raw: string | number) => { + let val: any = raw; + if (NUM_COLS.some((c) => c.key === key)) val = raw === "" ? 0 : Number(raw) || 0; + if (val === (entry as any)[key]) return; + setDraft((d) => ({ ...d, [key]: val })); + onPatch(entry.id, { [key]: val } as any); + }; + + return ( + + + + + + setDraft((d) => ({ ...d, entry_date: e.target.value }))} + onBlur={(e) => commit("entry_date", e.target.value)} + className="w-full bg-transparent border border-transparent hover:border-border focus:border-ring rounded px-1.5 py-1 text-xs outline-none" + /> + + + setDraft((d) => ({ ...d, description: e.target.value }))} + onBlur={(e) => commit("description", e.target.value)} + placeholder="—" + className="w-full bg-transparent border border-transparent hover:border-border focus:border-ring rounded px-1.5 py-1 text-sm outline-none min-w-[180px]" + /> + + + setDraft((d) => ({ ...d, account: e.target.value }))} + onBlur={(e) => commit("account", e.target.value)} + placeholder="—" + className="w-full bg-transparent border border-transparent hover:border-border focus:border-ring rounded px-1.5 py-1 text-xs text-muted-foreground capitalize outline-none min-w-[80px]" + /> + + {NUM_COLS.map(({ key, danger, positive }) => { + const v = num((draft as any)[key]); + return ( + + setDraft((d) => ({ ...d, [key]: e.target.value === "" ? 0 : Number(e.target.value) || 0 }))} + onBlur={(e) => commit(key, e.target.value)} + placeholder="0.00" + className={`w-20 text-right font-mono text-sm bg-transparent border border-transparent hover:border-border focus:border-ring rounded px-1.5 py-1 outline-none ${ + v === 0 + ? "text-muted-foreground/40 placeholder:text-muted-foreground/40" + : danger + ? "text-destructive" + : positive + ? "text-emerald-600" + : "" + }`} + /> + + ); + })} + 0 ? "" : (entry.runningBalance ?? 0) < 0 ? "text-emerald-600" : "text-muted-foreground" + }`}> + {formatCurrency(entry.runningBalance ?? 0)} + + + + + + ); +} + +export const LEDGER_NUM_COLS = NUM_COLS; +export { BUCKETS }; From 97aa28fe70bf44d7064a3c46d4a672c37d372cf8 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:58:09 +0000 Subject: [PATCH 4/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/collections-tab.tsx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/components/cases/collections-tab.tsx b/src/components/cases/collections-tab.tsx index c28c607..21c3eba 100644 --- a/src/components/cases/collections-tab.tsx +++ b/src/components/cases/collections-tab.tsx @@ -52,6 +52,22 @@ import { num, withRunningBalance, } from "@/lib/ledger"; +import { + DndContext, + closestCenter, + KeyboardSensor, + PointerSensor, + useSensor, + useSensors, + type DragEndEvent, +} from "@dnd-kit/core"; +import { + arrayMove, + SortableContext, + sortableKeyboardCoordinates, + verticalListSortingStrategy, +} from "@dnd-kit/sortable"; +import { SortableLedgerRow } from "./ledger-row"; const TXN_TYPES = [ { value: "assessment", label: "Assessment" }, From 49b6df7a80f8de5cf4e3a097db066ee4f3610b3d Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:58:25 +0000 Subject: [PATCH 5/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/collections-tab.tsx | 65 ++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/components/cases/collections-tab.tsx b/src/components/cases/collections-tab.tsx index 21c3eba..54883bd 100644 --- a/src/components/cases/collections-tab.tsx +++ b/src/components/cases/collections-tab.tsx @@ -365,12 +365,77 @@ export function CollectionDetail({ .from("collection_ledger_entries") .select("*") .eq("collection_id", collection.id) + .order("sort_order", { ascending: true }) .order("entry_date", { ascending: true }) .order("created_at", { ascending: true }); setEntries(data ?? []); setLoading(false); }; + // Inline-edit a single field (optimistic) + const patchEntry = async (id: string, patch: Record) => { + setEntries((prev) => prev.map((e) => (e.id === id ? { ...e, ...patch } : e))); + const { error } = await (supabase.from("collection_ledger_entries") as any) + .update(patch) + .eq("id", id); + if (error) { + toast.error("Could not save", { description: error.message }); + load(); + } else { + onChange(); + } + }; + + // Insert a blank row at the end (sort_order = max+10) + const addBlankRow = async () => { + const maxSort = entries.reduce((m: number, e: any) => Math.max(m, Number(e.sort_order) || 0), 0); + const today = new Date().toISOString().slice(0, 10); + const { data, error } = await supabase + .from("collection_ledger_entries") + .insert({ + collection_id: collection.id, + entry_date: today, + transaction_type: "adjustment", + sort_order: maxSort + 10, + created_by: user?.id, + }) + .select() + .single(); + if (error) { toast.error(error.message); return; } + setEntries((prev) => [...prev, data]); + }; + + // Drag-and-drop reorder + const sensors = useSensors( + useSensor(PointerSensor, { activationConstraint: { distance: 4 } }), + useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }), + ); + const handleDragEnd = async (e: DragEndEvent) => { + const { active, over } = e; + if (!over || active.id === over.id) return; + const oldIdx = entries.findIndex((x: any) => x.id === active.id); + const newIdx = entries.findIndex((x: any) => x.id === over.id); + if (oldIdx < 0 || newIdx < 0) return; + const reordered = arrayMove(entries, oldIdx, newIdx).map((x: any, i: number) => ({ + ...x, + sort_order: (i + 1) * 10, + })); + setEntries(reordered); + // Persist new sort orders + const updates = reordered.map((x: any) => + (supabase.from("collection_ledger_entries") as any) + .update({ sort_order: x.sort_order }) + .eq("id", x.id), + ); + const results = await Promise.all(updates); + const failed = results.find((r: any) => r.error); + if (failed) { + toast.error("Reorder failed", { description: failed.error.message }); + load(); + } + }; + + useEffect(() => { load(); // eslint-disable-next-line react-hooks/exhaustive-deps From 563f1279c33073400139b2c3562638d4780e4210 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:58:51 +0000 Subject: [PATCH 6/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/collections-tab.tsx | 124 +++++++++++------------ 1 file changed, 61 insertions(+), 63 deletions(-) diff --git a/src/components/cases/collections-tab.tsx b/src/components/cases/collections-tab.tsx index 54883bd..99aea3c 100644 --- a/src/components/cases/collections-tab.tsx +++ b/src/components/cases/collections-tab.tsx @@ -703,73 +703,71 @@ export function CollectionDetail({ - - - - - - - - - - - + + + + + + + + + + + + - - {opening !== 0 && ( - - - - - - - - - - )} - {withRunning.length === 0 && opening === 0 && ( - - )} - {withRunning.map((e: any) => ( - - - - - - - - - - - - - - - - ))} - - - - - - - - - - - - - - + + e.id)} + strategy={verticalListSortingStrategy} + > + + {opening !== 0 && ( + + + + + + + + + + + )} + {withRunning.length === 0 && opening === 0 && ( + + )} + {withRunning.map((e: any) => ( + + ))} + + + + + + + + + + + + + + + +
DateDescriptionAccountAssess ($)Late ($)Admin ($)Legal ($)Viol ($)Int ($)Bank ($)Pay (AR)DateDescriptionAccountAssess ($)Late ($)Admin ($)Legal ($)Viol ($)Int ($)Bank ($)Pay (AR) Balance
{formatDate(collection.opened_at)}Opening balanceopening{opening > 0 ? opening.toFixed(2) : "0.00"}0.00{formatCurrency(opening)}
No ledger entries yet. Use the buttons below to add one.
{formatDate(e.entry_date)}{e.description || "—"}{e.account || e.transaction_type || "—"} 0 ? "" : e.runningBalance < 0 ? "text-emerald-600" : "text-muted-foreground"}`}> - {formatCurrency(e.runningBalance)} - - -
Totals:{formatCurrency(totals.assess)}{formatCurrency(totals.late)}{formatCurrency(totals.admin)}{formatCurrency(totals.legal)}{formatCurrency(totals.viol)}{formatCurrency(totals.interest)}{formatCurrency(totals.bank)}{formatCurrency(totals.payment)}{formatCurrency(computed.total)}
{formatDate(collection.opened_at)}Opening balanceopening{opening > 0 ? opening.toFixed(2) : "0.00"}0.00{formatCurrency(opening)}
No ledger entries yet. Use the buttons below to add one.
Totals:{formatCurrency(totals.assess)}{formatCurrency(totals.late)}{formatCurrency(totals.admin)}{formatCurrency(totals.legal)}{formatCurrency(totals.viol)}{formatCurrency(totals.interest)}{formatCurrency(totals.bank)}{formatCurrency(totals.payment)}{formatCurrency(computed.total)}
)} From 48c006f36d9502d0eb454ee28c47b2f142bfe2e8 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 17 Apr 2026 01:59:03 +0000 Subject: [PATCH 7/7] Changes Co-authored-by: renee-png <262607627+renee-png@users.noreply.github.com> --- src/components/cases/collections-tab.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/cases/collections-tab.tsx b/src/components/cases/collections-tab.tsx index 99aea3c..b3c95c1 100644 --- a/src/components/cases/collections-tab.tsx +++ b/src/components/cases/collections-tab.tsx @@ -785,6 +785,9 @@ export function CollectionDetail({ +