From 75bf0652b1efeabce5ab3cc89988f3f2bc520f8f Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 17 Oct 2025 10:03:03 +0800 Subject: [PATCH] Fix QC Kak Inno & Kak Ayu Tanggal 15 Oct --- bun.lockb | Bin 355236 -> 355688 bytes package.json | 1 + prisma/schema.prisma | 2 +- .../admin/(dashboard)/_state/desa/berita.ts | 20 +- .../_state/pendidikan/perpustakaan-digital.ts | 198 +++-- .../api/[[...slugs]]/_lib/search/findMany.ts | 783 ++++++++++++++++++ .../ekonomi/sektor-unggulan-desa/page.tsx | 32 +- .../keamanan/pencegahan-kriminalitas/page.tsx | 31 + .../kesehatan/data-kesehatan-warga/page.tsx | 2 +- .../(pages)/kesehatan/kontak-darurat/page.tsx | 45 +- .../kesehatan/penanganan-darurat/page.tsx | 39 +- .../(pages)/kesehatan/posyandu/page.tsx | 6 +- .../lingkungan/edukasi-lingkungan/page.tsx | 4 +- .../(pages)/ppid/struktur-ppid/page.tsx | 167 ++-- src/app/darmasaba/_com/Navbar.tsx | 11 +- src/app/darmasaba/_com/NavbarMainMenu.tsx | 65 +- src/app/darmasaba/_com/NavbarSubMenu.tsx | 52 +- src/app/darmasaba/_com/globalSearch.tsx | 123 +-- .../_com/main-page/kepuasan/index.tsx | 2 +- .../main-page/landing-page/ModuleView.tsx | 13 +- .../main-page/landing-page/ProfileView.tsx | 27 +- .../darmasaba/_com/main-page/sdgs/index.tsx | 101 ++- src/app/darmasaba/_com/searchUrl.tsx | 31 + src/con/navbar-list-menu.ts | 8 - types/menu-item.ts | 13 +- 25 files changed, 1420 insertions(+), 356 deletions(-) diff --git a/bun.lockb b/bun.lockb index 7de6015e87a13828903e794e39fd8876578c5739..fbe4156d9d14dcbc658ab28f3a57510591cb4680 100755 GIT binary patch delta 63501 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

