From ccf39bc7786dc1060472e1749451948e5209cad0 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 15 Oct 2025 10:13:02 +0800 Subject: [PATCH] Penambahan fungsi search disetiap menu & submenu, Menu Landing Page Menu PPID Menu Desa --- prisma/schema.prisma | 2 +- .../artikel_kesehatan/page.tsx | 12 +- .../grafik_hasil_kepuasan/page.tsx | 2 +- .../kesehatan/info-wabah-penyakit/page.tsx | 4 +- .../api/[[...slugs]]/_lib/search/findMany.ts | 538 ++++++++++++++++++ src/app/api/[[...slugs]]/_lib/search/index.ts | 10 + .../[[...slugs]]/_lib/search/searchState.ts | 74 +++ src/app/api/[[...slugs]]/route.ts | 2 + .../kesehatan/info-wabah-penyakit/page.tsx | 6 +- .../kesehatan/penanganan-darurat/page.tsx | 18 +- .../(pages)/kesehatan/posyandu/page.tsx | 30 +- src/app/darmasaba/_com/NavBarSearch.tsx | 13 +- src/app/darmasaba/_com/globalSearch.tsx | 97 ++++ 13 files changed, 774 insertions(+), 34 deletions(-) create mode 100644 src/app/api/[[...slugs]]/_lib/search/findMany.ts create mode 100644 src/app/api/[[...slugs]]/_lib/search/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/search/searchState.ts create mode 100644 src/app/darmasaba/_com/globalSearch.tsx diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 261cf123..9c87ba27 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -143,7 +143,7 @@ model MediaSosial { isActive Boolean @default(true) } -//========================================= PROFILE ========================================= // +//========================================= DESA ANTI KORUPSI ========================================= // model DesaAntiKorupsi { id String @id @default(cuid()) name String @unique diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx index 2d1902a0..961c6630 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx @@ -89,26 +89,26 @@ function ListArtikelKesehatan({ search }: { search: string }) { - Judul - Konten - Aksi + Judul + Konten + Aksi {filteredData.length > 0 ? ( filteredData.map((item) => ( - + {item.title} - + {item.content} - + diff --git a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx index 3e3d3e10..4ce81235 100644 --- a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/page.tsx @@ -97,18 +97,23 @@ function Page() { shadow="sm" withBorder bg={colors['white-trans-1']} - style={{ transition: 'all 0.3s ease' }} + style={{ + transition: 'all 0.3s ease', + transform: 'translateY(0)', + }} + onMouseEnter={(e) => (e.currentTarget.style.transform = 'translateY(-5px)')} + onMouseLeave={(e) => (e.currentTarget.style.transform = 'translateY(0)')} >
@@ -151,8 +156,11 @@ function Page() { styles={{ control: { border: `1px solid ${colors['blue-button']}`, + transition: 'all 0.3s ease', + '&: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 d94d031c..a1bf2d8c 100644 --- a/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/posyandu/page.tsx @@ -28,11 +28,31 @@ export default function Page() { if (data.length === 0) { return ( - - - Tidak ada posyandu yang ditemukan - - + + + + + + Posyandu Desa Darmasaba + + } + w={{ base: "100%", md: "35%" }} + value={search} + onChange={(e) => setSearch(e.currentTarget.value)} + /> + + + ); } diff --git a/src/app/darmasaba/_com/NavBarSearch.tsx b/src/app/darmasaba/_com/NavBarSearch.tsx index 4585fa6e..b7fca50a 100644 --- a/src/app/darmasaba/_com/NavBarSearch.tsx +++ b/src/app/darmasaba/_com/NavBarSearch.tsx @@ -1,6 +1,6 @@ import stateNav from "@/state/state-nav"; -import { Container, Stack, TextInput, Tooltip } from "@mantine/core"; -import { IconSearch } from "@tabler/icons-react"; +import { Container, Stack, Tooltip } from "@mantine/core"; +import GlobalSearch from "./globalSearch"; export function NavbarSearch() { return ( @@ -12,14 +12,7 @@ export function NavbarSearch() { > - } - /> + diff --git a/src/app/darmasaba/_com/globalSearch.tsx b/src/app/darmasaba/_com/globalSearch.tsx new file mode 100644 index 00000000..259866f7 --- /dev/null +++ b/src/app/darmasaba/_com/globalSearch.tsx @@ -0,0 +1,97 @@ +'use client'; +import { TextInput, Loader, Stack, Box, Text } from '@mantine/core'; +import { useSnapshot } from 'valtio'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; +import searchState from '@/app/api/[[...slugs]]/_lib/search/searchState'; + +// Mapping type ke URL +const getDetailUrl = (item: { type?: string; id: string | number; [key: string]: unknown }) => { + const { type, id, kategori } = item; + + const typeUrlMap: Record = { + programinovasi: `/darmasaba/program-inovasi/${id}`, + desaantikorupsi: '/darmasaba/desa-anti-korupsi', + sdgsdesa: '/darmasaba/sdgs-desa', + apbdes: '/darmasaba/apbdes', + prestasidesa: '/darmasaba/prestasi-desa', + pejabatdesa: '/darmasaba/profile/pejabat-desa', + strukturppid: '/darmasaba/ppid/struktur-ppid', + visimisippid: '/darmasaba/ppid/visi-misi', + dasarhukumppid: '/darmasaba/ppid/dasar-hukum', + profileppid: '/darmasaba/ppid/profile', + daftarinformasipublik: '/darmasaba/ppid/daftar-informasi-publik', + perbekeldarmasaba: '/darmasaba/desa/profile', + berita: `/darmasaba/desa/berita/${kategori}/${id}`, + pengumuman: `/darmasaba/desa/pengumuman/${kategori}/${id}`, + sejarahdesa: '/darmasaba/desa/profile', + visimisidesa: '/darmasaba/desa/profile', + lambangdesa: '/darmasaba/desa/profile', + maskotdesa: '/darmasaba/desa/profile', + profilperbekel: '/darmasaba/desa/profile', + potensi: '/darmasaba/desa/potensi-desa', + galleryFoto: '/darmasaba/desa/gallery/foto', + galleryVideo: '/darmasaba/desa/gallery/video', + pelayananSuratKeterangan: '/darmasaba/desa/layanan', + pelayananPerizinanBerusaha: '/darmasaba/desa/layanan', + pelayananTelunjukSaktiDesa: '/darmasaba/desa/layanan', + pelayananPendudukNonPermanent: '/darmasaba/desa/layanan', + penghargaan: '/darmasaba/desa/penghargaan', + }; + + return type ? typeUrlMap[type] || '/darmasaba' : '/darmasaba'; +}; + + +export default function GlobalSearch() { + const snap = useSnapshot(searchState); + const router = useRouter(); + + // Infinite scroll listener + useEffect(() => { + const handleScroll = () => { + const bottom = + window.innerHeight + window.scrollY >= document.body.offsetHeight - 200; + if (bottom && !snap.loading) searchState.next(); + }; + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, [snap.loading]); + + return ( + + (searchState.query = e.currentTarget.value)} + /> + + {snap.results.map((item, i) => ( + (e.currentTarget.style.background = '#f5f5f5')} + onMouseLeave={(e) => (e.currentTarget.style.background = 'transparent')} + onClick={() => { + const url = getDetailUrl(item); + router.push(url); + }} + > + + {item.judul || item.namaPasar || item.nama || item.name} + + + dari modul: {item.type} + + + ))} + + {snap.loading && } + + ); +}