From dc8793e3aece7088b4a2738fa489526306280115 Mon Sep 17 00:00:00 2001 From: nico Date: Wed, 17 Dec 2025 17:37:58 +0800 Subject: [PATCH] Fix QC Kak Inno 16 Des Fix QC Kak Ayu 16 Des FIx UI Admin Mobile Menu PPID Fix Search Admin Menu Landing Page & Menu PPID --- .../permohonanInformasiPublik.ts | 44 ++- .../permohonanKeberatanInformasi.ts | 50 ++- .../[id]/page.tsx | 4 +- .../landing-page/SDGs/[id]/page.tsx | 4 +- .../(dashboard)/landing-page/SDGs/page.tsx | 28 +- .../landing-page/apbdes/[id]/edit/page.tsx | 14 + .../landing-page/apbdes/create/page.tsx | 14 + .../(dashboard)/landing-page/apbdes/page.tsx | 19 +- .../kategori-desa-anti-korupsi/page.tsx | 6 +- .../list-desa-anti-korupsi/page.tsx | 12 +- .../kategori-prestasi-desa/page.tsx | 7 +- .../prestasi-desa/list-prestasi-desa/page.tsx | 118 +++--- .../landing-page/profil/media-sosial/page.tsx | 16 +- .../profil/program-inovasi/page.tsx | 20 +- .../[id]/edit/page.tsx | 2 +- .../daftar-informasi-publik/[id]/page.tsx | 54 +-- .../daftar-informasi-publik/create/page.tsx | 2 +- .../ppid/daftar-informasi-publik/page.tsx | 217 +++++++---- .../(dashboard)/ppid/dasar-hukum/page.tsx | 57 +-- .../_lib/layoutTabs.tsx | 95 +++-- .../responden/[id]/edit/page.tsx | 8 +- .../responden/[id]/page.tsx | 2 +- .../responden/create/page.tsx | 36 +- .../responden/page.tsx | 234 ++++++++---- .../permohonan-informasi-publik/[id]/page.tsx | 4 +- .../ppid/permohonan-informasi-publik/page.tsx | 304 +++++++++++---- .../[id]/page.tsx | 4 +- .../page.tsx | 312 ++++++++++++--- .../ppid/profil-ppid/[id]/page.tsx | 2 +- .../(dashboard)/ppid/profil-ppid/page.tsx | 122 ++++-- .../ppid/struktur-ppid/_lib/layoutTabs.tsx | 125 ++++-- .../struktur-ppid/pegawai/[id]/edit/page.tsx | 2 +- .../ppid/struktur-ppid/pegawai/[id]/page.tsx | 4 +- .../struktur-ppid/pegawai/create/page.tsx | 2 +- .../ppid/struktur-ppid/pegawai/page.tsx | 191 +++++---- .../posisi-organisasi/[id]/page.tsx | 2 +- .../posisi-organisasi/create/page.tsx | 2 +- .../struktur-ppid/posisi-organisasi/page.tsx | 144 ++++--- .../ppid/visi-misi-ppid/edit/page.tsx | 2 +- .../(dashboard)/ppid/visi-misi-ppid/page.tsx | 87 +++-- .../permohonan_informasi_publik/find-many.ts | 64 +++- .../find-many.ts | 51 ++- .../darmasaba/_com/ModernNewsNotification.tsx | 361 +++++++++++++----- src/app/darmasaba/_com/NavbarMainMenu.tsx | 13 +- 44 files changed, 2028 insertions(+), 833 deletions(-) diff --git a/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts b/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts index 0cd22ea0..4a4cd5dc 100644 --- a/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts +++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_informasi_publik/permohonanInformasiPublik.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -136,12 +137,43 @@ const statepermohonanInformasiPublik = proxy({ }; }>[] | null, - async load() { - const res = await ApiFetch.api.ppid.permohonaninformasipublik[ - "find-many" - ].get(); - if (res.status === 200) { - statepermohonanInformasiPublik.findMany.data = res.data?.data ?? []; + page: 1, + totalPages: 1, + total: 0, + loading: false, + search: "", + load: async (page = 1, limit = 10, search = "") => { + // Change to arrow function + statepermohonanInformasiPublik.findMany.loading = true; // Use the full path to access the property + statepermohonanInformasiPublik.findMany.page = page; + statepermohonanInformasiPublik.findMany.search = search; + try { + const query: any = { page, limit }; + if (search) query.search = search; + + const res = await ApiFetch.api.ppid.permohonaninformasipublik[ + "find-many" + ].get({ + query, + }); + + if (res.status === 200 && res.data?.success) { + statepermohonanInformasiPublik.findMany.data = res.data.data || []; + statepermohonanInformasiPublik.findMany.total = res.data.total || 0; + statepermohonanInformasiPublik.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load permohonan keberatan informasi:", res.data?.message); + statepermohonanInformasiPublik.findMany.data = []; + statepermohonanInformasiPublik.findMany.total = 0; + statepermohonanInformasiPublik.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading permohonan keberatan informasi:", error); + statepermohonanInformasiPublik.findMany.data = []; + statepermohonanInformasiPublik.findMany.total = 0; + statepermohonanInformasiPublik.findMany.totalPages = 1; + } finally { + statepermohonanInformasiPublik.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts b/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts index b1545785..4ba89cb7 100644 --- a/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts +++ b/src/app/admin/(dashboard)/_state/ppid/permohonan_keberatan_informasi_publik/permohonanKeberatanInformasi.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; @@ -57,17 +58,48 @@ const permohonanKeberatanInformasi = proxy({ }, }, findMany: { - data: null as + data: null as + | null | Prisma.FormulirPermohonanKeberatanGetPayload<{ omit: { isActive: true }; - }>[] - | null, - async load() { - const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik[ - "find-many" - ].get(); - if (res.status === 200) { - permohonanKeberatanInformasi.findMany.data = res.data?.data ?? []; + }>[], + page: 1, + totalPages: 1, + total: 0, + loading: false, + search: "", + load: async (page = 1, limit = 10, search = "") => { + // Change to arrow function + permohonanKeberatanInformasi.findMany.loading = true; // Use the full path to access the property + permohonanKeberatanInformasi.findMany.page = page; + permohonanKeberatanInformasi.findMany.search = search; + try { + const query: any = { page, limit }; + if (search) query.search = search; + + const res = await ApiFetch.api.ppid.permohonankeberataninformasipublik[ + "find-many" + ].get({ + query, + }); + + if (res.status === 200 && res.data?.success) { + permohonanKeberatanInformasi.findMany.data = res.data.data || []; + permohonanKeberatanInformasi.findMany.total = res.data.total || 0; + permohonanKeberatanInformasi.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load permohonan keberatan informasi:", res.data?.message); + permohonanKeberatanInformasi.findMany.data = []; + permohonanKeberatanInformasi.findMany.total = 0; + permohonanKeberatanInformasi.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading permohonan keberatan informasi:", error); + permohonanKeberatanInformasi.findMany.data = []; + permohonanKeberatanInformasi.findMany.total = 0; + permohonanKeberatanInformasi.findMany.totalPages = 1; + } finally { + permohonanKeberatanInformasi.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx index c8f9eca9..bb0e2eea 100644 --- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx @@ -4,7 +4,7 @@ import stateProfileDesa from '@/app/admin/(dashboard)/_state/desa/profile'; import colors from '@/con/colors'; import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; -import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; +import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -108,7 +108,7 @@ function DetailPerbekelDariMasa() { radius="md" size="md" > - + - + + + + + + List Daftar Informasi Publik + + {filteredData.length === 0 ? ( - Belum ada informasi publik yang tersedia + + Belum ada informasi publik yang tersedia + ) : ( - - - - - No - Jenis Informasi - Deskripsi - Aksi - - - - {filteredData.map((item, index) => ( - - - {(page - 1) * 10 + index + 1} - - - - {item.jenisInformasi} - - - - - - {item.deskripsi?.replace(/<[^>]*>?/gm, '').substring(0, 80) + '...'} - - - - - + <> + {/* Desktop Table */} + +
+ + + + + Jenis Informasi + + + + + Deskripsi + + + + + Aksi + + + + + + {filteredData.map((item) => ( + + + + {item.jenisInformasi} + + + + + {item.deskripsi?.replace(/<[^>]*>?/gm, '').substring(0, 80)}... + + + - - - ))} - -
-
+
+ + ))} + + + + + {/* Mobile Card List */} + + {filteredData.map((item) => ( + + + + + Jenis Informasi + + + {item.jenisInformasi} + + + + + Deskripsi + + + {item.deskripsi?.replace(/<[^>]*>?/gm, '').substring(0, 80)}... + + + + + + + + ))} + + )} -
+ +
{ @@ -129,14 +202,12 @@ function ListDaftarInformasi({ search }: { search: string }) { window.scrollTo({ top: 0, behavior: 'smooth' }); }} total={totalPages} - mt="md" - mb="md" color="blue" radius="md" />
- ) + ); } -export default DaftarInformasiPublik; +export default DaftarInformasiPublik; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/dasar-hukum/page.tsx b/src/app/admin/(dashboard)/ppid/dasar-hukum/page.tsx index aa38d47e..95aa7979 100644 --- a/src/app/admin/(dashboard)/ppid/dasar-hukum/page.tsx +++ b/src/app/admin/(dashboard)/ppid/dasar-hukum/page.tsx @@ -8,11 +8,11 @@ import { useProxy } from 'valtio/utils'; import stateDasarHukumPPID from '../../_state/ppid/dasar_hukum/dasarHukum'; function Page() { - const router = useRouter() - const listDasarHukum = useProxy(stateDasarHukumPPID) + const router = useRouter(); + const listDasarHukum = useProxy(stateDasarHukumPPID); useShallowEffect(() => { - listDasarHukum.findById.load('1') - }, []) + listDasarHukum.findById.load('1'); + }, []); if (listDasarHukum.findById.loading) { return ( @@ -40,15 +40,16 @@ function Page() { Preview Dasar Hukum PPID - + @@ -57,33 +58,39 @@ function Page() {
- Logo PPID + Logo PPID
-
- - ) + ); } -export default Page; +export default Page; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx index 9b6604dd..a6705eb7 100644 --- a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client'; import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title} from '@mantine/core'; import { IconChartBar, IconUsers } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -56,42 +56,77 @@ function LayoutTabsIKM({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((e, i) => ( - + {/* ✅ Scroll horizontal wrapper */} + + + + {tabs.map((tab, i) => ( - {e.label} + {tab.label} - - ))} - - + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((e, i) => ( {/* Konten dummy, bisa diganti tergantung routing */} diff --git a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx index f11990e2..516c8e1c 100644 --- a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx @@ -85,11 +85,11 @@ function EditResponden() { }; return ( - + - + Edit Responden diff --git a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/page.tsx index a965cd88..dc74a8b0 100644 --- a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/[id]/page.tsx @@ -38,7 +38,7 @@ export default function DetailResponden() { ) } return ( - + + + + )) + )} + + + + + {/* Mobile Card View */} + + {filteredData.length === 0 ? ( + + Tidak ada data yang cocok dengan pencarian + + ) : ( + + {filteredData.map((item, index) => ( + + + + + No + + + {index + 1} + + + + + Nama + + + {item.name} + + + + + Tanggal + + + {item.tanggal + ? new Date(item.tanggal).toLocaleDateString('id-ID') + : '-'} + + + + + Jenis Kelamin + + + {item.jenisKelamin.name} + + + + + + + + ))} + + )} + + {filteredData.length > 0 && (
)} @@ -147,6 +241,4 @@ function ListResponden({ search }: ListRespondenProps) { ); } -export default Responden; - - +export default Responden; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/[id]/page.tsx index 29bf3335..9f8f8d4f 100644 --- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/[id]/page.tsx @@ -27,7 +27,7 @@ function DetailPermohonanInformasiPublik() { const data = state.findUnique.data; return ( - + - - - ))} - - - + + + + ))} + + )} +
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + withEdges + withControls + radius="md" + /> +
) } -export default Page +export default Page \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/[id]/page.tsx index 0e4e95e8..1aac3b7a 100644 --- a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/[id]/page.tsx @@ -28,7 +28,7 @@ function DetailPermohonanKeberatanInformasiPublik() { const data = state.findUnique.data; return ( - + - - - ))} - - - + + + + ))} + + )} +
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + withEdges + withControls + radius="md" + /> +
- ); + ) } -export default Page; + +export default Page \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/profil-ppid/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/profil-ppid/[id]/page.tsx index 6c166b5b..b0f95537 100644 --- a/src/app/admin/(dashboard)/ppid/profil-ppid/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/profil-ppid/[id]/page.tsx @@ -138,7 +138,7 @@ function EditProfilePPID() { } return ( - + + {dataArray.map((item) => ( @@ -57,9 +57,14 @@ function Page() {
- + PROFIL PIMPINAN BADAN PUBLIK DESA DARMASABA - </Text> + @@ -87,34 +92,77 @@ function Page() { className="glass3" style={{ mt: -30, boxShadow: '0 4px 20px rgba(0,0,0,0.15)' }} > - + {item.name} - </Text> + - + - Biodata - + + Biodata + + - + - Riwayat Karir - - - - - Pengalaman Organisasi + + Riwayat Karir + - + - - - Program Kerja Unggulan + + + + Pengalaman Organisasi + - + + + + + + + Program Kerja Unggulan + + + @@ -122,9 +170,7 @@ function Page() { ))} - ) + ); } - - export default Page; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/struktur-ppid/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ppid/struktur-ppid/_lib/layoutTabs.tsx index 4cc3d2b6..62cae3ef 100644 --- a/src/app/admin/(dashboard)/ppid/struktur-ppid/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ppid/struktur-ppid/_lib/layoutTabs.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconBuildingCommunity, IconHierarchy2, IconUsers } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -63,51 +63,92 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { keepMounted={false} > {/* ✅ Scroll horizontal wrapper */} - - + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + {tabs.map((tab, i) => ( + - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - - - {tabs.map((tab, i) => ( - - {children} - - ))} - + {children} + + ))} + ); } diff --git a/src/app/admin/(dashboard)/ppid/struktur-ppid/pegawai/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ppid/struktur-ppid/pegawai/[id]/edit/page.tsx index 946398c3..4b53047c 100644 --- a/src/app/admin/(dashboard)/ppid/struktur-ppid/pegawai/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ppid/struktur-ppid/pegawai/[id]/edit/page.tsx @@ -153,7 +153,7 @@ export default function EditPegawaiPPID() { }; return ( - + - -
- Tidak ada data pegawai yang ditemukan -
- -
- ); - } - return ( - - - - Daftar Pegawai PPID + + Daftar Pegawai PPID + + +
+ + Tidak ada data pegawai yang ditemukan + +
+
+
+ ); + } + + return ( + + + + + Daftar Pegawai PPID + + - - + + {/* Desktop: Table */} + +
- Nama Lengkap - Posisi - Status - Aksi + + Nama Lengkap + + + Posisi + + + Status + + + Aksi + {filteredData.map((item) => ( - - - {item.namaLengkap} - - + + {item.namaLengkap} + - - - {item.posisi?.nama || 'Belum diatur'} - - + + {item.posisi?.nama || 'Belum diatur'} + - - - - {item.isActive ? "Aktif" : "Tidak Aktif"} - - - - {item.isActive ? ( - - - - ) : ( - - - - )} - - + + {item.isActive ? "Aktif" : "Tidak Aktif"} + @@ -152,7 +171,47 @@ function ListPegawaiPPID({ search }: { search: string }) {
-
+ + {/* Mobile: Card List */} + + {filteredData.map((item) => ( + + + + Nama Lengkap + + {item.namaLengkap} + + + + Posisi + + {item.posisi?.nama || 'Belum diatur'} + + + + Status + + {item.isActive ? "Aktif" : "Tidak Aktif"} + + + + + + ))} + + +
{ @@ -170,4 +229,4 @@ function ListPegawaiPPID({ search }: { search: string }) { ); } -export default PegawaiPPID; +export default PegawaiPPID; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/ppid/struktur-ppid/posisi-organisasi/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/struktur-ppid/posisi-organisasi/[id]/page.tsx index 0e81e613..526e2ff6 100644 --- a/src/app/admin/(dashboard)/ppid/struktur-ppid/posisi-organisasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/struktur-ppid/posisi-organisasi/[id]/page.tsx @@ -107,7 +107,7 @@ function EditPosisiOrganisasiPPID() { }; return ( - + + + + + Daftar Posisi Organisasi PPID + - + + {/* Desktop Table */} + - Nama Posisi - Deskripsi - Hierarki - Edit - Hapus + Nama Posisi + Deskripsi + Hierarki + Edit + Hapus {filteredData.length > 0 ? ( filteredData.map((item) => ( - - {item.nama} + + {item.nama} - - - - + + - - {item.hierarki || '-'} + + {item.hierarki || '-'} - - + + - +
+ + {/* Mobile Card View */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama Posisi + {item.nama} + + + Deskripsi + + + + Hierarki + {item.hierarki || '-'} + + + + + + + + )) + ) : ( +
+ + Tidak ada data posisi organisasi yang cocok + +
+ )} +
+
+ {/* Modal Hapus */} + + @@ -58,14 +58,25 @@ function VisiMisiPPIDList() {
- Logo PPID + Logo PPID
- + MOTO PPID DESA DARMASABA - </Text> - <Text ta="center" fz={{ base: '1rem', md: '1.2rem' }} mt="sm"> + + MEMBERIKAN INFORMASI YANG CEPAT, MUDAH, TEPAT DAN TRANSPARAN @@ -74,26 +85,50 @@ function VisiMisiPPIDList() { - + VISI PPID - </Text> - <Box - className="prose max-w-none" + + - + MISI PPID - </Text> - <Box - className="prose max-w-none" + +
@@ -103,4 +138,4 @@ function VisiMisiPPIDList() { ); } -export default VisiMisiPPIDList; +export default VisiMisiPPIDList; \ No newline at end of file diff --git a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts index f8f32d41..7489b74b 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_informasi_publik/find-many.ts @@ -1,14 +1,56 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export default async function permohonanInformasiPublikFindMany() { - const res = await prisma.permohonanInformasiPublik.findMany({ - include: { - jenisInformasiDiminta: true, - caraMemperolehInformasi: true, - caraMemperolehSalinanInformasi: true, - } - }); - return { - data: res, - }; +export default async function permohonanInformasiPublikFindMany( + context: Context +) { + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const search = (context.query.search as string) || ""; + const skip = (page - 1) * limit; + + const where: any = { isActive: true }; + + // Tambahkan pencarian (jika ada) + if (search) { + where.OR = [ + { name: { contains: search, mode: "insensitive" } }, + { email: { contains: search, mode: "insensitive" } }, + ]; + } + + try { + const [data, total] = await Promise.all([ + prisma.permohonanInformasiPublik.findMany({ + where, + skip, + include: { + jenisInformasiDiminta: true, + caraMemperolehInformasi: true, + caraMemperolehSalinanInformasi: true, + }, + take: limit, + orderBy: { name: "asc" }, // opsional, kalau mau urut berdasarkan waktu + }), + prisma.permohonanInformasiPublik.count({ + where: { isActive: true }, + }), + ]); + + return { + success: true, + message: "Success fetch formulir permohonan keberatan with pagination", + data, + page, + totalPages: Math.ceil(total / limit), + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch formulir permohonan keberatan with pagination", + }; + } } diff --git a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_keberatan_informasi_publik/find-many.ts b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_keberatan_informasi_publik/find-many.ts index bd4b6c4d..7be2299f 100644 --- a/src/app/api/[[...slugs]]/_lib/ppid/permohonan_keberatan_informasi_publik/find-many.ts +++ b/src/app/api/[[...slugs]]/_lib/ppid/permohonan_keberatan_informasi_publik/find-many.ts @@ -1,8 +1,49 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import prisma from "@/lib/prisma"; +import { Context } from "elysia"; -export default async function permohonanKeberatanInformasiPublikFindMany() { - const res = await prisma.formulirPermohonanKeberatan.findMany(); - return { - data: res, - }; +export default async function permohonanKeberatanInformasiPublikFindMany(context: Context) { + const page = Number(context.query.page) || 1; + const limit = Number(context.query.limit) || 10; + const search = (context.query.search as string) || ''; + const skip = (page - 1) * limit; + + const where: any = { isActive: true }; + + // Tambahkan pencarian (jika ada) + if (search) { + where.OR = [ + { name: { contains: search, mode: 'insensitive' } }, + {email: { contains: search, mode: 'insensitive' } }, + ]; + } + + try { + const [data, total] = await Promise.all([ + prisma.formulirPermohonanKeberatan.findMany({ + where, + skip, + take: limit, + orderBy: { name: "asc" }, // opsional, kalau mau urut berdasarkan waktu + }), + prisma.formulirPermohonanKeberatan.count({ + where: { isActive: true }, + }), + ]); + + return { + success: true, + message: "Success fetch formulir permohonan keberatan with pagination", + data, + page, + totalPages: Math.ceil(total / limit), + total, + }; + } catch (e) { + console.error("Find many paginated error:", e); + return { + success: false, + message: "Failed fetch formulir permohonan keberatan with pagination", + }; + } } diff --git a/src/app/darmasaba/_com/ModernNewsNotification.tsx b/src/app/darmasaba/_com/ModernNewsNotification.tsx index 2fa14f1c..93503db6 100644 --- a/src/app/darmasaba/_com/ModernNewsNotification.tsx +++ b/src/app/darmasaba/_com/ModernNewsNotification.tsx @@ -216,105 +216,282 @@ export default function ModernNewsNotification({ {/* Widget Panel */} {(styles) => ( - - - - - - - Berita & Pengumuman - - - { - setWidgetOpen(false); - onSeen?.(); + + + + - - - - - {news.length === 0 ? ( - - - Tidak ada berita terbaru - + > + + + + + Berita & Pengumuman + + + { + setWidgetOpen(false); + onSeen?.(); + }} + variant="transparent" + c="white" + /> + - ) : ( - - {news.map((item) => ( - { - e.currentTarget.style.borderColor = "#1e5a7e"; - e.currentTarget.style.transform = "translateY(-2px)"; - e.currentTarget.style.boxShadow = "0 4px 12px rgba(0,0,0,0.08)"; - }} - onMouseLeave={(e) => { - e.currentTarget.style.borderColor = "#e9ecef"; - e.currentTarget.style.transform = "translateY(0)"; - e.currentTarget.style.boxShadow = "none"; - }} - onClick={() => handleNotificationClick(item)} - > - - + {news.length === 0 ? ( + + + Tidak ada berita terbaru + + + ) : ( + + {news.map((item) => ( + { + e.currentTarget.style.borderColor = "#1e5a7e"; + e.currentTarget.style.transform = "translateY(-2px)"; + e.currentTarget.style.boxShadow = "0 4px 12px rgba(0,0,0,0.08)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.borderColor = "#e9ecef"; + e.currentTarget.style.transform = "translateY(0)"; + e.currentTarget.style.boxShadow = "none"; + }} + onClick={() => handleNotificationClick(item)} > - {item.type === "berita" ? "Berita" : "Pengumuman"} - - - - - {item.title || "Tanpa Judul"} - - - {stripHtml(item.content).substring(0, 100)}... - - - ))} - - )} + + + {item.type === "berita" ? "Berita" : "Pengumuman"} + + + + + {item.title || "Tanpa Judul"} + + + {stripHtml(item.content).substring(0, 100)}... + + + ))} + + )} +
+
- + + + + + + + + Berita & Pengumuman + + + { + setWidgetOpen(false); + onSeen?.(); + }} + variant="transparent" + c="white" + /> + + + + + {news.length === 0 ? ( + + + Tidak ada berita terbaru + + + ) : ( + + {news.map((item) => ( + { + e.currentTarget.style.borderColor = "#1e5a7e"; + e.currentTarget.style.transform = "translateY(-2px)"; + e.currentTarget.style.boxShadow = "0 4px 12px rgba(0,0,0,0.08)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.borderColor = "#e9ecef"; + e.currentTarget.style.transform = "translateY(0)"; + e.currentTarget.style.boxShadow = "none"; + }} + onClick={() => handleNotificationClick(item)} + > + + + {item.type === "berita" ? "Berita" : "Pengumuman"} + + + + + {item.title || "Tanpa Judul"} + + + {stripHtml(item.content).substring(0, 100)}... + + + ))} + + )} + + + +
)} {/* Toast Notification */} - + + + {(styles) => ( + + + + + + + + {currentNews?.type === "berita" + ? "Berita Terbaru" + : "Pengumuman"} + + + + + + {currentNews?.title || "Informasi Terbaru"} + + + + {stripHtml(currentNews?.content || "")} + + + + + {news.length > 1 ? `${news.length} berita tersedia` : "1 berita"} + + + Lihat Semua → + + + + + )} + + + + {(styles) => ( @@ -323,7 +500,7 @@ export default function ModernNewsNotification({ ...styles, position: "fixed", bottom: "100px", - left: "24px", + right: "24px", width: "90vw", maxWidth: 380, boxShadow: "0 8px 32px rgba(0,0,0,0.15)", @@ -387,6 +564,8 @@ export default function ModernNewsNotification({ )} + + ); } \ No newline at end of file diff --git a/src/app/darmasaba/_com/NavbarMainMenu.tsx b/src/app/darmasaba/_com/NavbarMainMenu.tsx index 79ef6134..79b200c1 100644 --- a/src/app/darmasaba/_com/NavbarMainMenu.tsx +++ b/src/app/darmasaba/_com/NavbarMainMenu.tsx @@ -3,18 +3,17 @@ import colors from "@/con/colors" import stateNav from "@/state/state-nav" import { ActionIcon, Button, Container, Flex, Image, Menu, MenuTarget, Stack, Tooltip } from "@mantine/core" -import { IconSearch, IconUser } from "@tabler/icons-react" +import { IconSearch, IconUserCog } 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 { authStore } from "@/store/authStore"; // contoh state auth (dummy aja dulu, bisa diganti sesuai sistem auth kamu) -const stateAuth = { - role: "admin", // coba ubah ke "user" buat test -} +const isAdmin = authStore.user?.roleId === 0 || authStore.user?.roleId === 1 || authStore.user?.roleId === 2 || authStore.user?.roleId === 3 || authStore.user?.roleId === 4; export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { const { item, isSearch } = useSnapshot(stateNav) @@ -70,8 +69,8 @@ export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { {/* hanya tampil kalau role = admin */} - {stateAuth.role === "admin" && ( - + {isAdmin && ( + { next.push("/admin/landing-page/profil/program-inovasi") @@ -80,7 +79,7 @@ export function NavbarMainMenu({ listNavbar }: { listNavbar: MenuItem[] }) { radius="xl" variant="light" > - + )} -- 2.49.1