M}}S3~D*tkWr)xx;b^cH*|vtxC%brFL>Bj>rz) z?^ce8gaW6!dq!kCnWqKVpse6^ZuNx`XAS-Yzjzj8>$KQT zt>t+&US4h3F1(9ty*|v_e|gLBM%RY@i8m_dg>y5!O*kzx{1nzmx8}mkaDCS9d7gC% z);XT_1lCZ`3T4KubFj|#w56VvdP!D12GfvCdeEi5b$zY%F4ma}b&`6Fo_?erEWZTI(Y$1{Up9@@HVNuCBE{z+zz0PU`CoEY=Jx1{Ui@EGn6w84C4tI~HVz zy7zM@7G#Iret|$=x3C~H_?=r_5DBNUoAvbkiEcC+ahBk#ZjP=3q5fyOd!pHnIg=XWpLA0uMVy0Z>OF7!cGAd*)y6Vl_jRV?Da_ln zgO9o?lOv9k69`<07W6K*`EKRp2pf1cA>R<9{h9rCNqPbcMm0_FDwU6?UDO}G3OpKW zhh!(7_FKZJelwP&V%AmfhXxOHS4_zcE^w=-M8fY8lQ)v- zXiard#MwiL7H7!Y^G6N#v&Lij--XAhXzT~2IiKRGXBcL}PUS+OmimKU=tieSoWp1~ z2Aj|sLuj2_n3a`)p~AfmaGu5UBdsKxAlD*4tn;KaClk+~NlZ-V3cTU91#ZDpMZH`? zt%kWPO0u14!(ttyjb;^|-)U@uP7R)F=pAxGz0Yx1OwSHp;Z{$N1lPMMGa{kTx$eXn z*`c$}byv*DcIKU1TN5h30guXOW;#D(`AbLpT<7!rA@e3gc#1sl+I=^c#>DTOck%p= z>&zM8==1%((HkM>7Ceom@4bhoHYT_$^V32p!`+Fc*}>=C%F>AQ8@g6-Gi}r1u_JUz z&@rJ3OYLITFkgSiW4ohZt=7&X{o_W!Rd-IoV}qM@l*@MEJb=dvWZF!dmKOZlt-L(q zw8&-opw-td5gMKAcDy3nxd-tAFH4QWK|GBKvyDlRL4a-N8R>4ym67l=DXLib1FS5! za6o3L@hErCmD%Cpqv%q%kllR=RwuV=W+Xh$%UElrADin%wcfpW{wh(}pLl*1_L*=Vj z>QZk>hvM_xJ+rt>=J_j|`4deGM&0P_Nbo_olAk}i)w3f`moaQfv0R;Lcs*hs>$~#m zNN~4XeRU+%Zmiq!n(S~HIUDhG^`&in(wtUNe^z=&yHIY_op@cgb04Cb?;jw4!ec?|q{rImJ(25_ zmwexuY0hFie`!q{kQUyHcb;3-Bh%?S$v?cZ$a!}*gUx0LOsMln7#SPic zRg?WFAx%Hd_bGECPIjTc!W(!qW*MHQn0JhHzQoJGqf@EWX;b{;WCL&WxfUl6yPZxqerEeT925_-fejPjF>hiE!1JE+i_mDbIsJ) z@|?!ia08y-E}}S%r^P%KI~tEIU8`$pdIFB>K<7l$!dvl1d*j))Scid{`B}kYx8u!` zc-&kspm#~ky0g~$sn!}aU6;sIH!I#Zm>Iv-TEk}OTB+IcAlA8_b+FbNbg8bD3azNM zzQ-EuX_=SBtU0yT2UwY2Xj!RuOLNAD27|LFf)A0RoYju*eRoTM1lw1$~(BT zDfe?=flNvZ>-&yNyj$Y7v$WpXpjg9|CgOCR?N2POYD|z>c-oFh#kT(n9&!6~|9N$6 zVt4M9=1jozSGOkBGCZvwrr5YN=U2S5@wnz+mlmAuRxakMdQBj}F@YFtnxWp;x*hM# z4&LlW?~DXDyOnoFoTIMu=d6F~?t@p`T;~crJJ+LWP8D8nvf>KC_3{tAGw>RCMNhom zpU7S@!AIQaT@;O$>BZN1pxq7bp1ZO`V{dRfR%D0oxj`M5T9Fyt?p9VrLZ{Ag_aGO{ zAsflz6n^@(bP&JntYBI^!01&;8jva!Pq1;(UFJf8F9{ikZ>pR=*M6 zO_3f-5#v=fzrJi%;iDJmqNFDrmtdXd6~T2pc&l6eU?ljOoAOY^se79rlHj!>4NvpS zFX1}8?s(pT!Fd+%e6M1iE7F`(Tz@Y6lj;UM%~D!V&wOjcnCEnM#_fLd{A)uYp4Ncl z9X(&cQ+>IL(4xeJu_-2R2%h?obnK4L<3;f3mK)NXMtAsAld~h6avq+-xG=D9EXDKY zm9rPiKmM_p zB6Pu>?w&`p!_$^%2djBB(>aKxO#G@0yQ_BkW~7C0!Q-}MOIAF_>2B4aOs7?aAHA-3 zznq7cPGbL3y%^7)KZ?`iaeBH{q`lkQv$uN2V3isE7-^tqopcYq?WV5FO2E+cV5U~3 z%Q@Yv6TKTwT^a~&jpP8{b}Kc@Obz~eSXFA>(l2x)mmD4t@Rw1ms9A^`@GKUb3g6W2{9agkjd#; zqp&XUtW{VSdRF6yI2w9Z5f$^l%K z@VZgGM&ACj3eR75)7V1x;&Cm1CyOVyE1u5|_j`gfj$8G7X83ljvpwqztU;dD=}Fx< zD73WJdMRc(#ZU43MU=x@V_WzLPo2UvVGlfRRm@wtG|d@fJ@4Tl2jS>?u3}I7d#1m} zE?FH2Od+-Jz4afwtTll^ac$V6c>jvoa%~_mwKnV~yy>-G;F(zcs8O)Mt$aD+)S#V5 z4F3Xt*0cUfVruqGkH=x%MKgmN+{#xXPV?vdZshbbIW0U0&zsNTC0PE7dhP{&Guj)8 z5ii=g9K6>}c{LLL3V*a0(r3Nqh1S7ZEbU(YzIhn0JDzvc40U_So%mX|bHhviT6Wx( z%hD5Y)S>K&lhT~FFZ=6`iyB+mXgqBJbQhg{AD$nRt3>b{w|Zm5Y4eJIiePC!$r%Js zn*=wGyV4VIw1n9|*ob%H`B_cdpPsP6cc|5UY2jgbJR)Q}TUe`4yEHu>$KS@%Uya=~ z=zul{&(p)7VV&V-3{3^38Z-2=n*jAMnn? zk97^R3taC529X+nxAscKE7yG{9<1lF{CI8Oi=~}~#kW3$?!X%1SzX_c)#Dn^(uD_u6Zi*N@gKyd`s7+`EtbD+ z$A1{JhWOU1tba*g)drrnH4w=0dZ)~{R%XT5O7*reO})T#VpedmTfHq3+~THeXItH_ zOO?8N7?zifb03z5#~To52c9lZ^}Rt(`pBOS{w>2$yuohOs4Tboqlhzmhd;wu5`)v6 zJ$M7WT)1g*PXDy_KsAs33QsG96DbqmZtF3{m{cF(sdT)%cs}!4Y(}r-qInh`Pg{A= zax0c%v3YRL-R?$rM4a@`W4W%pF+BmNpRzG4gF#NcpGKSmNZRMTr&P|wow2D*&dzc? zO(Jd-sL>}jjQx~V)#3}k4*p&8c)V<4`V;$p>v3zu8v6oIYu%68VwazeO@us$;wc?# z6Ypj`^$t%IN%uLP-7#1mEx(MV)3-F|;GO1|$K`!KUbc>?;Wre^`${bMl^>rg15bQ= z<0&sTGPbpuc-`=h^1Ns9&i3-s9^icK_o3HjE`F7}BF^NU2hMPJm(`osQ zUwh7BjAj(?Ok%NnQ2Xcb`rvsRZ}?BVbhnDH1BdReJ@C+rSJ!%^(L>g+B2MFK|A6j4 z;4H)&NrG&>Kd5s~!JIC|XkUe-B0&=}B%}L)I z2u$?6m6xZ58vNky`IfH-e(=Y|dm!vwho|x9#(@N@@cdb%)A&z#>Ul<cxuq;;#l&kWDn zuVb97PqBCqg?0MRT7_6nDVDm3@!Of6fTJbpc;8q4s7PLr?oHBv@xz!R{nJ9lzql*D z&kk=y7t@9p)Pl;e~JWObyN07oIii}<9J5|?w>37 zM?&d`-97tx3U%0@Zd~U|)56c3;kGZ2*X3c*u59tb9kCF-d%vxn_mf1&-&gKcS3=Vz(i=rEpU6=8Ti`3<8%egOm0oO|%j z_dI>GSchL9^26Ax!&P`ZlDQ%)zHX4`KQ)m|=L}gyXG-)Gj5g7PBo$3 zy-@Bvoz@9{T)$nT@ccGU>z|&0Gu*EOb&unhmHK&}>enC7F1A0?6KaDr&3Cz#ha%2k zewS&eADyke0?%)_E-&BU`Awx$Lhb6gEB?%OCf19U#;OXxi03_iaDJ=RbtoKKKi2ln zFQ>=jTR% zgQ?|zb*;ywaNfuB3y|0H=%D?oL3v(|SG#nackwjaSfM|sC-8e$ehcX5V5v!|OZ&H2 zkw&smyYib?JS_VpD;|UIc6nB~9m}pvD%rldKan^#97=O0;b|`L1tecdRN`@i#%li6 z#`4d#nMpzK0U+M~G-o=VrXp7g9&7LmPqAtGLwW+gai!kzuBV~1lFh`Ug4v{JWIBc>eO$Q=0b22E8W)8oo3q7q2TZIa=_A@_amged6aV6RjVN z#IZGV%*px-ypi5M)}u{qkaR@54Nv33?{YDK@8fB3x#<|e z`f6)BHVXDAXP?tv=Y5XkIFyU6ek4mDV|8&5jJ3Wv8C+@ozhlLp3B*?g0_LYi!Kj(s zIG9kbMAzvDpCef@uLt5AfIdfZ2!Ae6_>DjxvGkjO^!Y#^@ln74g)avBz@b0`Q`0!u z-2Blvm}FWu;YU`JV580oepo;Fh?U(Va`=eDU?q_LgxFlyB-q;A)g+kU{U}$!DxlAi ztc1^iI^ad1o_!hUb0jPME1v4J>iw$q#R`AT`hUY-zy56mWwZ&X;5UK%w?I627w98a z_y<4*eF#+XkAXg7#s3T_{Bxks=RoOp@q3@%XBR(Jz*j(XDZMgVo{50bwE<$8w_9JVmfvmtBUu$)imsq#He9R<-w!MNL92^pK4kr7F+;41Jgf+&XHu|v zXQg}0#uLkY-1=gfEBT>#Ps%qlNmed*wZbgRT*HsL@C#NKtF)J`FIKt@)<2RZy~+vbFP-?5^+VdIJG;eTlT|32F-^uM2h-?3Y5MZ_|<@k2fIk@Y{e{0ZC) zeV+~gNi&Lnf&Khw0@opx)>b`OUDyCtctgvLV12|2Z)*J`S@Dmy;mu)1Nw$7VSVP&y z>gC5Pl#f^mPk@#2Nj5?U8-65f&2+N*-?8#J)rKF*%J+11RiL{cevxOW#hD07m}MjM z@*@Pq(tBI(W4W*8elY(6XIdU$^&GLuKQ`Dp7&07WTdS)B=h@KnEf0qs^owCtZ;aK) z!ulM^3LkHEvGUU&v5N~VM=ei;6~7SH2ll7>6a;BgZGc#2vGv93-%?l^m%*yw)izwL z{<|KQG>0FGH`nrwu-5JZSn>2C1$`EV?B==12Ha%>#EQ5SmUJ&aG#(GZYQYMtKcYZB zVij0reX-&_Zhf)RuY#5DT3GR)@wOTn2x{SrHsS^w;Z;~IeH&K7_h4x*Un$`8dqV0E!fz3)RGvBH11{0FRx z2h}~4A2U2w#E>80vBu1?zF6T$!OFY7WxWwapZ^LgeM90aNfVDpu=QXl!{(Ng70TyG zR*jFd;caZVSb96Fx3`?4aFf_N*gQq$oh;X~{8RA7sa6+<%wVE>Yq7HpKHUZ%$x5cT z3N?iLz?u+e+W7r#e6ix`RRn6)S=JwD!^H|8WO*>GctheC3uSn&jVM;Y`LLvsRu?OS zT>VWk zQa~d9v$o*>Nmk3BBVYCSi#Gpq846f$1+lv3Wmq$9Bdja@dp7+4hL!L8Hr?Mb;pKr3 zh@dY2#76wTVHL20bZXH~SXq2&^Z7eg{I6{MYPc=s2aY1OGH9S5e_`d-7+n=if|WtC zjVG4h0+w`~)y2|V!%Ba=<#w=ow!IDS0LN?oonnPlSRb(xo@Tj=)y0~{nbsF8!=AAA z@xHKz>TDY>))1ZxOB!MIBe}5(y1)jAgJ$#z_B48tmBnh%#nwNPmH#+&)oZeiR|u6gQbe>JRpuYtW)3akDL<25Y4@ju4upd}O_UIy2Pt6;VNaaa{uY555a zi(0lCK?&Bus^KfJ61)cUFYpFGl<-Yh@!qxihp<}ssSW=O)<-OJ7eAE$Zma(%)|5~U z_roW^&55l7S}B!fb!BUOZadlq+ndSlf=R;^c7l!b?^u;Sk$B4EBpY8Wy}jiQVpG-5 z&W2NLG_j(kTK`Cv-pT4>^;Ku z_97Os@_&U@Zf_g^NS59gUG?l|!^N7#gROrgtG+|ScD7=8AF(nz$NFMjj4rhLMOGK9 zpo^_9mVb%mJgbY9-&pJaXJ)o)vJ??Pv-DC}H7>UaXWN8g6>zoXYb;+2^Di)$A1Y`b ztjV^(vQZ!(v08kml5= ztdCe`Ykp{bw}-h}mj}9HD5G>(8TEkm`FE_0Gi|yEEWejc-v?HO`@{N(We&E!SPdEK z`Ha5|WiSlZ92jZ+Tv!=h1S>(F<#DhoTmUP6k=2V~HDEfdbY(FA0_FTr{A*z4bG_AX zQs4j}Llu~BBiw4)wR{Jx43}753M<3=VHNnG*tF{yZ0{Y3R^zH(&)eV^VMTuhRxul3 zeZ9}U3#@qW!u$(t(~tie`$y7GYyzHsYLpyl6S z{`sx5+!Ss~Yt;|U>N1)-0UnQ_4BA=l0Bg~t!^$8VR)_Yreh#dH&VrTEAUO8Xmo7(s z@giNm^1oOPpIYvRqku6|`G}SASUG&eI%NOdH!lj89yDJy3SRclcP=l|7wXHGfj&pF z`t%h~{pUNE|HgMTEEDhZzxm~khUl;@N38Ys&v!2LiaMsZepr_I&v!2Bg@3+t`R6+q zZ_EET-?eDf=sTHzzH{++l7GH)`R6+qZ%zF3oy$Mpx%~5;i+8%}!fnGp-??a4_#gl7 z<)80d{`t=3pYL4!Cr~%?OzWTTT(r&X{^vUveb?fB{`t;@j?hEY|NLEx-$7%;JbwD; zI~P6L{O3EDf4+0^zZ&`f@pmr$|A)SFS-tkm;DyHxI%nKP=T|g+^_(X+oV0CD!k?)- z7mRu%tJBl7nswU}*YeFVCBtTo{qB{ME7sq(@V3lX@64Q5)9!`q?s#zZV}sAhyJuI6 zFE8XlVleP$!$09%BHhqN!$|Xqw3>go@2FQHePSndMU`Wb_mYnPDoYpkHc& zMbKp?S5#_Nipq>L6}sHyiLNkfMOT`})1a9qD!R(77nPgjVrZ6`CYo(FL8i1sZ7rdY zYfM>*+B#irm2jO&nXa}d+0Y|qfvCzsT zARLmg(&SvDhDxZq2H{C_P{Q(S5k_B&u*y_ki!ky!gv9F*R-4@G5E8COSSMkvajr*L zBcbqmglElKgy3_g@eR;A6NOCD9D+CBK=2DDc@FxEW}0Zd*(7?&w4DpRY|2Ehm@T3W zCgnzwZo4tqz}$Re@T}l#X1jzr^T?~`Jo4IP=FUS%zX_p6!W$;zCWPG*DsDp9Y^o(J znvXDeKEm5(@qB~7+l{jTVU2{s1qdITwGs+$Luhpy!VVL?4I#-z*eu~Qlk6gFlrYmp*l9LN zD7_sa^>&0^rtEfv4hs=>NchU6EJWBQVg5pdZ_IWHbM8Rsc?UwZnR^F9xh*;7;rzrAqkC5&ix1nBvjpx(9|51 zu>1jp(GMUrGnEe@jC>Fw@j-;7jsa; z^2ZTIKaSANR6dR{awS6IN`y3%yAmPc350bLGK}*C!Ws#MPatHPwGs-RL}>LSLQfNY z5+Ug+gv}BnCiy9ZjS^-)h0xns1= z33FB>^jwXQW9F_#NMD0cBVnM)Sc9-zLd6<{!KPZmqO}Nv*CGrti`OCycn0B+gkdJ< z8H588s-8hO*Bq3v{8@z2&mx>}DxXCd`5Z#xa|k0$?sNP|SckAqLauSvA*_*5xDH{I zSu3I7d4yKaBaAlD=Mj=#K-etdVw3y=!bS-*UqHw+n-ds!dO%GB0`7t2s9TSCRl2!*Cv!lG9Y2ET$( zWEQ`IFkl11Aqmq=&IW`75~?;Jl$e7OmcNQH`c;G(rt(#Uk*^^nzJ_p_$$bqWVI#si z31!CFh_FUN;YNfj%vuQrn-E%ULYQfyn-G#-N7yW(+$6t_uu;Oy*AZr$O%h7qKuCQ9 z;Tlu+211875q3zp&ZNAFuua1JHxX_y+a=7|jL>s4!dx?VGeY`X2sIMsnT)p(c1x&u z3t_&gmayn;gu!nk++r5LjWFOHghLV*n4EVI4oIka2f;N5B`n{9FnSBZLQ}Z~VdT3A ziSHs9llv}0!g~noBrG=0dkAYJ6uyVB#H^K2@IFGT_Yo>g^nHY+4-hs>xW^=afUr@* z%nuNjnN1Q(KSW6V5aB*k_8~%ttq40LJYZ6`B5ac|e=EX6X1jzr+YowgL#Q-!w;`l& zN2rnTu*uktuvPt4;0>goIBK)=5}voKF$fNGSXi;aRg*LcwPUtv*9oXQH1W zBz=ysS;7k@`E!Jg5@vpmu-;A@0K61JF} zuMrMNsQMb=J#$dP@^27Ee}nLWsr&|E&Mc8RJNhtjeA@w_iU8d|igbph|PSu3I7XM|QiBOEf(pAnLNLD($euu1+UI3mO^D;EC}9Ik@~t||SM z@YG)kk27VzB6K)_utP%Fq#QulCSm>ogt}%s0)M*S`5@$&xuT=YPEkFR@f%d%ED$A{ zYEc8z`**0JSqzy0f1n@wos1froIlW;m}R1-=Ah_kGwcx5%v6ewF~L8f<|bE^WLAoj zjdPfc)*L3I!oy^AtXYe&uppGUuvKVau+_q7h$aVdH{-T8$-$6!st~m`n?#%{LeL4O zOvI@|)Xt>DL7XZ??ag+`%!v;%>hWZhV&=vpq=yk|B%EwA!bCj9ED)udYEdWCyAE`! zSu8ru>=Si1Id!4a%`#CJa}YAi6Ub zaV$cisg|&)CBopA2t{UbOC|x28AQ`ePAiDV45AWqP&C~PI}Vy*Dn&eFXboLvaz#92 z5S1CH4cV?~L$-x&$o2}eRzg8rgjQ`4W}0YQgrwsUHcKcs$;TsXlrZyngxO}3gwhib zQcpm*#+03a(BVXc9TKiHDJLRqlQ928gd5Cu33J*Z^lXPP*UW8)kbV+Ejf8n7<0ORL z5-LtYm~W~jENYK1xIMxxW^sFj0UZzyNmyWVIv^a7P}Kp!H3uauPeB-+g0Rq3rXY;$ zh>+M3!I<2R2ni=6tdp?VI42{lkx+Ot!ViOSs1*ry^{W zFf$clnb{z2npR0)=5}vobCu~BouZ>c-E|y!2be3f21L-Gto4J zq;!PM5?(OL=?EJo%uGjEZ#GFN%|J-aKzP}dWgv9ufv`iu29weQVVi{cJrG_q+a=7& zMCh4`u*uBLL`csa zHVO03K={UNmoVo{gq~+2RGYbHBBb|6sFCok$>@);TS7&Dgc?&VVbK7D!2=NXn#BVU z2IL?dlCaO@Q@!XXnKjF5CT!e$AFP4d|Y8zsy<8zE>mNhlqHkU9h*&Xf&7 z=r9yvhlH?68H%t?!u+8KbP|swXgRomd#W@Ixrdq9io{uncI6~rZgytr9 zI6}e*gmn^J)f%0x#ZB;_J(meATH=OS#BFf$jSt=S}@ z^a6y`3lL5)WfvfH7=^GyLOYW(3Spas`J)ipo9z$r>swFJC2x0I=2&bCG7am+0tXAHs`358=2GR;~E1!ECfjYa5bqGJ(~#vyE$5HZQ) z5H?DfIS!$>*(9MfA0ag#p|2^+N9ZsfVTXh>Ov-qKZ4%~>N9b?1OPDhOq2~mI95Z(U zLV5v0jf8(&ED(AItZ*s~cZO68DGhM@uuOl!X$)m$&6Ffz2>C zbc?6GDedMH1A%(0+ddF_*vp|*A$QCSC4~B(u6!>Fc~Nhjjo? z$F(Z=Kj!^#(5u`Zw^O;_7N`PONk|-9Qo{de&g(&Lw*^1zMNFKUS3EXeKTs{uD}G^O=|BtVMLqzI$wPziYheUE&qckr$RVCsl7aS*flt8}AAg zB<|(?WOV+K`kIPRQt(l;r6SZc?EQD^{=odDy^K?WSMVvzDEP|P8K=K=&Kw0h`6ZL1 zQ>ODyn$@iy2t6ALkN%oJhx97o)vNn%YE1dP;6{JR;4Uvl?EglMKky%h{oi-JA4(lt zdUaIiH1j%#qV$^tCHaMy<`?t#Z>I36(34>=Z&m8O)dyCEhCisbc0TIX(fUR`5a^I+ zMqU_~)dus=!~REdQ$qDO2C={FYHC(q7}vDt(N6bk8 ziW_~Jo8aiUrsYXCNI7SD0Sube^oNdpt=7V7`t#B=tahx`^f#`&wA1^vw3>dkNPoku zPb;gbioaV;@3){u<=$Vs?X_ZS8?gZqtF6`sP2H$piH!ZV^zl~HU&YnI*5^c-fEp}TKxsx9&CM1)o&y!qW;i%h80h<8fzu6$ZD|{ zb+km&%Tv@!y{toNTY=c0a_g5zr5y*_+O%D*)*7vhN~`kStXAFz=W;7{w_;ng7i{;Z zS?zeVY^$YP?F2Oa!Mj?NVYL&n^#%!jdRVO;cI+(>nN~XqjlVZ9_iCSI#rBALS%M1d zX|)d6Z({3{ZM76^{U)O_j##ZDwqCHHJbIz=FK{x@I}r5gYvY}QtrsvTe!sXA{q9P| z>4d1jGi=0>dCG#<1WhrQ7RDWK=3f|BclD@C;-bOOsDODZFRn%TS#;b$FbL?cFCU@n z^+G;P{GY)u;8$=E{021n{{V-;pWrYEk~Re5K^W8l3BUnIfqI}mNCXW*BhVN$QRf|v z(F}Y?M&E)TKn>7>+6T0V_5dxM?}0i{BdSr*h^dn`>KZ9^qz0llPzP$1HBA};y)2>$ z&^}Zbgh3s>LM0v}0q8|LhrplUFwhHov?ZQ;6l)od7B0FHV3^j;#6=Ub96Kq z1=`^2l?#19FQ9h}<$&(kX+W=y(5oc6fD~{dXb1Glqa?T`XbxIvp(JBy6Q2a4U;>y3 z#({h=6=*|W1Qr9my5T%JO~~F%fSlpFnAO^27+uMaUcwi0*ydp@GC9a5B7o|K#1Ns0RIg3f$zYNKv$I- z@ICkm`~l*LTdk|ix1cUg035_V1cKPVz<+|nAdFuJ{Dz$X{|=XeiC_|#21-Bym;ok( zVlW0o!6jfUm;$tW=7R~KdtjM>Fs$b*y2f>ZM}$gZsd} zK(AGs2j+vD!8PDoptqbo4Z49gpdB~?WPygDPKY7pz`fue@F2Jk z+z*z52fz}r7%T&KfeOI!J8(C+63hWNfNW-mUdGcFJ|3J!Kk0QT{JL)7WXwgU7)tuo|oZPk<-ETJRKD3G|01 zkAdSrbC3j%0(x)VUZ5B8Ee3j{pWgb{9-IVHKu1u1GCxiMsbCCvjV{zHIbQ)Q!4u#y za64EC7J~|K1-KkM#27CJPl6So3Oo)T26MqYpx5u{@Y)XOHEuuQ4`w)q)M5PfB9&F( zX|NVN1D*vhg7x4P@Fv&{-U9D{cfot$1F#Kz40eD|!RKHn_yX(#UxKf|*FbL=DFw5^ zBCxm)<9{c{EsW(na64E4ZUwi2n}7>$2J?YlS9J!^d$ja!t#@h7J76=|0^R~|gEztJ z;0>@7di-2#j!?gWsdgTPB9 z(p^y*33Qy-%SZI$5*^RaM6Uopl87UBpcD4>@YO(n1)>x8r(hHM2SBfX(n`y>P zY@L`>zy&}D<D3W9*!*__UKODX04OZbf8m^PDDB(bpsQ@ z>7X;{1WqwMr^GccKNd3?B!TAO7@z}C9S{$Gr475l=ioD-eg7k%1JRq{LhuGSAG`)$ z1e$8dIfT3zS^F1F_cHaBPO*tZlIZk)_WPgcEd&%x}vJYwO|cc4W0!mc>_?%u~Lu1e#LxH9M@X; zCj~c}#wBr0!>=Q6lG!{_ZGRuAhZ(^C`Zr{GWg?z)mmI z@|~E!fc@ZW@Fn;P`~bcM)!-Yj8|(o;f}eoG_X6qPgBqZ4#r+QK0}59>r4cKRSZRI+ z3~0Icwvyj*4uFH;H=yIlAK*_A2(p)fAP89w!|F_NGjKF$3Yvh%K(_!|r42y?pcBwh zAQ9*!B%V$BM!|-DpgO1p;z?%J^thATredB7P6Mh_3|f#~LDU3i#Pu)lf*F&at^DwYDxke~lFLrxKRH$Q8j;z$BmvtqhbaL(Lq0w9#vGp8>RI#|jhQgg+df2VVSUQ7t2RO@COI1;`V)2f#Y1PL{Q=$K@M$Qrf?zDkQpth?|V*PQK4O3jjQy+N! zVYZaUrIp8$$0JvQ`+-*ZePAiL7c>LQfOK`igYW}jId}-H0MZ@?RY2(;v-~*x1km+U zy08|k0jsslp2kq1wt<&nHS{I09y|wB*Jt5%;CY}5ya>MlHh{H+$M*a;@L#j~M$50m zo51JbE$}9I1t{%iEi)OPf$iW!um!vg-Usi1cY(C`zz1L}*akiZAAwK64)7^ZUSES- zLjLXOpV+^EgWwPFJNO>lM0gFHsh4m6iqQl90#?L5;482TdL4pcT-?Pd6}Xff619UGZCk zD~aoy|ah>{#KXI>fCv4=8{ zAItDqYOloVAyq<|>G6Upt3p&EHQ?lsSwVV72N&G}b}>7yj5{_%?&BaGDGli9gkHF> z`K!*=5hFHA>P!`laVF?z0_VWxSs&VgM6SD>1!gL3l9UmKm_Q) zM{Fi$V=Mcf@R7x-+jIV+^~KjK{`=@f`Ta2ZgCQh76F$R2@Aj7+)5MB%7Ocbr!P#Ii z7zASJWDog^KNMe+QI&~}v$}Rqu!}#a=McdcI0Rt-wZfh1$;2u5 zdRq}E5-C<+O-x0I^{^7j*CIG_B>qqFR3Q~w^fv`-qUp(cDYz_To-dC(t~|C7R7PyU zsS&YG)~Y_T0kMWD-AeL1vVpPmTH)sq7MoehJJt@_v9_|>%WE^&7I0*5#(L}DHArEx z%#~?u`;jIn{O>wKy5DeidPSUT3zv9gCb3G~_&1f)mZJxZN5&r&$J7PCp#Kc^gPlM( z?=|3a@IKH~)4lGy+Ud7|x54Y+P4EWT1YQLjz$@To@Df-DRPbteHeH;By$bsYuo655 z9tBg;E8+XVyNcPn-2pEG1}p@(0~bh_FJ1yFz+FI@JpkVi z9t018{S4>;bz#HBcT2G-M~NN_+{&!oJY>$08_D1*lthqkj#QaV&u{ zQTNH0{SB<4h#gHnM2j6+VrgcRpYl+}z5ubZ6#gzKR}GI0_z`~}_}=ml@Luo@8C?yO z!CMq`HnY4x7z_r1f#58V1N8Na;`fDn19f{ZxDNOgTX`G;JVPz_o^3@4$Ob{6fIon~ zZ`5~;nc&E~U)?e5JIIzmcgx>{4D58EyWPX2)#I($opBfJ)4}iPdH`1!=z(1VXcKp` z{~HhAkx)@Y5 zbrh=&vj0R6kT!N#E-hAX#fi05+W%A9cYsBa1Z}fBgXs*QM0Zg*%m@hUqMQLSpJKpp z>X|TyGkfNQ>5ONVGK-w?OrV~4=A0GG0dqQY&H=x-rh8c6!2ACH<9X)ko$0r$tE#K3 zt801}&i%12a-w8;R94t`xXFQwlY1Pf&pJaqB7D!xr7yVyR=h5N zC+@lP-10eRyWeYcF=3v80CUZn=L{ti7F z&-rlW#pQ^LX)sML`C{5kPZx-v@x6)jx9I`8$uO55xL8tFKdYI|fk!p#nXsfR zXC`Q(ayBoEc!^OoZ>bWNql}S!y0S{Ta7q3~PXg zt|ac6CO?C4$lib;H)5&SHg!TeV@!g%pUK^>2R!2Qco%$Km;f{DFrGC!XpK&q$X1KTy_H`rJK{mw)Ue24K zWPKgjt9R;WtO;h483HpSw6~_r zNn2dZNCYlkVVM#3xXeUrl$CHX6SeTX6-s8NC9W2@m>FHw+!?D_zt=ltt?;n2J+TvI ze^`}>6D=|jRZfIH_Ip!e}U7#%W) ztd5k2@|mtCPDgh{Jtq(BCgTJCw){v3Cn`napHEbJWOF-?hfc@}#g903`^mJf&PGEk zi(eVPQq*FmavI+c@t>u1!uN=1mf~aoqdn#swOOe+*%vRh@djKd1K$Xp(uAbVyxUXsm@C)=S1(t5m zNC0pGy!UD)AFZ3MWHGsC#W(<5v&Yh^$-k&qZQwGLz~IL8fKzRb?rRIsg-YD*t4Rwmbqd@I0{er^$2{;$v>b;EF)zPn?t4#*S zY!n@Zba+uRtWun^XmXXKQz@St<2L}nPIu(}96{j59_QpS7dzjv5g1Nh;1@q@QI6SO z1stor_5eez@K;wHY`7=XlN8H0I8H5B=F$uG7=*IEq0Lk}H;7^Q#yEx1?{gqSQwqI- zVg>EtyA_m#!sMG5%LgRN>eSk4$b-u3VMwJgyn%2OlxMEe$%s?(5oZ-QQ?7gn8vtA} z;Yo)gZHmkkKFN;-UZu?$~C8-X2GS{uEHo_J_!9xwNaS50G9{2WwD*k{ARpYS@sJC2NKR& zxLe0bz{az|@4tWZw5*L#6l$E&G|6eyxqE-ydoF9h@>@E=wD+Qxd9Z$T>CrAQ=S`!b z1Wz^mRV2d#rFE0mZU|KX=z=mkN|&)g*_ISix*81up1z)#BX(g@4BuUUd35rLv=|M2 zB(}Z9_t!4nJJ<~ha@aOwY;Q*V0cLeRduDx z(TWpQUa92Irt6Cw&MMC2wODbrPlmI|p^d!!$exF~EmpqA55P=atQ@MK^V*?r+kRcT zwYPKdu25w_)>rXH!*(yhzyXxpZ5NMPK^rfA!k}CHf;69Vj%G$fcay#sUMqNAl`0O# z$y1GnpYa4E8yQ2xmOugPaf_je%snFBZA^(l-He7HKiDgjyN~<<2y3nB0W@oU$1EnFSABbePlAch7z5&8;r&|3i5AvLI&=wtS9Tww#`EG+nP z`}i@S!O@@&wi?gER5wO(3$g-%$rD+s^1RmZS@IZdh?=Njs<~XNK3KG_{~=pVtHQJZ zZB2cEV8*)qU4CWhEZy(f5MwAI29sruBp$PBc-N=d3ZJ$CR!icmt9NPHC#2{CTg@Kw z_yZcf2moueMBZW+!=&3wY=FlU4uH{Egu4BqxS3sw2qylC`t{|Kkhj}xz+y!x8VG9z zAXvol>YC229e)^TL)1qNix}uQ?5CSs8??36bfhQD#b8N%&)w-O^SRb|X9G+ouca8* zXe!6WMryni_T82KSgQEo`-lm6Xg|&mA*fgh$C0v3DTi;_g)GB(1!Cw}Z)NsO+8kBo zW&)-QJ2yP7ii2CE4@C(A5W}3bnxLLFsg>N))$lpdD`zh+g>9eC+8(~}kT9H|h zHI^Ce2JcxIJ-hn4T#MCBBX)^=S3sg?!1A(wVU$Z;_A@0_ES<8qEO1+J zM3K{;uRLD8|8Z|yO#urHU4a1%0s_7%a{Y)A_w#0dHphmjXQ5ai@O{=JE8q@B(--t* znhAVf;G4&0Yucg9m~KvnRsoO!ls_vA<;s;^1726$Olr*hE7kr|HUHRVkCEu?<{3M2l-J;=UQ9S^xcV!4Lo^IZXI+qlEODA?%79H z6%*n-eO(6~+@Ke6SOR0$D=G!9hv8?8w!s>hlB$WNzo+l336J)?Ic0N5_sAm_^ZN|| z92O0BzZYW3ZvI*GOPCYLQdAc;#plKr_b+QGC!1nz%vYVd#bSPY1L1(St8+~nHST5; ze~Ex4TdGrZtP+SXm_0!!vM^n#Dcp4rSO4-Kw!8^~=i)E~6rYh-TndgF#VPorXDwP9 z2NIg>&h~+rq?%xsZ%OS=lQ$^&t+m4h>-7edSZqDDJ{gR0Pi3)_MGd={+?AppnuauN zikd*-V!Bb%2E}3wszVMN6*pr@9f}TA-Hc&%=wu1ijaqDkzNgaS!m7KeP+g(atP7?e z_a1#OMv{ll)>A?u)!lHAyo#tU_7F^xGhC#A5~vUa@HO4uo~k=l-=yR>7OG3Rz0^R% zbMpBfi1oC76Eq?4IyZRAboE;*^%olIqyzKerzuG6#K>uYtW#CzdhQ*gxQxIp-=z}SExA(^K;{+eG8iQHzvNhg_!sS?~I*&;(=!~8=|zVsqp8Pb|(+j{J~Ze)`G5~t*J8*2y-Ko zHz&oO-}Llv8)6JOZUq-h$OnaK7jTG6Bfng_m&@?`^|?0O9cs;h&TWP6hCJ?cVtn35 z-}5}two-PhY35dCq^Vmwv9#yf{KMH+1?yITys+W`zcSd%_;151HU$7)t7@-3HL%%= zgQsnPrLv~|fMZdGDz{)Y%cfgt7@C?+1Hi6t>8d_UcW>%|@InVXq&NVKN_#rK4YS|e z9$Pj5Z`EHtBDkgJ9UCyHebjbDXW;-~`w-dqOQ)irnpIk710Yt{YO04%t?yW4dAO}+ z9M#zlCjJ0`Rq6X>O<>+CC-2z+yJ#c;*l)~7VSXoZ)uWmvZMm|B2VP2(uLC8533I6q zB9YL%tm~r_NiVQ9(-Cz$kh%jCq#N}<00Xbok-F_bgZdqXQ)?R1(|oJ=q~FjWz|Vq| zh+RZSiUtC|p|NDY;^e9207e1L{^YN)PJPQCXvmvJpm{etiwf?CB+DhhuI2MwT_${a zpaHOjKq7{`c0!V4R1SsdI&e-P^dT;)@Y~;NJ=SmmOz9Q%1i+lFld#+68u^ojalVn!xh#f2cC?kChAiV4Df9w7Jv@H5|_U{_L;nOK(=> z{T$bT-+uJnE_Cxd035UJ9yxo~`>n&X0f33bQ^~F~RoVs5=+>EX=2G2E5#ZPn$l}+Z zz5KPvqEik`DiG?o>rKBisq~uE00_3qN=-W1GhI!a?q&}uo|oanu0LzO6^hhiKd9Yd zHwGqO7ZETN+GGt2iC52nGo+80Ga%LgVT2-DF*1F}nvj9EA#|dMy^3m-%}g0~U51xH z!J8Oxcb&YvwPx6h#&L!OwVGKpWDlm0?D?CNG|8;p#7gt{;_&#mJEO!r){UP`s`)0Vd}IBN^mrezUrt}|W6ov!+*tFUFw zftMdh>(JKt^FTU$NGTzAoG5Y~#s*EuMKupArR8U%!yuY-SPA=vJUW-gEJN{Af4axh zpCTAZIHKG%+@iRn*jwEihE$fewau=51pC-AABDCDlGib)c@mZ5ViAQRCubiFVg90? z$CPT4Kq0-=UbueFiMb?yUv1a=GgBaZ8NWb;dzN}5=-L^G*m?xzJdRU9dKzaLg&ar5 zPb8x_*^}y{w+@Pr6gu5Mztn;Eqp}qS*+4klGI$wFdyXUbbQ=H%^jl^}*7$AadWWRl zVK%>_JSUWD*^>bX0-z7IJfXBUB-4%)uz0QTGPW8;ekYZxDIkrg3r#<%{FsUx`)Z@{ zPFBlJ8LN#ZhXlnFyPJRn=;bWcPQa827(??ClrYn}Ut84EmjZOq}Vo*|a8v2`X2h}EfHuX!o?V|}F$cstXZ{&FjYZIciQ_x{E z03B)13B`>@o>E5qdvNi@dK!azi$c#S1!&x9#a|A6E+lD@0f3=u#Pl#wsm&$ z;ziibVWyD#6at{v-Ota3+`-@y#!_G=&A1FMdeMQ)5d13TOX61!vqaPx5VExJ(9w?h zfwv&+#P)0}wMjzvcC#rq2{KKfFG-r(Lh@t7vWNn%;BFn&z5-6a&w>qY}F;#Rnk8+76dddWM7%vZr2@-bII>ASgN z)vxescid42YiCd@14@uD95w7<)TV)rPGtG>0BU4b`wv=pRq14!I!_36K6h}Byw0_M zWF{aFB8EBSbr*V%0e~}P1EP|R{-1;5m=~;?(9k+s@*YBMqv`*kI6^mXqPRdyuAz89 z+qn2bi|=45&pV%roA1|e1om#r}=NAEJkJyseN-34>PDq7Tjx2FM`u!dn zCoL9@L#*BG2Q2=LV?uPzo!_U{H(@%N10*3Sp-`l;*%JDE6THc;1&c_e$9+bEyzMPz z0TTQ?Ksp;S6rPN`b@a?0yYH<_1UC!JgQ9+Pd;GG1g#RniMl)+a20+a62y60yWLOrt39>fLDV2}XJeZ}U)Ypa0>FF2zwX{|dOLY_ zvWi)Ylr%iZehPSi?ygd86z2E9@&0sF?pG_X-a5V2hReH*A|GIz6tGO}4G$N(wsOnz zqr+{8dZ^(ox__gq!KacchuUg-(FqVYO#^^mW)F#3SZiRDOQ`_s$?y&I$iL-YEfjIh8a}9He*8imuTJp&0d{VvaYEBo!LxfcaDTa& z(*&?5)RbIJiyngisz7jjdFkPJ@}9BsgbmRgHN1&mwDwxJj}eWR*=qXIBj#%|0G!B*rkNk@ttls8Xzy`R88rEy~xC+K`) zoG_o~E8Z?Vyl?7R=u>WR=TImB_}3228Fvsk)^6gRX(gL^yS(9nDXXnRmuV^hK~E*X zr_#^Ch9h2wZ2;p2u@j##)=BLZd*9DiZN#=FmuEA!Cc#0t&xfy5hfM~yO?B?~ekLFPE0#nP* z+O0!PNz`}+Oq+1f*a*g}*IcHxAa2bTF91y&{CeWxu*5SqKxtXy9_zGr|AypIwi>~n z>EADiR&5ndcQg4vgZ7Tf+jzGFR}vGGMeYZ78;s?o-802v{YHoa_sxrL&p8QshK~;; z2SeyK;dW%QIPH=l7e&oTT=*5wef+>NhUepUkxMRkx6S%7-fyts)z|J^J4DT9hauVO zG#G;e0eX$+4qEUW`GL|v@Yo;uI&4?Hz^lkx>xh~=C=m#23m}|k{ph^i$J-FS zWsPU9(z6~GD~UXf-u5^0cmdVSmwhT+qecy?ys| zuDcPhrgcIuXfXgmS$7H}>b5(fg9m9jCzfACp~=u{=+2V zQ31o5@CN(wMqEdqnpb)MbmUW-yg|3BG0kz^>!U3YXip`}MeH1N=!n0kH0s z0I#qK@7w#uwXy*&qlSG(N#_~9n{uycXsdZeJJ8gebC+-(Z?c9{-7@Q+*#I&WG8WlI zIbUIjLV;wz`Qh)!miU%M5ccT;wAe+JfUph(q5u$&ju?~nN6;c0A__G{P;)%Vxm0NW z_Nm&6RaFKCChKlt)61tj>=|V@6bdemCv2O-=uDMy%T};``p2x+R=;nzb&=jiZ)Q{T zQ_I&_QPbCGA>Dks{u(3yCyjWE2q*6wxT~S$`v$T10Sb7F)E(?Pfei1oca~V`#Ai<} zTQYl}aA@O>H2v)DUH%munoN78Zjmt^?WqO7O^fcG?KxZÐ$fZ*ltJz+SQVd_C{q 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 E0}^pgp#T5? delta 62512 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 diff --git a/package.json b/package.json index 4b4d2a54..4ec51ca6 100644 --- a/package.json +++ b/package.json @@ -82,6 +82,7 @@ "react-simple-toasts": "^6.1.0", "react-toastify": "^11.0.5", "react-transition-group": "^4.4.5", + "react-zoom-pan-pinch": "^3.7.0", "readdirp": "^4.1.1", "recharts": "^2.15.3", "sharp": "^0.34.3", diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9c87ba27..a52a0cb1 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -1606,7 +1606,7 @@ model Pembiayaan { ApbDesa ApbDesa[] @relation("ApbDesaPembiayaan") } -// ========================================= INOVASI ========================================= // +// ========================================= MENU INOVASI ========================================= // // ========================================= DESA DIGITAL / SMART VILLAGE ========================================= // model DesaDigital { id String @id @default(cuid()) diff --git a/src/app/admin/(dashboard)/_state/desa/berita.ts b/src/app/admin/(dashboard)/_state/desa/berita.ts index 2105e58f..0a7dc17e 100644 --- a/src/app/admin/(dashboard)/_state/desa/berita.ts +++ b/src/app/admin/(dashboard)/_state/desa/berita.ts @@ -75,17 +75,18 @@ const berita = proxy({ loading: false, search: "", load: async (page = 1, limit = 10, search = "", kategori = "") => { - berita.findMany.loading = true; // ✅ Akses langsung via nama path + const startTime = Date.now(); + berita.findMany.loading = true; berita.findMany.page = page; berita.findMany.search = search; - + try { const query: any = { page, limit }; if (search) query.search = search; if (kategori) query.kategori = kategori; - + const res = await ApiFetch.api.desa.berita["find-many"].get({ query }); - + if (res.status === 200 && res.data?.success) { berita.findMany.data = res.data.data ?? []; berita.findMany.totalPages = res.data.totalPages ?? 1; @@ -98,9 +99,16 @@ const berita = proxy({ berita.findMany.data = []; berita.findMany.totalPages = 1; } finally { - berita.findMany.loading = false; + // pastikan minimal 300ms sebelum loading = false (biar UX smooth) + const elapsed = Date.now() - startTime; + const minDelay = 300; + const delay = elapsed < minDelay ? minDelay - elapsed : 0; + + setTimeout(() => { + berita.findMany.loading = false; + }, delay); } - }, + }, }, findUnique: { diff --git a/src/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital.ts b/src/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital.ts index 341bbe79..69234af2 100644 --- a/src/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital.ts +++ b/src/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital.ts @@ -55,81 +55,95 @@ const dataPerpustakaan = proxy({ }, }, findMany: { - data: null as - | Prisma.DataPerpustakaanGetPayload<{ - include: { - image: true; - kategori: true; - }; - }>[] - | null, - page: 1, - totalPages: 1, - loading: false, - search: "", - load: async (page = 1, limit = 10, search = "", kategori = "") => { - dataPerpustakaan.findMany.loading = true; // ✅ Akses langsung via nama path - dataPerpustakaan.findMany.page = page; - dataPerpustakaan.findMany.search = search; - - try { - const query: any = { page, limit }; - if (search) query.search = search; - if (kategori) query.kategori = kategori; - - const res = await ApiFetch.api.pendidikan.perpustakaandigital.dataperpustakaan["findMany"].get({ query }); - - if (res.status === 200 && res.data?.success) { - dataPerpustakaan.findMany.data = res.data.data ?? []; - dataPerpustakaan.findMany.totalPages = res.data.totalPages ?? 1; - } else { - dataPerpustakaan.findMany.data = []; - dataPerpustakaan.findMany.totalPages = 1; - } - } catch (err) { - console.error("Gagal fetch data perpustakaan paginated:", err); + data: null as + | Prisma.DataPerpustakaanGetPayload<{ + include: { + image: true; + kategori: true; + }; + }>[] + | null, + page: 1, + totalPages: 1, + loading: false, + search: "", + load: async (page = 1, limit = 10, search = "", kategori = "") => { + const startTime = Date.now(); + dataPerpustakaan.findMany.loading = true; // ✅ Akses langsung via nama path + dataPerpustakaan.findMany.page = page; + dataPerpustakaan.findMany.search = search; + + try { + const query: any = { page, limit }; + if (search) query.search = search; + if (kategori) query.kategori = kategori; + + const res = + await ApiFetch.api.pendidikan.perpustakaandigital.dataperpustakaan[ + "findMany" + ].get({ query }); + + if (res.status === 200 && res.data?.success) { + dataPerpustakaan.findMany.data = res.data.data ?? []; + dataPerpustakaan.findMany.totalPages = res.data.totalPages ?? 1; + } else { dataPerpustakaan.findMany.data = []; dataPerpustakaan.findMany.totalPages = 1; - } finally { + } + } catch (err) { + console.error("Gagal fetch data perpustakaan paginated:", err); + dataPerpustakaan.findMany.data = []; + dataPerpustakaan.findMany.totalPages = 1; + } finally { + // pastikan minimal 300ms sebelum loading = false (biar UX smooth) + const elapsed = Date.now() - startTime; + const minDelay = 300; + const delay = elapsed < minDelay ? minDelay - elapsed : 0; + + setTimeout(() => { dataPerpustakaan.findMany.loading = false; - } - }, + }, delay); + } }, - findManyAll: { - data: null as - | Prisma.DataPerpustakaanGetPayload<{ - include: { - image: true; - kategori: true; - }; - }>[] - | null, - loading: false, - search: "", - load: async (search = "", kategori = "") => { - dataPerpustakaan.findMany.loading = true; // ✅ Akses langsung via nama path - dataPerpustakaan.findMany.search = search; - - try { - const query: any = {}; - if (search) query.search = search; - if (kategori) query.kategori = kategori; - - const res = await ApiFetch.api.pendidikan.perpustakaandigital.dataperpustakaan["findManyAll"].get({ query }); - - if (res.status === 200 && res.data?.success) { - dataPerpustakaan.findManyAll.data = res.data.data ?? []; - } else { - dataPerpustakaan.findManyAll.data = []; - } - } catch (err) { - console.error("Gagal fetch data perpustakaan paginated:", err); + }, + findManyAll: { + data: null as + | Prisma.DataPerpustakaanGetPayload<{ + include: { + image: true; + kategori: true; + }; + }>[] + | null, + loading: false, + search: "", + load: async (search = "", kategori = "") => { + dataPerpustakaan.findMany.loading = true; // ✅ Akses langsung via nama path + dataPerpustakaan.findMany.search = search; + + try { + const query: any = {}; + if (search) query.search = search; + if (kategori) query.kategori = kategori; + + const res = + await ApiFetch.api.pendidikan.perpustakaandigital.dataperpustakaan[ + "findManyAll" + ].get({ query }); + + if (res.status === 200 && res.data?.success) { + dataPerpustakaan.findManyAll.data = res.data.data ?? []; + } else { dataPerpustakaan.findManyAll.data = []; - } finally { - dataPerpustakaan.findManyAll.loading = false; } - }, + } catch (err) { + console.error("Gagal fetch data perpustakaan paginated:", err); + dataPerpustakaan.findManyAll.data = []; + } finally { + dataPerpustakaan.findManyAll.loading = false; + } }, + }, findUnique: { data: null as Prisma.DataPerpustakaanGetPayload<{ include: { @@ -356,17 +370,20 @@ const kategoriBuku = proxy({ totalPages: 1, loading: false, search: "", - load: async (page = 1, limit = 10, search = "") => { + load: async (page = 1, limit = 10, search = "") => { kategoriBuku.findMany.loading = true; // ✅ Akses langsung via nama path kategoriBuku.findMany.page = page; kategoriBuku.findMany.search = search; - + try { const query: any = { page, limit }; if (search) query.search = search; - - const res = await ApiFetch.api.pendidikan.perpustakaandigital.kategoribuku["findMany"].get({ query }); - + + const res = + await ApiFetch.api.pendidikan.perpustakaandigital.kategoribuku[ + "findMany" + ].get({ query }); + if (res.status === 200 && res.data?.success) { kategoriBuku.findMany.data = res.data.data ?? []; kategoriBuku.findMany.totalPages = res.data.totalPages ?? 1; @@ -557,7 +574,7 @@ const templatePeminjamanBuku = z.object({ tanggalPinjam: z.string().min(1, "Tanggal Pinjam harus diisi"), batasKembali: z.string().min(1, "Batas Kembali harus diisi"), tanggalKembali: z.string().min(1, "Tanggal Kembali harus diisi"), - catatan: z.string().min(1, "Catatan harus diisi") + catatan: z.string().min(1, "Catatan harus diisi"), }); const defaultPeminjamanBuku = { @@ -568,7 +585,7 @@ const defaultPeminjamanBuku = { tanggalPinjam: "", batasKembali: "", tanggalKembali: "", - catatan: "" + catatan: "", }; interface FormEditData { @@ -584,7 +601,7 @@ interface FormEditData { batasKembali: string; tanggalKembali: string; catatan: string; - status: 'Dipinjam' | 'Dikembalikan' | 'Terlambat' | 'Dibatalkan'; + status: "Dipinjam" | "Dikembalikan" | "Terlambat" | "Dibatalkan"; } const editForm: FormEditData = { @@ -596,8 +613,8 @@ const editForm: FormEditData = { batasKembali: "", tanggalKembali: "", catatan: "", - status: "Dipinjam" -} + status: "Dipinjam", +}; const peminjamanBuku = proxy({ create: { @@ -646,13 +663,16 @@ const peminjamanBuku = proxy({ peminjamanBuku.findMany.loading = true; // ✅ Akses langsung via nama path peminjamanBuku.findMany.page = page; peminjamanBuku.findMany.search = search; - + try { const query: any = { page, limit }; if (search) query.search = search; - - const res = await ApiFetch.api.pendidikan.perpustakaandigital.peminjamanbuku["findMany"].get({ query }); - + + const res = + await ApiFetch.api.pendidikan.perpustakaandigital.peminjamanbuku[ + "findMany" + ].get({ query }); + if (res.status === 200 && res.data?.success) { peminjamanBuku.findMany.data = res.data.data ?? []; peminjamanBuku.findMany.totalPages = res.data.totalPages ?? 1; @@ -720,7 +740,9 @@ const peminjamanBuku = proxy({ ); await peminjamanBuku.findMany.load(); // refresh list } else { - toast.error(result?.message || "Gagal menghapus Data Peminjaman Buku"); + toast.error( + result?.message || "Gagal menghapus Data Peminjaman Buku" + ); } } catch (error) { console.error("Gagal delete:", error); @@ -768,7 +790,7 @@ const peminjamanBuku = proxy({ batasKembali: data.batasKembali, tanggalKembali: data.tanggalKembali, catatan: data.catatan, - status: data.status + status: data.status, }; return data; // Return the loaded data } else { @@ -811,7 +833,7 @@ const peminjamanBuku = proxy({ batasKembali: this.form.batasKembali, tanggalKembali: this.form.tanggalKembali, catatan: this.form.catatan, - status: this.form.status + status: this.form.status, }), } ); @@ -830,7 +852,9 @@ const peminjamanBuku = proxy({ await peminjamanBuku.findMany.load(); // refresh list return true; } else { - throw new Error(result.message || "Gagal update data peminjaman buku"); + throw new Error( + result.message || "Gagal update data peminjaman buku" + ); } } catch (error) { console.error("Error updating data peminjaman buku:", error); @@ -849,7 +873,7 @@ const peminjamanBuku = proxy({ peminjamanBuku.update.form = { ...editForm }; }, }, -}) +}); const perpustakaanDigitalState = proxy({ dataPerpustakaan, diff --git a/src/app/api/[[...slugs]]/_lib/search/findMany.ts b/src/app/api/[[...slugs]]/_lib/search/findMany.ts index 23bbbe9b..2a782fd6 100644 --- a/src/app/api/[[...slugs]]/_lib/search/findMany.ts +++ b/src/app/api/[[...slugs]]/_lib/search/findMany.ts @@ -701,6 +701,457 @@ export default async function searchFindMany(context: Context) { return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; } + // ========================================= MENU INOVASI ========================================= // +// ========================================= DESA DIGITAL / SMART VILLAGE ========================================= // + + if (type === "desaDigital") { + const data = await prisma.desaDigital.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= PROGRAM KREATIF ========================================= // + + if (type === "programKreatif") { + const data = await prisma.programKreatif.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { slug: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= KOLABORASI INOVASI ========================================= // + + if (type === "kolaborasiInovasi") { + const data = await prisma.kolaborasiInovasi.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { slug: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } }, + { kolaborator: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "mitraKolaborasi") { + const data = await prisma.mitraKolaborasi.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= INFO TEKHNOLOGI TEPAT GUNA ========================================= // + + if (type === "infoTekno") { + const data = await prisma.infoTekno.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= LINGKUNGAN ========================================= // +// ========================================= PENGELOLAAN SAMPAH ========================================= // + + if (type === "pengelolaanSampah") { + const data = await prisma.pengelolaanSampah.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "keteranganBankSampahTerdekat") { + const data = await prisma.keteranganBankSampahTerdekat.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { alamat: { contains: query, mode: "insensitive" } }, + { namaTempatMaps: { contains: query, mode: "insensitive" } }, + { linkPetunjukArah: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= PORGRAM PENGHIJAUAN ========================================= // + + if (type === "programPenghijauan") { + const data = await prisma.programPenghijauan.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= DATA LINGKUNGAN DESA ========================================= // + + if (type === "dataLingkunganDesa") { + const data = await prisma.dataLingkunganDesa.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= GOTONG ROYONG ========================================= // + + if (type === "gotongRoyong") { + const data = await prisma.kegiatanDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsiSingkat: { contains: query, mode: "insensitive" } }, + { deskripsiLengkap: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= EDUKASI LINGKUNGAN ========================================= // + + if (type === "tujuanEdukasiLingkungan") { + const data = await prisma.tujuanEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "materiEdukasiLingkungan") { + const data = await prisma.materiEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "contohEdukasiLingkungan") { + const data = await prisma.contohEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= KONSERVASI ADAT BALI ========================================= // + + if (type === "filosofiTriHita") { + const data = await prisma.filosofiTriHita.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "bentukKonservasiBerdasarkanAdat") { + const data = await prisma.bentukKonservasiBerdasarkanAdat.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "nilaiKonservasiAdat") { + const data = await prisma.nilaiKonservasiAdat.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= MENU PENDIDIKAN ========================================= // +// ========================================= INFO SEKOLAH & PAUD ========================================= // + + if (type === "jenjangPendidikan") { + const data = await prisma.jenjangPendidikan.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "lembaga") { + const data = await prisma.lembaga.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "siswa") { + const data = await prisma.siswa.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "pengajar") { + const data = await prisma.pengajar.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= BEASISWA DESA ========================================= // + if (type === "keunggulanProgram") { + const data = await prisma.keunggulanProgram.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= PROGRAM PENDIDIKAN ANAK ========================================= // + if (type === "tujuanProgram") { + const data = await prisma.tujuanProgram.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "programUnggulan") { + const data = await prisma.programUnggulan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "lokasiJadwalBimbinganBelajarDesa") { + const data = await prisma.lokasiJadwalBimbinganBelajarDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "fasilitasBimbinganBelajarDesa") { + const data = await prisma.fasilitasBimbinganBelajarDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= PENDIDIKAN NON FORMAL ========================================= // + if (type === "tujuanPendidikanNonFormal") { + const data = await prisma.tujuanPendidikanNonFormal.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "tempatKegiatan") { + const data = await prisma.tempatKegiatan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + if (type === "jenisProgramYangDiselenggarakan") { + const data = await prisma.jenisProgramYangDiselenggarakan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= PERPUSTAKAAN ========================================= // + if (type === "dataPerpustakaan") { + const data = await prisma.dataPerpustakaan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + + // ========================================= DATA PENDIDIKAN ========================================= // + if (type === "dataPendidikan") { + const data = await prisma.dataPendidikan.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { jumlah: { contains: query, mode: "insensitive" } } + ], + }, + skip, + take: limitNum, + }); + return { data, nextPage: data.length < limitNum ? null : pageNum + 1 }; + } + // 🌍 GLOBAL SEARCH — cari di beberapa modul sekaligus const [ pejabatdesa, @@ -760,6 +1211,37 @@ export default async function searchFindMany(context: Context) { programKemiskinan, sektorUnggulanDesa, demografiPekerjaan, + desaDigital, + programKreatif, + kolaborasiInovasi, + mitraKolaborasi, + infoTekno, + pengelolaanSampah, + keteranganBankSampahTerdekat, + programPenghijauan, + dataLingkunganDesa, + gotongRoyong, + tujuanEdukasiLingkungan, + materiEdukasiLingkungan, + contohEdukasiLingkungan, + filosofiTriHita, + bentukKonservasiBerdasarkanAdat, + nilaiKonservasiAdat, + jenjangPendidikan, + lembaga, + siswa, + pengajar, + keunggulanProgram, + tujuanProgram, + programUnggulan, + lokasiJadwalBimbinganBelajarDesa, + fasilitasBimbinganBelajarDesa, + tujuanPendidikanNonFormal, + tempatKegiatan, + jenisProgramYangDiselenggarakan, + dataPerpustakaan, + dataPendidikan + ] = await Promise.all([ prisma.pejabatDesa.findMany({ where: { name: { contains: query, mode: "insensitive" } }, @@ -1097,6 +1579,277 @@ export default async function searchFindMany(context: Context) { pekerjaan: { contains: query, mode: "insensitive" } }, take: limitNum, + }), + prisma.desaDigital.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.programKreatif.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { slug: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.kolaborasiInovasi.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { slug: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } }, + { kolaborator: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.mitraKolaborasi.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.infoTekno.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.pengelolaanSampah.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.keteranganBankSampahTerdekat.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { alamat: { contains: query, mode: "insensitive" } }, + { namaTempatMaps: { contains: query, mode: "insensitive" } }, + { linkPetunjukArah: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.programPenghijauan.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.dataLingkunganDesa.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.kegiatanDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsiSingkat: { contains: query, mode: "insensitive" } }, + { deskripsiLengkap: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.tujuanEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.materiEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.contohEdukasiLingkungan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.filosofiTriHita.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.bentukKonservasiBerdasarkanAdat.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.nilaiKonservasiAdat.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.jenjangPendidikan.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.lembaga.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.siswa.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.pengajar.findMany({ + where: { + OR: [ + { nama: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.keunggulanProgram.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.tujuanProgram.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.programUnggulan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.lokasiJadwalBimbinganBelajarDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.fasilitasBimbinganBelajarDesa.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.tujuanPendidikanNonFormal.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.tempatKegiatan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.jenisProgramYangDiselenggarakan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.dataPerpustakaan.findMany({ + where: { + OR: [ + { judul: { contains: query, mode: "insensitive" } }, + { deskripsi: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, + }), + prisma.dataPendidikan.findMany({ + where: { + OR: [ + { name: { contains: query, mode: "insensitive" } }, + { jumlah: { contains: query, mode: "insensitive" } } + ], + }, + take: limitNum, }) ]); @@ -1180,6 +1933,36 @@ export default async function searchFindMany(context: Context) { ...programKemiskinan.map((b) => ({ type: "programKemiskinan", ...b })), ...sektorUnggulanDesa.map((b) => ({ type: "sektorUnggulanDesa", ...b })), ...demografiPekerjaan.map((b) => ({ type: "demografiPekerjaan", ...b })), + ...desaDigital.map((b) => ({ type: "desaDigital", ...b })), + ...programKreatif.map((b) => ({ type: "programKreatif", ...b })), + ...kolaborasiInovasi.map((b) => ({ type: "kolaborasiInovasi", ...b })), + ...mitraKolaborasi.map((b) => ({ type: "mitraKolaborasi", ...b })), + ...infoTekno.map((b) => ({ type: "infoTekno", ...b })), + ...pengelolaanSampah.map((b) => ({ type: "pengelolaanSampah", ...b })), + ...keteranganBankSampahTerdekat.map((b) => ({ type: "keteranganBankSampahTerdekat", ...b })), + ...programPenghijauan.map((b) => ({ type: "programPenghijauan", ...b })), + ...dataLingkunganDesa.map((b) => ({ type: "dataLingkunganDesa", ...b })), + ...gotongRoyong.map((b) => ({ type: "gotongRoyong", ...b })), + ...tujuanEdukasiLingkungan.map((b) => ({ type: "tujuanEdukasiLingkungan", ...b })), + ...materiEdukasiLingkungan.map((b) => ({ type: "materiEdukasiLingkungan", ...b })), + ...contohEdukasiLingkungan.map((b) => ({ type: "contohEdukasiLingkungan", ...b })), + ...filosofiTriHita.map((b) => ({ type: "filosofiTriHita", ...b })), + ...bentukKonservasiBerdasarkanAdat.map((b) => ({ type: "bentukKonservasiBerdasarkanAdat", ...b })), + ...nilaiKonservasiAdat.map((b) => ({ type: "nilaiKonservasiAdat", ...b })), + ...jenjangPendidikan.map((b) => ({ type: "jenjangPendidikan", ...b })), + ...lembaga.map((b) => ({ type: "lembaga", ...b })), + ...siswa.map((b) => ({ type: "siswa", ...b })), + ...pengajar.map((b) => ({ type: "pengajar", ...b })), + ...keunggulanProgram.map((b) => ({ type: "keunggulanProgram", ...b })), + ...tujuanProgram.map((b) => ({ type: "tujuanProgram", ...b })), + ...programUnggulan.map((b) => ({ type: "programUnggulan", ...b })), + ...tujuanPendidikanNonFormal.map((b) => ({ type: "tujuanPendidikanNonFormal", ...b })), + ...fasilitasBimbinganBelajarDesa.map((b) => ({ type: "fasilitasBimbinganBelajarDesa", ...b })), + ...lokasiJadwalBimbinganBelajarDesa.map((b) => ({ type: "lokasiJadwalBimbinganBelajarDesa", ...b })), + ...tempatKegiatan.map((b) => ({ type: "tempatKegiatan", ...b })), + ...jenisProgramYangDiselenggarakan.map((b) => ({ type: "jenisProgramYangDiselenggarakan", ...b })), + ...dataPerpustakaan.map((b) => ({ type: "dataPerpustakaan", ...b })), + ...dataPendidikan.map((b) => ({ type: "dataPendidikan", ...b })), ], nextPage: null, // bisa dibuat lebih kompleks kalau perlu diff --git a/src/app/darmasaba/(pages)/ekonomi/sektor-unggulan-desa/page.tsx b/src/app/darmasaba/(pages)/ekonomi/sektor-unggulan-desa/page.tsx index 593adfda..8bb7ecc4 100644 --- a/src/app/darmasaba/(pages)/ekonomi/sektor-unggulan-desa/page.tsx +++ b/src/app/darmasaba/(pages)/ekonomi/sektor-unggulan-desa/page.tsx @@ -28,6 +28,32 @@ function Page() { ) } + // Add this check before the return statement +if (data.length === 0) { + return ( + + + + + Sektor Unggulan Desa Darmasaba + + + Data sektor unggulan belum tersedia + + + + ); +} + +const chartData = data + .filter(item => item?.name && typeof item.value === 'number') + .map((item) => ({ + id: item.id, + sektor: item.name, + Ton: item.value, + })); + + return ( @@ -54,11 +80,7 @@ function Page() { ({ - id: item.id, - sektor: item.name, - Ton: item.value, - }))} + data={chartData} dataKey="sektor" series={[ { name: 'Ton', color: colors['blue-button'] }, diff --git a/src/app/darmasaba/(pages)/keamanan/pencegahan-kriminalitas/page.tsx b/src/app/darmasaba/(pages)/keamanan/pencegahan-kriminalitas/page.tsx index 3492cf0f..50c01e02 100644 --- a/src/app/darmasaba/(pages)/keamanan/pencegahan-kriminalitas/page.tsx +++ b/src/app/darmasaba/(pages)/keamanan/pencegahan-kriminalitas/page.tsx @@ -41,6 +41,37 @@ function Page() { ) } + if (data.length === 0) { + return ( + + + + Pencegahan Kriminalitas + + + Keamanan Komunitas & Pencegahan Kriminal + + + + + + Program Keamanan Berjalan + + + + Tidak ada data pencegahan kriminalitas yang cocok + + + + + + ) + } + return ( diff --git a/src/app/darmasaba/(pages)/kesehatan/data-kesehatan-warga/page.tsx b/src/app/darmasaba/(pages)/kesehatan/data-kesehatan-warga/page.tsx index 3a25f243..7000f374 100644 --- a/src/app/darmasaba/(pages)/kesehatan/data-kesehatan-warga/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/data-kesehatan-warga/page.tsx @@ -141,7 +141,7 @@ function Page() { Angka Kematian - + diff --git a/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx b/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx index 24238344..b07c1ea5 100644 --- a/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx @@ -101,27 +101,42 @@ function Page() { }} > - {v.name} + + {v.name} (e.currentTarget.style.transform = 'scale(1.05)')} + onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')} + /> + + {v.name} - diff --git a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx index 4ce81235..af52ebd8 100644 --- a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx @@ -2,7 +2,6 @@ import penangananDarurat from '@/app/admin/(dashboard)/_state/kesehatan/penanganan-darurat/penangananDarurat' import colors from '@/con/colors' import { - Badge, Box, Center, Grid, @@ -106,15 +105,30 @@ function Page() { >

