feat(desa): Kalender Event Budaya — fitur admin/public, seeder, pagination, fix duplicate options

- Tambah fitur Kalender Event Budaya di admin CMS (list, detail, edit, hapus)
- Tambah state Valtio (create, findMany, findUnique, edit, delete, findUpcoming)
- Tambah endpoint API /find-upcoming untuk event mendatang
- Tambah halaman public /darmasaba/desa/event-budaya dengan pagination 5 data/halaman
- Switch public page dari findUpcoming ke findMany agar pagination berjalan
- Tambah menu "Kalender Event Budaya" di navbar (id: 2.9)
- Perluas seeder event budaya: 8 → 34 events mencakup 2025-2026
- Fix: deduplikasi kategoriOptions di kegiatan-desa public page (Mantine Select error)
- Hapus STRUKTUR.md yang sudah tidak relevan

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-21 16:28:13 +08:00
parent 0a3dc1dc43
commit e9e7c17ee3
12 changed files with 648 additions and 906 deletions

View File

@@ -0,0 +1,24 @@
import prisma from "@/lib/prisma";
async function eventBudayaFindUpcoming() {
const today = new Date();
today.setHours(0, 0, 0, 0);
try {
const data = await prisma.eventBudaya.findMany({
where: {
isActive: true,
tanggal: { gte: today },
},
orderBy: { tanggal: "asc" },
take: 20,
});
return { success: true, data };
} catch (e) {
console.error("Error di eventBudayaFindUpcoming:", e);
return { success: false, message: "Gagal mengambil event mendatang" };
}
}
export default eventBudayaFindUpcoming;

View File

@@ -1,5 +1,6 @@
import Elysia, { t } from "elysia";
import eventBudayaFindMany from "./find-many";
import eventBudayaFindUpcoming from "./find-upcoming";
import eventBudayaFindUnique from "./findUnique";
import eventBudayaCreate from "./create";
import eventBudayaDelete from "./del";
@@ -7,6 +8,7 @@ import eventBudayaUpdate from "./updt";
const EventBudaya = new Elysia({ prefix: "/eventbudaya", tags: ["Desa/Event Budaya"] })
.get("/find-many", eventBudayaFindMany)
.get("/find-upcoming", eventBudayaFindUpcoming)
.get("/:id", eventBudayaFindUnique)
.post("/create", eventBudayaCreate, {
body: t.Object({