Fix UI Menu Landing Page, Submenu Profile & Desa Anti Korupsi
This commit is contained in:
128
prisma/data/landing-page/desa-anti-korupsi/desaantiKorpusi.json
Normal file
128
prisma/data/landing-page/desa-anti-korupsi/desaantiKorpusi.json
Normal file
@@ -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": "<p>ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PERENCANAAN, PELAKSANAAN, PENATAUSAHAAN DAN PERTANGGUNG JAWABAN APBDES BESERTA IMPLEMENTASINYA</p>",
|
||||||
|
"kategoriId": "cmds9es2o000ivnbe1o0swrvh",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmds9sjmz000svnbesv2133of",
|
||||||
|
"name": "1.2 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP MENGENAI MEKANISME EVALUASI KINERJA PERANGKAT DESA",
|
||||||
|
"deskripsi": "<p>ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP MENGENAI MEKANISME EVALUASI KINERJA PERANGKAT DESA</p>",
|
||||||
|
"kategoriId": "cmds9es2o000ivnbe1o0swrvh",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmds9tcpi000vvnbev3ebtlnt",
|
||||||
|
"name": "1.3 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PENGENDALIAN GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN",
|
||||||
|
"deskripsi": "<p>ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PENGENDALIAN GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN</p>",
|
||||||
|
"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": "<p>PERJANJIAN KERJA SAMA ANTARA PELAKSANA KEGIATAN ANGGARAN DENGAN PIHAK PENYEDIA, DAN TELAH MELALUI PROSES PENGADAAN BARANG/JASA DI DESA</p>",
|
||||||
|
"kategoriId": "cmds9es2o000ivnbe1o0swrvh",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmds9ugap0011vnbe118yv871",
|
||||||
|
"name": "1.5 ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PAKTA INTEGRITAS DAN SEJENISNYA",
|
||||||
|
"deskripsi": "<p>ADANYA PERDES/KEPUTUSAN KEPALA DESA/SOP TENTANG PAKTA INTEGRITAS DAN SEJENISNYA</p>",
|
||||||
|
"kategoriId": "cmds9es2o000ivnbe1o0swrvh",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsa35310014vnbe6qy6l1rz",
|
||||||
|
"name": "2.1 ADANYA KEGIATAN PENGAWASAN DAN EVALUASI KINERJA PERANGKAT DESA",
|
||||||
|
"deskripsi": "<p>ADANYA KEGIATAN PENGAWASAN DAN EVALUASI KINERJA PERANGKAT DESA</p>",
|
||||||
|
"kategoriId": "cmds9f2ua000jvnbeksu1sfwm",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsa46590017vnbepp3noso1",
|
||||||
|
"name": "2.2 ADANYA TINDAK LANJUT HASIL PEMBINAAN, PETUNJUK, ARAH, PENGAWASAN, DAN PEMERIKSAAN DARI PEMERINTAH PUSAT/DAERAH",
|
||||||
|
"deskripsi": "<p>ADANYA TINDAK LANJUT HASIL PEMBINAAN, PETUNJUK, ARAH, PENGAWASAN, DAN PEMERIKSAAN DARI PEMERINTAH PUSAT/DAERAH</p>",
|
||||||
|
"kategoriId": "cmds9f2ua000jvnbeksu1sfwm",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsa5m7z001avnbe4cvfrcz0",
|
||||||
|
"name": "2.3 TIDAK ADANYA APARATUR DESA DALAM 3(TIGA) TAHUN TERAKHIR YANG TERJERAT TINDAKAN PIDANA KORUPSI",
|
||||||
|
"deskripsi": "<p>TIDAK ADANYA APARATUR DESA DALAM 3(TIGA) TAHUN TERAKHIR YANG TERJERAT TINDAKAN PIDANA KORUPSI</p>",
|
||||||
|
"kategoriId": "cmds9f2ua000jvnbeksu1sfwm",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsa8q5q001dvnbemch8j24x",
|
||||||
|
"name": "3.1 ADANYA LAYANAN PENGADUAN BAGI MASYARAKAT",
|
||||||
|
"deskripsi": "<p>ADANYA LAYANAN PENGADUAN BAGI MASYARAKAT</p>",
|
||||||
|
"kategoriId": "cmds9fr73000kvnbe6w281dcl",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsa9lbi001gvnbequn2ba7m",
|
||||||
|
"name": "3.2 ADANYA SURVEY KEPUASAN MASYARAKAT (SKM) TERHADAP LAYANAN PEMERINTAH DESA",
|
||||||
|
"deskripsi": "<p>ADANYA SURVEY KEPUASAN MASYARAKAT (SKM) TERHADAP LAYANAN PEMERINTAH DESA</p>",
|
||||||
|
"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": "<p>ADANYA KETERBUKAAN AKSES MASYARAKAT TERHADAP INFORMASI LAYANAN PEMERINTAH DESA (KESEHATAN, PENDIDIKAN, SOSIAL, LINGKUNGAN, TRANTIBUMLINMAS, PEKERJAAN UMUM) PEMBANGUNAN, KEPENDUDUKAN, KEUANGAN, DAN PELAYANAN LAINNYA</p>",
|
||||||
|
"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": "<p>ADANYA MEDIA INFORMASI TENTANG APBDES DI BALAI DESA DAN/ATAU TEMPAT LAIN YANG MUDAH DIAKSES OLEH MASYARAKAT</p>",
|
||||||
|
"kategoriId": "cmds9fr73000kvnbe6w281dcl",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsabhif001pvnbepm06hry6",
|
||||||
|
"name": "3.5 ADANYA MAKLUMAT PELAYANAN",
|
||||||
|
"deskripsi": "<p>ADANYA MAKLUMAT PELAYANAN</p>",
|
||||||
|
"kategoriId": "cmds9fr73000kvnbe6w281dcl",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsag40b001svnbe7krq9khc",
|
||||||
|
"name": "4.1 ADANYA PARTISIPASI DAN KETERLIBATAN MASYARAKAT DALAM PENYUSUNAN RKP DESA",
|
||||||
|
"deskripsi": "<p>ADANYA PARTISIPASI DAN KETERLIBATAN MASYARAKAT DALAM PENYUSUNAN RKP DESA</p>",
|
||||||
|
"kategoriId": "cmds9g5ow000lvnbel3rkkwrv",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsagkaf001vvnbejo26w8sa",
|
||||||
|
"name": "4.2 ADANYA KESADARAN MASYARAKAT DALAM MENCEGAH TERJADINYA PRAKTIK GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN",
|
||||||
|
"deskripsi": "<p>ADANYA KESADARAN MASYARAKAT DALAM MENCEGAH TERJADINYA PRAKTIK GRATIFIKASI, SUAP DAN KONFLIK KEPENTINGAN</p>",
|
||||||
|
"kategoriId": "cmds9g5ow000lvnbel3rkkwrv",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsah4qe001yvnbeiy3mwrvb",
|
||||||
|
"name": "4.3 ADANYA KETERLIBATAN LEMBAGA KEMASYARAKATAN DALAM PELAKSANAAN PEMBANGUNAN DESA",
|
||||||
|
"deskripsi": "<p>ADANYA KETERLIBATAN LEMBAGA KEMASYARAKATAN DALAM PELAKSANAAN PEMBANGUNAN DESA</p>",
|
||||||
|
"kategoriId": "cmds9g5ow000lvnbel3rkkwrv",
|
||||||
|
"fileId": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cmdsak5vn0021vnbemg86aab4",
|
||||||
|
"name": "5.1 ADANYA BUDAYA LOKAL/HUKUM ADAT YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI",
|
||||||
|
"deskripsi": "<p>ADANYA BUDAYA LOKAL/HUKUM ADAT YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI</p>",
|
||||||
|
"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": "<p>ADANYA TOKOH MASYARAKAT, TOKOH AGAMA, TOKOH ADAT, TOKOH PEMUDA, DAN KAUM PEREMPUAN YANG MENDORONG UPAYA PENCEGAHAN TINDAK PIDANA KORUPSI</p>",
|
||||||
|
"kategoriId": "cmds9govb000mvnbesq8b4y99",
|
||||||
|
"fileId": ""
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"id": "edit",
|
|
||||||
"name": "I.B Surya Prabhawa Manuaba, S.H., M.H.",
|
|
||||||
"position": "Perbekel Darmasaba periode 2021-2027"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|
||||||
32
prisma/data/landing-page/profile/mediaSosial.json
Normal file
32
prisma/data/landing-page/profile/mediaSosial.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
7
prisma/data/landing-page/profile/profile.json
Normal file
7
prisma/data/landing-page/profile/profile.json
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id": "edit",
|
||||||
|
"name": "I.B Surya Prabhawa Manuaba, S.H., M.H.",
|
||||||
|
"position": "Perbekel Darmasaba periode 2021-2027"
|
||||||
|
}
|
||||||
|
]
|
||||||
50
prisma/data/landing-page/profile/programInovasi.json
Normal file
50
prisma/data/landing-page/profile/programInovasi.json
Normal file
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -132,8 +132,8 @@ model ProgramInovasi {
|
|||||||
model MediaSosial {
|
model MediaSosial {
|
||||||
id String @id @default(cuid())
|
id String @id @default(cuid())
|
||||||
name String
|
name String
|
||||||
image FileStorage @relation(fields: [imageId], references: [id])
|
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||||
imageId String
|
imageId String?
|
||||||
iconUrl String? @db.VarChar(255)
|
iconUrl String? @db.VarChar(255)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
@@ -148,8 +148,8 @@ model DesaAntiKorupsi {
|
|||||||
deskripsi String @db.Text
|
deskripsi String @db.Text
|
||||||
kategori KategoriDesaAntiKorupsi @relation(fields: [kategoriId], references: [id])
|
kategori KategoriDesaAntiKorupsi @relation(fields: [kategoriId], references: [id])
|
||||||
kategoriId String
|
kategoriId String
|
||||||
file FileStorage @relation(fields: [fileId], references: [id])
|
file FileStorage? @relation(fields: [fileId], references: [id])
|
||||||
fileId String
|
fileId String?
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
deletedAt DateTime @default(now())
|
deletedAt DateTime @default(now())
|
||||||
|
|||||||
144
prisma/seed.ts
144
prisma/seed.ts
@@ -1,4 +1,7 @@
|
|||||||
import prisma from "@/lib/prisma";
|
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 categoryPengumuman from "./data/category-pengumuman.json";
|
||||||
import kategoriBerita from "./data/kategori-berita.json";
|
import kategoriBerita from "./data/kategori-berita.json";
|
||||||
import caraMemperolehInformasi from "./data/list-caraMemperolehInformasi.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 hubunganOrganisasi from "./data/ekonomi/struktur-organisasi/hubungan-organisasi.json";
|
||||||
import posisiOrganisasi from "./data/ekonomi/struktur-organisasi/posisi-organisasi.json";
|
import posisiOrganisasi from "./data/ekonomi/struktur-organisasi/posisi-organisasi.json";
|
||||||
import pegawai from "./data/ekonomi/struktur-organisasi/pegawai.json";
|
import pegawai from "./data/ekonomi/struktur-organisasi/pegawai.json";
|
||||||
import detailDataPengangguran from './data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json';
|
import detailDataPengangguran from "./data/ekonomi/jumlah-pengangguran/detail-data-pengangguran.json";
|
||||||
import tujuanEdukasiLingkungan from './data/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan.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 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 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 nilaiKonservasiAdat from "./data/lingkungan/konservasi-adat-bali/nilai-konservasi-adat.json";
|
||||||
import bentukKonservasiBerdasarkanAdat from './data/lingkungan/konservasi-adat-bali/bentuk-konservasi.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 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 tujuanProgram from './data/pendidikan/program-pendidikan-anak/tujuan-program.json';
|
import tujuanProgram2 from "./data/pendidikan/pendidikan-non-formal/tujuan-program2.json";
|
||||||
import tujuanProgram2 from './data/pendidikan/pendidikan-non-formal/tujuan-program2.json';
|
import programUnggulan from "./data/pendidikan/program-pendidikan-anak/program-unggulan.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 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 lokasiJadwalBimbinganBelajarDesa from './data/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal.json';
|
import fasilitasBimbinganBelajarDesa from "./data/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan.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 tempatKegiatan from './data/pendidikan/pendidikan-non-formal/tempat-kegiatan.json';
|
import jenisProgramYangDiselenggarakan from "./data/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan.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 posisiOrganisasiPPID from "./data/ppid/struktur-ppid/posisi-organisasi-PPID.json";
|
||||||
import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
||||||
|
|
||||||
|
|
||||||
(async () => {
|
(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) {
|
for (const l of layanan) {
|
||||||
await prisma.layanan.upsert({
|
await prisma.layanan.upsert({
|
||||||
where: {
|
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) {
|
for (const l of visiMisiDesa) {
|
||||||
await prisma.visiMisiDesa.upsert({
|
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
|
// Flatten the nested array structure for posisiOrganisasiPPID
|
||||||
const flattenedPosisiOrganisasiPPID = posisiOrganisasiPPID.flat();
|
const flattenedPosisiOrganisasiPPID = posisiOrganisasiPPID.flat();
|
||||||
|
|
||||||
for (const p of flattenedPosisiOrganisasiPPID) {
|
for (const p of flattenedPosisiOrganisasiPPID) {
|
||||||
await prisma.posisiOrganisasiPPID.upsert({
|
await prisma.posisiOrganisasiPPID.upsert({
|
||||||
where: {
|
where: {
|
||||||
@@ -182,7 +242,7 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
|||||||
|
|
||||||
// Flatten the nested array structure for pegawaiPPID
|
// Flatten the nested array structure for pegawaiPPID
|
||||||
const flattenedPegawaiPPID = pegawaiPPID.flat();
|
const flattenedPegawaiPPID = pegawaiPPID.flat();
|
||||||
|
|
||||||
for (const p of flattenedPegawaiPPID) {
|
for (const p of flattenedPegawaiPPID) {
|
||||||
await prisma.pegawaiPPID.upsert({
|
await prisma.pegawaiPPID.upsert({
|
||||||
where: {
|
where: {
|
||||||
@@ -252,7 +312,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
|||||||
}
|
}
|
||||||
console.log("pelayanan penduduk non permanen success ...");
|
console.log("pelayanan penduduk non permanen success ...");
|
||||||
|
|
||||||
|
|
||||||
for (const p of potensi) {
|
for (const p of potensi) {
|
||||||
await prisma.potensi.upsert({
|
await prisma.potensi.upsert({
|
||||||
where: {
|
where: {
|
||||||
@@ -422,7 +481,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
|||||||
}
|
}
|
||||||
console.log("kategori produk success ...");
|
console.log("kategori produk success ...");
|
||||||
|
|
||||||
|
|
||||||
for (const p of posisiOrganisasi) {
|
for (const p of posisiOrganisasi) {
|
||||||
await prisma.posisiOrganisasi.upsert({
|
await prisma.posisiOrganisasi.upsert({
|
||||||
where: {
|
where: {
|
||||||
@@ -611,7 +669,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
|||||||
|
|
||||||
console.log("bentuk konservasi berdasarkan adat success ...");
|
console.log("bentuk konservasi berdasarkan adat success ...");
|
||||||
|
|
||||||
|
|
||||||
for (const n of nilaiKonservasiAdat) {
|
for (const n of nilaiKonservasiAdat) {
|
||||||
await prisma.nilaiKonservasiAdat.upsert({
|
await prisma.nilaiKonservasiAdat.upsert({
|
||||||
where: {
|
where: {
|
||||||
@@ -631,22 +688,6 @@ import pegawaiPPID from "./data/ppid/struktur-ppid/pegawai-PPID.json";
|
|||||||
|
|
||||||
console.log("nilai konservasi adat success ...");
|
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) {
|
for (const t of tujuanProgram) {
|
||||||
await prisma.tujuanProgram.upsert({
|
await prisma.tujuanProgram.upsert({
|
||||||
where: { id: t.id },
|
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) {
|
for (const t of lokasiJadwalBimbinganBelajarDesa) {
|
||||||
await prisma.lokasiJadwalBimbinganBelajarDesa.upsert({
|
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) {
|
for (const t of fasilitasBimbinganBelajarDesa) {
|
||||||
await prisma.fasilitasBimbinganBelajarDesa.upsert({
|
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) {
|
for (const t of tujuanProgram2) {
|
||||||
await prisma.tujuanPendidikanNonFormal.upsert({
|
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) {
|
for (const t of tempatKegiatan) {
|
||||||
await prisma.tempatKegiatan.upsert({
|
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) {
|
for (const t of jenisProgramYangDiselenggarakan) {
|
||||||
await prisma.jenisProgramYangDiselenggarakan.upsert({
|
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())
|
.then(() => prisma.$disconnect())
|
||||||
.catch((e) => {
|
.catch((e) => {
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
import ApiFetch from "@/lib/api-fetch";
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
import { Prisma } from "@prisma/client";
|
import { Prisma } from "@prisma/client";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
@@ -54,20 +55,38 @@ const desaAntikorupsi = proxy({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
findMany: {
|
findMany: {
|
||||||
data: null as Array<
|
data: null as any[] | null,
|
||||||
Prisma.DesaAntiKorupsiGetPayload<{
|
page: 1,
|
||||||
include: {
|
totalPages: 1,
|
||||||
file: true;
|
total: 0,
|
||||||
kategori: true;
|
loading: false,
|
||||||
};
|
load: async (page = 1, limit = 10) => { // Change to arrow function
|
||||||
}>
|
desaAntikorupsi.findMany.loading = true; // Use the full path to access the property
|
||||||
> | null,
|
desaAntikorupsi.findMany.page = page;
|
||||||
async load() {
|
try {
|
||||||
const res = await ApiFetch.api.landingpage.desaantikorupsi[
|
const res = await ApiFetch.api.landingpage.desaantikorupsi[
|
||||||
"find-many"
|
"findMany"
|
||||||
].get();
|
].get({
|
||||||
if (res.status === 200) {
|
query: { page, limit },
|
||||||
desaAntikorupsi.findMany.data = res.data?.data ?? [];
|
});
|
||||||
|
|
||||||
|
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: {
|
findMany: {
|
||||||
data: null as Array<{
|
data: null as any[] | null,
|
||||||
id: string;
|
page: 1,
|
||||||
name: string;
|
totalPages: 1,
|
||||||
}> | null,
|
total: 0,
|
||||||
async load() {
|
loading: false,
|
||||||
const res = await ApiFetch.api.landingpage.kategoridak["find-many"].get();
|
load: async (page = 1, limit = 10) => { // Change to arrow function
|
||||||
if (res.status === 200) {
|
kategoriDesaAntiKorupsi.findMany.loading = true; // Use the full path to access the property
|
||||||
kategoriDesaAntiKorupsi.findMany.data = res.data?.data ?? [];
|
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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||||
import ApiFetch from "@/lib/api-fetch";
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
import { Prisma } from "@prisma/client";
|
import { Prisma } from "@prisma/client";
|
||||||
import { toast } from "react-toastify";
|
import { toast } from "react-toastify";
|
||||||
@@ -5,10 +6,10 @@ import { proxy } from "valtio";
|
|||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
|
|
||||||
const templateProgramInovasi = z.object({
|
const templateProgramInovasi = z.object({
|
||||||
name: z.string().min(3, "Nama minimal 3 karakter"),
|
name: z.string().min(1, "Nama minimal 1 karakter"),
|
||||||
description: z.string().min(3, "Deskripsi minimal 3 karakter"),
|
description: z.string().min(1, "Deskripsi minimal 1 karakter"),
|
||||||
imageId: z.string().min(1, "Gambar wajib dipilih"),
|
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<{
|
type ProgramInovasiForm = Prisma.ProgramInovasiGetPayload<{
|
||||||
@@ -59,15 +60,38 @@ const programInovasi = proxy({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
findMany: {
|
findMany: {
|
||||||
data: null as
|
data: null as any[] | null,
|
||||||
| Prisma.ProgramInovasiGetPayload<{ include: { image: true } }>[]
|
page: 1,
|
||||||
| null,
|
totalPages: 1,
|
||||||
async load() {
|
total: 0,
|
||||||
const res = await ApiFetch.api.landingpage.programinovasi[
|
loading: false,
|
||||||
"find-many"
|
load: async (page = 1, limit = 10) => { // Change to arrow function
|
||||||
].get();
|
programInovasi.findMany.loading = true; // Use the full path to access the property
|
||||||
if (res.status === 200) {
|
programInovasi.findMany.page = page;
|
||||||
programInovasi.findMany.data = res.data?.data ?? [];
|
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: {
|
findMany: {
|
||||||
data: null as
|
data: null as any[] | null,
|
||||||
| Prisma.MediaSosialGetPayload<{ include: { image: true } }>[]
|
page: 1,
|
||||||
| null,
|
totalPages: 1,
|
||||||
async load() {
|
total: 0,
|
||||||
const res = await ApiFetch.api.landingpage.mediasosial["find-many"].get();
|
loading: false,
|
||||||
if (res.status === 200) {
|
load: async (page = 1, limit = 10) => { // Change to arrow function
|
||||||
mediaSosial.findMany.data = res.data?.data ?? [];
|
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;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
|
import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
|
||||||
import { IconEdit, IconSearch, IconX } from '@tabler/icons-react';
|
import { IconEdit, IconSearch, IconX } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import HeaderSearch from '../../../_com/header';
|
import HeaderSearch from '../../../_com/header';
|
||||||
import JudulList from '../../../_com/judulList';
|
import JudulList from '../../../_com/judulList';
|
||||||
@@ -34,6 +34,14 @@ function ListKategoriKegiatan({ search }: { search: string }) {
|
|||||||
const [selectedId, setSelectedId] = useState<string | null>(null)
|
const [selectedId, setSelectedId] = useState<string | null>(null)
|
||||||
const router = useRouter()
|
const router = useRouter()
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
page,
|
||||||
|
totalPages,
|
||||||
|
loading,
|
||||||
|
load,
|
||||||
|
} = stateKategori.findMany;
|
||||||
|
|
||||||
const handleHapus = () => {
|
const handleHapus = () => {
|
||||||
if (selectedId) {
|
if (selectedId) {
|
||||||
stateKategori.delete.byId(selectedId)
|
stateKategori.delete.byId(selectedId)
|
||||||
@@ -42,23 +50,51 @@ function ListKategoriKegiatan({ search }: { search: string }) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useShallowEffect(() => {
|
useEffect(() => {
|
||||||
stateKategori.findMany.load()
|
load(page, 10)
|
||||||
}, [])
|
}, [page])
|
||||||
|
|
||||||
const filteredData = (stateKategori.findMany.data || []).filter(item => {
|
const filteredData = useMemo(() => {
|
||||||
const keyword = search.toLowerCase();
|
if (!data) return [];
|
||||||
return (
|
return data.filter(item => {
|
||||||
item.name.toLowerCase().includes(keyword)
|
const keyword = search.toLowerCase();
|
||||||
);
|
return (
|
||||||
});
|
item.name?.toLowerCase().includes(keyword)
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}, [data, search]);
|
||||||
|
|
||||||
if (!stateKategori.findMany.data) {
|
// Handle loading state
|
||||||
|
if (loading || !data) {
|
||||||
return (
|
return (
|
||||||
<Stack py={10}>
|
<Stack py={10}>
|
||||||
<Skeleton h={500} />
|
<Skeleton height={300} />
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.length === 0) {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<JudulList
|
||||||
|
title='List Kategori Kegiatan'
|
||||||
|
href='/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create'
|
||||||
|
/>
|
||||||
|
<Box style={{ overflowX: "auto" }}>
|
||||||
|
<Table striped withTableBorder withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Nama</TableTh>
|
||||||
|
<TableTh>Edit</TableTh>
|
||||||
|
<TableTh>Delete</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -68,38 +104,50 @@ function ListKategoriKegiatan({ search }: { search: string }) {
|
|||||||
title='List Kategori Kegiatan'
|
title='List Kategori Kegiatan'
|
||||||
href='/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create'
|
href='/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create'
|
||||||
/>
|
/>
|
||||||
<Box style={{overflowY: "auto"}}>
|
<Box style={{ overflowY: "auto" }}>
|
||||||
<Table striped withTableBorder withRowBorders>
|
<Table striped withTableBorder withRowBorders>
|
||||||
<TableThead>
|
<TableThead>
|
||||||
<TableTr>
|
<TableTr>
|
||||||
<TableTh>Nama Kategori</TableTh>
|
<TableTh>Nama Kategori</TableTh>
|
||||||
<TableTh>Edit</TableTh>
|
<TableTh>Edit</TableTh>
|
||||||
<TableTh>Delete</TableTh>
|
<TableTh>Delete</TableTh>
|
||||||
</TableTr>
|
|
||||||
</TableThead>
|
|
||||||
<TableTbody>
|
|
||||||
{filteredData.map((item) => (
|
|
||||||
<TableTr key={item.id}>
|
|
||||||
<TableTd>{item.name}</TableTd>
|
|
||||||
<TableTd>
|
|
||||||
<Button color="green" onClick={() => router.push(`/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/${item.id}`)}>
|
|
||||||
<IconEdit size={20} />
|
|
||||||
</Button>
|
|
||||||
</TableTd>
|
|
||||||
<TableTd>
|
|
||||||
<Button color="red" onClick={() => {
|
|
||||||
setSelectedId(item.id)
|
|
||||||
setModalHapus(true)
|
|
||||||
}}>
|
|
||||||
<IconX size={20} />
|
|
||||||
</Button>
|
|
||||||
</TableTd>
|
|
||||||
</TableTr>
|
</TableTr>
|
||||||
))}
|
</TableThead>
|
||||||
</TableTbody>
|
<TableTbody>
|
||||||
</Table>
|
{filteredData.map((item) => (
|
||||||
|
<TableTr key={item.id}>
|
||||||
|
<TableTd>{item.name}</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Button color="green" onClick={() => router.push(`/admin/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/${item.id}`)}>
|
||||||
|
<IconEdit size={20} />
|
||||||
|
</Button>
|
||||||
|
</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Button color="red" onClick={() => {
|
||||||
|
setSelectedId(item.id)
|
||||||
|
setModalHapus(true)
|
||||||
|
}}>
|
||||||
|
<IconX size={20} />
|
||||||
|
</Button>
|
||||||
|
</TableTd>
|
||||||
|
</TableTr>
|
||||||
|
))}
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
</Box>
|
</Box>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
<Center>
|
||||||
|
<Pagination
|
||||||
|
value={page}
|
||||||
|
onChange={(newPage) => {
|
||||||
|
load(newPage, 10);
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}}
|
||||||
|
total={totalPages}
|
||||||
|
mt="md"
|
||||||
|
mb="md"
|
||||||
|
/>
|
||||||
|
</Center>
|
||||||
{/* Modal Konfirmasi Hapus */}
|
{/* Modal Konfirmasi Hapus */}
|
||||||
<ModalKonfirmasiHapus
|
<ModalKonfirmasiHapus
|
||||||
opened={modalHapus}
|
opened={modalHapus}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
/* eslint-disable react-hooks/exhaustive-deps */
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
|
import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
|
||||||
import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
|
import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import HeaderSearch from '../../../_com/header';
|
import HeaderSearch from '../../../_com/header';
|
||||||
import JudulList from '../../../_com/judulList';
|
import JudulList from '../../../_com/judulList';
|
||||||
@@ -29,27 +29,65 @@ function DesaAntiKorupsi() {
|
|||||||
function ListDesaAntiKorupsi({ search }: { search: string }) {
|
function ListDesaAntiKorupsi({ search }: { search: string }) {
|
||||||
const listState = useProxy(korupsiState.desaAntikorupsi)
|
const listState = useProxy(korupsiState.desaAntikorupsi)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
|
const {
|
||||||
|
data,
|
||||||
|
page,
|
||||||
|
totalPages,
|
||||||
|
loading,
|
||||||
|
load,
|
||||||
|
} = listState.findMany;
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
listState.findMany.load()
|
load(page, 10);
|
||||||
}, [])
|
}, [page]);
|
||||||
|
|
||||||
const filteredData = (listState.findMany.data || []).filter(item => {
|
const filteredData = useMemo(() => {
|
||||||
const keyword = search.toLowerCase();
|
if (!data) return [];
|
||||||
return (
|
return data.filter(item => {
|
||||||
item.name.toLowerCase().includes(keyword) ||
|
const keyword = search.toLowerCase();
|
||||||
item.deskripsi.toLowerCase().includes(keyword) ||
|
return (
|
||||||
item.kategori?.name?.toLowerCase().includes(keyword)
|
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 (
|
return (
|
||||||
<Stack py={10}>
|
<Stack py={10}>
|
||||||
<Skeleton h={500} />
|
<Skeleton height={300} />
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.length === 0) {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<JudulList
|
||||||
|
title='List Desa Anti Korupsi'
|
||||||
|
href='/admin/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/create'
|
||||||
|
/>
|
||||||
|
<Box style={{ overflowX: "auto" }}>
|
||||||
|
<Table striped withTableBorder withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Nama</TableTh>
|
||||||
|
<TableTh>Deskripsi</TableTh>
|
||||||
|
<TableTh>Kategori</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box py={10}>
|
||||||
<Paper bg={colors['white-1']} p={'md'}>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
@@ -77,7 +115,9 @@ function ListDesaAntiKorupsi({ search }: { search: string }) {
|
|||||||
</Box>
|
</Box>
|
||||||
</TableTd>
|
</TableTd>
|
||||||
<TableTd>
|
<TableTd>
|
||||||
<Text truncate="end" fz={"sm"} dangerouslySetInnerHTML={{ __html: item.deskripsi }} />
|
<Box w={200}>
|
||||||
|
<Text truncate="end" fz={"sm"} dangerouslySetInnerHTML={{ __html: item.deskripsi }} />
|
||||||
|
</Box>
|
||||||
</TableTd>
|
</TableTd>
|
||||||
<TableTd>{item.kategori?.name}</TableTd>
|
<TableTd>{item.kategori?.name}</TableTd>
|
||||||
<TableTd>
|
<TableTd>
|
||||||
@@ -92,6 +132,18 @@ function ListDesaAntiKorupsi({ search }: { search: string }) {
|
|||||||
</Box>
|
</Box>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
<Center>
|
||||||
|
<Pagination
|
||||||
|
value={page}
|
||||||
|
onChange={(newPage) => {
|
||||||
|
load(newPage, 10);
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}}
|
||||||
|
total={totalPages}
|
||||||
|
mt="md"
|
||||||
|
mb="md"
|
||||||
|
/>
|
||||||
|
</Center>
|
||||||
</Box>
|
</Box>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Image, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
|
import { Box, Button, Center, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
|
||||||
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import HeaderSearch from '../../../_com/header';
|
import HeaderSearch from '../../../_com/header';
|
||||||
import JudulList from '../../../_com/judulList';
|
import JudulList from '../../../_com/judulList';
|
||||||
@@ -30,24 +30,61 @@ function ListMediaSosial({ search }: { search: string }) {
|
|||||||
const stateMediaSosial = useProxy(profileLandingPageState.mediaSosial)
|
const stateMediaSosial = useProxy(profileLandingPageState.mediaSosial)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
useShallowEffect(() => {
|
const {
|
||||||
stateMediaSosial.findMany.load()
|
data,
|
||||||
}, [])
|
page,
|
||||||
|
totalPages,
|
||||||
|
loading,
|
||||||
|
load,
|
||||||
|
} = stateMediaSosial.findMany;
|
||||||
|
|
||||||
const filteredData = (stateMediaSosial.findMany.data || []).filter(item => {
|
useEffect(() => {
|
||||||
const keyword = search.toLowerCase();
|
load(page, 10)
|
||||||
return (
|
}, [page])
|
||||||
item.name.toLowerCase().includes(keyword) ||
|
|
||||||
item.iconUrl?.toLowerCase().includes(keyword)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
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 (
|
return (
|
||||||
<Stack py={10}>
|
<Stack py={10}>
|
||||||
<Skeleton h={500} />
|
<Skeleton height={300} />
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.length === 0) {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<JudulList
|
||||||
|
title='List Media Sosial'
|
||||||
|
href='/admin/landing-page/profile/media-sosial/create'
|
||||||
|
/>
|
||||||
|
<Box style={{ overflowX: "auto" }}>
|
||||||
|
<Table striped withTableBorder withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Nama Media Sosial / Nama Kontak</TableTh>
|
||||||
|
<TableTh>Image</TableTh>
|
||||||
|
<TableTh>Icon URL / No Telephone</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@@ -57,37 +94,55 @@ function ListMediaSosial({ search }: { search: string }) {
|
|||||||
title='List Media Sosial'
|
title='List Media Sosial'
|
||||||
href='/admin/landing-page/profile/media-sosial/create'
|
href='/admin/landing-page/profile/media-sosial/create'
|
||||||
/>
|
/>
|
||||||
<Box style={{overflowY: "auto"}}>
|
<Box style={{ overflowY: "auto" }}>
|
||||||
<Table striped withTableBorder withRowBorders>
|
<Table striped withTableBorder withRowBorders>
|
||||||
<TableThead>
|
<TableThead>
|
||||||
<TableTr>
|
<TableTr>
|
||||||
<TableTh>Nama Media Sosial / Nama Kontak</TableTh>
|
<TableTh>Nama Media Sosial / Nama Kontak</TableTh>
|
||||||
<TableTh>Image</TableTh>
|
<TableTh>Image</TableTh>
|
||||||
<TableTh>Icon URL / No Telephone</TableTh>
|
<TableTh>Icon URL / No Telephone</TableTh>
|
||||||
<TableTh>Detail</TableTh>
|
<TableTh>Detail</TableTh>
|
||||||
</TableTr>
|
|
||||||
</TableThead>
|
|
||||||
<TableTbody>
|
|
||||||
{filteredData.map((item) => (
|
|
||||||
<TableTr key={item.id}>
|
|
||||||
<TableTd>{item.name}</TableTd>
|
|
||||||
<TableTd>
|
|
||||||
<Box w={50} h={50}>
|
|
||||||
<Image src={item.image?.link} alt={item.name} />
|
|
||||||
</Box>
|
|
||||||
</TableTd>
|
|
||||||
<TableTd>{item.iconUrl}</TableTd>
|
|
||||||
<TableTd>
|
|
||||||
<Button onClick={() => router.push(`/admin/landing-page/profile/media-sosial/${item.id}`)}>
|
|
||||||
<IconDeviceImac size={20} />
|
|
||||||
</Button>
|
|
||||||
</TableTd>
|
|
||||||
</TableTr>
|
</TableTr>
|
||||||
))}
|
</TableThead>
|
||||||
</TableTbody>
|
<TableTbody>
|
||||||
</Table>
|
{filteredData.map((item) => (
|
||||||
</Box>
|
<TableTr key={item.id}>
|
||||||
|
<TableTd>{item.name}</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Box w={50} h={50}>
|
||||||
|
<Image src={item.image?.link} alt={item.name} />
|
||||||
|
</Box>
|
||||||
|
</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Box w={250}>
|
||||||
|
<a style={{color: "black"}} href={item.iconUrl} target="_blank" rel="noopener noreferrer">
|
||||||
|
<Text truncate fz={'sm'}>{item.iconUrl}</Text>
|
||||||
|
</a>
|
||||||
|
</Box>
|
||||||
|
</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Button onClick={() => router.push(`/admin/landing-page/profile/media-sosial/${item.id}`)}>
|
||||||
|
<IconDeviceImac size={20} />
|
||||||
|
</Button>
|
||||||
|
</TableTd>
|
||||||
|
</TableTr>
|
||||||
|
))}
|
||||||
|
</TableTbody>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
<Center>
|
||||||
|
<Pagination
|
||||||
|
value={page}
|
||||||
|
onChange={(newPage) => {
|
||||||
|
load(newPage, 10);
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}}
|
||||||
|
total={totalPages}
|
||||||
|
mt="md"
|
||||||
|
mb="md"
|
||||||
|
/>
|
||||||
|
</Center>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,7 +59,13 @@ function DetailProgramInovasi() {
|
|||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
<Text fz={"lg"} fw={"bold"}>Link</Text>
|
<Text fz={"lg"} fw={"bold"}>Link</Text>
|
||||||
<Text fz={"lg"}>{stateProgramInovasi.findUnique.data?.link}</Text>
|
<a
|
||||||
|
href={stateProgramInovasi.findUnique.data?.link || "#"}
|
||||||
|
target="_blank"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
{stateProgramInovasi.findUnique.data?.link || "Tidak ada link"}
|
||||||
|
</a>
|
||||||
</Box>
|
</Box>
|
||||||
<Box>
|
<Box>
|
||||||
<Text fz={"lg"} fw={"bold"}>Gambar</Text>
|
<Text fz={"lg"} fw={"bold"}>Gambar</Text>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
|
import { Box, Button, Center, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
|
||||||
import { useShallowEffect } from '@mantine/hooks';
|
|
||||||
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import { useProxy } from 'valtio/utils';
|
import { useProxy } from 'valtio/utils';
|
||||||
import HeaderSearch from '../../../_com/header';
|
import HeaderSearch from '../../../_com/header';
|
||||||
import JudulList from '../../../_com/judulList';
|
import JudulList from '../../../_com/judulList';
|
||||||
@@ -30,27 +30,62 @@ function ListProgramInovasi({ search }: { search: string }) {
|
|||||||
const stateProgramInovasi = useProxy(profileLandingPageState.programInovasi)
|
const stateProgramInovasi = useProxy(profileLandingPageState.programInovasi)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
useShallowEffect(() => {
|
const {
|
||||||
stateProgramInovasi.findMany.load()
|
data,
|
||||||
}, [])
|
page,
|
||||||
|
totalPages,
|
||||||
|
loading,
|
||||||
|
load,
|
||||||
|
} = stateProgramInovasi.findMany;
|
||||||
|
|
||||||
const filteredData = (stateProgramInovasi.findMany.data || []).filter(item => {
|
useEffect(() => {
|
||||||
const keyword = search.toLowerCase();
|
load(page, 10);
|
||||||
return (
|
}, [page]);
|
||||||
item.name.toLowerCase().includes(keyword) ||
|
|
||||||
item.description?.toLowerCase().includes(keyword) ||
|
|
||||||
item.link?.toLowerCase().includes(keyword)
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
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 (
|
return (
|
||||||
<Stack py={10}>
|
<Stack py={10}>
|
||||||
<Skeleton h={500} />
|
<Skeleton height={300} />
|
||||||
</Stack>
|
</Stack>
|
||||||
)
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data.length === 0) {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
|
<JudulList
|
||||||
|
title='List Program Inovasi'
|
||||||
|
href='/admin/landing-page/profile/program-inovasi/create'
|
||||||
|
/>
|
||||||
|
<Box style={{ overflowX: "auto" }}>
|
||||||
|
<Table striped withTableBorder withRowBorders>
|
||||||
|
<TableThead>
|
||||||
|
<TableTr>
|
||||||
|
<TableTh>Nama Program</TableTh>
|
||||||
|
<TableTh>Deskripsi</TableTh>
|
||||||
|
<TableTh>Link</TableTh>
|
||||||
|
<TableTh>Detail</TableTh>
|
||||||
|
</TableTr>
|
||||||
|
</TableThead>
|
||||||
|
</Table>
|
||||||
|
</Box>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box py={10}>
|
||||||
<Paper bg={colors['white-1']} p={'md'}>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
@@ -72,8 +107,14 @@ function ListProgramInovasi({ search }: { search: string }) {
|
|||||||
{filteredData.map((item) => (
|
{filteredData.map((item) => (
|
||||||
<TableTr key={item.id}>
|
<TableTr key={item.id}>
|
||||||
<TableTd>{item.name}</TableTd>
|
<TableTd>{item.name}</TableTd>
|
||||||
<TableTd>{item.description}</TableTd>
|
<TableTd w={200}>{item.description}</TableTd>
|
||||||
<TableTd>{item.link}</TableTd>
|
<TableTd>
|
||||||
|
<Box w={250}>
|
||||||
|
<a style={{ color: "black" }} href={item.link} target="_blank" rel="noopener noreferrer">
|
||||||
|
<Text truncate fz={'sm'}>{item.link}</Text>
|
||||||
|
</a>
|
||||||
|
</Box>
|
||||||
|
</TableTd>
|
||||||
<TableTd>
|
<TableTd>
|
||||||
<Button onClick={() => router.push(`/admin/landing-page/profile/program-inovasi/${item.id}`)}>
|
<Button onClick={() => router.push(`/admin/landing-page/profile/program-inovasi/${item.id}`)}>
|
||||||
<IconDeviceImac size={20} />
|
<IconDeviceImac size={20} />
|
||||||
@@ -85,6 +126,18 @@ function ListProgramInovasi({ search }: { search: string }) {
|
|||||||
</Table>
|
</Table>
|
||||||
</Box>
|
</Box>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
<Center>
|
||||||
|
<Pagination
|
||||||
|
value={page}
|
||||||
|
onChange={(newPage) => {
|
||||||
|
load(newPage, 10);
|
||||||
|
window.scrollTo(0, 0);
|
||||||
|
}}
|
||||||
|
total={totalPages}
|
||||||
|
mt="md"
|
||||||
|
mb="md"
|
||||||
|
/>
|
||||||
|
</Center>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ async function desaAntiKorupsiFindMany(context: Context) {
|
|||||||
},
|
},
|
||||||
skip,
|
skip,
|
||||||
take: limit,
|
take: limit,
|
||||||
orderBy: { createdAt: 'desc' }, // opsional, kalau mau urut berdasarkan waktu
|
orderBy: { name: 'asc' }, // opsional, kalau mau urut berdasarkan waktu
|
||||||
}),
|
}),
|
||||||
prisma.desaAntiKorupsi.count({
|
prisma.desaAntiKorupsi.count({
|
||||||
where: { isActive: true }
|
where: { isActive: true }
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const DesaAntiKorupsi = new Elysia({
|
|||||||
})
|
})
|
||||||
|
|
||||||
// ✅ Find all
|
// ✅ Find all
|
||||||
.get("/find-many", desaAntiKorupsiFindMany)
|
.get("/findMany", desaAntiKorupsiFindMany)
|
||||||
|
|
||||||
// ✅ Find by ID
|
// ✅ Find by ID
|
||||||
.get("/:id", desaAntiKorupsiFindUnique)
|
.get("/:id", desaAntiKorupsiFindUnique)
|
||||||
|
|||||||
@@ -1,15 +1,40 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
// /api/berita/findManyPaginated.ts
|
||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
|
import { Context } from "elysia";
|
||||||
|
|
||||||
export default async function kategoriDesaAntiKorupsiFindMany() {
|
async function kategoriDesaAntiKorupsiFindMany(context: Context) {
|
||||||
const data = await prisma.kategoriDesaAntiKorupsi.findMany();
|
const page = Number(context.query.page) || 1;
|
||||||
return {
|
const limit = Number(context.query.limit) || 10;
|
||||||
success: true,
|
const skip = (page - 1) * limit;
|
||||||
data: data.map((item: any) => {
|
|
||||||
return {
|
try {
|
||||||
id: item.id,
|
const [data, total] = await Promise.all([
|
||||||
name: item.name,
|
prisma.kategoriDesaAntiKorupsi.findMany({
|
||||||
}
|
where: { isActive: true },
|
||||||
}),
|
skip,
|
||||||
|
take: limit,
|
||||||
|
orderBy: { name: 'asc' }, // opsional, kalau mau urut berdasarkan waktu
|
||||||
|
}),
|
||||||
|
prisma.kategoriDesaAntiKorupsi.count({
|
||||||
|
where: { isActive: true }
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
message: "Success fetch kategori desa anti korupsi with pagination",
|
||||||
|
data,
|
||||||
|
page,
|
||||||
|
totalPages: Math.ceil(total / limit),
|
||||||
|
total,
|
||||||
};
|
};
|
||||||
}
|
} catch (e) {
|
||||||
|
console.error("Find many paginated error:", e);
|
||||||
|
return {
|
||||||
|
success: false,
|
||||||
|
message: "Failed fetch kategori desa anti korupsi with pagination",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default kategoriDesaAntiKorupsiFindMany;
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const KategoriDesaAntiKorupsi = new Elysia({
|
|||||||
prefix: "/kategoridak",
|
prefix: "/kategoridak",
|
||||||
tags: ["Landing Page/Desa Anti Korupsi"],
|
tags: ["Landing Page/Desa Anti Korupsi"],
|
||||||
})
|
})
|
||||||
.get("/find-many", kategoriDesaAntiKorupsiFindMany)
|
.get("/findMany", kategoriDesaAntiKorupsiFindMany)
|
||||||
.get("/:id", async (context) => {
|
.get("/:id", async (context) => {
|
||||||
const response = await kategoriDesaAntiKorupsiFindUnique(context);
|
const response = await kategoriDesaAntiKorupsiFindUnique(context);
|
||||||
return response;
|
return response;
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ async function mediaSosialFindMany(context: Context) {
|
|||||||
},
|
},
|
||||||
skip,
|
skip,
|
||||||
take: limit,
|
take: limit,
|
||||||
orderBy: { createdAt: "desc" }, // opsional, kalau mau urut berdasarkan waktu
|
orderBy: { name: "asc" }, // opsional, kalau mau urut berdasarkan waktu
|
||||||
}),
|
}),
|
||||||
prisma.mediaSosial.count({
|
prisma.mediaSosial.count({
|
||||||
where: { isActive: true },
|
where: { isActive: true },
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const MediaSosial = new Elysia({
|
|||||||
})
|
})
|
||||||
|
|
||||||
// ✅ Find all
|
// ✅ Find all
|
||||||
.get("/find-many", MediaSosialFindMany)
|
.get("/findMany", MediaSosialFindMany)
|
||||||
|
|
||||||
// ✅ Find by ID
|
// ✅ Find by ID
|
||||||
.get("/:id", MediaSosialFindUnique)
|
.get("/:id", MediaSosialFindUnique)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// /api/berita/findManyPaginated.ts
|
// // /api/berita/findManyPaginated.ts
|
||||||
import prisma from "@/lib/prisma";
|
import prisma from "@/lib/prisma";
|
||||||
import { Context } from "elysia";
|
import { Context } from "elysia";
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@ async function programInovasiFindMany(context: Context) {
|
|||||||
},
|
},
|
||||||
skip,
|
skip,
|
||||||
take: limit,
|
take: limit,
|
||||||
orderBy: { createdAt: "desc" }, // opsional, kalau mau urut berdasarkan waktu
|
orderBy: { name: "asc" }, // opsional, kalau mau urut berdasarkan waktu
|
||||||
}),
|
}),
|
||||||
prisma.programInovasi.count({
|
prisma.programInovasi.count({
|
||||||
where: { isActive: true },
|
where: { isActive: true },
|
||||||
@@ -41,3 +41,4 @@ async function programInovasiFindMany(context: Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default programInovasiFindMany;
|
export default programInovasiFindMany;
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ const ProgramInovasi = new Elysia({
|
|||||||
})
|
})
|
||||||
|
|
||||||
// ✅ Find all
|
// ✅ Find all
|
||||||
.get("/find-many", ProgramInovasiFindMany)
|
.get("/findMany", ProgramInovasiFindMany)
|
||||||
|
|
||||||
// ✅ Find by ID
|
// ✅ Find by ID
|
||||||
.get("/:id", ProgramInovasiFindUnique)
|
.get("/:id", ProgramInovasiFindUnique)
|
||||||
|
|||||||
@@ -1,17 +1,20 @@
|
|||||||
import images from "@/con/images";
|
import profileLandingPageState from "@/app/admin/(dashboard)/_state/landing-page/profile";
|
||||||
import { Center, Image, Paper, SimpleGrid } from "@mantine/core";
|
import { Center, Image, Paper, SimpleGrid } from "@mantine/core";
|
||||||
|
import { useShallowEffect } from "@mantine/hooks";
|
||||||
import { motion } from 'framer-motion';
|
import { motion } from 'framer-motion';
|
||||||
import { useTransitionRouter } from 'next-view-transitions';
|
import { useTransitionRouter } from 'next-view-transitions';
|
||||||
|
import { useProxy } from "valtio/utils";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
|
||||||
|
|
||||||
const listImageModule = Object.values(images.module);
|
type ProgramInovasiItem = Prisma.ProgramInovasiGetPayload<{ include: { image: true } }>;
|
||||||
|
|
||||||
function ModuleItem({ item }: { item: string }) {
|
function ModuleItem({ data }: { data: ProgramInovasiItem }) {
|
||||||
const router = useTransitionRouter();
|
const router = useTransitionRouter();
|
||||||
return (
|
return (
|
||||||
<Paper
|
<Paper
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
router.push(`/module/c`);
|
router.push(`/${data.name}`);
|
||||||
}}
|
}}
|
||||||
p={"md"}
|
p={"md"}
|
||||||
bg={"white"}
|
bg={"white"}
|
||||||
@@ -22,7 +25,7 @@ function ModuleItem({ item }: { item: string }) {
|
|||||||
<motion.div
|
<motion.div
|
||||||
whileHover={{ scale: 1.05 }}
|
whileHover={{ scale: 1.05 }}
|
||||||
>
|
>
|
||||||
<Image src={item} alt="icon"
|
<Image src={data.image?.link || ""} alt="icon"
|
||||||
fit="contain"
|
fit="contain"
|
||||||
sizes="100%"
|
sizes="100%"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
@@ -38,6 +41,11 @@ function ModuleItem({ item }: { item: string }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ModuleView() {
|
function ModuleView() {
|
||||||
|
const listImageState = useProxy(profileLandingPageState.programInovasi)
|
||||||
|
|
||||||
|
useShallowEffect(() => {
|
||||||
|
listImageState.findMany.load()
|
||||||
|
}, [])
|
||||||
return (
|
return (
|
||||||
<SimpleGrid
|
<SimpleGrid
|
||||||
cols={{
|
cols={{
|
||||||
@@ -45,9 +53,9 @@ function ModuleView() {
|
|||||||
md: 3,
|
md: 3,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{listImageModule.map((item, k) => {
|
{listImageState.findMany.data?.map((item) => (
|
||||||
return <ModuleItem key={k} item={item} />;
|
<ModuleItem key={item.id} data={item} />
|
||||||
})}
|
))}
|
||||||
</SimpleGrid>
|
</SimpleGrid>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user