- {v.name} + + {v.name} (e.currentTarget.style.transform = 'scale(1.05)')} + onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')} + /> + +
- - Darurat - ))} @@ -160,7 +171,7 @@ function Page() { '&:hover': { backgroundColor: colors['blue-button'], color: 'white' }, }, }} - + /> diff --git a/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx b/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx index a1bf2d8c..189ab309 100644 --- a/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx @@ -7,16 +7,18 @@ import { IconCalendar, IconInfoCircle, IconPhone, IconSearch } from "@tabler/ico import { useState } from "react"; import { useProxy } from "valtio/utils"; import BackButton from "../../desa/layanan/_com/BackButto"; +import { useDebouncedValue } from "@mantine/hooks"; export default function Page() { const state = useProxy(posyandustate); const [search, setSearch] = useState(""); + const [debouncedSearch] = useDebouncedValue(search, 500); // 500ms delay const { data, page, totalPages, loading, load } = state.findMany; useShallowEffect(() => { - load(page, 6, search); - }, [page, search]); + load(page, 6, debouncedSearch); + }, [page, debouncedSearch]); if (loading || !data) { return ( diff --git a/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/page.tsx b/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/page.tsx index a9fefc45..d4b6ee5f 100644 --- a/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/page.tsx +++ b/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/page.tsx @@ -78,9 +78,7 @@ function Page() { - - {materi.data?.judul} - + diff --git a/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx b/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx index 4b9c52b2..123f88df 100644 --- a/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx @@ -1,6 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' + import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID' import colors from '@/con/colors' import { @@ -15,17 +16,27 @@ import { Paper, Stack, Text, + TextInput, Title, Tooltip, Transition, } from '@mantine/core' -import { IconRefresh, IconSearch, IconUsers } from '@tabler/icons-react' +import { + IconRefresh, + IconSearch, + IconUsers, + IconZoomIn, + IconZoomOut, + IconArrowsMaximize, + IconArrowsMinimize, +} from '@tabler/icons-react' import { OrganizationChart } from 'primereact/organizationchart' -import { useEffect } from 'react' +import { useEffect, useRef, useState } from 'react' import { useProxy } from 'valtio/utils' import BackButton from '../../desa/layanan/_com/BackButto' import { useTransitionRouter } from 'next-view-transitions' import ScrollToTopButton from '@/app/darmasaba/_com/scrollToTopButton' +import { debounce } from 'lodash' export default function Page() { return ( @@ -47,7 +58,6 @@ export default function Page() { ta="center" c={colors['blue-button']} fz={{ base: 28, md: 36, lg: 44 }} - > Struktur Organisasi PPID @@ -61,8 +71,8 @@ export default function Page() { - {/* Tombol Scroll ke Atas */} - + {/* Tombol Scroll ke Atas */} + ) } @@ -70,14 +80,24 @@ export default function Page() { function StrukturOrganisasiPPID() { const stateOrganisasi: any = useProxy(stateStrukturPPID.pegawai) const router = useTransitionRouter() + const chartContainerRef = useRef(null) + const [scale, setScale] = useState(1) + const [isFullscreen, setFullscreen] = useState(false) + const [searchQuery, setSearchQuery] = useState('') + + // debounce untuk pencarian + const debouncedSearch = useRef( + debounce((value: string) => { + setSearchQuery(value) + }, 400) + ).current useEffect(() => { void stateOrganisasi.findMany.load() }, []) const isLoading = - !stateOrganisasi.findMany.data && - stateOrganisasi.findMany.loading !== false + !stateOrganisasi.findMany.data && stateOrganisasi.findMany.loading !== false if (isLoading) { return ( @@ -93,10 +113,7 @@ function StrukturOrganisasiPPID() { ) } - if ( - !stateOrganisasi.findMany.data || - stateOrganisasi.findMany.data.length === 0 - ) { + if (!stateOrganisasi.findMany.data || stateOrganisasi.findMany.data.length === 0) { return (
@@ -117,8 +134,7 @@ function StrukturOrganisasiPPID() { Data pegawai belum tersedia - Belum ada data pegawai yang tercatat untuk PPID. Silakan coba - muat ulang atau periksa sumber data. + Belum ada data pegawai yang tercatat untuk PPID. - @@ -145,44 +152,39 @@ function StrukturOrganisasiPPID() { ) } + // Buat struktur organisasi const posisiMap = new Map() - - const aktifPegawai = stateOrganisasi.findMany.data.filter((p: any) => p.isActive); + const aktifPegawai = stateOrganisasi.findMany.data.filter((p: any) => p.isActive) for (const pegawai of aktifPegawai) { - const posisiId = pegawai.posisi.id; + const posisiId = pegawai.posisi.id if (!posisiMap.has(posisiId)) { posisiMap.set(posisiId, { ...pegawai.posisi, pegawaiList: [], children: [], - }); + }) } - posisiMap.get(posisiId)!.pegawaiList.push(pegawai); + posisiMap.get(posisiId)!.pegawaiList.push(pegawai) } const root: any[] = [] posisiMap.forEach((posisi) => { if (posisi.parentId) { const parent = posisiMap.get(posisi.parentId) - if (parent) { - parent.children.push(posisi) - } else { - root.push(posisi) - } - } else { - root.push(posisi) - } + if (parent) parent.children.push(posisi) + else root.push(posisi) + } else root.push(posisi) }) function toOrgChartFormat(node: any): any { - const pegawai = node.pegawaiList?.[0]; + const pegawai = node.pegawaiList?.[0] return { expanded: true, type: 'person', styleClass: 'p-person', data: { - id: pegawai?.id || null, // tambahin ini bro + id: pegawai?.id || null, name: pegawai?.namaLengkap || 'Belum ditugaskan', title: node.nama || 'Tanpa jabatan', image: pegawai?.image?.link || '/img/default.png', @@ -190,28 +192,90 @@ function StrukturOrganisasiPPID() { positionId: node.id || null, }, children: node.children?.map(toOrgChartFormat) || [], - }; + } } - const chartData = root.map(toOrgChartFormat) + let chartData = root.map(toOrgChartFormat) + + // 🔍 filter by search + if (searchQuery) { + const filterNodes = (nodes: any[]): any[] => + nodes + .map((n) => ({ + ...n, + children: filterNodes(n.children || []), + })) + .filter( + (n) => + n.data.name.toLowerCase().includes(searchQuery.toLowerCase()) || + n.data.title.toLowerCase().includes(searchQuery.toLowerCase()) || + n.children.length > 0 + ) + chartData = filterNodes(chartData) + } + + // 🧭 fungsi fullscreen + const toggleFullscreen = () => { + if (!document.fullscreenElement) { + chartContainerRef.current?.requestFullscreen() + setFullscreen(true) + } else { + document.exitFullscreen() + setFullscreen(false) + } + } + + // 🧭 fungsi zoom + const handleZoomIn = () => setScale((prev) => Math.min(prev + 0.1, 2)) + const handleZoomOut = () => setScale((prev) => Math.max(prev - 0.1, 0.5)) + const resetZoom = () => setScale(1) return ( - - + {/* 🔍 Search + Zoom + Fullscreen controls */} + + } + onChange={(e) => debouncedSearch(e.target.value)} + /> + + + + + + + {/* Chart Container */} + nodeTemplate(node, router)} /> - - + + ) } @@ -221,7 +285,6 @@ function nodeTemplate(node: any, router: ReturnType) const title = node?.data?.title || 'Tanpa Jabatan' const description = node?.data?.description || '' - return ( {(styles) => ( @@ -244,15 +307,15 @@ function nodeTemplate(node: any, router: ReturnType) src={imageSrc} alt={name} radius="md" - width={120} - height={120} + width={60} + height={60} fit="cover" style={{ objectFit: 'cover', border: '2px solid rgba(255,255,255,0.2)', marginBottom: 12, }} - loading='lazy' + loading="lazy" /> {name} diff --git a/src/app/darmasaba/_com/Navbar.tsx b/src/app/darmasaba/_com/Navbar.tsx index 95c14d56..698b210d 100644 --- a/src/app/darmasaba/_com/Navbar.tsx +++ b/src/app/darmasaba/_com/Navbar.tsx @@ -86,10 +86,15 @@ function NavbarMobile({ listNavbar }: { listNavbar: MenuItem[] }) { align="center" p="xs" onClick={() => { - router.push(item.href); - stateNav.mobileOpen = false; + if (item.href) { + router.push(item.href); + stateNav.mobileOpen = false; + } + }} + style={{ + cursor: item.href ? "pointer" : "default", + opacity: item.href ? 1 : 0.8 }} - style={{ cursor: "pointer" }} > {item.name} diff --git a/src/app/darmasaba/_com/NavbarMainMenu.tsx b/src/app/darmasaba/_com/NavbarMainMenu.tsx index 4882b6a0..2838f93d 100644 --- a/src/app/darmasaba/_com/NavbarMainMenu.tsx +++ b/src/app/darmasaba/_com/NavbarMainMenu.tsx @@ -2,15 +2,14 @@ import colors from "@/con/colors" import stateNav from "@/state/state-nav" -import { ActionIcon, Button, Container, Flex, Image, Stack, Tooltip } from "@mantine/core" -import { useHover } from "@mantine/hooks" +import { ActionIcon, Button, Container, Flex, Image, Menu, MenuTarget, Stack, Tooltip } from "@mantine/core" import { IconSearch, IconUser } from "@tabler/icons-react" import { useTransitionRouter } from 'next-view-transitions' +import { usePathname, useRouter } from "next/navigation" import { useSnapshot } from "valtio" import { MenuItem } from "../../../../types/menu-item" import { NavbarSearch } from "./NavBarSearch" import { NavbarSubMenu } from "./NavbarSubMenu" -import { useRouter } from "next/navigation" // contoh state auth (dummy aja dulu, bisa diganti sesuai sistem auth kamu) const stateAuth = { @@ -21,6 +20,7 @@ export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { const { item, isSearch } = useSnapshot(stateNav) const router = useTransitionRouter() const next = useRouter() + const pathname = usePathname(); return ( @@ -47,7 +47,12 @@ export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { {listNavbar.map((item, k) => ( - + child.href === pathname))} + /> ))} @@ -88,27 +93,45 @@ export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { ) } -function MenuItemCom({ item }: { item: MenuItem }) { - const { ref, hovered } = useHover() +function MenuItemCom({ item, isActive = false }: { item: MenuItem, isActive?: boolean }) { const router = useTransitionRouter() return ( - + + + + ) } diff --git a/src/app/darmasaba/_com/NavbarSubMenu.tsx b/src/app/darmasaba/_com/NavbarSubMenu.tsx index be7235ba..f271b79b 100644 --- a/src/app/darmasaba/_com/NavbarSubMenu.tsx +++ b/src/app/darmasaba/_com/NavbarSubMenu.tsx @@ -7,10 +7,11 @@ import { IconArrowRight } from "@tabler/icons-react"; import { MenuItem } from "../../../../types/menu-item"; import { useTransitionRouter } from "next-view-transitions"; import colors from "@/con/colors"; +import { usePathname } from "next/navigation"; export function NavbarSubMenu({ item }: { item: MenuItem[] | null }) { const router = useTransitionRouter(); - + const pathname = usePathname(); return ( {item.map((link, index) => ( + } + }} + rightSection={} + styles={(theme) => ({ + root: { + background: pathname === link.href ? theme.colors.blue[0] : 'transparent', + color: pathname === link.href ? theme.colors.blue[7] : colors['blue-button'], + fontWeight: pathname === link.href ? 600 : 500, + transition: "all 0.2s ease", + "&:hover": { + background: pathname === link.href ? theme.colors.blue[1] : theme.colors.gray[0], + } + }, + })} + > + {link.name} + ))} ) : ( diff --git a/src/app/darmasaba/_com/globalSearch.tsx b/src/app/darmasaba/_com/globalSearch.tsx index fda58114..b5d66a76 100644 --- a/src/app/darmasaba/_com/globalSearch.tsx +++ b/src/app/darmasaba/_com/globalSearch.tsx @@ -1,21 +1,24 @@ 'use client'; import searchState, { debouncedFetch } from '@/app/api/[[...slugs]]/_lib/search/searchState'; -import { Box, Center, Loader, Stack, Text, TextInput } from '@mantine/core'; +import { Box, Center, Loader, Modal, Text, TextInput } from '@mantine/core'; import { IconX } from '@tabler/icons-react'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useSnapshot } from 'valtio'; import getDetailUrl from './searchUrl'; - - export default function GlobalSearch() { const snap = useSnapshot(searchState); + const [isOpen, setIsOpen] = useState(false); + + // Toggle modal when there's a query + useEffect(() => { + setIsOpen(!!snap.query); + }, [snap.query]); // Infinite scroll useEffect(() => { const handleScroll = () => { - const bottom = - window.innerHeight + window.scrollY >= document.body.offsetHeight - 200; + const bottom = window.innerHeight + window.scrollY >= document.body.offsetHeight - 200; if (bottom && !snap.loading) searchState.next(); }; window.addEventListener('scroll', handleScroll); @@ -23,15 +26,14 @@ export default function GlobalSearch() { }, [snap.loading]); return ( - - {/* 🔍 Search input */} + ( - searchState.query = e.currentTarget.value, - debouncedFetch() - )} + onChange={(e) => { + searchState.query = e.currentTarget.value; + debouncedFetch(); + }} radius="xl" rightSection={ snap.query ? ( @@ -47,45 +49,64 @@ export default function GlobalSearch() { } /> - {/* 📄 Hasil pencarian */} -
- {snap.results.map((item, i) => ( - { + searchState.query = ''; + searchState.results = []; + }} + withCloseButton={false} + size="lg" + padding={0} + radius="md" + style={{ position: 'absolute', top: '100%', left: 0, right: 0, zIndex: 1000 }} + styles={{ + content: { // Changed from 'modal' to 'content' + backgroundColor: 'white', + boxShadow: '0 4px 6px rgba(0, 0, 0, 0.1)', + borderRadius: '0.5rem', + maxHeight: '400px', overflow: 'hidden', - textOverflow: 'ellipsis', - whiteSpace: 'nowrap', - maxWidth: '100%' - }} - onMouseEnter={(e) => (e.currentTarget.style.background = '#f5f5f5')} - onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')} - onClick={() => { - const url = getDetailUrl(item); - window.location.href = url; - }} - > - - {item.judul || item.namaPasar || item.nama || item.name} - - - dari modul: {item.type} - + }, + }} + > + + {snap.results.map((item, i) => ( + (e.currentTarget.style.background = '#f5f5f5')} + onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')} + onClick={() => { + const url = getDetailUrl(item); + window.location.href = url; + }} + > + + {item.judul || item.namaPasar || item.nama || item.name} + + + dari modul: {item.type} + + + ))} + {snap.loading && ( +
+ +
+ )}
- ))} -
- - {/* ⏳ Loader di bawah hasil */} - {snap.loading && ( -
- -
- )} -
+ + ); -} - +} \ No newline at end of file diff --git a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx index 540608d7..997e779c 100644 --- a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx +++ b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx @@ -332,7 +332,7 @@ function Kepuasan() { { state.create.form.name = val.currentTarget.value; diff --git a/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx b/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx index d8269302..80dcb5fb 100644 --- a/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx +++ b/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx @@ -6,20 +6,19 @@ import { Center, Image, Paper, + ScrollArea, SimpleGrid, + Skeleton, Stack, Text, - Tooltip, - Skeleton, - useMantineColorScheme, - ScrollArea, + useMantineColorScheme } from "@mantine/core"; import { useShallowEffect } from "@mantine/hooks"; +import { Prisma } from "@prisma/client"; +import { IconPhotoOff } from "@tabler/icons-react"; import { motion } from "framer-motion"; import { useTransitionRouter } from "next-view-transitions"; import { useProxy } from "valtio/utils"; -import { Prisma } from "@prisma/client"; -import { IconPhotoOff } from "@tabler/icons-react"; type ProgramInovasiItem = Prisma.ProgramInovasiGetPayload<{ include: { image: true } }>; @@ -30,7 +29,6 @@ function ModuleItem({ data }: { data: ProgramInovasiItem }) { return ( - router.push(`/darmasaba/program-inovasi/${data.id}`)} p="lg" @@ -67,7 +65,6 @@ function ModuleItem({ data }: { data: ProgramInovasiItem }) {
- ); } diff --git a/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx b/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx index 5081dcd0..cdbaf0f4 100644 --- a/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx +++ b/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx @@ -37,9 +37,13 @@ export default function ProfileView({ data }: ProfileViewProps) { {data.name ) : ( @@ -49,13 +53,26 @@ export default function ProfileView({ data }: ProfileViewProps) {
)} - + + {/* Box nama dan jabatan - sedikit overlap dengan gambar */} + diff --git a/src/app/darmasaba/_com/main-page/sdgs/index.tsx b/src/app/darmasaba/_com/main-page/sdgs/index.tsx index d51ca065..a80584be 100644 --- a/src/app/darmasaba/_com/main-page/sdgs/index.tsx +++ b/src/app/darmasaba/_com/main-page/sdgs/index.tsx @@ -51,7 +51,7 @@ export default function SDGS() {
- SDGs Desa merupakan langkah nyata untuk mewujudkan desa yang maju, inklusif, dan berkelanjutan melalui 17 tujuan pembangunan: dari pengentasan kemiskinan, pendidikan, kesehatan, kesetaraan gender, hingga pelestarian lingkungan. + SDGs Desa merupakan langkah nyata untuk mewujudkan desa yang maju, inklusif, dan berkelanjutan melalui 17 tujuan pembangunan dari pengentasan kemiskinan, pendidikan, kesehatan, kesetaraan gender, hingga pelestarian lingkungan. @@ -67,49 +67,62 @@ export default function SDGS() { > {sdgsDesa && sdgsDesa.length > 0 ? ( - {sdgsDesa.map((item) => ( - -
- - {item.name} - -
+ {sdgsDesa.map((item) => ( + +
+ + {item.name} + +
+ + {/* Stack isi teks & angka */} + - + {item.name} + {item.jumlah} -
- ))} -
+ + + ))} + + ) : (
diff --git a/src/app/darmasaba/_com/searchUrl.tsx b/src/app/darmasaba/_com/searchUrl.tsx index d358bfa9..3b430a4d 100644 --- a/src/app/darmasaba/_com/searchUrl.tsx +++ b/src/app/darmasaba/_com/searchUrl.tsx @@ -52,6 +52,37 @@ const getDetailUrl = (item: { type?: string; id: string | number; [key: string]: programKemiskinan: '/darmasaba/ekonomi/program-kemiskinan', sektorUnggulanDesa: '/darmasaba/ekonomi/sektor-unggulan-desa', demografiPekerjaan: '/darmasaba/ekonomi/demografi-pekerjaan', + desaDigital: '/darmasaba/inovasi/desa-digital-smart-village', + programKreatif: '/darmasaba/inovasi/program-kreatif-desa', + kolaborasiInovasi: '/darmasaba/inovasi/kolaborasi-inovasi', + mitraKolaborasi: '/darmasaba/inovasi/kolaborasi-inovasi', + infoTekno: '/darmasaba/inovasi/info-teknologi-tepat-guna', + pengelolaanSampah: '/darmasaba/lingkungan/pengelolaan-sampah-bank-sampah', + keteranganBankSampahTerdekat: '/darmasaba/lingkungan/pengelolaan-sampah-bank-sampah', + programPenghijauan: '/darmasaba/lingkungan/program-penghijauan', + dataLingkunganDesa: '/darmasaba/lingkungan/data-lingkungan-desa', + gotongRoyong: '/darmasaba/lingkungan/gotong-royong', + tujuanEdukasiLingkungan: '/darmasaba/lingkungan/tujuan-edukasi-lingkungan', + materiEdukasiLingkungan: '/darmasaba/lingkungan/materi-edukasi-lingkungan', + contohEdukasiLingkungan: '/darmasaba/lingkungan/contoh-edukasi-lingkungan', + filosofiTriHita: '/darmasaba/lingkungan/filosofi-tri-hita', + bentukKonservasiBerdasarkanAdat: '/darmasaba/lingkungan/bentuk-konservasi-berdasarkan-adat', + nilaiKonservasiAdat: '/darmasaba/lingkungan/nilai-konservasi-adat', + jenjangPendidikan: '/darmasaba/inovasi/jenjang-pendidikan', + lembaga: '/darmasaba/inovasi/lembaga', + siswa: '/darmasaba/inovasi/siswa', + pengajar: '/darmasaba/inovasi/pengajar', + keunggulanProgram: '/darmasaba/inovasi/keunggulan-program', + tujuanProgram: '/darmasaba/inovasi/tujuan-program', + programUnggulan: '/darmasaba/inovasi/program-unggulan', + lokasiJadwalBimbinganBelajarDesa: '/darmasaba/inovasi/lokasi-jadwal-bimbingan-belajar-desa', + fasilitasBimbinganBelajarDesa: '/darmasaba/inovasi/fasilitas-bimbingan-belajar-desa', + tujuanPendidikanNonFormal: '/darmasaba/inovasi/tujuan-pendidikan-non-formal', + tempatKegiatan: '/darmasaba/inovasi/tempat-kegiatan', + jenisProgramYangDiselenggarakan: '/darmasaba/inovasi/jenis-program-yang-diselenggarakan', + dataPerpustakaan: '/darmasaba/inovasi/data-perpustakaan', + dataPendidikan: '/darmasaba/inovasi/data-pendidikan', + }; return typeUrlMap[type || ''] || '/darmasaba'; diff --git a/src/con/navbar-list-menu.ts b/src/con/navbar-list-menu.ts index 031ccac0..28eaf9c2 100644 --- a/src/con/navbar-list-menu.ts +++ b/src/con/navbar-list-menu.ts @@ -2,7 +2,6 @@ const navbarListMenu = [ { id: "1", name: "PPID", - href: "/darmasaba/ppid/profile-ppid", children: [ { id: "1.1", @@ -51,7 +50,6 @@ const navbarListMenu = [ { id: "2", name: "Desa", - href: "/darmasaba/desa/profile", children: [ { id: "2.1", @@ -94,7 +92,6 @@ const navbarListMenu = [ { id: "3", name: "Kesehatan", - href: "/darmasaba/kesehatan/posyandu", children: [ { id: "3.1", @@ -136,7 +133,6 @@ const navbarListMenu = [ { id: "4", name: "Keamanan", - href: "/darmasaba/keamanan/keamanan-lingkungan-pecalang-patwal", children: [ { id: "4.1", @@ -173,7 +169,6 @@ const navbarListMenu = [ { id: "5", name: "Ekonomi", - href: "/darmasaba/ekonomi/pasar-desa", children: [ { id: "5.1", @@ -229,7 +224,6 @@ const navbarListMenu = [ }, { id: "6", name: "Inovasi", - href: "/darmasaba/inovasi/desa-digital-smart-village", children: [ { id: "6.1", @@ -266,7 +260,6 @@ const navbarListMenu = [ }, { id: "7", name: "Lingkungan", - href: "/darmasaba/lingkungan/pengelolaan-sampah-bank-sampah", children: [ { id: "7.1", @@ -302,7 +295,6 @@ const navbarListMenu = [ }, { id: "8", name: "Pendidikan", - href: "/darmasaba/pendidikan/info-sekolah", children: [ { id: "8.1", diff --git a/types/menu-item.ts b/types/menu-item.ts index dfc957bc..a6ecf87f 100644 --- a/types/menu-item.ts +++ b/types/menu-item.ts @@ -1,6 +1,9 @@ export type MenuItem = { - id: string, - name: string, - href: string, - children?: MenuItem[] -} \ No newline at end of file + id: string; + name: string; + href?: string; + children?: MenuItem[]; +} & ( + { href: string; children?: MenuItem[] } | + { children: MenuItem[] } +) \ No newline at end of file