diff --git a/prisma/data/landing-page/desa-anti-korupsi/desaantiKorpusi.json b/prisma/data/landing-page/desa-anti-korupsi/desaantiKorpusi.json new file mode 100644 index 00000000..dfd2f4eb --- /dev/null +++ b/prisma/data/landing-page/desa-anti-korupsi/desaantiKorpusi.json @@ -0,0 +1,128 @@ +[ + { + "id": "cmds9h9ko000pvnberdjnx64b", + "name": "1.1 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PERENCANAAN, PELAKSANAAN, PENATAUSAHAAN DAN PERTANGGUNG JAWABAN APBDES BESERTA IMPLEMENTASINYA", + "deskripsi": "

ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PERENCANAAN, PELAKSANAAN, PENATAUSAHAAN DAN PERTANGGUNG JAWABAN APBDES BESERTA IMPLEMENTASINYA

", + "kategoriId": "cmds9es2o000ivnbe1o0swrvh", + "fileId": "" + }, + { + "id": "cmds9sjmz000svnbesv2133of", + "name": "1.2 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP MENGENAI MEKANISME EVALUASI KINERJA PERANGKAT DESA", + "deskripsi": "

ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP MENGENAI MEKANISME EVALUASI KINERJA PERANGKAT DESA

", + "kategoriId": "cmds9es2o000ivnbe1o0swrvh", + "fileId": "" + }, + { + "id": "cmds9tcpi000vvnbev3ebtlnt", + "name": "1.3 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PENGENDALIAN GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN", + "deskripsi": "

ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PENGENDALIAN GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN

", + "kategoriId": "cmds9es2o000ivnbe1o0swrvh", + "fileId": "" + }, + { + "id": "cmds9twvj000yvnbep0pq8dzf", + "name": "1.4 PERJANJIAN KERJA SAMA ANTARA PELAKSANA KEGIATAN ANGGARAN DENGAN PIHAK PENYEDIA, DAN TELAH MELALUI PROSES PENGADAAN BARANG/JASA DI DESA", + "deskripsi": "

PERJANJIAN KERJA SAMA ANTARA PELAKSANA KEGIATAN ANGGARAN DENGAN PIHAK PENYEDIA, DAN TELAH MELALUI PROSES PENGADAAN BARANG/JASA DI DESA

", + "kategoriId": "cmds9es2o000ivnbe1o0swrvh", + "fileId": "" + }, + { + "id": "cmds9ugap0011vnbe118yv871", + "name": "1.5 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PAKTA INTEGRITAS DAN SEJENISNYA", + "deskripsi": "

ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PAKTA INTEGRITAS DAN SEJENISNYA

", + "kategoriId": "cmds9es2o000ivnbe1o0swrvh", + "fileId": "" + }, + { + "id": "cmdsa35310014vnbe6qy6l1rz", + "name": "2.1 ADANYA KEGIATAN PENGAWASAN DAN EVALUASI KINERJA PERANGKAT DESA", + "deskripsi": "

ADANYA KEGIATAN PENGAWASAN DAN EVALUASI KINERJA PERANGKAT DESA

", + "kategoriId": "cmds9f2ua000jvnbeksu1sfwm", + "fileId": "" + }, + { + "id": "cmdsa46590017vnbepp3noso1", + "name": "2.2 ADANYA TINDAK LANJUT HASIL PEMBINAAN, PETUNJUK, ARAH, PENGAWASAN, DAN PEMERIKSAAN DARI PEMERINTAH PUSAT/DAERAH", + "deskripsi": "

ADANYA TINDAK LANJUT HASIL PEMBINAAN, PETUNJUK, ARAH, PENGAWASAN, DAN PEMERIKSAAN DARI PEMERINTAH PUSAT/DAERAH

", + "kategoriId": "cmds9f2ua000jvnbeksu1sfwm", + "fileId": "" + }, + { + "id": "cmdsa5m7z001avnbe4cvfrcz0", + "name": "2.3 TIDAK ADANYA APARATUR DESA DALAM 3(TIGA) TAHUN TERAKHIR YANG TERJERAT TINDAKAN PIDANA KORUPSI", + "deskripsi": "

TIDAK ADANYA APARATUR DESA DALAM 3(TIGA) TAHUN TERAKHIR YANG TERJERAT TINDAKAN PIDANA KORUPSI

", + "kategoriId": "cmds9f2ua000jvnbeksu1sfwm", + "fileId": "" + }, + { + "id": "cmdsa8q5q001dvnbemch8j24x", + "name": "3.1 ADANYA LAYANAN PENGADUAN BAGI MASYARAKAT", + "deskripsi": "

ADANYA LAYANAN PENGADUAN BAGI MASYARAKAT

", + "kategoriId": "cmds9fr73000kvnbe6w281dcl", + "fileId": "" + }, + { + "id": "cmdsa9lbi001gvnbequn2ba7m", + "name": "3.2 ADANYA SURVEY KEPUASAN MASYARAKAT (SKM) TERHADAP LAYANAN PEMERINTAH DESA", + "deskripsi": "

ADANYA SURVEY KEPUASAN MASYARAKAT (SKM) TERHADAP LAYANAN PEMERINTAH DESA

", + "kategoriId": "cmds9fr73000kvnbe6w281dcl", + "fileId": "" + }, + { + "id": "cmdsaa7aq001jvnbeizh04e67", + "name": "3.3 ADANYA KETERBUKAAN AKSES MASYARAKAT TERHADAP INFORMASI LAYANAN PEMERINTAH DESA (KESEHATAN, PENDIDIKAN, SOSIAL, LINGKUNGAN, TRANTIBUMLINMAS, PEKERJAAN UMUM) PEMBANGUNAN, KEPENDUDUKAN, KEUANGAN, DAN PELAYANAN LAINNYA", + "deskripsi": "

ADANYA KETERBUKAAN AKSES MASYARAKAT TERHADAP INFORMASI LAYANAN PEMERINTAH DESA (KESEHATAN, PENDIDIKAN, SOSIAL, LINGKUNGAN, TRANTIBUMLINMAS, PEKERJAAN UMUM) PEMBANGUNAN, KEPENDUDUKAN, KEUANGAN, DAN PELAYANAN LAINNYA

", + "kategoriId": "cmds9fr73000kvnbe6w281dcl", + "fileId": "" + }, + { + "id": "cmdsaaw8d001mvnbek3tfefrk", + "name": "3.4 ADANYA MEDIA INFORMASI TENTANG APBDES DI BALAI DESA DAN/ATAU TEMPAT LAIN YANG MUDAH DIAKSES OLEH MASYARAKAT", + "deskripsi": "

ADANYA MEDIA INFORMASI TENTANG APBDES DI BALAI DESA DAN/ATAU TEMPAT LAIN YANG MUDAH DIAKSES OLEH MASYARAKAT

", + "kategoriId": "cmds9fr73000kvnbe6w281dcl", + "fileId": "" + }, + { + "id": "cmdsabhif001pvnbepm06hry6", + "name": "3.5 ADANYA MAKLUMAT PELAYANAN", + "deskripsi": "

ADANYA MAKLUMAT PELAYANAN

", + "kategoriId": "cmds9fr73000kvnbe6w281dcl", + "fileId": "" + }, + { + "id": "cmdsag40b001svnbe7krq9khc", + "name": "4.1 ADANYA PARTISIPASI DAN KETERLIBATAN MASYARAKAT DALAM PENYUSUNAN RKP DESA", + "deskripsi": "

ADANYA PARTISIPASI DAN KETERLIBATAN MASYARAKAT DALAM PENYUSUNAN RKP DESA

", + "kategoriId": "cmds9g5ow000lvnbel3rkkwrv", + "fileId": "" + }, + { + "id": "cmdsagkaf001vvnbejo26w8sa", + "name": "4.2 ADANYA KESADARAN MASYARAKAT DALAM MENCEGAH TERJADINYA PRAKTIK GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN", + "deskripsi": "

ADANYA KESADARAN MASYARAKAT DALAM MENCEGAH TERJADINYA PRAKTIK GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN

", + "kategoriId": "cmds9g5ow000lvnbel3rkkwrv", + "fileId": "" + }, + { + "id": "cmdsah4qe001yvnbeiy3mwrvb", + "name": "4.3 ADANYA KETERLIBATAN LEMBAGA KEMASYARAKATAN DALAM PELAKSANAAN PEMBANGUNAN DESA", + "deskripsi": "

ADANYA KETERLIBATAN LEMBAGA KEMASYARAKATAN DALAM PELAKSANAAN PEMBANGUNAN DESA

", + "kategoriId": "cmds9g5ow000lvnbel3rkkwrv", + "fileId": "" + }, + { + "id": "cmdsak5vn0021vnbemg86aab4", + "name": "5.1 ADANYA BUDAYA LOKAL/HUKUM ADAT YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI", + "deskripsi": "

ADANYA BUDAYA LOKAL/HUKUM ADAT YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI

", + "kategoriId": "cmds9govb000mvnbesq8b4y99", + "fileId": "" + }, + { + "id": "cmdsalc800024vnbezgulhgrb", + "name": "5.2 ADANYA TOKOH MASYARAKAT, TOKOH AGAMA, TOKOH ADAT, TOKOH PEMUDA, DAN KAUM PEREMPUAN YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI", + "deskripsi": "

ADANYA TOKOH MASYARAKAT, TOKOH AGAMA, TOKOH ADAT, TOKOH PEMUDA, DAN KAUM PEREMPUAN YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI

", + "kategoriId": "cmds9govb000mvnbesq8b4y99", + "fileId": "" + } +] \ No newline at end of file diff --git a/prisma/data/landing-page/desa-anti-korupsi/kategoriDesaAntiJKorupsi.json b/prisma/data/landing-page/desa-anti-korupsi/kategoriDesaAntiJKorupsi.json new file mode 100644 index 00000000..eaed17c4 --- /dev/null +++ b/prisma/data/landing-page/desa-anti-korupsi/kategoriDesaAntiJKorupsi.json @@ -0,0 +1,22 @@ +[ + { + "id": "cmds9es2o000ivnbe1o0swrvh", + "name": "PENGUATAN TATA LAKSANA" + }, + { + "id": "cmds9f2ua000jvnbeksu1sfwm", + "name": "PENGUATAN PENGAWASAN" + }, + { + "id": "cmds9fr73000kvnbe6w281dcl", + "name": "PENGUATAN KUALITAS PELAYANAN PUBLIK" + }, + { + "id": "cmds9g5ow000lvnbel3rkkwrv", + "name": "PENGUATAN PARTISIPASI MASYARAKAT" + }, + { + "id": "cmds9govb000mvnbesq8b4y99", + "name": "KEARIFAN LOKAL" + } +] \ No newline at end of file diff --git a/prisma/data/landing-page/profile.json b/prisma/data/landing-page/profile.json deleted file mode 100644 index 15f6f542..00000000 --- a/prisma/data/landing-page/profile.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - { - "id": "edit", - "name": "I.B Surya Prabhawa Manuaba, S.H., M.H.", - "position": "Perbekel Darmasaba periode 2021-2027" - } - ] - \ No newline at end of file diff --git a/prisma/data/landing-page/profile/mediaSosial.json b/prisma/data/landing-page/profile/mediaSosial.json new file mode 100644 index 00000000..b2361ebd --- /dev/null +++ b/prisma/data/landing-page/profile/mediaSosial.json @@ -0,0 +1,32 @@ +[ + { + "id": "cmds8w2q60002vnbe6i8qhkuo", + "name": "Telephone Desa Darmasaba", + "iconUrl": "081239580000" + }, + { + "id": "cmds8z7u20005vnbegyyvnbk0", + "name": "Email Desa Darmasaba", + "iconUrl": "desadarmasaba@badungkab.go.id" + }, + { + "id": "cmds9023u0008vnbe3oxmhwyf", + "name": "Desa Darmasaba", + "iconUrl": "https://www.youtube.com/channel/UCtPw9WOQO7d2HIKzKgel4Xg" + }, + { + "id": "cmds90oul000bvnbe2bqkptoi", + "name": "Pemerintah Desa Darmasaba", + "iconUrl": "https://www.facebook.com/DarmasabaDesaku" + }, + { + "id": "cmds91i4e000evnbe8gtf1gub", + "name": "ddarmasaba", + "iconUrl": "https://www.instagram.com/ddarmasaba/" + }, + { + "id": "cmds92de5000hvnbemlu6sq5x", + "name": "desa.darmasaba", + "iconUrl": "https://www.tiktok.com/@desa.darmasaba?is_from_webapp=1&sender_device=pc" + } +] diff --git a/prisma/data/landing-page/profile/profile.json b/prisma/data/landing-page/profile/profile.json new file mode 100644 index 00000000..a30af2c7 --- /dev/null +++ b/prisma/data/landing-page/profile/profile.json @@ -0,0 +1,7 @@ +[ + { + "id": "edit", + "name": "I.B Surya Prabhawa Manuaba, S.H., M.H.", + "position": "Perbekel Darmasaba periode 2021-2027" + } +] diff --git a/prisma/data/landing-page/profile/programInovasi.json b/prisma/data/landing-page/profile/programInovasi.json new file mode 100644 index 00000000..d3fe242d --- /dev/null +++ b/prisma/data/landing-page/profile/programInovasi.json @@ -0,0 +1,50 @@ +[ + { + "id": "cmdr7039z0002vn5rttctt9hn", + "name": "Davest", + "description": "Darmasaba Village Festval", + "link": "https://darmasaba.desa.id/berita/55862-rakor-davest-2024" + }, + { + "id": "cmdr755pf0005vn5rp8tyuubw", + "name": "Dmangan", + "description": "Darmasaba Aman Pangan", + "link": "https://darmasaba.desa.id/berita/61452-kader-d-mangan-berhasil-meraih-prestasi-dalam-ajang-lomba-banjar-bali-quis-bbq-tahun-2024" + }, + { + "id": "cmdr76nqk0008vn5rdddvcxnr", + "name": "Bicara Darmasaba", + "description": "Bicara Darmasaba", + "link": "https://darmasaba.desa.id/berita/42506-bicara-darmasaba" + }, + { + "id": "cmdr77vbw000bvn5rvpmoq31s", + "name": "Bares", + "description": "Darmasaba Recycling Stock/Exchange", + "link": "http://darmasaba.desa.id/berita/56722-bares" + }, + { + "id": "cmdr7bxtp000evn5rmy85wihx", + "name": "Sajjana Dharma Raksaka", + "description": "Sajjana Dharma Raksaka", + "link": "https://ppid.badungkab.go.id/storage/dokumen/5RS9dldGkrgzMQq6bKdZsqsVRHI8gffWv4PGfb3r.pdf" + }, + { + "id": "cmdr7dlnk000hvn5r9lur3z35", + "name": "PDKT", + "description": "Perangkat Desa Kuat Teknologi", + "link": "https://darmasaba.desa.id/berita/53752-p-d-k-t" + }, + { + "id": "cmdr7ftob000mvn5rfhgdtg8v", + "name": "GM", + "description": "Galah Melah", + "link": "https://darmasaba.desa.id/berita/52880-galah-melah" + }, + { + "id": "cmdr7glue000pvn5r6onzslju", + "name": "Inovasi Desa Darmasaba", + "description": "Inovasi Desa Darmasaba", + "link": "https://darmasaba.desa.id/produk-lokal-desa" + } +] diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0a549c51..39c55fae 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -132,8 +132,8 @@ model ProgramInovasi { model MediaSosial { id String @id @default(cuid()) name String - image FileStorage @relation(fields: [imageId], references: [id]) - imageId String + image FileStorage? @relation(fields: [imageId], references: [id]) + imageId String? iconUrl String? @db.VarChar(255) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -148,8 +148,8 @@ model DesaAntiKorupsi { deskripsi String @db.Text kategori KategoriDesaAntiKorupsi @relation(fields: [kategoriId], references: [id]) kategoriId String - file FileStorage @relation(fields: [fileId], references: [id]) - fileId String + file FileStorage? @relation(fields: [fileId], references: [id]) + fileId String? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) diff --git a/prisma/seed.ts b/prisma/seed.ts index 517d12af..b08e2f6e 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,4 +1,7 @@ import prisma from "@/lib/prisma"; +import profilePejabatDesa from "./data/landing-page/profile/profile.json"; +import programInovasi from "./data/landing-page/profile/programInovasi.json"; +import mediaSosial from "./data/landing-page/profile/mediaSosial.json"; import categoryPengumuman from "./data/category-pengumuman.json"; import kategoriBerita from "./data/kategori-berita.json"; import caraMemperolehInformasi from "./data/list-caraMemperolehInformasi.json"; @@ -20,27 +23,82 @@ import kategoriProduk from "./data/ekonomi/pasar-desa/kategori-produk.json"; import hubunganOrganisasi from "./data/ekonomi/struktur-organisasi/hubungan-organisasi.json"; import posisiOrganisasi from "./data/ekonomi/struktur-organisasi/posisi-organisasi.json"; import pegawai from "./data/ekonomi/struktur-organisasi/pegawai.json"; -import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json'; -import tujuanEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json'; -import materiEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json'; -import contohEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json'; -import nilaiKonservasiAdat from './data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json'; -import bentukKonservasiBerdasarkanAdat from './data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json'; -import filosofiTriHita from './data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json'; -import profilePejabatDesa from './data/landing-page/profile.json'; -import tujuanProgram from './data/pendidikan/program-pendidikan-anak/tujuan-program.json'; -import tujuanProgram2 from './data/pendidikan/pendidikan-non-formal/tujuan-program2.json'; -import programUnggulan from './data/pendidikan/program-pendidikan-anak/program-unggulan.json'; -import tujuanBimbinganBelajarDesa from './data/pendidikan/bimbingan-belajar-desa/tujuan-bimbingan-belajar-desa.json'; -import lokasiJadwalBimbinganBelajarDesa from './data/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal.json'; -import fasilitasBimbinganBelajarDesa from './data/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan.json'; -import tempatKegiatan from './data/pendidikan/pendidikan-non-formal/tempat-kegiatan.json'; -import jenisProgramYangDiselenggarakan from './data/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan.json'; +import detailDataPengangguran from "./data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json"; +import tujuanEdukasiLingkungan from "./data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.json"; +import materiEdukasiLingkungan from "./data/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan.json"; +import contohEdukasiLingkungan from "./data/lingkungan/edukasi-lingkungan/contoh-kegiatan-di-desa-darmasaba.json"; +import nilaiKonservasiAdat from "./data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json"; +import bentukKonservasiBerdasarkanAdat from "./data/lingkungan/konservasi-adat-bali/bentuk-konservasi.json"; +import filosofiTriHita from "./data/lingkungan/konservasi-adat-bali/filosofi-tri-hita.json"; +import tujuanProgram from "./data/pendidikan/program-pendidikan-anak/tujuan-program.json"; +import tujuanProgram2 from "./data/pendidikan/pendidikan-non-formal/tujuan-program2.json"; +import programUnggulan from "./data/pendidikan/program-pendidikan-anak/program-unggulan.json"; +import tujuanBimbinganBelajarDesa from "./data/pendidikan/bimbingan-belajar-desa/tujuan-bimbingan-belajar-desa.json"; +import lokasiJadwalBimbinganBelajarDesa from "./data/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal.json"; +import fasilitasBimbinganBelajarDesa from "./data/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan.json"; +import tempatKegiatan from "./data/pendidikan/pendidikan-non-formal/tempat-kegiatan.json"; +import jenisProgramYangDiselenggarakan from "./data/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan.json"; import posisiOrganisasiPPID from "./data/ppid/struktur-ppid/posisi-organisasi-PPID.json"; import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; - (async () => { + // =========== LANDING PAGE =========== + // =========== PROFILE =========== + for (const p of profilePejabatDesa) { + await prisma.pejabatDesa.upsert({ + where: { id: p.id }, + update: { + name: p.name, + position: p.position, + }, + create: { + id: p.id, + name: p.name, + position: p.position, + }, + }); + } + console.log( + "✅ profilePejabatDesa seeded without imageId (editable later via UI)" + ); + + // =========== PROGRAM INOVASI =========== + for (const p of programInovasi) { + await prisma.programInovasi.upsert({ + where: { id: p.id }, + update: { + name: p.name, + description: p.description, + link: p.link, + }, + create: { + id: p.id, + name: p.name, + description: p.description, + link: p.link, + }, + }); + } + console.log("program inovasi success ..."); + + // =========== MEDIA SOSIAL =========== + for (const p of mediaSosial) { + await prisma.mediaSosial.upsert({ + where: { id: p.id }, + update: { + name: p.name, + iconUrl: p.iconUrl, + }, + create: { + id: p.id, + name: p.name, + iconUrl: p.iconUrl, + }, + }); + } + console.log("media sosial success ..."); + + // =========== LAYANAN =========== for (const l of layanan) { await prisma.layanan.upsert({ where: { @@ -134,7 +192,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ profilePerbekel seeded without imageId (editable later via UI)"); + console.log( + "✅ profilePerbekel seeded without imageId (editable later via UI)" + ); for (const l of visiMisiDesa) { await prisma.visiMisiDesa.upsert({ @@ -157,7 +217,7 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; // Flatten the nested array structure for posisiOrganisasiPPID const flattenedPosisiOrganisasiPPID = posisiOrganisasiPPID.flat(); - + for (const p of flattenedPosisiOrganisasiPPID) { await prisma.posisiOrganisasiPPID.upsert({ where: { @@ -182,7 +242,7 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; // Flatten the nested array structure for pegawaiPPID const flattenedPegawaiPPID = pegawaiPPID.flat(); - + for (const p of flattenedPegawaiPPID) { await prisma.pegawaiPPID.upsert({ where: { @@ -252,7 +312,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; } console.log("pelayanan penduduk non permanen success ..."); - for (const p of potensi) { await prisma.potensi.upsert({ where: { @@ -422,7 +481,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; } console.log("kategori produk success ..."); - for (const p of posisiOrganisasi) { await prisma.posisiOrganisasi.upsert({ where: { @@ -611,7 +669,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; console.log("bentuk konservasi berdasarkan adat success ..."); - for (const n of nilaiKonservasiAdat) { await prisma.nilaiKonservasiAdat.upsert({ where: { @@ -631,22 +688,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; console.log("nilai konservasi adat success ..."); - for (const p of profilePejabatDesa) { - await prisma.pejabatDesa.upsert({ - where: { id: p.id }, - update: { - name: p.name, - position: p.position, - }, - create: { - id: p.id, - name: p.name, - position: p.position, - }, - }); - } - console.log("✅ profilePejabatDesa seeded without imageId (editable later via UI)"); - for (const t of tujuanProgram) { await prisma.tujuanProgram.upsert({ where: { id: t.id }, @@ -693,7 +734,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ tujuan bimbingan belajar desa seeded (editable later via UI)"); + console.log( + "✅ tujuan bimbingan belajar desa seeded (editable later via UI)" + ); for (const t of lokasiJadwalBimbinganBelajarDesa) { await prisma.lokasiJadwalBimbinganBelajarDesa.upsert({ @@ -709,7 +752,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ lokasi jadwal bimbingan belajar desa seeded (editable later via UI)"); + console.log( + "✅ lokasi jadwal bimbingan belajar desa seeded (editable later via UI)" + ); for (const t of fasilitasBimbinganBelajarDesa) { await prisma.fasilitasBimbinganBelajarDesa.upsert({ @@ -725,7 +770,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ fasilitas bimbingan belajar desa seeded (editable later via UI)"); + console.log( + "✅ fasilitas bimbingan belajar desa seeded (editable later via UI)" + ); for (const t of tujuanProgram2) { await prisma.tujuanPendidikanNonFormal.upsert({ @@ -741,7 +788,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ fasilitas bimbingan belajar desa seeded (editable later via UI)"); + console.log( + "✅ fasilitas bimbingan belajar desa seeded (editable later via UI)" + ); for (const t of tempatKegiatan) { await prisma.tempatKegiatan.upsert({ @@ -757,7 +806,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ fasilitas bimbingan belajar desa seeded (editable later via UI)"); + console.log( + "✅ fasilitas bimbingan belajar desa seeded (editable later via UI)" + ); for (const t of jenisProgramYangDiselenggarakan) { await prisma.jenisProgramYangDiselenggarakan.upsert({ @@ -773,8 +824,9 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json"; }, }); } - console.log("✅ fasilitas bimbingan belajar desa seeded (editable later via UI)"); - + console.log( + "✅ fasilitas bimbingan belajar desa seeded (editable later via UI)" + ); })() .then(() => prisma.$disconnect()) .catch((e) => { diff --git a/src/app/admin/(dashboard)/_state/landing-page/desa-anti-korupsi.ts b/src/app/admin/(dashboard)/_state/landing-page/desa-anti-korupsi.ts index 6eccb4e7..e3f0dc85 100644 --- a/src/app/admin/(dashboard)/_state/landing-page/desa-anti-korupsi.ts +++ b/src/app/admin/(dashboard)/_state/landing-page/desa-anti-korupsi.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"; @@ -54,20 +55,38 @@ const desaAntikorupsi = proxy({ }, }, findMany: { - data: null as Array< - Prisma.DesaAntiKorupsiGetPayload<{ - include: { - file: true; - kategori: true; - }; - }> - > | null, - async load() { - const res = await ApiFetch.api.landingpage.desaantikorupsi[ - "find-many" - ].get(); - if (res.status === 200) { - desaAntikorupsi.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + desaAntikorupsi.findMany.loading = true; // Use the full path to access the property + desaAntikorupsi.findMany.page = page; + try { + const res = await ApiFetch.api.landingpage.desaantikorupsi[ + "findMany" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + desaAntikorupsi.findMany.data = res.data.data || []; + desaAntikorupsi.findMany.total = res.data.total || 0; + desaAntikorupsi.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load media sosial:", res.data?.message); + desaAntikorupsi.findMany.data = []; + desaAntikorupsi.findMany.total = 0; + desaAntikorupsi.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading media sosial:", error); + desaAntikorupsi.findMany.data = []; + desaAntikorupsi.findMany.total = 0; + desaAntikorupsi.findMany.totalPages = 1; + } finally { + desaAntikorupsi.findMany.loading = false; } }, }, @@ -281,14 +300,38 @@ const kategoriDesaAntiKorupsi = proxy({ }, }, findMany: { - data: null as Array<{ - id: string; - name: string; - }> | null, - async load() { - const res = await ApiFetch.api.landingpage.kategoridak["find-many"].get(); - if (res.status === 200) { - kategoriDesaAntiKorupsi.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + kategoriDesaAntiKorupsi.findMany.loading = true; // Use the full path to access the property + kategoriDesaAntiKorupsi.findMany.page = page; + try { + const res = await ApiFetch.api.landingpage.kategoridak[ + "findMany" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + kategoriDesaAntiKorupsi.findMany.data = res.data.data || []; + kategoriDesaAntiKorupsi.findMany.total = res.data.total || 0; + kategoriDesaAntiKorupsi.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load media sosial:", res.data?.message); + kategoriDesaAntiKorupsi.findMany.data = []; + kategoriDesaAntiKorupsi.findMany.total = 0; + kategoriDesaAntiKorupsi.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading media sosial:", error); + kategoriDesaAntiKorupsi.findMany.data = []; + kategoriDesaAntiKorupsi.findMany.total = 0; + kategoriDesaAntiKorupsi.findMany.totalPages = 1; + } finally { + kategoriDesaAntiKorupsi.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/_state/landing-page/profile.ts b/src/app/admin/(dashboard)/_state/landing-page/profile.ts index 4088acd9..b6007bd4 100644 --- a/src/app/admin/(dashboard)/_state/landing-page/profile.ts +++ b/src/app/admin/(dashboard)/_state/landing-page/profile.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"; @@ -5,10 +6,10 @@ import { proxy } from "valtio"; import { z } from "zod"; const templateProgramInovasi = z.object({ - name: z.string().min(3, "Nama minimal 3 karakter"), - description: z.string().min(3, "Deskripsi minimal 3 karakter"), + name: z.string().min(1, "Nama minimal 1 karakter"), + description: z.string().min(1, "Deskripsi minimal 1 karakter"), imageId: z.string().min(1, "Gambar wajib dipilih"), - link: z.string().min(3, "Link minimal 3 karakter"), + link: z.string().min(1, "Link minimal 1 karakter"), }); type ProgramInovasiForm = Prisma.ProgramInovasiGetPayload<{ @@ -59,15 +60,38 @@ const programInovasi = proxy({ }, }, findMany: { - data: null as - | Prisma.ProgramInovasiGetPayload<{ include: { image: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.landingpage.programinovasi[ - "find-many" - ].get(); - if (res.status === 200) { - programInovasi.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + programInovasi.findMany.loading = true; // Use the full path to access the property + programInovasi.findMany.page = page; + try { + const res = await ApiFetch.api.landingpage.programinovasi[ + "findMany" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + programInovasi.findMany.data = res.data.data || []; + programInovasi.findMany.total = res.data.total || 0; + programInovasi.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load pegawai:", res.data?.message); + programInovasi.findMany.data = []; + programInovasi.findMany.total = 0; + programInovasi.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading pegawai:", error); + programInovasi.findMany.data = []; + programInovasi.findMany.total = 0; + programInovasi.findMany.totalPages = 1; + } finally { + programInovasi.findMany.loading = false; } }, }, @@ -453,13 +477,38 @@ const mediaSosial = proxy({ }, }, findMany: { - data: null as - | Prisma.MediaSosialGetPayload<{ include: { image: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.landingpage.mediasosial["find-many"].get(); - if (res.status === 200) { - mediaSosial.findMany.data = res.data?.data ?? []; + data: null as any[] | null, + page: 1, + totalPages: 1, + total: 0, + loading: false, + load: async (page = 1, limit = 10) => { // Change to arrow function + mediaSosial.findMany.loading = true; // Use the full path to access the property + mediaSosial.findMany.page = page; + try { + const res = await ApiFetch.api.landingpage.mediasosial[ + "findMany" + ].get({ + query: { page, limit }, + }); + + if (res.status === 200 && res.data?.success) { + mediaSosial.findMany.data = res.data.data || []; + mediaSosial.findMany.total = res.data.total || 0; + mediaSosial.findMany.totalPages = res.data.totalPages || 1; + } else { + console.error("Failed to load media sosial:", res.data?.message); + mediaSosial.findMany.data = []; + mediaSosial.findMany.total = 0; + mediaSosial.findMany.totalPages = 1; + } + } catch (error) { + console.error("Error loading media sosial:", error); + mediaSosial.findMany.data = []; + mediaSosial.findMany.total = 0; + mediaSosial.findMany.totalPages = 1; + } finally { + mediaSosial.findMany.loading = false; } }, }, diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/page.tsx index 880b7057..4ad364e4 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/page.tsx @@ -1,10 +1,10 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; import { IconEdit, IconSearch, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import JudulList from '../../../_com/judulList'; @@ -34,6 +34,14 @@ function ListKategoriKegiatan({ search }: { search: string }) { const [selectedId, setSelectedId] = useState(null) const router = useRouter() + const { + data, + page, + totalPages, + loading, + load, + } = stateKategori.findMany; + const handleHapus = () => { if (selectedId) { stateKategori.delete.byId(selectedId) @@ -42,23 +50,51 @@ function ListKategoriKegiatan({ search }: { search: string }) { } } - useShallowEffect(() => { - stateKategori.findMany.load() - }, []) + useEffect(() => { + load(page, 10) + }, [page]) - const filteredData = (stateKategori.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.name.toLowerCase().includes(keyword) - ); - }); + const filteredData = useMemo(() => { + if (!data) return []; + return data.filter(item => { + const keyword = search.toLowerCase(); + return ( + item.name?.toLowerCase().includes(keyword) + ); + }) + }, [data, search]); - if (!stateKategori.findMany.data) { + // Handle loading state + if (loading || !data) { return ( - + - ) + ); + } + + if (data.length === 0) { + return ( + + + + + + + + Nama + Edit + Delete + + +
+
+
+
+ ); } return ( @@ -68,38 +104,50 @@ function ListKategoriKegiatan({ search }: { search: string }) { title='List Kategori Kegiatan' href='/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create' /> - - - - - Nama Kategori - Edit - Delete - - - - {filteredData.map((item) => ( - - {item.name} - - - - - - + +
+ + + Nama Kategori + Edit + Delete - ))} - -
+ + + {filteredData.map((item) => ( + + {item.name} + + + + + + + + ))} + +
+
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
{/* Modal Konfirmasi Hapus */} { - listState.findMany.load() - }, []) + load(page, 10); + }, [page]); - const filteredData = (listState.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.name.toLowerCase().includes(keyword) || - item.deskripsi.toLowerCase().includes(keyword) || - item.kategori?.name?.toLowerCase().includes(keyword) - ); - }); + const filteredData = useMemo(() => { + if (!data) return []; + return data.filter(item => { + const keyword = search.toLowerCase(); + return ( + item.name?.toLowerCase().includes(keyword) || + item.deskripsi?.toLowerCase().includes(keyword) || + item.kategori?.name?.toLowerCase().includes(keyword) + ); + }) + .sort((a, b) => b.createdAt - a.createdAt); + }, [data, search]); - if (!listState.findMany.data) { + // Handle loading state + if (loading || !data) { return ( - + - ) + ); } + if (data.length === 0) { + return ( + + + + + + + + Nama + Deskripsi + Kategori + Detail + + +
+
+
+
+ ); + } return ( @@ -77,7 +115,9 @@ function ListDesaAntiKorupsi({ search }: { search: string }) { - + + + {item.kategori?.name} @@ -92,6 +132,18 @@ function ListDesaAntiKorupsi({ search }: { search: string }) { +
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
) } diff --git a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx index 55295c28..25a74ee1 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx @@ -1,10 +1,10 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Image, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { Box, Button, Center, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import JudulList from '../../../_com/judulList'; @@ -30,24 +30,61 @@ function ListMediaSosial({ search }: { search: string }) { const stateMediaSosial = useProxy(profileLandingPageState.mediaSosial) const router = useRouter(); - useShallowEffect(() => { - stateMediaSosial.findMany.load() - }, []) + const { + data, + page, + totalPages, + loading, + load, + } = stateMediaSosial.findMany; - const filteredData = (stateMediaSosial.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.name.toLowerCase().includes(keyword) || - item.iconUrl?.toLowerCase().includes(keyword) - ); - }); + useEffect(() => { + load(page, 10) + }, [page]) - if (!stateMediaSosial.findMany.data) { + const filteredData = useMemo(() => { + if (!data) return []; + return data.filter(item => { + const keyword = search.toLowerCase(); + return ( + item.name?.toLowerCase().includes(keyword) || + item.iconUrl?.toLowerCase().includes(keyword) + ); + }) + }, [data, search]); + + // Handle loading state + if (loading || !data) { return ( - + - ) + ); + } + + if (data.length === 0) { + return ( + + + + + + + + Nama Media Sosial / Nama Kontak + Image + Icon URL / No Telephone + Detail + + +
+
+
+
+ ); } return ( @@ -57,37 +94,55 @@ function ListMediaSosial({ search }: { search: string }) { title='List Media Sosial' href='/admin/landing-page/profile/media-sosial/create' /> - - - - - Nama Media Sosial / Nama Kontak - Image - Icon URL / No Telephone - Detail - - - - {filteredData.map((item) => ( - - {item.name} - - - - - - {item.iconUrl} - - - + +
+ + + Nama Media Sosial / Nama Kontak + Image + Icon URL / No Telephone + Detail - ))} - -
-
+ + + {filteredData.map((item) => ( + + {item.name} + + + {item.name} + + + + + + {item.iconUrl} + + + + + + + + ))} + + + +
+ { + load(newPage, 10); + window.scrollTo(0, 0); + }} + total={totalPages} + mt="md" + mb="md" + /> +
); } diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx index d7e075c9..6d15d999 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx @@ -59,7 +59,13 @@ function DetailProgramInovasi() { Link - {stateProgramInovasi.findUnique.data?.link} + + {stateProgramInovasi.findUnique.data?.link || "Tidak ada link"} + Gambar diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx index f8dfbc2c..5772af74 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx @@ -1,10 +1,10 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import JudulList from '../../../_com/judulList'; @@ -30,27 +30,62 @@ function ListProgramInovasi({ search }: { search: string }) { const stateProgramInovasi = useProxy(profileLandingPageState.programInovasi) const router = useRouter(); - useShallowEffect(() => { - stateProgramInovasi.findMany.load() - }, []) + const { + data, + page, + totalPages, + loading, + load, + } = stateProgramInovasi.findMany; - const filteredData = (stateProgramInovasi.findMany.data || []).filter(item => { - const keyword = search.toLowerCase(); - return ( - item.name.toLowerCase().includes(keyword) || - item.description?.toLowerCase().includes(keyword) || - item.link?.toLowerCase().includes(keyword) - ); - }); + useEffect(() => { + load(page, 10); + }, [page]); - if (!stateProgramInovasi.findMany.data) { + const filteredData = useMemo(() => { + if (!data) return []; + return data.filter(item => { + const keyword = search.toLowerCase(); + return ( + item.name?.toLowerCase().includes(keyword) || + item.description?.toLowerCase().includes(keyword) || + item.link?.toLowerCase().includes(keyword) + ); + }) + }, [data, search]); + + if (loading || !data) { return ( - + - ) + ); } + if (data.length === 0) { + return ( + + + + + + + + Nama Program + Deskripsi + Link + Detail + + +
+
+
+
+ ); + } return ( @@ -72,8 +107,14 @@ function ListProgramInovasi({ search }: { search: string }) { {filteredData.map((item) => ( {item.name} - {item.description} - {item.link} + {item.description} + + + + {item.link} + + +