feat: add kependudukan seeders, API routes, year filter, and navbar menu

- Add Prisma models: DataBanjar, DistribusiAgama, DistribusiUmur, MigrasiPenduduk, DinamikaPenduduk
- Create seeders for all kependudukan models with year 2026 data
- Register Kependudukan API routes in route.ts
- Update API findMany endpoints to make tahun parameter optional
- Add YearFilter reusable component for admin pages
- Update 4 kependudukan admin pages with year filter UI
- Fix Mantine color array in AdminThemeProvider (add 10th element)
- Fix invalid Mantine color scale in paguTable.tsx (gray.50 -> gray.1)
- Add Kependudukan menu to navbar-list-menu.ts
- Fix Bun JSON import resolution with loadJsonData helper
- Update 74 seeder files to use dynamic JSON loading

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-04-10 11:54:36 +08:00
parent 5e822f0b05
commit 8b14c6ce44
146 changed files with 3051 additions and 201 deletions

View File

@@ -1,8 +1,10 @@
import prisma from "@/lib/prisma";
import daftarInformasiPublik from "../../../data/ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json"
import jenisInformasiDiminta from "../../../data/list-jenisInfromasi.json"
import caraMemperolehInformasi from "../../../data/list-caraMemperolehInformasi.json"
import caraMemperolehSalinanInformasi from "../../../data/list-caraMemperolehSalinanInformasi.json"
import { loadJsonData } from "../../../load-json";
const daftarInformasiPublik = loadJsonData("ppid/daftar-informasi-publik-desa-darmasaba/daftarInformasi.json");
const jenisInformasiDiminta = loadJsonData("list-jenisInfromasi.json");
const caraMemperolehInformasi = loadJsonData("list-caraMemperolehInformasi.json");
const caraMemperolehSalinanInformasi = loadJsonData("list-caraMemperolehSalinanInformasi.json");
export async function seedDaftarInformasiPublikPpid() {

View File

@@ -1,5 +1,7 @@
import prisma from "@/lib/prisma";
import dasarHukumPPID from "../../../data/ppid/dasar-hukum-ppid/dasarhukumPPID.json"
import { loadJsonData } from "../../../load-json";
const dasarHukumPPID = loadJsonData("ppid/dasar-hukum-ppid/dasarhukumPPID.json");
export async function seedDasarHukumPpid() {
for (const v of dasarHukumPPID) {

View File

@@ -1,7 +1,9 @@
import prisma from "@/lib/prisma";
import jenisKelamin from "../../../data/ppid/ikm/jenis-kelamin/jenis-kelamin.json";
import pilihanRatingResponden from "../../../data/ppid/ikm/pilihan-rating-responden/rating-responden.json";
import umurResponden from "../../../data/ppid/ikm/umur-responden/umur-responden.json";
import { loadJsonData } from "../../../load-json";
const jenisKelamin = loadJsonData("ppid/ikm/jenis-kelamin/jenis-kelamin.json");
const pilihanRatingResponden = loadJsonData("ppid/ikm/pilihan-rating-responden/rating-responden.json");
const umurResponden = loadJsonData("ppid/ikm/umur-responden/umur-responden.json");
export async function seedIkmPpid() {
for (const j of jenisKelamin) {

View File

@@ -1,5 +1,7 @@
import prisma from "@/lib/prisma";
import profilPpd from "../../../data/ppid/profile-ppid/profilePPid.json"
import { loadJsonData } from "../../../load-json";
const profilPpd = loadJsonData("ppid/profile-ppid/profilePPid.json");
export async function seedProfilPpd() {
console.log("🔄 Seeding Profil PPD...");

View File

@@ -0,0 +1,161 @@
import prisma from "@/lib/prisma";
import { loadJsonData } from "../../load-json";
const strukturOrganisasiPpidJson = loadJsonData("ppid/struktur-organisasi-ppid/struktur-organisasi-ppid.json");
const formulirPermohonanKeberatanJson = loadJsonData("ppid/formulir-permohonan-keberatan/formulir-permohonan-keberatan.json");
const ikmJson = loadJsonData("ppid/ikm/indeks-kepuasan-masyarakat/indeks-kepuasan-masyarakat.json");
const grafikJenisKelaminJson = loadJsonData("ppid/ikm/grafik-jenis-kelamin/grafik-jenis-kelamin.json");
const grafikRespondenJson = loadJsonData("ppid/ikm/grafik-responden/grafik-responden.json");
const grafikUmurJson = loadJsonData("ppid/ikm/grafik-umur/grafik-umur.json");
export async function seedStrukturOrganisasiPpid() {
console.log("🔄 Seeding StrukturOrganisasiPPID...");
for (const item of strukturOrganisasiPpidJson) {
await prisma.strukturOrganisasiPPID.upsert({
where: { id: item.id },
update: {
posisiOrganisasiId: item.posisiOrganisasiId,
pegawaiId: item.pegawaiId,
hubunganOrganisasiId: item.hubunganOrganisasiId,
},
create: {
id: item.id,
posisiOrganisasiId: item.posisiOrganisasiId,
pegawaiId: item.pegawaiId,
hubunganOrganisasiId: item.hubunganOrganisasiId,
},
});
console.log(`✅ StrukturOrganisasiPPID seeded: ${item.id}`);
}
console.log("🎉 StrukturOrganisasiPPID seed selesai");
}
export async function seedFormulirPermohonanKeberatan() {
console.log("🔄 Seeding FormulirPermohonanKeberatan...");
for (const item of formulirPermohonanKeberatanJson) {
await prisma.formulirPermohonanKeberatan.upsert({
where: { id: item.id },
update: {
name: item.name,
email: item.email,
notelp: item.notelp,
alasan: item.alasan,
},
create: {
id: item.id,
name: item.name,
email: item.email,
notelp: item.notelp,
alasan: item.alasan,
},
});
console.log(`✅ FormulirPermohonanKeberatan seeded: ${item.name}`);
}
console.log("🎉 FormulirPermohonanKeberatan seed selesai");
}
export async function seedIndeksKepuasanMasyarakat() {
console.log("🔄 Seeding IndeksKepuasanMasyarakat...");
for (const item of ikmJson) {
await prisma.indeksKepuasanMasyarakat.upsert({
where: { id: item.id },
update: {
label: item.label,
kepuasan: item.kepuasan,
},
create: {
id: item.id,
label: item.label,
kepuasan: item.kepuasan,
},
});
console.log(`✅ IndeksKepuasanMasyarakat seeded: ${item.label}`);
}
console.log("🎉 IndeksKepuasanMasyarakat seed selesai");
}
export async function seedGrafikBerdasarkanJenisKelamin() {
console.log("🔄 Seeding GrafikBerdasarkanJenisKelamin...");
for (const item of grafikJenisKelaminJson) {
await prisma.grafikBerdasarkanJenisKelamin.upsert({
where: { id: item.id },
update: {
perempuan: item.perempuan,
laki: item.laki,
},
create: {
id: item.id,
perempuan: item.perempuan,
laki: item.laki,
},
});
console.log(`✅ GrafikBerdasarkanJenisKelamin seeded: ${item.id}`);
}
console.log("🎉 GrafikBerdasarkanJenisKelamin seed selesai");
}
export async function seedGrafikBerdasarkanResponden() {
console.log("🔄 Seeding GrafikBerdasarkanResponden...");
for (const item of grafikRespondenJson) {
await prisma.grafikBerdasarkanResponden.upsert({
where: { id: item.id },
update: {
sangatbaik: item.sangatbaik,
baik: item.baik,
kurangbaik: item.kurangbaik,
tidakbaik: item.tidakbaik,
},
create: {
id: item.id,
sangatbaik: item.sangatbaik,
baik: item.baik,
kurangbaik: item.kurangbaik,
tidakbaik: item.tidakbaik,
},
});
console.log(`✅ GrafikBerdasarkanResponden seeded: ${item.id}`);
}
console.log("🎉 GrafikBerdasarkanResponden seed selesai");
}
export async function seedGrafikBerdasarkanUmur() {
console.log("🔄 Seeding GrafikBerdasarkanUmur...");
for (const item of grafikUmurJson) {
await prisma.grafikBerdasarkanUmur.upsert({
where: { id: item.id },
update: {
remaja: item.remaja,
dewasa: item.dewasa,
orangtua: item.orangtua,
lansia: item.lansia,
},
create: {
id: item.id,
remaja: item.remaja,
dewasa: item.dewasa,
orangtua: item.orangtua,
lansia: item.lansia,
},
});
console.log(`✅ GrafikBerdasarkanUmur seeded: ${item.id}`);
}
console.log("🎉 GrafikBerdasarkanUmur seed selesai");
}

View File

@@ -1,6 +1,8 @@
import prisma from "@/lib/prisma";
import pegawaiPpid from "../../../data/ppid/struktur-ppid/pegawai-PPID.json"
import posisiOrganisasiPPID from "../../../data/ppid/struktur-ppid/posisi-organisasi-PPID.json"
import { loadJsonData } from "../../../load-json";
const pegawaiPpid = loadJsonData("ppid/struktur-ppid/pegawai-PPID.json");
const posisiOrganisasiPPID = loadJsonData("ppid/struktur-ppid/posisi-organisasi-PPID.json");
export async function seedPegawaiPpid() {

View File

@@ -1,5 +1,7 @@
import prisma from "@/lib/prisma";
import visiMisiPPID from "../../../data/ppid/visi-misi-ppid/visimisiPPID.json"
import { loadJsonData } from "../../../load-json";
const visiMisiPPID = loadJsonData("ppid/visi-misi-ppid/visimisiPPID.json");
export async function seedVisiMisiPpid() {
for (const v of visiMisiPPID) {