feat(kesehatan): posyandu banjar relation, redesign halaman publik, fix tips keamanan image
- Tambah model Banjar + relasi ke Posyandu (migration + seeder) - Update API posyandu (create/update/find) untuk support banjarId - Tambah endpoint banjar di kesehatan API - Redesign halaman publik posyandu dengan tabs: ringkasan, data posyandu, balita, ibu hamil - Update halaman admin posyandu list/create/edit/detail untuk banjar - Fix image ketukar pada seed tips keamanan - Hapus seeder core yang sudah tidak dipakai Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,57 +0,0 @@
|
||||
import prisma from "@/lib/prisma";
|
||||
import { loadJsonData } from "../../load-json";
|
||||
|
||||
const appMenuJson = loadJsonData("core/app-menu.json");
|
||||
const appMenuChildJson = loadJsonData("core/app-menu-child.json");
|
||||
|
||||
export async function seedAppMenu() {
|
||||
console.log("🔄 Seeding AppMenu...");
|
||||
|
||||
for (const item of appMenuJson) {
|
||||
await prisma.appMenu.upsert({
|
||||
where: { id: item.id },
|
||||
update: {
|
||||
name: item.name,
|
||||
link: item.link,
|
||||
isActive: item.isActive,
|
||||
},
|
||||
create: {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
link: item.link,
|
||||
isActive: item.isActive,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`✅ AppMenu seeded: ${item.name}`);
|
||||
}
|
||||
|
||||
console.log("🎉 AppMenu seed selesai");
|
||||
}
|
||||
|
||||
export async function seedAppMenuChild() {
|
||||
console.log("🔄 Seeding AppMenuChild...");
|
||||
|
||||
for (const item of appMenuChildJson) {
|
||||
await prisma.appMenuChild.upsert({
|
||||
where: { id: item.id },
|
||||
update: {
|
||||
name: item.name,
|
||||
link: item.link,
|
||||
isActive: item.isActive,
|
||||
appMenuId: item.appMenuId,
|
||||
},
|
||||
create: {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
link: item.link,
|
||||
isActive: item.isActive,
|
||||
appMenuId: item.appMenuId,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`✅ AppMenuChild seeded: ${item.name}`);
|
||||
}
|
||||
|
||||
console.log("🎉 AppMenuChild seed selesai");
|
||||
}
|
||||
@@ -1,69 +0,0 @@
|
||||
import prisma from "@/lib/prisma";
|
||||
import { loadJsonData } from "../../load-json";
|
||||
|
||||
const layananJson = loadJsonData("core/layanan.json");
|
||||
const potensiJson = loadJsonData("core/potensi.json");
|
||||
const landingPageLayananJson = loadJsonData("core/landingpage-layanan.json");
|
||||
|
||||
export async function seedLayananCore() {
|
||||
console.log("🔄 Seeding Layanan...");
|
||||
|
||||
for (const item of layananJson) {
|
||||
await prisma.layanan.upsert({
|
||||
where: { id: item.id },
|
||||
update: {
|
||||
name: item.name,
|
||||
},
|
||||
create: {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`✅ Layanan seeded: ${item.name}`);
|
||||
}
|
||||
|
||||
console.log("🎉 Layanan seed selesai");
|
||||
}
|
||||
|
||||
export async function seedPotensiCore() {
|
||||
console.log("🔄 Seeding Potensi...");
|
||||
|
||||
for (const item of potensiJson) {
|
||||
await prisma.potensi.upsert({
|
||||
where: { id: item.id },
|
||||
update: {
|
||||
name: item.name,
|
||||
},
|
||||
create: {
|
||||
id: item.id,
|
||||
name: item.name,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`✅ Potensi seeded: ${item.name}`);
|
||||
}
|
||||
|
||||
console.log("🎉 Potensi seed selesai");
|
||||
}
|
||||
|
||||
export async function seedLandingPageLayanan() {
|
||||
console.log("🔄 Seeding LandingPage_Layanan...");
|
||||
|
||||
for (const item of landingPageLayananJson) {
|
||||
await prisma.landingPage_Layanan.upsert({
|
||||
where: { id: item.id },
|
||||
update: {
|
||||
deksripsi: item.deksripsi,
|
||||
},
|
||||
create: {
|
||||
id: item.id,
|
||||
deksripsi: item.deksripsi,
|
||||
},
|
||||
});
|
||||
|
||||
console.log(`✅ LandingPage_Layanan seeded: ${item.id}`);
|
||||
}
|
||||
|
||||
console.log("🎉 LandingPage_Layanan seed selesai");
|
||||
}
|
||||
@@ -32,6 +32,7 @@ export async function seedPosyandu() {
|
||||
deskripsi: p.deskripsi,
|
||||
jadwalPelayanan: p.jadwalPelayanan,
|
||||
imageId,
|
||||
banjarId: p.banjarId || null,
|
||||
},
|
||||
create: {
|
||||
id: p.id,
|
||||
@@ -40,6 +41,7 @@ export async function seedPosyandu() {
|
||||
deskripsi: p.deskripsi,
|
||||
jadwalPelayanan: p.jadwalPelayanan,
|
||||
imageId,
|
||||
banjarId: p.banjarId || null,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
19
prisma/_seeder_list/kesehatan/seed_banjar.ts
Normal file
19
prisma/_seeder_list/kesehatan/seed_banjar.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
import prisma from "@/lib/prisma";
|
||||
import { loadJsonData } from "../../load-json";
|
||||
|
||||
const banjarJson = loadJsonData("kesehatan/banjar/banjar.json");
|
||||
|
||||
export async function seedBanjar() {
|
||||
console.log("🔄 Seeding Banjar...");
|
||||
|
||||
for (const b of banjarJson) {
|
||||
await prisma.banjar.upsert({
|
||||
where: { id: b.id },
|
||||
update: { name: b.name },
|
||||
create: { id: b.id, name: b.name },
|
||||
});
|
||||
console.log(`✅ Banjar seeded: ${b.name}`);
|
||||
}
|
||||
|
||||
console.log("🎉 Banjar seed selesai");
|
||||
}
|
||||
@@ -3,12 +3,12 @@
|
||||
"id": "cmkp70zau0002vnu9o1jtpi1i",
|
||||
"judul": "Keamanan Rumah",
|
||||
"deskripsi": "<p><ul><li><p>Pastikan pintu dan jendela selalu terkunci saat meninggalkan rumah</p></li><li><p>Pasang lampu penerangan di halaman dan area sekitar rumah untuk mencegah tindak kejahatan.</p></li><li><p>Jangan mudah memberikan akses masuk ke orang yang tidak dikenal.</p></li></ul></p>",
|
||||
"imageName": "dSe0xyvNLkP2t2f6iq-Hk-mobile.webp"
|
||||
"imageName": "vwZsaxcoFWDlxG1PW7FC0-mobile.webp"
|
||||
},
|
||||
{
|
||||
"id": "cmkp71pzo0005vnu9p3n9646d",
|
||||
"judul": "Keamanan Lingkungan Tanggungjawab Bersama",
|
||||
"deskripsi": "<p>Pemerintah Desa Darmasaba melaksanakan sosialisasi dan pembinaan tentang keamanan dan ketertiban lingkungan kepada warga Perumahan Darmasaba Permai. Warga diajak berperan aktif dalam menjaga keamanan lingkungan serta mendukung penyediaan lampu penerangan jalan untuk mencegah tindak kriminal dan kecelakaan. Bhabinkamtibmas dan Babinsa turut memberikan materi keamanan dan ketertiban kepada warga, menekankan pentingnya partisipasi masyarakat dalam menjaga keamanan desa.</p>",
|
||||
"imageName": "vwZsaxcoFWDlxG1PW7FC0-mobile.webp"
|
||||
"imageName": "dSe0xyvNLkP2t2f6iq-Hk-mobile.webp"
|
||||
}
|
||||
]
|
||||
10
prisma/data/kesehatan/banjar/banjar.json
Normal file
10
prisma/data/kesehatan/banjar/banjar.json
Normal file
@@ -0,0 +1,10 @@
|
||||
[
|
||||
{ "id": "banjar_pudak_amara_001", "name": "Banjar Pudak Amara" },
|
||||
{ "id": "banjar_mawar_001", "name": "Banjar Mawar" },
|
||||
{ "id": "banjar_melati_001", "name": "Banjar Melati" },
|
||||
{ "id": "banjar_dahlia_001", "name": "Banjar Dahlia" },
|
||||
{ "id": "banjar_anggrek_001", "name": "Banjar Anggrek" },
|
||||
{ "id": "banjar_kamboja_001", "name": "Banjar Kamboja" },
|
||||
{ "id": "banjar_melur_001", "name": "Banjar Melur" },
|
||||
{ "id": "banjar_kenanga_001", "name": "Banjar Kenanga" }
|
||||
]
|
||||
@@ -5,55 +5,63 @@
|
||||
"nomor": "(0361) 8463263",
|
||||
"deskripsi": "<p>Posyandu Pudak Amara merupakan salah satu posyandu aktif di Desa Darmasaba dan pernah berkompetisi dalam lomba kader dan posyandu berprestasi tingkat Provinsi Bali tahun 2025.</p>",
|
||||
"jadwalPelayanan": "Senin, 10 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"imageName": "TDQReg1lQ73s39crXW0ra-mobile.webp"
|
||||
"imageName": "TDQReg1lQ73s39crXW0ra-mobile.webp",
|
||||
"banjarId": "banjar_pudak_amara_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_mawar_001",
|
||||
"name": "Posyandu Mawar",
|
||||
"nomor": "(0361) 8463264",
|
||||
"deskripsi": "<p>Posyandu Mawar melayani kesehatan ibu dan anak di wilayah Banjar Mawar, Desa Darmasaba, dengan fokus pada pemantauan tumbuh kembang balita dan kesehatan ibu hamil.</p>",
|
||||
"jadwalPelayanan": "Senin, 15 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Senin, 15 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_mawar_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_melati_001",
|
||||
"name": "Posyandu Melati",
|
||||
"nomor": "(0361) 8463265",
|
||||
"deskripsi": "<p>Posyandu Melati berperan aktif dalam pelayanan kesehatan dasar masyarakat di Banjar Melati, meliputi imunisasi, penimbangan balita, dan konsultasi gizi.</p>",
|
||||
"jadwalPelayanan": "Selasa, 16 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Selasa, 16 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_melati_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_dahlia_001",
|
||||
"name": "Posyandu Dahlia",
|
||||
"nomor": "(0361) 8463266",
|
||||
"deskripsi": "<p>Posyandu Dahlia aktif melayani masyarakat Banjar Dahlia dengan program unggulan pemantauan stunting dan pemberian makanan tambahan bagi balita berisiko.</p>",
|
||||
"jadwalPelayanan": "Rabu, 17 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Rabu, 17 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_dahlia_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_anggrek_001",
|
||||
"name": "Posyandu Anggrek",
|
||||
"nomor": "(0361) 8463267",
|
||||
"deskripsi": "<p>Posyandu Anggrek melayani ibu hamil, ibu menyusui, dan balita di wilayah Banjar Anggrek dengan dukungan tenaga kesehatan dari Puskesmas Abiansemal 3.</p>",
|
||||
"jadwalPelayanan": "Kamis, 18 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Kamis, 18 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_anggrek_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_kamboja_001",
|
||||
"name": "Posyandu Kamboja",
|
||||
"nomor": "(0361) 8463268",
|
||||
"deskripsi": "<p>Posyandu Kamboja hadir untuk mendukung kesehatan masyarakat Banjar Kamboja melalui layanan pemeriksaan rutin, imunisasi lengkap, dan edukasi gizi keluarga.</p>",
|
||||
"jadwalPelayanan": "Jumat, 19 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Jumat, 19 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_kamboja_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_melur_001",
|
||||
"name": "Posyandu Melur",
|
||||
"nomor": "(0361) 8463269",
|
||||
"deskripsi": "<p>Posyandu Melur aktif memberikan layanan kesehatan preventif bagi ibu dan anak di Banjar Melur, termasuk deteksi dini stunting dan pemantauan gizi balita.</p>",
|
||||
"jadwalPelayanan": "Sabtu, 20 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Sabtu, 20 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_melur_001"
|
||||
},
|
||||
{
|
||||
"id": "posyandu_kenanga_001",
|
||||
"name": "Posyandu Kenanga",
|
||||
"nomor": "(0361) 8463270",
|
||||
"deskripsi": "<p>Posyandu Kenanga melayani masyarakat Banjar Kenanga dengan program kesehatan ibu dan anak, pemberian vitamin A, dan konseling laktasi bagi ibu menyusui.</p>",
|
||||
"jadwalPelayanan": "Senin, 23 Feb 2026, 08:00 - 11:00 WITA"
|
||||
"jadwalPelayanan": "Senin, 23 Feb 2026, 08:00 - 11:00 WITA",
|
||||
"banjarId": "banjar_kenanga_001"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
[
|
||||
{
|
||||
"id": "struktur-org-ppid-001",
|
||||
"posisiOrganisasiId": "posisi-001",
|
||||
"pegawaiId": "pegawai-001",
|
||||
"posisiOrganisasiId": "kepala_desa",
|
||||
"pegawaiId": "cmgewz4gt000704ib91i3f169",
|
||||
"hubunganOrganisasiId": "hubungan-001"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
-- CreateTable
|
||||
CREATE TABLE "Banjar" (
|
||||
"id" TEXT NOT NULL,
|
||||
"name" TEXT NOT NULL,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
|
||||
CONSTRAINT "Banjar_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Posyandu" ADD COLUMN "banjarId" TEXT;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Posyandu" ADD CONSTRAINT "Posyandu_banjarId_fkey" FOREIGN KEY ("banjarId") REFERENCES "Banjar"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
@@ -1150,6 +1150,16 @@ model DoctorSign {
|
||||
ArtikelKesehatan ArtikelKesehatan[]
|
||||
}
|
||||
|
||||
// ========================================= BANJAR ========================================= //
|
||||
model Banjar {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
posyandus Posyandu[]
|
||||
}
|
||||
|
||||
// ========================================= POSYANDU ========================================= //
|
||||
model Posyandu {
|
||||
id String @id @default(cuid())
|
||||
@@ -1159,6 +1169,8 @@ model Posyandu {
|
||||
jadwalPelayanan String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
banjar Banjar? @relation(fields: [banjarId], references: [id])
|
||||
banjarId String?
|
||||
ibuHamil IbuHamil[]
|
||||
balita Balita[]
|
||||
createdAt DateTime @default(now())
|
||||
|
||||
@@ -38,6 +38,7 @@ import { seedKontakDaruratKeamanan } from "./_seeder_list/keamanan/seed_kontak_d
|
||||
import { seedLaporanPublik } from "./_seeder_list/keamanan/seed_laporan_publik";
|
||||
import { seedPencegahanKriminalitas } from "./_seeder_list/keamanan/seed_pencegahan_kriminalitas";
|
||||
import { seedPolsekTerdekat } from "./_seeder_list/keamanan/seed_polsek_terdekat";
|
||||
import { seedTipsKeamanan } from "./_seeder_list/keamanan/seed_tips_keamanan";
|
||||
import { seedArtikelKesehatan } from "./_seeder_list/kesehatan/artikel-kesehatan/seed_artikel_kesehatan";
|
||||
import { seedFasilitasKesehatan } from "./_seeder_list/kesehatan/fasilitas-kesehatan/seed_fasilitas_kesehatan";
|
||||
import { seedInfoWabahPenyakit } from "./_seeder_list/kesehatan/info-wabah-penyakit/seed_info_wabah_penyakit";
|
||||
@@ -49,6 +50,7 @@ import { seedProgramKesehatan } from "./_seeder_list/kesehatan/program-kesehatan
|
||||
import { seedPuskesmas } from "./_seeder_list/kesehatan/puskesmas/seed_puskesmas";
|
||||
import { seedGrafikKepuasan } from "./_seeder_list/kesehatan/seed_grafik_kepuasan";
|
||||
import { seedKelahiranKematian } from "./_seeder_list/kesehatan/seed_kelahiran_kematian";
|
||||
import { seedBanjar } from "./_seeder_list/kesehatan/seed_banjar";
|
||||
import { seedRingkasanKesehatan } from "./_seeder_list/kesehatan/seed_ringkasan_kesehatan";
|
||||
import { seedIbuHamil } from "./_seeder_list/kesehatan/seed_ibu_hamil";
|
||||
import { seedBalita } from "./_seeder_list/kesehatan/seed_balita";
|
||||
@@ -84,6 +86,7 @@ import { seedIkmPpid } from "./_seeder_list/ppid/ikm/seed_ikm";
|
||||
import { seedProfilPpd } from "./_seeder_list/ppid/profil-ppid/seed_profil_ppd";
|
||||
import { seedPegawaiPpid } from "./_seeder_list/ppid/struktur-ppid/seed_struktur_ppid";
|
||||
import { seedVisiMisiPpid } from "./_seeder_list/ppid/visi-misi-ppid/seed_visi_misi_ppid";
|
||||
import { seedStrukturOrganisasiPpid, seedFormulirPermohonanKeberatan, seedIndeksKepuasanMasyarakat, seedGrafikBerdasarkanJenisKelamin, seedGrafikBerdasarkanResponden, seedGrafikBerdasarkanUmur } from "./_seeder_list/ppid/seed_ppid_extra";
|
||||
import roles from "./data/user/roles.json";
|
||||
import users from "./data/user/users.json";
|
||||
import { safeSeedUnique } from "./safeseedUnique";
|
||||
@@ -219,6 +222,12 @@ import seedAssets from "./seed_assets";
|
||||
|
||||
// // =========== SUBMENU INDEKS KEPUASAN MASYARAKAT ===========
|
||||
await seedIkmPpid();
|
||||
await seedStrukturOrganisasiPpid();
|
||||
await seedFormulirPermohonanKeberatan();
|
||||
await seedIndeksKepuasanMasyarakat();
|
||||
await seedGrafikBerdasarkanJenisKelamin();
|
||||
await seedGrafikBerdasarkanResponden();
|
||||
await seedGrafikBerdasarkanUmur();
|
||||
|
||||
// // =========== MENU DESA ===========
|
||||
// // =========== SUBMENU PROFILE ===========
|
||||
@@ -245,6 +254,9 @@ import seedAssets from "./seed_assets";
|
||||
await seedPenghargaan();
|
||||
|
||||
// // ====================== MENU KESEHATAN ========================
|
||||
// // ==================== SUBMENU BANJAR =========================
|
||||
await seedBanjar();
|
||||
|
||||
// // ==================== SUBMENU POSYANDU =========================
|
||||
await seedPosyandu();
|
||||
|
||||
@@ -285,7 +297,7 @@ import seedAssets from "./seed_assets";
|
||||
await seedCctv();
|
||||
|
||||
// // ==================== SUBMENU TIPS KEAMANAN ==================
|
||||
await seedKeamananLingkungan();
|
||||
await seedTipsKeamanan();
|
||||
|
||||
// // ====================== MENU EKONOMI ========================
|
||||
// // ==================== SUBMENU UMKM ==========================
|
||||
|
||||
Reference in New Issue
Block a user