From cc7c8eb7040e7c495a7b7d28cc1805b45ddbbb20 Mon Sep 17 00:00:00 2001 From: amal Date: Tue, 2 Dec 2025 11:22:05 +0800 Subject: [PATCH 1/4] upd: dashboard admin Deskripsi: - pagination list pengaduan No Issues --- .../scr/dashboard/pengaduan/list_page.tsx | 78 +++++++++++-------- src/server/routes/pengaduan_route.ts | 18 ++++- 2 files changed, 60 insertions(+), 36 deletions(-) diff --git a/src/pages/scr/dashboard/pengaduan/list_page.tsx b/src/pages/scr/dashboard/pengaduan/list_page.tsx index f694682..4f101b2 100644 --- a/src/pages/scr/dashboard/pengaduan/list_page.tsx +++ b/src/pages/scr/dashboard/pengaduan/list_page.tsx @@ -6,8 +6,10 @@ import { Container, Divider, Flex, + Grid, Group, Input, + Pagination, Stack, Tabs, Text, @@ -124,22 +126,25 @@ function ListPengaduan({ status }: { status: StatusKey }) { const navigate = useNavigate(); const [page, setPage] = useState(1); const [value, setValue] = useState(""); - const { data, mutate, isLoading } = useSwr("/", async () => { - const res = await apiFetch.api.pengaduan.list.get({ + const { data, mutate, isLoading } = useSwr("/", async () => + apiFetch.api.pengaduan.list.get({ query: { status, search: value, take: "", - page: "", + page: page.toString(), }, - }); + }) + ); - return Array.isArray(res?.data) ? res.data : []; // ⬅ paksa return array - }); + useShallowEffect(() => { + setPage(1); + mutate(); + }, [status, value]); useShallowEffect(() => { mutate(); - }, [status, value]); + }, [page]); useShallowEffect(() => { const unsubscribe = subscribe(state, () => mutate()); @@ -163,30 +168,39 @@ function ListPengaduan({ status }: { status: StatusKey }) { ); - const list = data || []; + const list = data?.data?.data || []; + const total = data?.data?.total || 0; + const totalPage = data?.data?.totalPages || 1; + const pageSize = data?.data?.pageSize || 10; + const pageNow = data?.data?.page || 1; + return ( - - setValue(event.currentTarget.value)} - leftSection={} - rightSectionPointerEvents="all" - rightSection={ - setValue("")} - style={{ display: value ? undefined : "none" }} - /> - } - /> - {/* - Menampilkan {Number(data?.data?.length) * (page - 1) + 1} – {Math.min(10, Number(data?.data?.length) * page)} dari {Number(data?.data?.length)} - - */} - + + + setValue(event.currentTarget.value)} + leftSection={} + rightSectionPointerEvents="all" + rightSection={ + setValue("")} + style={{ display: value ? undefined : "none" }} + /> + } + /> + + + + {`${pageSize * (page - 1) + 1} – ${Math.min(total, pageSize * page)} of ${total}`} + + + + {list.length === 0 ? ( @@ -217,14 +231,14 @@ function ListPengaduan({ status }: { status: StatusKey }) { - {v.title} + {v.title.toString()} - #{v.noPengaduan} + #{v.noPengaduan.toString()} - {v.updatedAt} + {v.updatedAt.toString()} @@ -257,7 +271,7 @@ function ListPengaduan({ status }: { status: StatusKey }) { Tanggal Aduan - {v.createdAt} + {v.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} diff --git a/src/server/routes/pengaduan_route.ts b/src/server/routes/pengaduan_route.ts index 0da9701..dfe7fad 100644 --- a/src/server/routes/pengaduan_route.ts +++ b/src/server/routes/pengaduan_route.ts @@ -646,6 +646,10 @@ const PengaduanRoute = new Elysia({ } } + const totalData = await prisma.pengaduan.count({ + where + }); + const data = await prisma.pengaduan.findMany({ skip, take: !take ? 10 : Number(take), @@ -683,12 +687,20 @@ const PengaduanRoute = new Elysia({ detail: item.detail, status: item.status, location: item.location, - createdAt: item.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" }), + createdAt: item.createdAt, updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt), } }) - return dataFix + const dataReturn = { + data: dataFix, + total: totalData, + page: Number(page) || 1, + pageSize: !take ? 10 : Number(take), + totalPages: Math.ceil(totalData / (!take ? 10 : Number(take))) + } + + return dataReturn }, { query: t.Object({ take: t.String({ optional: true }), @@ -790,8 +802,6 @@ const PengaduanRoute = new Elysia({ description: "Tool untuk delete file Seafile", }, }) - - ; export default PengaduanRoute From 2b94684570ff2d3f6e5b8b647ae57fcd759a2064 Mon Sep 17 00:00:00 2001 From: amal Date: Tue, 2 Dec 2025 11:32:16 +0800 Subject: [PATCH 2/4] upd: dashboard admin Deskripsi: - pagination list pengajuan surat NO Issues --- .../pelayanan-surat/list_pelayanan_page.tsx | 68 ++++++++++++------- .../scr/dashboard/pengaduan/list_page.tsx | 2 +- src/server/routes/pelayanan_surat_route.ts | 25 ++++++- 3 files changed, 67 insertions(+), 28 deletions(-) diff --git a/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx b/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx index 0d6a5cd..07b87df 100644 --- a/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx +++ b/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx @@ -6,8 +6,10 @@ import { Container, Divider, Flex, + Grid, Group, Input, + Pagination, Stack, Tabs, Text, @@ -113,22 +115,26 @@ type StatusKey = function ListPelayananSurat({ status }: { status: StatusKey }) { const [page, setPage] = useState(1); const [value, setValue] = useState(""); - const { data, mutate, isLoading } = useSwr("/", async () => { - const res = await apiFetch.api.pelayanan.list.get({ + const { data, mutate, isLoading } = useSwr("/", async () => + apiFetch.api.pelayanan.list.get({ query: { status, search: value, take: "", - page: "", + page: page.toString(), }, - }); + }) + ); + + useShallowEffect(() => { + setPage(1); + mutate(); + }, [status, value]); - return Array.isArray(res?.data) ? res.data : []; // ⬅ paksa return array - }); useShallowEffect(() => { mutate(); - }, [status, value]); + }, [page]); useShallowEffect(() => { @@ -155,26 +161,38 @@ function ListPelayananSurat({ status }: { status: StatusKey }) { ); - const list = data || []; + const list = data?.data?.data || []; + const total = data?.data?.total || 0; + const totalPage = data?.data?.totalPages || 1; + const pageSize = data?.data?.pageSize || 10; + const pageNow = data?.data?.page || 1; return ( - - setValue(event.currentTarget.value)} - leftSection={} - rightSectionPointerEvents="all" - rightSection={ - setValue("")} - style={{ display: value ? undefined : "none" }} - /> - } - /> - + + + setValue(event.currentTarget.value)} + leftSection={} + rightSectionPointerEvents="all" + rightSection={ + setValue("")} + style={{ display: value ? undefined : "none" }} + /> + } + /> + + + + {`${pageSize * (page - 1) + 1} – ${Math.min(total, pageSize * page)} of ${total}`} + + + + {Array.isArray(list) && list?.length === 0 ? ( @@ -247,7 +265,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) { Tanggal Ajuan - {v.createdAt} + {v.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} diff --git a/src/pages/scr/dashboard/pengaduan/list_page.tsx b/src/pages/scr/dashboard/pengaduan/list_page.tsx index 4f101b2..9a64aa9 100644 --- a/src/pages/scr/dashboard/pengaduan/list_page.tsx +++ b/src/pages/scr/dashboard/pengaduan/list_page.tsx @@ -201,7 +201,7 @@ function ListPengaduan({ status }: { status: StatusKey }) { - {list.length === 0 ? ( + {Array.isArray(list) && list.length === 0 ? ( diff --git a/src/server/routes/pelayanan_surat_route.ts b/src/server/routes/pelayanan_surat_route.ts index 5d79106..a860d45 100644 --- a/src/server/routes/pelayanan_surat_route.ts +++ b/src/server/routes/pelayanan_surat_route.ts @@ -581,6 +581,14 @@ const PelayananRoute = new Elysia({ mode: "insensitive" }, }, + }, + { + Warga: { + name: { + contains: search ?? "", + mode: "insensitive" + }, + }, } ] } @@ -592,6 +600,11 @@ const PelayananRoute = new Elysia({ } } + + const totalData = await prisma.pelayananAjuan.count({ + where + }); + const data = await prisma.pelayananAjuan.findMany({ skip, take: !take ? 10 : Number(take), @@ -625,12 +638,20 @@ const PelayananRoute = new Elysia({ category: item.CategoryPelayanan.name, warga: item.Warga.name, status: item.status, - createdAt: item.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" }), + createdAt: item.createdAt, updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt), } }) - return dataFix + const dataReturn = { + data: dataFix, + total: totalData, + page: Number(page) || 1, + pageSize: !take ? 10 : Number(take), + totalPages: Math.ceil(totalData / (!take ? 10 : Number(take))) + } + + return dataReturn }, { query: t.Object({ take: t.String({ optional: true }), From 6a52d10faa3a485870f4fd2a4769fdaa6e47e1ad Mon Sep 17 00:00:00 2001 From: amal Date: Tue, 2 Dec 2025 11:40:30 +0800 Subject: [PATCH 3/4] upd: dashboard admin Deskripsi: - home > ganti warna No Issues --- src/components/DashboardCountData.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/DashboardCountData.tsx b/src/components/DashboardCountData.tsx index 8da6172..8ba3f5a 100644 --- a/src/components/DashboardCountData.tsx +++ b/src/components/DashboardCountData.tsx @@ -21,7 +21,7 @@ export default function DashboardCountData() { label="Pengaduan Hari Ini" value={String(data?.data?.pengaduan?.today)} change={String(data?.data?.pengaduan?.kenaikan) + "%"} - color={(data?.data?.pengaduan?.kenaikan || 0) > 0 ? "teal" : "gray"} + color={"gray"} /> @@ -30,7 +30,7 @@ export default function DashboardCountData() { label="Pengajuan Surat Hari Ini" value={String(data?.data?.pelayanan?.today)} change={String(data?.data?.pelayanan?.kenaikan) + "%"} - color={(data?.data?.pelayanan?.kenaikan || 0) > 0 ? "teal" : "gray"} + color="gray" /> From 48a7d437130451bf92851e3151a1c1c989837b27 Mon Sep 17 00:00:00 2001 From: amal Date: Tue, 2 Dec 2025 11:50:58 +0800 Subject: [PATCH 4/4] fix: list pengaduan dan list pelayanan surat Deskripsi: - fix date string No Issues --- .../dashboard/pelayanan-surat/list_pelayanan_page.tsx | 5 +++-- src/pages/scr/dashboard/pengaduan/list_page.tsx | 9 +++++---- src/server/routes/pelayanan_surat_route.ts | 2 +- src/server/routes/pengaduan_route.ts | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx b/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx index 07b87df..0458d9d 100644 --- a/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx +++ b/src/pages/scr/dashboard/pelayanan-surat/list_pelayanan_page.tsx @@ -166,6 +166,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) { const totalPage = data?.data?.totalPages || 1; const pageSize = data?.data?.pageSize || 10; const pageNow = data?.data?.page || 1; + const toDate = (d: any) => new Date(d); return ( @@ -232,7 +233,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) { #{v.noPengajuan} - {v.updatedAt} + {String(v.updatedAt)} @@ -265,7 +266,7 @@ function ListPelayananSurat({ status }: { status: StatusKey }) { Tanggal Ajuan - {v.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} + {toDate(v.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} diff --git a/src/pages/scr/dashboard/pengaduan/list_page.tsx b/src/pages/scr/dashboard/pengaduan/list_page.tsx index 9a64aa9..974ef64 100644 --- a/src/pages/scr/dashboard/pengaduan/list_page.tsx +++ b/src/pages/scr/dashboard/pengaduan/list_page.tsx @@ -173,6 +173,7 @@ function ListPengaduan({ status }: { status: StatusKey }) { const totalPage = data?.data?.totalPages || 1; const pageSize = data?.data?.pageSize || 10; const pageNow = data?.data?.page || 1; + const toDate = (d: any) => new Date(d); return ( @@ -231,14 +232,14 @@ function ListPengaduan({ status }: { status: StatusKey }) { - {v.title.toString()} + {v.title} - #{v.noPengaduan.toString()} + #{v.noPengaduan} - {v.updatedAt.toString()} + {String(v.updatedAt)} @@ -271,7 +272,7 @@ function ListPengaduan({ status }: { status: StatusKey }) { Tanggal Aduan - {v.createdAt.toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} + {toDate(v.createdAt).toLocaleDateString("id-ID", { day: "numeric", month: "long", year: "numeric" })} diff --git a/src/server/routes/pelayanan_surat_route.ts b/src/server/routes/pelayanan_surat_route.ts index a860d45..fe3f6e5 100644 --- a/src/server/routes/pelayanan_surat_route.ts +++ b/src/server/routes/pelayanan_surat_route.ts @@ -638,7 +638,7 @@ const PelayananRoute = new Elysia({ category: item.CategoryPelayanan.name, warga: item.Warga.name, status: item.status, - createdAt: item.createdAt, + createdAt: item.createdAt.toISOString(), updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt), } }) diff --git a/src/server/routes/pengaduan_route.ts b/src/server/routes/pengaduan_route.ts index dfe7fad..37ed7fe 100644 --- a/src/server/routes/pengaduan_route.ts +++ b/src/server/routes/pengaduan_route.ts @@ -687,7 +687,7 @@ const PengaduanRoute = new Elysia({ detail: item.detail, status: item.status, location: item.location, - createdAt: item.createdAt, + createdAt: item.createdAt.toISOString(), updatedAt: 'terakhir diperbarui ' + getLastUpdated(item.updatedAt), } })