Compare commits
5 Commits
nico/13-ja
...
nico/23-ja
| Author | SHA1 | Date | |
|---|---|---|---|
| d9ce4aac6d | |||
| 3fcfec22fb | |||
| 6ca1e032a6 | |||
| 78c55a8a71 | |||
| 17b20e0d40 |
@@ -45,6 +45,7 @@
|
||||
"@types/bun": "^1.2.2",
|
||||
"@types/leaflet": "^1.9.20",
|
||||
"@types/lodash": "^4.17.16",
|
||||
"@types/mime-types": "^3.0.1",
|
||||
"@types/nodemailer": "^7.0.2",
|
||||
"add": "^2.0.6",
|
||||
"adm-zip": "^0.5.16",
|
||||
@@ -72,6 +73,7 @@
|
||||
"leaflet": "^1.9.4",
|
||||
"list": "^2.0.19",
|
||||
"lodash": "^4.17.21",
|
||||
"mime-types": "^3.0.2",
|
||||
"motion": "^12.4.1",
|
||||
"nanoid": "^5.1.5",
|
||||
"next": "^15.5.2",
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh7ugj2",
|
||||
"pekerjaan": "Petani/Pekebun",
|
||||
"lakiLaki": 180,
|
||||
"perempuan": 120
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh8vhk3",
|
||||
"pekerjaan": "Perajin Industri",
|
||||
"lakiLaki": 95,
|
||||
"perempuan": 140
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh9wil4",
|
||||
"pekerjaan": "Pedagang/UMKM",
|
||||
"lakiLaki": 130,
|
||||
"perempuan": 170
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh0xjm5",
|
||||
"pekerjaan": "Karyawan Swasta",
|
||||
"lakiLaki": 260,
|
||||
"perempuan": 310
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh1ykn6",
|
||||
"pekerjaan": "PNS/TNI/Polri",
|
||||
"lakiLaki": 85,
|
||||
"perempuan": 75
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh2zlo7",
|
||||
"pekerjaan": "Buruh Harian Lepas",
|
||||
"lakiLaki": 140,
|
||||
"perempuan": 90
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh3amp8",
|
||||
"pekerjaan": "Wiraswasta",
|
||||
"lakiLaki": 165,
|
||||
"perempuan": 110
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh4bnq9",
|
||||
"pekerjaan": "Pelajar/Mahasiswa",
|
||||
"lakiLaki": 220,
|
||||
"perempuan": 240
|
||||
},
|
||||
{
|
||||
"id": "cmkf3kv0b0004vnys6hh5cor0",
|
||||
"pekerjaan": "Belum/Tidak Bekerja",
|
||||
"lakiLaki": 70,
|
||||
"perempuan": 95
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
[
|
||||
{
|
||||
"id": "795b3e69-2bdb-4d2b-8331-9433fc604723",
|
||||
"year": 2021,
|
||||
"totalPoorPopulation": 480
|
||||
},
|
||||
{
|
||||
"id": "0e61ed28-1789-4329-86bc-67bdb715d4fa",
|
||||
"year": 2022,
|
||||
"totalPoorPopulation": 450
|
||||
},
|
||||
{
|
||||
"id": "0f80e31e-56d7-42aa-aede-e3104f1bca4f",
|
||||
"year": 2023,
|
||||
"totalPoorPopulation": 430
|
||||
},
|
||||
{
|
||||
"id": "3668ecd4-4c4c-4a87-a39a-72661fce5a2c",
|
||||
"year": 2024,
|
||||
"totalPoorPopulation": 410
|
||||
},
|
||||
{
|
||||
"id": "854a375e-4662-4e4c-abd8-59115b4910a9",
|
||||
"year": 2025,
|
||||
"totalPoorPopulation": 390
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,10 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkko983k000104l2ff4i8awk",
|
||||
"SD": "35",
|
||||
"SMP": "28",
|
||||
"SMA": "20",
|
||||
"D3": "8",
|
||||
"S1": "15"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,9 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkko8wam000004l2h99rekid",
|
||||
"usia18_25": "25",
|
||||
"usia26_35": "18",
|
||||
"usia36_45": "12",
|
||||
"usia46_keatas": "10"
|
||||
}
|
||||
]
|
||||
@@ -94,6 +94,24 @@
|
||||
"educatedUnemployment": 78,
|
||||
"uneducatedUnemployment": 54,
|
||||
"percentageChange": -2.22
|
||||
},
|
||||
{
|
||||
"id": "13f11e4f-c96e-4155-bf30-3f45076ee34c",
|
||||
"month": "Jan",
|
||||
"year": 2026,
|
||||
"totalUnemployment": 350,
|
||||
"educatedUnemployment": 200,
|
||||
"uneducatedUnemployment": 150,
|
||||
"percentageChange": 0.0
|
||||
},
|
||||
{
|
||||
"id": "477b3b0c-af18-4816-a00b-dcac530d57cd",
|
||||
"month": "Feb",
|
||||
"year": 2026,
|
||||
"totalUnemployment": 270,
|
||||
"educatedUnemployment": 150,
|
||||
"uneducatedUnemployment": 120,
|
||||
"percentageChange": -22.9
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
[
|
||||
{
|
||||
"id": "3b3e817b-c136-4488-ac79-9a7d408939a2",
|
||||
"posisi": "Lowongan TPS3R Pudak Mesari",
|
||||
"namaPerusahaan": "TPS3R Pudak Mesari Desa Darmasaba",
|
||||
"lokasi": "Desa Darmasaba, Abiansemal, Kabupaten Badung, Bali",
|
||||
"tipePekerjaan": "Freelance",
|
||||
"gaji": "1.500.000",
|
||||
"deskripsi": "Menjalankan tugas di TPS3R Pudak Mesari.",
|
||||
"kualifikasi": "Usia 18-30 tahun, SMA/SMK minimal",
|
||||
"notelp": "089647037426"
|
||||
},
|
||||
{
|
||||
"id": "3b3e817b-c136-4488-bd80-9a7d408939a2",
|
||||
"posisi": "Marketing Executive",
|
||||
"namaPerusahaan": "PT Mitra Krida Mandiri (Dealer Honda MKM Darmasaba)",
|
||||
"lokasi": "Jalan Raya Darmasaba No.169, Abiansemal, Badung, Bali",
|
||||
"tipePekerjaan": "Full Time",
|
||||
"gaji": "2.500.000",
|
||||
"deskripsi": "Menjalankan tugas pemasaran dan penjualan produk Honda di area Darmasaba.",
|
||||
"kualifikasi": "Usia 18-30 tahun, SMA/SMK minimal, memiliki sepeda motor Honda dan smartphone.",
|
||||
"notelp": "081296001047"
|
||||
},
|
||||
{
|
||||
"id": "3b3e817b-c136-4488-ce91-9a7d408939a2",
|
||||
"posisi": "Kasir",
|
||||
"namaPerusahaan": "GOGO DARMASABA",
|
||||
"lokasi": "Jl. Raya Darmasaba, Darmasaba, Kec. Abiansemal, Kabupaten Badung, Bali",
|
||||
"tipePekerjaan": "Full Time",
|
||||
"gaji": "2.500.000",
|
||||
"deskripsi": "Melakukan pelayanan kasir dan administrasi pelanggan di restoran/food service.",
|
||||
"kualifikasi": "Wanita, 18-30 tahun, SMA/SMK minimal pengalaman 1-3 tahun sebagai kasir atau Customer Service.",
|
||||
"notelp": "089647037426"
|
||||
},
|
||||
{
|
||||
"id": "3b3e817b-c136-4488-df02-9a7d408939a2",
|
||||
"posisi": "Kasir / Teknisi Handphone",
|
||||
"namaPerusahaan": "Jaya Cell Darmasaba",
|
||||
"lokasi": "Jl. Raya Darmasaba, Darmasaba, Abiansemal, Badung, Bali",
|
||||
"tipePekerjaan": "Full Time",
|
||||
"gaji": "2.000.000",
|
||||
"deskripsi": "Melakukan pelayanan kasir serta teknisi ponsel termasuk troubleshooting dan perbaikan.",
|
||||
"kualifikasi": "Tidak disebutkan pengalaman khusus, memiliki KTP dan keinginan kuat untuk bekerja.",
|
||||
"notelp": "089647037426"
|
||||
},
|
||||
{
|
||||
"id": "3b3e817b-c136-4488-eg13-9a7d408939a2",
|
||||
"posisi": "Guru Les (Pengajar Anak)",
|
||||
"namaPerusahaan": "Bimba AIUEO Darmasaba",
|
||||
"lokasi": "Darmasaba, Kabupaten Badung, Bali",
|
||||
"tipePekerjaan": "Full Time",
|
||||
"gaji": "2.000.000",
|
||||
"deskripsi": "Mengajar calistung dan perkembangan dasar anak usia 3-6 tahun.",
|
||||
"kualifikasi": "Minimal SMA/SMK, komunikasi baik, berinteraksi dengan anak-anak.",
|
||||
"notelp": "089647037426"
|
||||
}
|
||||
]
|
||||
@@ -6,5 +6,17 @@
|
||||
{
|
||||
"id": "5c06chf7-123f-6hfe-0663-5e9h76e55060",
|
||||
"nama": "Minuman"
|
||||
},
|
||||
{
|
||||
"id": "5c06chf7-123f-7igd-0663-5e9h76e55060",
|
||||
"nama": "Sembako"
|
||||
},
|
||||
{
|
||||
"id": "5c06chf7-123f-8jhe-0663-5e9h76e55060",
|
||||
"nama": "Sayur Mayur"
|
||||
},
|
||||
{
|
||||
"id": "5c06chf7-123f-9kif-0663-5e9h76e55060",
|
||||
"nama": "Protein Hewani"
|
||||
}
|
||||
]
|
||||
|
||||
42
prisma/data/ekonomi/pasar-desa/kategori-to-pasar.json
Normal file
42
prisma/data/ekonomi/pasar-desa/kategori-to-pasar.json
Normal file
@@ -0,0 +1,42 @@
|
||||
[
|
||||
{
|
||||
"id": "f6b52033-5016-45d9-b0fd-b9d4b6c4729b",
|
||||
"kategoriId": "5c06chf7-123f-9kif-0663-5e9h76e55060",
|
||||
"pasarDesaId": "d62660a2-ac6b-428a-acf6-58cc837ef789"
|
||||
},
|
||||
{
|
||||
"id": "d2ef373c-043c-44b5-adde-6a25a54199d3",
|
||||
"kategoriId": "5c06chf7-123f-7igd-0663-5e9h76e55060",
|
||||
"pasarDesaId": "d62660a2-ac6b-428a-acf6-58cc837ef789"
|
||||
},
|
||||
{
|
||||
"id": "ad427752-fea0-4ef3-a312-5961eefd5ee3",
|
||||
"kategoriId": "4b95bge6-012e-5ged-9552-4d8g65d44959",
|
||||
"pasarDesaId": "d62660a2-ac6b-428a-acf6-58cc837ef789"
|
||||
},
|
||||
{
|
||||
"id": "bd00ab59-7ac8-4d40-94de-a86bb0eb4557",
|
||||
"kategoriId": "5c06chf7-123f-8jhe-0663-5e9h76e55060",
|
||||
"pasarDesaId": "24c6b992-49da-4c6e-aebb-72cf89f75438"
|
||||
},
|
||||
{
|
||||
"id": "b7d311a2-a23a-499d-a339-823c5e30849a",
|
||||
"kategoriId": "5c06chf7-123f-7igd-0663-5e9h76e55060",
|
||||
"pasarDesaId": "24c6b992-49da-4c6e-aebb-72cf89f75438"
|
||||
},
|
||||
{
|
||||
"id": "50ccc6c9-92c1-4d86-9585-85d48d35f640",
|
||||
"kategoriId": "4b95bge6-012e-5ged-9552-4d8g65d44959",
|
||||
"pasarDesaId": "24c6b992-49da-4c6e-aebb-72cf89f75438"
|
||||
},
|
||||
{
|
||||
"id": "3b27f795-1d1d-4655-90f9-b779a009094e",
|
||||
"kategoriId": "4b95bge6-012e-5ged-9552-4d8g65d44959",
|
||||
"pasarDesaId": "6dea2257-b710-4cd2-8d94-9b6737e658d8"
|
||||
},
|
||||
{
|
||||
"id": "d45873c5-5948-40f9-a88d-aa0861132bae",
|
||||
"kategoriId": "4b95bge6-012e-5ged-9552-4d8g65d44959",
|
||||
"pasarDesaId": "1b7a17ea-83f7-4e73-a94d-96e2b4a623f2"
|
||||
}
|
||||
]
|
||||
46
prisma/data/ekonomi/pasar-desa/pasar-desa.json
Normal file
46
prisma/data/ekonomi/pasar-desa/pasar-desa.json
Normal file
@@ -0,0 +1,46 @@
|
||||
[
|
||||
{
|
||||
"id": "1b7a17ea-83f7-4e73-a94d-96e2b4a623f2",
|
||||
"nama": "Warung Pasar Darmasaba",
|
||||
"harga": 30000,
|
||||
"imageId": "cmkew56ls0000vnysrnzr9ttx",
|
||||
"rating": 4.3,
|
||||
"alamatUsaha": "Br. Baler Pasar, Desa Darmasaba, Kec. Abiansemal",
|
||||
"kontak": "081234567890",
|
||||
"deskripsi": "Warung tradisional yang menjual kebutuhan pokok harian seperti sembako, jajanan pasar, dan minuman.",
|
||||
"kategoriProdukId": "5c06chf7-123f-7igd-0663-5e9h76e55060"
|
||||
},
|
||||
{
|
||||
"id": "6dea2257-b710-4cd2-8d94-9b6737e658d8",
|
||||
"nama": "Jajanan Pasar Bu Made",
|
||||
"imageId": "cmkewaa2s0001vnysvvs9tu56",
|
||||
"harga": 5000,
|
||||
"rating": 4.6,
|
||||
"alamatUsaha": "Jl. Raya Darmasaba, dekat Banjar Baler Pasar",
|
||||
"kontak": "082145678901",
|
||||
"deskripsi": "Menjual berbagai jajanan pasar tradisional Bali seperti laklak, klepon, dan pisang rai.",
|
||||
"kategoriProdukId": "4b95bge6-012e-5ged-9552-4d8g65d44959"
|
||||
},
|
||||
{
|
||||
"id": "24c6b992-49da-4c6e-aebb-72cf89f75438",
|
||||
"nama": "Sayur Segar Pak Wayan",
|
||||
"imageId": "cmkewcvfq0002vnys6985nm90",
|
||||
"harga": 20000,
|
||||
"rating": 4.4,
|
||||
"alamatUsaha": "Area Pasar Desa Darmasaba",
|
||||
"kontak": "087865432109",
|
||||
"deskripsi": "Lapak sayur segar yang menyediakan sayuran lokal hasil petani sekitar Desa Darmasaba.",
|
||||
"kategoriProdukId": "5c06chf7-123f-8jhe-0663-5e9h76e55060"
|
||||
},
|
||||
{
|
||||
"id": "d62660a2-ac6b-428a-acf6-58cc837ef789",
|
||||
"nama": "Ayam & Daging Segar Darmasaba",
|
||||
"imageId": "cmkewf4u90003vnys87en35nj",
|
||||
"harga": 80000,
|
||||
"rating": 4.2,
|
||||
"alamatUsaha": "Br. Baler Pasar, Desa Darmasaba",
|
||||
"kontak": "081998877665",
|
||||
"deskripsi": "Menjual ayam potong dan daging segar untuk kebutuhan rumah tangga dan upacara adat.",
|
||||
"kategoriProdukId": "5c06chf7-123f-9kif-0663-5e9h76e55060"
|
||||
}
|
||||
]
|
||||
6
prisma/data/ekonomi/pendapatan-asli-desa/apbDesa.json
Normal file
6
prisma/data/ekonomi/pendapatan-asli-desa/apbDesa.json
Normal file
@@ -0,0 +1,6 @@
|
||||
[
|
||||
{
|
||||
"id": "6b52d644-09b7-4af5-a78b-3dad854973e7",
|
||||
"tahun": 2025
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"id": "82b8c96f-7817-482f-ba5e-85ad78c7bd57",
|
||||
"name": "Belanja Desa (Realisasi Semester I)",
|
||||
"nilai": 43871400
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"id": "cb593f99-9f15-4294-9c17-a93c8c149a25",
|
||||
"name": "Pembiayaan Neto (SILPA 2024)",
|
||||
"nilai": 69289666
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,7 @@
|
||||
[
|
||||
{
|
||||
"id": "24576ca1-3dee-4608-9fb3-51f16efce901",
|
||||
"name": "Pendapatan Asli Desa (PADes)",
|
||||
"nilai": 10610011
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
[
|
||||
{
|
||||
"id": "c2760e40-f770-11f0-89ff-719f813f71b3",
|
||||
"nama": "BLT-DD (Bantuan Langsung Tunai Dana Desa)",
|
||||
"icon": "bantuan",
|
||||
"deskripsi": "<p>Program pemberian Bantuan Langsung Tunai yang dibiayai dari Dana Desa untuk meringankan beban ekonomi keluarga miskin/prasejahtera di Desa Darmasaba.</p>",
|
||||
"tahun": 2023
|
||||
},
|
||||
{
|
||||
"id": "c7f0f2e0-f770-11f0-89ff-719f813f71b3",
|
||||
"nama": "Penguatan Ketahanan Pangan",
|
||||
"icon": "air",
|
||||
"deskripsi": "<p>Kegiatan pemberdayaan masyarakat dalam ketahanan pangan untuk mendukung ketersediaan pangan keluarga kurang mampu dan meningkatkan kemampuan produksi pangan lokal.</p>",
|
||||
"tahun": 2024
|
||||
},
|
||||
{
|
||||
"id": "ccda45e0-f770-11f0-89ff-719f813f71b3",
|
||||
"nama": "Peningkatan IKM berbasis E-commerce",
|
||||
"icon": "ekonomi",
|
||||
"deskripsi": "<p>Program peningkatan keterampilan usaha mikro kecil (IKM) termasuk pelatihan branding, pengemasan, dan promosi digital untuk memperkuat ekonomi rumah tangga melalui pemasaran online.</p>",
|
||||
"tahun": 2025
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"id": "85d8a150-f770-11f0-89ff-719f813f71b3",
|
||||
"tahun": 2023,
|
||||
"jumlah": 20
|
||||
},
|
||||
{
|
||||
"id": "993b8d20-f770-11f0-89ff-719f813f71b3",
|
||||
"tahun": 2024,
|
||||
"jumlah": 30
|
||||
},
|
||||
{
|
||||
"id": "9eb3b2a0-f770-11f0-89ff-719f813f71b3",
|
||||
"tahun": 2025,
|
||||
"jumlah": 20
|
||||
}
|
||||
]
|
||||
44
prisma/data/ekonomi/sektor-unggulan/sektor-unggulan.json
Normal file
44
prisma/data/ekonomi/sektor-unggulan/sektor-unggulan.json
Normal file
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"id": "053999e8-e5c4-4a50-b587-0e0ce15aba1a",
|
||||
"name": "Pertanian",
|
||||
"description": "Sektor pertanian meliputi kegiatan bercocok tanam padi, palawija, dan tanaman lain di subak yang menjadi basis mata pencaharian warga",
|
||||
"value": 90
|
||||
},
|
||||
{
|
||||
"id": "8e0d2f2d-512d-4c05-8880-b6e7d144a34d",
|
||||
"name": "UMKM Kecil",
|
||||
"description": "Usaha Mikro Kecil Menengah termasuk IKM berbasis pengolahan pangan dan kuliner yang tumbuh di desa sebagai penggerak ekonomi lokal",
|
||||
"value": 45
|
||||
},
|
||||
{
|
||||
"id": "0378b10a-f0e3-421c-9272-225d931179ce",
|
||||
"name": "Peternakan",
|
||||
"description": "Peternakan ikan lele dan mata pencaharian lain yang mendukung ketahanan pangan dan ekonomi masyarakat desa",
|
||||
"value": 30
|
||||
},
|
||||
{
|
||||
"id": "4fa28680-8014-4c46-9dd0-1aa910630fd3",
|
||||
"name": "BUMDes",
|
||||
"description": "BUMDes Pudak Mesari sebagai lembaga usaha desa yang mengembangkan potensi lokal dan layanan ekonomi",
|
||||
"value": 20
|
||||
},
|
||||
{
|
||||
"id": "669464b2-dd7e-44be-b609-97a9b844df8b",
|
||||
"name": "Kawasan Kuliner",
|
||||
"description": "Potensi kawasan kuliner desa yang menjadi daya tarik ekonomi dan pariwisata kecil di daerah Darmasaba",
|
||||
"value": 15
|
||||
},
|
||||
{
|
||||
"id": "ef65e122-84ce-4483-93e9-c1a8bcee9b79",
|
||||
"name": "Pariwisata",
|
||||
"description": "Potensi wisata lokal seperti Jogging Track, taman dan water park yang memberikan nilai tambah ekonomi masyarakat",
|
||||
"value": 35
|
||||
},
|
||||
{
|
||||
"id": "08443c84-8ca9-4690-b900-e5e3e753cc97",
|
||||
"name": "Kerajinan Genteng",
|
||||
"description": "Kerajinan genteng press di Desa Adat Tegal yang merupakan usaha kerajinan lokal dengan kontribusi ekonomi",
|
||||
"value": 25
|
||||
}
|
||||
]
|
||||
@@ -999,7 +999,7 @@
|
||||
"link": "/api/fileStorage/findUnique/M9QlgVKIEfCdY3g4F_tRZ-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
{
|
||||
"id": "cmkayz2h8001cvn6yrb7uptjs",
|
||||
"name": "Gi8EX3pBmT719AfzXirDS-desktop.webp",
|
||||
"realName": "pd1.jpg",
|
||||
@@ -1115,5 +1115,446 @@
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/DyX82oztXbHfu6HEvbrpt-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkc2tcn30000vnt9esmx8kyb",
|
||||
"name": "K0wY911212dinYA3AFB_f-desktop.webp",
|
||||
"realName": "keamananl-1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/K0wY911212dinYA3AFB_f-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkc2xm1z0003vnt98682dv0a",
|
||||
"name": "x0_-siY2V8IehBzo4_uph-desktop.webp",
|
||||
"realName": "keamananl-2.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/x0_-siY2V8IehBzo4_uph-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkc36q2j0006vnt9g87h5it4",
|
||||
"name": "TXknK9CSRSxwvM2hPW6BO-desktop.webp",
|
||||
"realName": "pecalang.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/TXknK9CSRSxwvM2hPW6BO-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkp70z5g0000vnu9b0aieem8",
|
||||
"name": "vwZsaxcoFWDlxG1PW7FC0-desktop.webp",
|
||||
"realName": "tips-keamanan-1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/vwZsaxcoFWDlxG1PW7FC0-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkp71pub0003vnu9ef60huuv",
|
||||
"name": "dSe0xyvNLkP2t2f6iq-Hk-desktop.webp",
|
||||
"realName": "tipskaman.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/dSe0xyvNLkP2t2f6iq-Hk-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkdu8kb20002vn4lihwo4k86",
|
||||
"name": "6DQbAvn0St-xHdPGW3vpY-desktop.webp",
|
||||
"realName": "Jamban4.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/6DQbAvn0St-xHdPGW3vpY-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkew56ls0000vnysrnzr9ttx",
|
||||
"name": "YdCBnK-bWxlyHjwsk4Qie-desktop.webp",
|
||||
"realName": "WarungPasar.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/YdCBnK-bWxlyHjwsk4Qie-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkewaa2s0001vnysvvs9tu56",
|
||||
"name": "TWdNTZZbTOhFTNJGGPDyG-desktop.webp",
|
||||
"realName": "JajananPasar.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/TWdNTZZbTOhFTNJGGPDyG-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkewcvfq0002vnys6985nm90",
|
||||
"name": "mtQsaKtQnhxIYVIooCkiQ-desktop.webp",
|
||||
"realName": "SayurSegar.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/mtQsaKtQnhxIYVIooCkiQ-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkewf4u90003vnys87en35nj",
|
||||
"name": "Ez-SkRyf_F-1gksz_amNg-desktop.webp",
|
||||
"realName": "AyamDaging.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/Ez-SkRyf_F-1gksz_amNg-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkksb3jr0005vni4sp3ogr87",
|
||||
"name": "r_gBF0FuFpFPfSENHc4XI-desktop.webp",
|
||||
"realName": "desa-digital.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/r_gBF0FuFpFPfSENHc4XI-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkksoze80008vni4ki2ry81r",
|
||||
"name": "uE2QwpbcXyBWxVYqCWQQT-desktop.webp",
|
||||
"realName": "Digital2.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/uE2QwpbcXyBWxVYqCWQQT-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkkx9e38000bvni4azjd3u53",
|
||||
"name": "SQqSobKRg3ShvgPw_H41h-desktop.webp",
|
||||
"realName": "pengaduan1.webp",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/SQqSobKRg3ShvgPw_H41h-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkkxep9l000evni4xkegbk72",
|
||||
"name": "gyNi4s8TnK2UrViU-gN2C-desktop.webp",
|
||||
"realName": "pd2.png",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/gyNi4s8TnK2UrViU-gN2C-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkky60sq0000vnjjc55k84d2",
|
||||
"name": "y78xZ2axTOjz87gRKjVAf-desktop.webp",
|
||||
"realName": "penanganan-sampah-rumah-tangga-di-desa copy.png",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/y78xZ2axTOjz87gRKjVAf-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm0w0my0001vnswthy6ihaw",
|
||||
"name": "SVeScDA6-OAVvGoAfNC0c-desktop.webp",
|
||||
"realName": "desadg1.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/SVeScDA6-OAVvGoAfNC0c-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm0z9hx0004vnswtjd2bk3z",
|
||||
"name": "kN09yF3sahmy-d5EaeGqA-desktop.webp",
|
||||
"realName": "desadg1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/kN09yF3sahmy-d5EaeGqA-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1a14d0005vnsww1tsd92o",
|
||||
"name": "c7xWNyoYp8Cak28NG5NoG-desktop.webp",
|
||||
"realName": "desadg2.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/c7xWNyoYp8Cak28NG5NoG-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1c8py0008vnsw0unbxkpq",
|
||||
"name": "h_Gd0SoeIJVTi_5TWUO-P-desktop.webp",
|
||||
"realName": "desadg3.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/h_Gd0SoeIJVTi_5TWUO-P-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1zis2000bvnsw85m6wdlf",
|
||||
"name": "qJFWokQLCaO60j0XJU_33-desktop.webp",
|
||||
"realName": "mitrakl1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/qJFWokQLCaO60j0XJU_33-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm2dgif000evnswskk0dfo9",
|
||||
"name": "nzLJoEAfl7HkpUcYa8Y1E-desktop.webp",
|
||||
"realName": "mitrak2.webp",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/nzLJoEAfl7HkpUcYa8Y1E-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm2fzub000hvnswnvoytlzs",
|
||||
"name": "JFd5C2FoaZcgDQUmvp-AO-desktop.webp",
|
||||
"realName": "mitrakl3.png",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/JFd5C2FoaZcgDQUmvp-AO-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3b1a2000nvnswb9x48dzk",
|
||||
"name": "JjUDrfqxuEMYSAza-s7A8-desktop.webp",
|
||||
"realName": "desa-digital.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/JjUDrfqxuEMYSAza-s7A8-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3bnkt000qvnswzhqa4upf",
|
||||
"name": "xVrwJgdwtcoABPU6DB__Y-desktop.webp",
|
||||
"realName": "Digital2.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/xVrwJgdwtcoABPU6DB__Y-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3fwg4000rvnsw5d1vbiz0",
|
||||
"name": "42RCCpBZla4ZWxXcwx7kG-desktop.webp",
|
||||
"realName": "infotek3-1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/42RCCpBZla4ZWxXcwx7kG-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3hjhz000uvnswwqu6z9f6",
|
||||
"name": "TrbkwnYM5rKZeHlISHCX4-desktop.webp",
|
||||
"realName": "infotek4.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/TrbkwnYM5rKZeHlISHCX4-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmknb59md0000vnmam828iuzt",
|
||||
"name": "YgOX5qAP3O1PHG5XmQXkr-desktop.webp",
|
||||
"realName": "gr-1.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/YgOX5qAP3O1PHG5XmQXkr-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmknbp3vd0001vnmarjz542o7",
|
||||
"name": "qxqSDHe-akIRi1EkQFUbG-desktop.webp",
|
||||
"realName": "gr-2.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/qxqSDHe-akIRi1EkQFUbG-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmknbrj4r0002vnmantw9rn0l",
|
||||
"name": "iHTVkQZ1VdkMOXLt5qdAd-desktop.webp",
|
||||
"realName": "gr-3.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/iHTVkQZ1VdkMOXLt5qdAd-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhbhxi0000vneamj3din9u",
|
||||
"name": "RnAdv7O0QAFrxkFLAXJSa-desktop.webp",
|
||||
"realName": "buku1.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/RnAdv7O0QAFrxkFLAXJSa-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhed8x0003vneakx0c7me2",
|
||||
"name": "71eZShq4FYAFLxpLfZB0W-desktop.webp",
|
||||
"realName": "buku2.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/71eZShq4FYAFLxpLfZB0W-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhg1cb0006vneagsxa6t4t",
|
||||
"name": "Uxq3GXPqh7HN9fHmRkr3r-desktop.webp",
|
||||
"realName": "buku3.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/Uxq3GXPqh7HN9fHmRkr3r-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhl6mv0009vneasgix42ud",
|
||||
"name": "W5Fc0uRADNkIY3nZicvQA-desktop.webp",
|
||||
"realName": "buku4.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/W5Fc0uRADNkIY3nZicvQA-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhoa5w000cvneah15n28zq",
|
||||
"name": "mp77Op-MwtPQZnH3so4JY-desktop.webp",
|
||||
"realName": "buku5.jpeg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/mp77Op-MwtPQZnH3so4JY-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhr9lg000fvneai3q8qw0s",
|
||||
"name": "V09ZxN1wOwbSFLQiDK0VQ-desktop.webp",
|
||||
"realName": "buku6.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/V09ZxN1wOwbSFLQiDK0VQ-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqi5knc000ivnea8grp7j06",
|
||||
"name": "Wqp4AyVkGjqRMED9Q5XAs-desktop.webp",
|
||||
"realName": "buku7.webp",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/Wqp4AyVkGjqRMED9Q5XAs-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqi9799000lvneamskmvpq5",
|
||||
"name": "NH4aLc7cVuutdQBCofTC0-desktop.webp",
|
||||
"realName": "buku8.webp",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/NH4aLc7cVuutdQBCofTC0-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqibjj2000ovnea3zmmvdop",
|
||||
"name": "MLrsPrD6oiHsrNP4Lc8J7-desktop.webp",
|
||||
"realName": "buku9.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/MLrsPrD6oiHsrNP4Lc8J7-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqidn7e000rvnea5rl58f2e",
|
||||
"name": "iaIeNdhuxqltqKP7aZncQ-desktop.webp",
|
||||
"realName": "buku10.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/iaIeNdhuxqltqKP7aZncQ-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqifdfs000uvneajss8zswp",
|
||||
"name": "WUDssJ59pTKE_3IuTiZ2s-desktop.webp",
|
||||
"realName": "buku11.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/WUDssJ59pTKE_3IuTiZ2s-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqik7p5000xvnea6krii3vw",
|
||||
"name": "RJH_-4_R_nlP7GVEQeD1M-desktop.webp",
|
||||
"realName": "buku13.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/RJH_-4_R_nlP7GVEQeD1M-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqinnih0010vneakpjb9egl",
|
||||
"name": "9MA-Jx_36uoho2Tg40_G9-desktop.webp",
|
||||
"realName": "buku14.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/9MA-Jx_36uoho2Tg40_G9-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiqeb60013vnea2ygrq5rs",
|
||||
"name": "dkb7ZWFl28TREVcvH8sWd-desktop.webp",
|
||||
"realName": "buku15.png",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/dkb7ZWFl28TREVcvH8sWd-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiur960016vnea3werdoey",
|
||||
"name": "nVj3one6CLuWRd04QnsWo-desktop.webp",
|
||||
"realName": "buku16.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/nVj3one6CLuWRd04QnsWo-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqix2go0019vnea8coousvn",
|
||||
"name": "AnB7JO4_6tlPTX3ypOVLi-desktop.webp",
|
||||
"realName": "buku17.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/AnB7JO4_6tlPTX3ypOVLi-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiytnv001cvnea7o2sv1vt",
|
||||
"name": "sAyoMERxL6JgFfiO22KPb-desktop.webp",
|
||||
"realName": "buku18.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/sAyoMERxL6JgFfiO22KPb-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj0nn0001fvneaufur3nke",
|
||||
"name": "WeA-JP2Ks_32fv1k529vj-desktop.webp",
|
||||
"realName": "buku18.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/WeA-JP2Ks_32fv1k529vj-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj37rg001ivneam29fgayr",
|
||||
"name": "pxlHu2kDmIprQqC2PuXaL-desktop.webp",
|
||||
"realName": "buku19.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/pxlHu2kDmIprQqC2PuXaL-desktop.webp",
|
||||
"category": "image"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj5ql6001lvnea6p0afr9f",
|
||||
"name": "G0iELZb2DhQDCCP5OdzJR-desktop.webp",
|
||||
"realName": "buku20.jpg",
|
||||
"path": "uploads/images",
|
||||
"mimeType": "image/webp",
|
||||
"link": "/api/fileStorage/findUnique/G0iELZb2DhQDCCP5OdzJR-desktop.webp",
|
||||
"category": "image"
|
||||
}
|
||||
]
|
||||
|
||||
38
prisma/data/inovasi/ajukan-ide/ajukan-ide.json
Normal file
38
prisma/data/inovasi/ajukan-ide/ajukan-ide.json
Normal file
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkm710n3000xvnsw1ni0vlam",
|
||||
"name": "I Made Rudi",
|
||||
"alamat": "Darmasaba, Abiansemal, Badung, Bali",
|
||||
"namaIde": "Program Bersama Jaga Rabies (BAJRA)",
|
||||
"deskripsi": "Inovasi berbasis komunitas yang mengintegrasikan pelaporan cepat masyarakat, edukasi berkelanjutan, serta koordinasi lintas sektor untuk penanggulangan rabies secara efektif di Desa Darmasaba.",
|
||||
"masalah": "Tingginya kasus rabies dan rendahnya pelaporan serta koordinasi penanganan antar warga sehingga perlunya pendekatan komunitas yang terstruktur.",
|
||||
"benefit": "Meningkatkan kesadaran vaksinasi, respons cepat terhadap kasus gigitan, serta memperkuat sistem kesiapsiagaan kesehatan hewan dan manusia di komunitas."
|
||||
},
|
||||
{
|
||||
"id": "cmkm710n3000xvnsw1ni1wmbn",
|
||||
"name": "I Made Rudja",
|
||||
"alamat": "Darmasaba, Abiansemal, Badung, Bali",
|
||||
"namaIde": "Program LESTARI – Ekowisata dan Edukasi Lingkungan",
|
||||
"deskripsi": "Inovasi pengembangan ekowisata berbasis persawahan yang menggabungkan edukasi lingkungan dan potensi desa untuk menarik wisatawan serta meningkatkan kesejahteraan masyarakat.",
|
||||
"masalah": "Kurangnya sarana edukasi lingkungan dan kurang optimalnya pemanfaatan potensi lahan persawahan sebagai sumber pendapatan masyarakat.",
|
||||
"benefit": "Menambah peluang ekonomi desa, meningkatkan kesadaran lingkungan, dan memperkuat daya tarik wisata lokal Desa Darmasaba."
|
||||
},
|
||||
{
|
||||
"id": "cmkm710n3000xvnsw1ni2xnco",
|
||||
"name": "I Wayan Sumi",
|
||||
"alamat": "Darmasaba, Abiansemal, Badung, Bali",
|
||||
"namaIde": "Darmasaba Digital Project",
|
||||
"deskripsi": "Ide inovatif untuk mengembangkan satu platform digital terpadu bagi layanan pemerintahan desa serta administrasi kerja desa yang lebih cepat dan transparan.",
|
||||
"masalah": "Proses administrasi dan pelayanan publik desa yang masih belum terintegrasi secara digital sehingga kurang efisien.",
|
||||
"benefit": "Meningkatkan efisiensi kerja perangkat desa, transparansi data, dan kecepatan layanan kepada masyarakat."
|
||||
},
|
||||
{
|
||||
"id": "cmkm710n3000xvnsw1ni3yodp",
|
||||
"name": "I Ketut Surya",
|
||||
"alamat": "Darmasaba, Abiansemal, Badung, Bali",
|
||||
"namaIde": "Program CINTA – Cara Indah Tangani Sampah",
|
||||
"deskripsi": "Inovasi pengelolaan sampah melalui mekanisme pilah, kompos, dan bursa sampah (BARES) untuk mengurangi volume sampah di desa dan meningkatkan nilai ekonomi dari sampah yang ternyata bernilai jual.",
|
||||
"masalah": "Volume sampah meningkat yang berdampak pada lingkungan, kurangnya sistem pengelolaan sampah berbasis komunitas.",
|
||||
"benefit": "Lingkungan desa menjadi bersih, sampah bernilai ekonomi dan peningkatan keterlibatan masyarakat dalam pengelolaan sampah."
|
||||
}
|
||||
]
|
||||
32
prisma/data/inovasi/desa-digital/desa-digital.json
Normal file
32
prisma/data/inovasi/desa-digital/desa-digital.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkkshcox000504l88lp54coc",
|
||||
"name": "Darmasaba Digital App",
|
||||
"deskripsi": "<p>Aplikasi digital desa yang dikembangkan oleh Pemerintah Desa Darmasaba pada tahun 2024 untuk mempermudah pelayanan publik dan informasi pemerintahan berbasis digital.</p>",
|
||||
"imageId": "cmkksb3jr0005vni4sp3ogr87"
|
||||
},
|
||||
{
|
||||
"id": "cmkkshln8000604l8c9b5b4il",
|
||||
"name": "D’DAMART (Darmasaba Digital Market)",
|
||||
"deskripsi": "<p>Sistem pasar UMKM digital berbasis website yang dikembangkan untuk meningkatkan akses pasar dan pemasaran produk UMKM Desa Darmasaba melalui platform digital.</p>",
|
||||
"imageId": "cmkksoze80008vni4ki2ry81r"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1a1g80007vnsw8ejmj816",
|
||||
"name": "Media Aspirasi dan Pengaduan Warga",
|
||||
"deskripsi": "<p>Media aspirasi dan pengaduan warga disediakan sebagai wadah partisipasi masyarakat dalam menyampaikan saran, masukan, maupun keluhan secara transparan dan terstruktur. Fitur ini memperkuat komunikasi dua arah antara pemerintah desa dan masyarakat, sehingga setiap aspirasi dapat ditindaklanjuti secara lebih cepat dan akuntabel.</p>",
|
||||
"imageId": "cmkm1a14d0005vnsww1tsd92o"
|
||||
},
|
||||
{
|
||||
"id": "cmkm0w0s50003vnswmwpnqsi5",
|
||||
"name": "Website Desa Resmi",
|
||||
"deskripsi": "<p>Website Desa Darmasaba berfungsi sebagai sarana utama penyampaian informasi resmi kepada masyarakat. Melalui website ini, pemerintah desa menghadirkan keterbukaan informasi publik, mempermudah akses warga terhadap berita, pengumuman, serta agenda kegiatan desa, sekaligus menjadi pusat data dan referensi terkait profil dan struktur pemerintahan desa.</p>",
|
||||
"imageId": "cmkm0z9hx0004vnswtjd2bk3z"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1c8wx000avnswksc56orq",
|
||||
"name": "Publikasi Kegiatan Desa Secara Digital",
|
||||
"deskripsi": "<p>Publikasi kegiatan desa secara digital bertujuan untuk mendokumentasikan dan menyebarluaskan berbagai aktivitas serta program kerja pemerintah desa. Melalui artikel dan dokumentasi foto, masyarakat dapat mengetahui perkembangan kegiatan desa secara terbuka, sekaligus meningkatkan kepercayaan publik terhadap pelaksanaan program desa.</p>",
|
||||
"imageId": "cmkm1c8py0008vnsw0unbxkpq"
|
||||
}
|
||||
]
|
||||
26
prisma/data/inovasi/info-teknologi/info-teknologi.json
Normal file
26
prisma/data/inovasi/info-teknologi/info-teknologi.json
Normal file
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkm2xlqr000mvnswdaymiho6",
|
||||
"name": "Darmasaba Digital App",
|
||||
"deskripsi": "<p>Aplikasi layanan desa berbasis teknologi untuk transparansi informasi dan layanan publik di Desa Darmasaba yang membantu warga mendapatkan informasi administratif, berita desa, dan pelayanan digital lainnya secara cepat dan mudah.</p>",
|
||||
"imageId": "cmkm3bnkt000qvnswzhqa4upf"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3b1fw000pvnswpr7hgzhp",
|
||||
"name": "Program Digitalisasi Desa",
|
||||
"deskripsi": "<p>Program kerja sama Desa Darmasaba bersama PT. Bali Interaktif Perkasa untuk memperkuat kapasitas pemanfaatan teknologi informasi dan komunikasi dalam administrasi desa, pelayanan publik, serta pemberdayaan digital masyarakat.</p>",
|
||||
"imageId": "cmkm3b1a2000nvnswb9x48dzk"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3fwmq000tvnswejmhm7yc",
|
||||
"name": "Pengembangan Sistem Informasi Desa",
|
||||
"deskripsi": "<p>Inisiatif pengembangan Sistem Informasi Desa yang mendukung pengelolaan data desa secara digital, termasuk data publik, laporan, dan statistik warga, sebagai bagian dari peningkatan kapabilitas teknologi informasi desa.</p>",
|
||||
"imageId": "cmkm3fwg4000rvnsw5d1vbiz0"
|
||||
},
|
||||
{
|
||||
"id": "cmkm3hjp6000wvnswkuylnf53",
|
||||
"name": "Pelayanan Kependudukan Berbasis Digital",
|
||||
"deskripsi": "<p>Program untuk menyediakan layanan kependudukan secara digital, termasuk integrasi sistem administrasi kependudukan desa dengan sistem nasional, guna mempercepat layanan e-KTP, kartu keluarga, dan berkas kependudukan lainnya.</p>",
|
||||
"imageId": "cmkm3hjhz000uvnswwqu6z9f6"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"id": "cmklzhfjb0000vnswml6z7xnj",
|
||||
"name": "Bersama Jaga Rabies (BAJRA)",
|
||||
"tahun": 2025,
|
||||
"slug": "Program kolaborasi penanggulangan rabies",
|
||||
"deskripsi": "<p>Inovasi BAJRA (Bersama Jaga Rabies) merupakan program kolaboratif Desa Darmasaba bersama berbagai pihak, termasuk Sahabat Anti Rabies Indonesia dan Dinas Pertanian dan Pangan Kabupaten Badung, yang fokus pada edukasi publik, pelaporan cepat, serta strategis vaksinasi anjing guna upaya eliminasi rabies. Inovasi ini diangkat hingga tingkat internasional di Konferensi Rabies in Borneo 2025.</p>",
|
||||
"kolaborator": "Sahabat Anti Rabies Indonesia, Bidang Kesehatan Hewan Dinas Pertanian dan Pangan Kabupaten Badung"
|
||||
},
|
||||
{
|
||||
"id": "cmklzhfjb0000vnswml6z8yok",
|
||||
"name": "Inovasi Eco-Enzyme dan Optimalisasi Tata Kelola BUMDes",
|
||||
"tahun": 2025,
|
||||
"slug": "Kolaborasi inovasi ekonomi & lingkungan",
|
||||
"deskripsi": "<p>Program kerja sama Desa Darmasaba dengan Universitas Warmadewa dan BUMDes setempat yang berfokus pada pelatihan produksi eco-enzyme ramah lingkungan dan pengembangan tata kelola BUMDes modern untuk meningkatkan kesejahteraan masyarakat berbasis usaha hijau dan ekonomi kreatif.</p>",
|
||||
"kolaborator": "Universitas Warmadewa, Pengurus BUMDes Darmasaba"
|
||||
},
|
||||
{
|
||||
"id": "cmklzhfjb0000vnswml6z9zpl",
|
||||
"name": "Ekowisata dan Kuliner Berkelanjutan",
|
||||
"tahun": 2025,
|
||||
"slug": "Kolaborasi pengembangan ekowisata dan kuliner berbasis budaya",
|
||||
"deskripsi": "<p>Kegiatan yang melibatkan desa adat, BUMDes, UMKM, akademisi, dan pemerintah desa untuk mengembangkan ekowisata dan kuliner lokal berbasis keberlanjutan lingkungan serta potensi budaya setempat, sebagai wujud sinergi inovatif di Darmasaba.</p>",
|
||||
"kolaborator": "Desa Adat Darmasaba, BUMDes, UMKM lokal, Akademisi"
|
||||
}
|
||||
]
|
||||
17
prisma/data/inovasi/kolaborasi-inovasi/mitra-kolaborasi.json
Normal file
17
prisma/data/inovasi/kolaborasi-inovasi/mitra-kolaborasi.json
Normal file
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkm1ziyi000dvnsweg8lp3f7",
|
||||
"name": "TP Posyandu Bali",
|
||||
"imageId": "cmkm1zis2000bvnsw85m6wdlf"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1ziyi000dvnsweg8lq4g8",
|
||||
"name": "BRI Peduli",
|
||||
"imageId": "cmkm2dgif000evnswskk0dfo9"
|
||||
},
|
||||
{
|
||||
"id": "cmkm1ziyi000dvnsweg8lr5h9",
|
||||
"name": "Universitas Warmadewa (KKN-PMM)",
|
||||
"imageId": "cmkm2fzub000hvnswnvoytlzs"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq7ll1",
|
||||
"name": "Surat Keterangan Domisili Organisasi",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9876543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq7ll1"
|
||||
},
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq8mm2",
|
||||
"name": "Surat Keterangan Penghasilan",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9776543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq8mm2"
|
||||
},
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq9nn3",
|
||||
"name": "Surat Keterangan Tidak Mampu",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9676543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq9nn3"
|
||||
},
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq0oo4",
|
||||
"name": "Surat Keterangan Kelahiran",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9576543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq0oo4"
|
||||
},
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq1pp5",
|
||||
"name": "Surat Keterangan Usaha",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9476543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq1pp5"
|
||||
},
|
||||
{
|
||||
"id": "cmkkt91ma000004lb4dpq2qq6",
|
||||
"name": "Perizinan Berusaha OSS",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"nomorTelepon": "0361-9376543",
|
||||
"jenisLayananId": "dnllt91ma000004lb4dpq2qq6"
|
||||
}
|
||||
]
|
||||
32
prisma/data/inovasi/layanan-online-desa/jenis-layanan.json
Normal file
32
prisma/data/inovasi/layanan-online-desa/jenis-layanan.json
Normal file
@@ -0,0 +1,32 @@
|
||||
[
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq7ll1",
|
||||
"nama": "Surat Keterangan Domisili Organisasi",
|
||||
"deskripsi": "Administrasi Online Surat Keterangan Domisili Organisasi"
|
||||
},
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq8mm2",
|
||||
"nama": "Surat Keterangan Penghasilan",
|
||||
"deskripsi": "Administrasi Online Surat Keterangan Penghasilan"
|
||||
},
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq9nn3",
|
||||
"nama": "Surat Keterangan Tidak Mampu",
|
||||
"deskripsi": "Administrasi Online Surat Keterangan Tidak Mampu"
|
||||
},
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq0oo4",
|
||||
"nama": "Surat Keterangan Kelahiran",
|
||||
"deskripsi": "Administrasi Online Surat Keterangan Kelahiran"
|
||||
},
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq1pp5",
|
||||
"nama": "Surat Keterangan Usaha",
|
||||
"deskripsi": "Administrasi Online Surat Keterangan Usaha"
|
||||
},
|
||||
{
|
||||
"id": "dnllt91ma000004lb4dpq2qq6",
|
||||
"nama": "Perizinan Berusaha OSS",
|
||||
"deskripsi": "Administrasi Online Perizinan Usaha Online Single Submission (OSS)"
|
||||
}
|
||||
]
|
||||
26
prisma/data/inovasi/layanan-online-desa/jenis-pengaduan.json
Normal file
26
prisma/data/inovasi/layanan-online-desa/jenis-pengaduan.json
Normal file
@@ -0,0 +1,26 @@
|
||||
[
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq7ll1",
|
||||
"nama": "Lingkungan"
|
||||
},
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq8mm2",
|
||||
"nama": "Ketertiban Umum"
|
||||
},
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq9nn3",
|
||||
"nama": "Kesehatan Masyarakat"
|
||||
},
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq0oo4",
|
||||
"nama": "Pendidikan"
|
||||
},
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq1pp5",
|
||||
"nama": "Pembangunan Infrastuktur"
|
||||
},
|
||||
{
|
||||
"id": "eommt91ma000004lb4dpq2qq6",
|
||||
"nama": "Perizinan Berusaha"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,38 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkkrxmub0004vni41cwyhid4",
|
||||
"name": "Nyoman Putra",
|
||||
"email": "nyoman.putra@example.com",
|
||||
"nomorTelepon": "081234567890",
|
||||
"nik": "3175011234567890",
|
||||
"judulPengaduan": "Permintaan Pemasangan Spanduk Larangan Bagi Hewan",
|
||||
"deskripsiPengaduan": "<p>Permintaan Pemasangan Spanduk Larangan Bagi Hewan</p>",
|
||||
"lokasiKejadian": "Banjar Darmasaba Tengah",
|
||||
"jenisPengaduanId": "eommt91ma000004lb4dpq7ll1",
|
||||
"imageId": "cmkkxep9l000evni4xkegbk72"
|
||||
},
|
||||
{
|
||||
"id": "cmkkrxmub0004vni41cwyhid5",
|
||||
"name": "I Made Sari",
|
||||
"email": "imade.sari@example.com",
|
||||
"nomorTelepon": "087654321098",
|
||||
"nik": "3175010987654321",
|
||||
"judulPengaduan": "Laporan Anjing Liar Sering Menyerang Warga",
|
||||
"deskripsiPengaduan": "<p>Laporan Anjing Liar Sering Menyerang Warga</p>",
|
||||
"lokasiKejadian": "Jl. Raya Darmasaba",
|
||||
"jenisPengaduanId": "eommt91ma000004lb4dpq8mm2",
|
||||
"imageId": "cmkkx9e38000bvni4azjd3u53"
|
||||
},
|
||||
{
|
||||
"id": "cmkkrxmub0004vni41cwyhid6",
|
||||
"name": "Ketut Widi",
|
||||
"email": "ketut.widi@example.com",
|
||||
"nomorTelepon": "085612347890",
|
||||
"nik": "3175011122334455",
|
||||
"judulPengaduan": "Pengelolaan Sampah Rumah Tangga Belum Efektif",
|
||||
"deskripsiPengaduan": "<p>Pengelolaan Sampah Rumah Tangga Belum Efektif</p>",
|
||||
"lokasiKejadian": "Banjar Bucu",
|
||||
"jenisPengaduanId": "eommt91ma000004lb4dpq7ll1",
|
||||
"imageId": "cmkky60sq0000vnjjc55k84d2"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi9frv",
|
||||
"name": "Pelatihan Pembuatan Eco-Enzyme",
|
||||
"slug": "Pelatihan pembuatan cairan eco-enzyme dari limbah organik rumah tangga",
|
||||
"deskripsi": "<p>Program ini mengajarkan masyarakat Desa Darmasaba cara membuat eco-enzyme dari limbah organik yang dapat digunakan sebagai pembersih alami, pupuk organik, dan produk ramah lingkungan untuk meningkatkan nilai tambah ekonomi lokal.</p>",
|
||||
"icon": "lingkunganSehat"
|
||||
},
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi0gsw",
|
||||
"name": "Green House dan Biopori Berkelanjutan",
|
||||
"slug": "Perancangan rumah kaca dan lubang biopori di TPS3R",
|
||||
"deskripsi": "<p>Program perancangan dan pembangunan green house di kawasan TPS3R Pudak Mesari serta pembuatan lubang biopori untuk pengelolaan sampah organik dan konservasi air yang ramah lingkungan sebagai bagian dari pengembangan ekonomi hijau desa.</p>",
|
||||
"icon": "lingkunganSehat"
|
||||
},
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi1htx",
|
||||
"name": "Ekowisata dan Eco-Kuliner Desa",
|
||||
"slug": "Pengembangan paket ekowisata dan kuliner berbasis potensi lokal",
|
||||
"deskripsi": "<p>Kolaborasi antara desa, BUMDes, dan akademisi untuk mengembangkan potensi ekowisata berkelanjutan serta produk kuliner khas desa dengan pendekatan pemasaran digital untuk memperkuat ekonomi kreatif dan pariwisata lokal.</p>",
|
||||
"icon": "ekowisata"
|
||||
},
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi2iuy",
|
||||
"name": "Sosialisasi Kewirausahaan",
|
||||
"slug": "Sosialisasi kewirausahaan bagi masyarakat desa",
|
||||
"deskripsi": "<p>Program ini memberikan pengetahuan dan motivasi kepada warga Darmasaba tentang kewirausahaan, pemasaran digital, pencatatan usaha, dan strategi pengembangan UMKM agar produk lokal lebih produktif dan bernilai ekonomi.</p>",
|
||||
"icon": "ekonomi"
|
||||
},
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi3jvz",
|
||||
"name": "E-Book Kuliner Lokal",
|
||||
"slug": "Publikasi e-book tentang kuliner khas Desa Darmasaba",
|
||||
"deskripsi": "<p>Produksi dan distribusi e-book yang mengangkat resep dan cerita kuliner khas Desa Darmasaba sebagai media edukatif dan promosi budaya pangan lokal yang kreatif serta bisa diperluas untuk pemasaran UMKM desa.</p>",
|
||||
"icon": "book"
|
||||
},
|
||||
{
|
||||
"id": "cmkkyux9x000104jo4gwi4kwa",
|
||||
"name": "Tes Kompetensi",
|
||||
"slug": "Program pemetaan minat dan keterampilan masyarakat untuk mendukung pengembangan potensi dan kesiapan kerja.",
|
||||
"deskripsi": "<p>Tes Kompetensi merupakan program untuk membantu masyarakat, khususnya generasi muda, dalam mengenali minat, bakat, dan keterampilan yang dimiliki. Hasil tes dapat menjadi dasar dalam perencanaan pelatihan, pengembangan potensi diri, serta kesiapan menghadapi dunia kerja dan wirausaha.</p>",
|
||||
"icon": "layananPublik"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkc2tcs00002vnt9c0ssj05n",
|
||||
"name": "Sosialisasi dan Pembinaan Keamanan Lingkungan Desa Darmasaba",
|
||||
"deskripsi": "<p>Pemerintah Desa Darmasaba melaksanakan Sosialisasi dan Pembinaan tentang keamanan dan ketertiban lingkungan kepada warga Perumahan Darmasaba Permai di Wantilan Perum Darmasaba Permai, Desa Darmasaba. Kegiatan ini melibatkan Perbekel Darmasaba, Bhabinkamtibmas, Babinsa, anggota BPD, LPM Desa, KBD dan KBA untuk mengajak warga berperan aktif dalam menjaga keamanan lingkungan, serta mendukung pemasangan lampu penerangan jalan guna mencegah kriminalitas dan kecelakaan di wilayah lingkungan.</p>",
|
||||
"imageId": "cmkc2tcn30000vnt9esmx8kyb"
|
||||
},
|
||||
{
|
||||
"id": "cmkc2xmdh0005vnt9ri6f4nk8",
|
||||
"name": "Sinergi Aparat dan Masyarakat untuk Keamanan Lingkungan",
|
||||
"deskripsi": "<p>Desa Darmasaba bersama aparat seperti Polres Badung dan elemen masyarakat berkomitmen menjalin sinergi untuk menciptakan keamanan dan ketertiban lingkungan yang kondusif, memperkuat kepedulian serta tindakan nyata dalam menjaga situasi kamtibmas desa.</p>",
|
||||
"imageId": "cmkc2xm1z0003vnt98682dv0a"
|
||||
},
|
||||
{
|
||||
"id": "cmkc36qbl0008vnt9odvekex6",
|
||||
"name": "Peran Sistem Keamanan Lingkungan (Siskamling) dan Pecalang di Bali",
|
||||
"deskripsi": "<p>Sistem keamanan lingkungan (Siskamling) di Bali termasuk di Desa Darmasaba melibatkan kolaborasi antara pemerintah desa, satlinmas, dan pecalang sebagai pranata adat Bali. Sinergi ini penting untuk menjaga ketertiban masyarakat serta harmoni sosial berdasarkan kearifan lokal seperti Tri Hita Karana, meskipun perlu pembinaan dan koordinasi terus menerus dari desa dan aparat terkait.</p>",
|
||||
"imageId": "cmkc36q2j0006vnt9g87h5it4"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"id": "keamanan-polisi",
|
||||
"nama": "Kepolisian",
|
||||
"icon": "keamanan",
|
||||
"kategoriId": "item-polisi"
|
||||
},
|
||||
{
|
||||
"id": "keamanan-damkar",
|
||||
"nama": "Pemadam Kebakaran",
|
||||
"icon": "pemadam",
|
||||
"kategoriId": "item-damkar"
|
||||
},
|
||||
{
|
||||
"id": "keamanan-sar",
|
||||
"nama": "SAR & Evakuasi",
|
||||
"icon": "sar",
|
||||
"kategoriId": "item-sar"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,17 @@
|
||||
[
|
||||
{
|
||||
"id": "map-polisi-1",
|
||||
"kontakDaruratId": "keamanan-polisi",
|
||||
"kontakItemId": "item-polsek-darmasaba"
|
||||
},
|
||||
{
|
||||
"id": "map-polisi-2",
|
||||
"kontakDaruratId": "keamanan-polisi",
|
||||
"kontakItemId": "item-polres-badung"
|
||||
},
|
||||
{
|
||||
"id": "map-damkar-1",
|
||||
"kontakDaruratId": "keamanan-damkar",
|
||||
"kontakItemId": "item-damkar-badung"
|
||||
}
|
||||
]
|
||||
45
prisma/data/keamanan/kontak-darurat-keamanan/kontakItem.json
Normal file
45
prisma/data/keamanan/kontak-darurat-keamanan/kontakItem.json
Normal file
@@ -0,0 +1,45 @@
|
||||
[
|
||||
{
|
||||
"id": "item-polisi",
|
||||
"nama": "Polisi",
|
||||
"nomorTelepon": "110",
|
||||
"icon": "keamanan"
|
||||
},
|
||||
{
|
||||
"id": "item-damkar",
|
||||
"nama": "Pemadam Kebakaran",
|
||||
"nomorTelepon": "113",
|
||||
"icon": "pemadam"
|
||||
},
|
||||
{
|
||||
"id": "item-sar",
|
||||
"nama": "BASARNAS",
|
||||
"nomorTelepon": "115",
|
||||
"icon": "sar"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "item-polsek-darmasaba",
|
||||
"nama": "Polsek Darmasaba",
|
||||
"nomorTelepon": "0361123456",
|
||||
"icon": "bangunan"
|
||||
},
|
||||
{
|
||||
"id": "item-polres-badung",
|
||||
"nama": "Polres Badung",
|
||||
"nomorTelepon": "0361123999",
|
||||
"icon": "bangunan"
|
||||
},
|
||||
{
|
||||
"id": "item-damkar-badung",
|
||||
"nama": "Damkar Kabupaten Badung",
|
||||
"nomorTelepon": "0361900113",
|
||||
"icon": "pemadam"
|
||||
},
|
||||
{
|
||||
"id": "item-bpbd-badung",
|
||||
"nama": "BPBD Badung",
|
||||
"nomorTelepon": "0361900113",
|
||||
"icon": "sar"
|
||||
}
|
||||
]
|
||||
16
prisma/data/keamanan/laporan-publik/laporan-publik.json
Normal file
16
prisma/data/keamanan/laporan-publik/laporan-publik.json
Normal file
@@ -0,0 +1,16 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkdt14my0000vn4lrvfv6jxr",
|
||||
"judul": "LAPORAN REALISASI APBDES SEMESTER I TAHUN ANGGARAN 2025",
|
||||
"lokasi": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung",
|
||||
"tanggalWaktu": "2025-08-04T08:58:55.080Z",
|
||||
"kronologi": "<p>Pemerintah Desa Darmasaba menyampaikan realisasi pendapatan dan belanja desa hingga semester I tahun 2025 yang mencakup berbagai sumber pendapatan dan rincian belanja desa.</p>"
|
||||
},
|
||||
{
|
||||
"id": "cmkdt14my0000vn4lrvfv7kys",
|
||||
"judul": "Aksi Penanganan Maraknya Pembuangan Sampah Liar di Wilayah Desa Darmasaba",
|
||||
"lokasi": "Desa Darmasaba, Kabupaten Badung",
|
||||
"tanggalWaktu": "2025-11-24T08:58:55.080Z",
|
||||
"kronologi": "<p>Tim mendatangi rumah pihak yang diduga melakukan pembuangan sampah liar, melakukan pendataan dan penelusuran, serta koordinasi lintas wilayah untuk memastikan penanganan yang tepat.</p>"
|
||||
}
|
||||
]
|
||||
12
prisma/data/keamanan/laporan-publik/penanganan-laporan.json
Normal file
12
prisma/data/keamanan/laporan-publik/penanganan-laporan.json
Normal file
@@ -0,0 +1,12 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkdt41lx0001vn4lrlcqz735",
|
||||
"laporanId": "cmkdt14my0000vn4lrvfv6jxr",
|
||||
"deskripsi": "<p>Laporan ini disampaikan sebagai bentuk komitmen transparansi pengelolaan keuangan desa dan dapat dimonitor oleh masyarakat.</p>"
|
||||
},
|
||||
{
|
||||
"id": "cmkdt41lx0002vn4lrlcqz846",
|
||||
"laporanId": "cmkdt14my0000vn4lrvfv7kys",
|
||||
"deskripsi": "<p>Pemerintah Desa bersama Penyidik Lingkungan Hidup melakukan investigasi lapangan terhadap laporan masyarakat mengenai aksi pembuangan sampah liar, serta melakukan koordinasi untuk penindakan sesuai ketentuan.</p>"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
[
|
||||
{
|
||||
"id": "cmh48mn850003qq091pvs7rf1",
|
||||
"judul": "Maling Motor di Darmasaba, Residivis Begal Didor",
|
||||
"deskripsi": "<p>Maling Motor di Darmasaba, Residivis Begal Didor David Andiansyah kembali terancam dibui lantaran melakukan aksi pencurian.</p>",
|
||||
"deskripsiSingkat": "<p>Maling Motor di Darmasaba, Residivis Begal Didor David Andiansyah kembali terancam dibui lantaran melakukan aksi pencurian. Mantan narapidana kasus begal ini diciduk polisi usai mencuri sepeda motor di garase rumah, kawasan Banjar Cabe, Desa Darmasaba, Abiansemal, Badung, Kamis (24/6). Kasi Humas Polres Badung Iptu Ketut Sudana menerangkan, peristiwa tersebut bermula ketika korban Ni Made Desniari berkunjung ke rumah tetangganya Putu Juliati. Saat itu korban memarkirkan sepeda motor Honda Beat miliknya di garase (TKP), tetapi kunci motornya masih nyantol di motor. Ketika korban kembali sekitar pukul 13.00, didapati motornya telah raib. Atas kejadian ini wanita asli Banjar Cabe melapor ke polisi.</p>",
|
||||
"linkVideo": "https://www.youtube.com/embed/2rxK5A-KoeY"
|
||||
},
|
||||
{
|
||||
"id": "cmh59no850003qq091pvs7rf1",
|
||||
"judul": "Integrasi Digital & Akuntabilitas Desa (Pencegahan Penyalahgunaan Wewenang)",
|
||||
"deskripsi": "<p>Video ini membahas bagaimana integrasi digital seperti Simpades, Siskeudes, dan program Jaga Desa memperkuat akuntabilitas pemerintahan desa Darmasaba. Program tersebut mendukung transparansi dan pencegahan tindak pidana administrasi maupun penyalahgunaan wewenang karena tata kelola data desa yang baik membantu mencegah korupsi atau kecurangan dalam pengelolaan dana dan layanan desa.</p>",
|
||||
"deskripsiSingkat": "<p>Integrasi digital meningkatkan transparansi dan mencegah penyalahgunaan wewenang di pemerintahan desa.</p>",
|
||||
"linkVideo": "https://www.youtube.com/embed/l7NIqjA2b_k"
|
||||
},
|
||||
{
|
||||
"id": "cmh60op850003qq091pvs7rf1",
|
||||
"judul": "PROFIL DESA DARMASABA",
|
||||
"deskripsiSingkat": "PROFIL DESA DARMASABA Desa Darmasaba adalah permata di ujung selatan Kecamatan Abiansemal, Kabupaten Badung",
|
||||
"deskripsi": "<p>PROFIL DESA DARMASABA Desa Darmasaba adalah permata di ujung selatan Kecamatan Abiansemal, Kabupaten Badung, yang dikenal dengan kekayaan budaya, inovasi desa, dan potensi ekonomi yang terus berkembang. Berbatasan langsung dengan Kota Denpasar, Desa Darmasaba memiliki luas wilayah 567 hektar dengan jumlah penduduk 10.141 jiwa (per akhir Desember 2024). Video ini menampilkan potensi dan keunggulan Desa Darmasaba: 🏞️ Keindahan alam dan kawasan persawahan yang dikelola empat subak aktif. 🍽️ Keberhasilan UMKM dan kuliner lokal, termasuk produk unggulan ACK yang merambah pasar nasional. 🌱 Inovasi ketahanan pangan, pengolahan sampah ramah lingkungan (TPS3R Pudak Mesari, CINTA Darmasaba), hingga Graha Sari Boga dengan program makan bergizi gratis. 🎭 Pelestarian seni, budaya, dan tradisi, termasuk maskot Sekar Pudak dan tradisi Ngerebeg. 🏆 Prestasi desa tingkat nasional dan internasional. 📱 Transformasi digital dengan aplikasi Darmasaba Digital App, talkshow Bicara Darmasaba, hingga perpustakaan digital Pustaka Ananta Loka. Dengan motto \\\"Menggali Warisan, Merangkai Inovasi\\\", Desa Darmasaba menghadirkan 13 inovasi unggulan di bidang pemerintahan, kewilayahan, UMKM, dan kemasyarakatan. Desa ini membuktikan bahwa kolaborasi masyarakat dan pemerintah mampu mewujudkan desa yang mandiri, berdaya saing, dan berkelanjutan. 🎥 Produksi: Tim Media Kreatif Desa Darmasaba 🤝 Dukungan: Seluruh Lembaga & Elemen Masyarakat Desa Darmasaba</p>",
|
||||
"linkVideo": "https://www.youtube.com/watch?v=9eCnhJvdv6A"
|
||||
}
|
||||
]
|
||||
14
prisma/data/keamanan/polsek-terdekat/layanan-polsek.json
Normal file
14
prisma/data/keamanan/polsek-terdekat/layanan-polsek.json
Normal file
@@ -0,0 +1,14 @@
|
||||
[
|
||||
{
|
||||
"id": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478",
|
||||
"nama": "Layanan Administrasi & Surat-Menyurat"
|
||||
},
|
||||
{
|
||||
"id": "b5af284c-6aa1-4442-935f-869d78eb7ecf",
|
||||
"nama": "Penanganan Laporan & Pengaduan"
|
||||
},
|
||||
{
|
||||
"id": "56b37d7f-d717-4e33-b05d-ea22b5f7af91",
|
||||
"nama": "Perlindungan & Pengayoman Masyarakat"
|
||||
}
|
||||
]
|
||||
62
prisma/data/keamanan/polsek-terdekat/layanan-to-polsek.json
Normal file
62
prisma/data/keamanan/polsek-terdekat/layanan-to-polsek.json
Normal file
@@ -0,0 +1,62 @@
|
||||
[
|
||||
{
|
||||
"id": "a50d52f2-e70f-4f29-9133-e294c40d14d3",
|
||||
"layananId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478",
|
||||
"polsekTerdekatId": "b92ee048-fb7f-44e9-aa5b-822e6cd0085d"
|
||||
},
|
||||
{
|
||||
"id": "012454f8-f5d7-41c0-9dce-2754c0356523",
|
||||
"layananId": "b5af284c-6aa1-4442-935f-869d78eb7ecf",
|
||||
"polsekTerdekatId": "b92ee048-fb7f-44e9-aa5b-822e6cd0085d"
|
||||
},
|
||||
{
|
||||
"id": "50736038-4ba6-47f8-8399-35b73b389f12",
|
||||
"layananId": "56b37d7f-d717-4e33-b05d-ea22b5f7af91",
|
||||
"polsekTerdekatId": "b92ee048-fb7f-44e9-aa5b-822e6cd0085d"
|
||||
},
|
||||
{
|
||||
"id": "e2dc3487-1f62-4f63-9a12-49ac30da3372",
|
||||
"layananId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478",
|
||||
"polsekTerdekatId": "de769c40-10d4-4fbc-a5ef-12f2ce53a0a2"
|
||||
},
|
||||
{
|
||||
"id": "47fe1f9c-4072-4203-90f9-3294d1369ac5",
|
||||
"layananId": "b5af284c-6aa1-4442-935f-869d78eb7ecf",
|
||||
"polsekTerdekatId": "de769c40-10d4-4fbc-a5ef-12f2ce53a0a2"
|
||||
},
|
||||
{
|
||||
"id": "2cc1ba81-6b62-42ff-af21-09f8165a2dd0",
|
||||
"layananId": "56b37d7f-d717-4e33-b05d-ea22b5f7af91",
|
||||
"polsekTerdekatId": "de769c40-10d4-4fbc-a5ef-12f2ce53a0a2"
|
||||
},
|
||||
{
|
||||
"id": "3ca2ce42-2e7d-4750-87b7-f1f52ed141de",
|
||||
"layananId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478",
|
||||
"polsekTerdekatId": "9a3fff54-8854-4929-b9b5-b5b2751011ea"
|
||||
},
|
||||
{
|
||||
"id": "90472bca-cf3d-47ca-92e5-db43c4c7e579",
|
||||
"layananId": "b5af284c-6aa1-4442-935f-869d78eb7ecf",
|
||||
"polsekTerdekatId": "9a3fff54-8854-4929-b9b5-b5b2751011ea"
|
||||
},
|
||||
{
|
||||
"id": "41cfc1fe-a193-446d-b574-64b1124c6f55",
|
||||
"layananId": "56b37d7f-d717-4e33-b05d-ea22b5f7af91",
|
||||
"polsekTerdekatId": "9a3fff54-8854-4929-b9b5-b5b2751011ea"
|
||||
},
|
||||
{
|
||||
"id": "f35443e1-6aca-416d-8c55-00e3f4a0f5f9",
|
||||
"layananId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478",
|
||||
"polsekTerdekatId": "c2d272e1-737d-44f5-bd85-ae268cb06cbf"
|
||||
},
|
||||
{
|
||||
"id": "e09797f6-82e5-4b77-946e-319eee431c8f",
|
||||
"layananId": "b5af284c-6aa1-4442-935f-869d78eb7ecf",
|
||||
"polsekTerdekatId": "c2d272e1-737d-44f5-bd85-ae268cb06cbf"
|
||||
},
|
||||
{
|
||||
"id": "bd9b1f27-cd1b-4e23-b162-3a757745f78a",
|
||||
"layananId": "56b37d7f-d717-4e33-b05d-ea22b5f7af91",
|
||||
"polsekTerdekatId": "c2d272e1-737d-44f5-bd85-ae268cb06cbf"
|
||||
}
|
||||
]
|
||||
54
prisma/data/keamanan/polsek-terdekat/polsek-terdekat.json
Normal file
54
prisma/data/keamanan/polsek-terdekat/polsek-terdekat.json
Normal file
@@ -0,0 +1,54 @@
|
||||
[
|
||||
{
|
||||
"id": "b92ee048-fb7f-44e9-aa5b-822e6cd0085d",
|
||||
"nama": "Kantor Polisi Abian Semal",
|
||||
"jarakKeDesa": "9,6 Km",
|
||||
"alamat": "ABIAN SEMAL POLICE STAT, JL. Pasar, Blahkiuh, Kec. Abiansemal, Kabupaten Badung, Bali 80352",
|
||||
"nomorTelepon": "0361813972",
|
||||
"jamOperasional": "Buka 24 Jam",
|
||||
"embedMapUrl": "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d63127.118683990586!2d115.16592643905703!3d-8.553143643198624!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2dd23ceb4f6e5363%3A0xa353662f070f47d8!2sAbian%20Semal%20Police%20Station!5e0!3m2!1sid!2sid!4v1768376981008!5m2!1sid!2sid",
|
||||
"namaTempatMaps": "Abian Semal Police Station",
|
||||
"alamatMaps": "ABIAN SEMAL POLICE STAT, JL. Pasar, Blahkiuh, Kec. Abiansemal, Kabupaten Badung, Bali 80352",
|
||||
"linkPetunjukArah": "https://maps.app.goo.gl/GhHVNQqffNrXSMFX7",
|
||||
"layananPolsekId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478"
|
||||
},
|
||||
{
|
||||
"id": "de769c40-10d4-4fbc-a5ef-12f2ce53a0a2",
|
||||
"nama": "Polres Badung",
|
||||
"jarakKeDesa": "5,8 Km",
|
||||
"alamat": "Jl. Kebo Iwa No.1, Mengwitani, Kec. Mengwi, Kabupaten Badung, Bali 80351",
|
||||
"nomorTelepon": "0361829949",
|
||||
"jamOperasional": "Buka 24 Jam",
|
||||
"embedMapUrl": "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d15780.907469872707!2d115.17829950197888!3d-8.574172113520685!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2dd238cade1488c3%3A0x918ba5cac3ef00b7!2sPolres%20Badung!5e0!3m2!1sid!2sid!4v1768377100998!5m2!1sid!2sid",
|
||||
"namaTempatMaps": "Polres Badung",
|
||||
"alamatMaps": "Jl. Kebo Iwa No.1, Mengwitani, Kec. Mengwi, Kabupaten Badung, Bali 80351",
|
||||
"linkPetunjukArah": "https://maps.app.goo.gl/7yQQod4PFhpqqe7Z8",
|
||||
"layananPolsekId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478"
|
||||
},
|
||||
{
|
||||
"id": "9a3fff54-8854-4929-b9b5-b5b2751011ea",
|
||||
"nama": "Polsek Mengwi",
|
||||
"jarakKeDesa": "9,7 Km",
|
||||
"alamat": "Jl. I Gusti Ngurah Rai No.110, Werdi Bhuwana, Kec. Mengwi, Kabupaten Badung, Bali 80351",
|
||||
"nomorTelepon": "0361411270",
|
||||
"jamOperasional": "Buka 24 Jam",
|
||||
"embedMapUrl": "https://www.google.com/maps/embed?pb=!1m14!1m8!1m3!1d63126.100310757916!2d115.1716545!3d-8.5592871!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2dd23b9ddc3980af%3A0xa1f4f195483537b!2sPolsek%20Mengwi!5e0!3m2!1sid!2sid!4v1768377317955!5m2!1sid!2sid",
|
||||
"namaTempatMaps": "Polsek Mengwi",
|
||||
"alamatMaps": "Jl. I Gusti Ngurah Rai No.110, Werdi Bhuwana, Kec. Mengwi, Kabupaten Badung, Bali 80351",
|
||||
"linkPetunjukArah": "https://maps.app.goo.gl/cJD44NSUdpA7Ly2m6",
|
||||
"layananPolsekId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478"
|
||||
},
|
||||
{
|
||||
"id": "c2d272e1-737d-44f5-bd85-ae268cb06cbf",
|
||||
"nama": "Pos Polisi Ahmad Yani",
|
||||
"jarakKeDesa": "7 Km",
|
||||
"alamat": "Jl. Ahmad Yani Utara No.5, Peguyangan, Kec. Denpasar Utara, Kota Denpasar, Bali 80239",
|
||||
"nomorTelepon": "-",
|
||||
"jamOperasional": "-",
|
||||
"embedMapUrl": "https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d31558.650325984465!2d115.18791122296605!3d-8.612190901728288!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x2dd23f635f1186b1%3A0xcfdde508d897fb04!2sPos%20Polisi%20Simpang%20Ahmad%20Yani!5e0!3m2!1sid!2sid!4v1768377470154!5m2!1sid!2sid",
|
||||
"namaTempatMaps": "Pos Polisi Simpang Ahmad Yani",
|
||||
"alamatMaps": "Jl. Ahmad Yani Utara No.5, Peguyangan, Kec. Denpasar Utara, Kota Denpasar, Bali 80239",
|
||||
"linkPetunjukArah": "https://maps.app.goo.gl/D8HGs4mSAQqJm9KRA",
|
||||
"layananPolsekId": "7ded635b-bf4a-4c1b-b6fa-2f13f4dfc478"
|
||||
}
|
||||
]
|
||||
14
prisma/data/keamanan/tips-keamanan/tips-keamanan.json
Normal file
14
prisma/data/keamanan/tips-keamanan/tips-keamanan.json
Normal file
@@ -0,0 +1,14 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkp70zau0002vnu9o1jtpi1i",
|
||||
"judul": "Keamanan Rumah",
|
||||
"deskripsi": "<p><ul><li><p>Pastikan pintu dan jendela selalu terkunci saat meninggalkan rumah</p></li><li><p>Pasang lampu penerangan di halaman dan area sekitar rumah untuk mencegah tindak kejahatan.</p></li><li><p>Jangan mudah memberikan akses masuk ke orang yang tidak dikenal.</p></li></ul></p>",
|
||||
"imageId": "cmkp71pub0003vnu9ef60huuv"
|
||||
},
|
||||
{
|
||||
"id": "cmkp71pzo0005vnu9p3n9646d",
|
||||
"judul": "Keamanan Lingkungan Tanggungjawab Bersama",
|
||||
"deskripsi": "<p>Pemerintah Desa Darmasaba melaksanakan sosialisasi dan pembinaan tentang keamanan dan ketertiban lingkungan kepada warga Perumahan Darmasaba Permai. Warga diajak berperan aktif dalam menjaga keamanan lingkungan serta mendukung penyediaan lampu penerangan jalan untuk mencegah tindak kriminal dan kecelakaan. Bhabinkamtibmas dan Babinsa turut memberikan materi keamanan dan ketertiban kepada warga, menekankan pentingnya partisipasi masyarakat dalam menjaga keamanan desa.</p>",
|
||||
"imageId": "cmkp70z5g0000vnu9b0aieem8"
|
||||
}
|
||||
]
|
||||
@@ -40,5 +40,12 @@
|
||||
"deskripsiSingkat": "<p>Program pembinaan dan pengembangan kapasitas kader Posyandu.</p>",
|
||||
"deskripsi": "<p>Pemdes Darmasaba melaksanakan kegiatan Outbound Posyandu untuk meningkatkan kapasitas dan wawasan Kader Posyandu se-Desa Darmasaba sebagai bagian dari upaya peningkatan kualitas pelayanan kesehatan dasar di masyarakat.</p>",
|
||||
"imageId": "cmkaykipf0019vn6yknjno3k1"
|
||||
},
|
||||
{
|
||||
"id": "cmkdu8ki10004vn4lpbxm2zqo",
|
||||
"name": "PEMBANGUNAN JAMBAN BAGI MASYARAKAT",
|
||||
"deskripsiSingkat": "<p>Program pengadaan jamban bagi Masyarakat ini diharapkan menjadi stimulus agar masyarakat peduli terhadap lingkungan sehat sehingga Badung Open Defection Free atau terbebas dari buang air besar di tempat terbuka dapat terwujud.</p>",
|
||||
"deskripsi": "<p>Desa Darmasaba sebagai desa yang berkomitmen selalu selaras dengan pembangunan Pemerintah Kabupaten Badung pada tahun anggaran 2023 ini turut ambil bagian dalam menyukseskan program Bupati Badung I Nyoman Giri Prasta, S.Sos dalam bidang kesehatan sanitasi masyarakat. Program pengadaan jamban bagi Masyarakat ini diharapkan menjadi stimulus agar masyarakat peduli terhadap lingkungan sehat sehingga Badung Open Defection Free atau terbebas dari buang air besar di tempat terbuka dapat terwujud.</p><p style=\"text-align: justify\">Pemberian bantuan jamban ini dilaksanakan di 11 banjar dengan menyasar 22 keluarga yang memang belum memiliki jamban yang sumber dananya sepenuhnya dari APBDes Darmasaba T. A. 2023. Pembangunan Jamban bagi Masyarakat ini juga menjadi bukti komitmen Pemerintah Desa Darmasaba dalam melaksanakan salah satu visi mewujudkan masyarakat yang sejahtera dan berbudaya untuk menjaga lingkungan yang bersih dan sehat.</p>",
|
||||
"imageId": "cmkdu8kb20002vn4lihwo4k86"
|
||||
}
|
||||
]
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
[
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps1eg8",
|
||||
"name": "Pelaksanaan Kebersihan Lingkungan Desa",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Kegiatan pelaksanaan kebersihan lingkungan desa Darmasaba untuk meningkatkan kualitas lingkungan dan kesehatan masyarakat.",
|
||||
"icon": "lingkunganSehat"
|
||||
},
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps2fh9",
|
||||
"name": "Penataan Taman Telajakan",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Program penataan taman telajakan sebagai upaya memperindah lingkungan desa serta ruang terbuka publik di desa Darmasaba.",
|
||||
"icon": "lingkunganSehat"
|
||||
},
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps3gi0",
|
||||
"name": "Pelatihan/Sosialisasi Peduli Lingkungan",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Pelatihan dan sosialisasi penyuluhan tentang kepedulian lingkungan hidup dan kehutanan bagi masyarakat.",
|
||||
"icon": "pelatihan"
|
||||
},
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps4hj2",
|
||||
"name": "Pemanfaatan Pekarangan Rumah",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Program pemanfaatan lingkungan pekarangan rumah menjadi produktif untuk mendukung ketahanan pangan keluarga.",
|
||||
"icon": "sumberOksigen"
|
||||
},
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps5ik3",
|
||||
"name": "Pengelolaan Daerah Aliran Sungai",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Kegiatan pengelolaan dan pemeliharaan daerah aliran sungai untuk menjaga kualitas sumber air dan mencegah erosi.",
|
||||
"icon": "air"
|
||||
},
|
||||
{
|
||||
"id": "bnlneq3zg0000vn8issps6jl4",
|
||||
"name": "Pengelolaan Sampah Desa (Inovasi CINtA)",
|
||||
"jumlah": "1 paket kegiatan",
|
||||
"deskripsi": "Program inovatif cara indah tangani sampah (CINtA) di desa Darmasaba termasuk TPS3R dan pemilahan sampah berbasis rumah tangga.",
|
||||
"icon": "sampah"
|
||||
}
|
||||
]
|
||||
35
prisma/data/lingkungan/gotong-royong/gotong-royong.json
Normal file
35
prisma/data/lingkungan/gotong-royong/gotong-royong.json
Normal file
@@ -0,0 +1,35 @@
|
||||
[
|
||||
{
|
||||
"id": "ee38b9ee-88ca-4a11-8fa0-7d407ea7e774",
|
||||
"judul": "Gotong Royong PKK Mareresik Pura Desa dan Pura Dalem",
|
||||
"deskripsiSingkat": "TP PKK Desa Darmasaba melaksanakan gotong royong mareresik di Pura Desa dan Pura Dalem Desa Adat Tegal.",
|
||||
"deskripsiLengkap": "Pada tanggal 28 Januari 2024, TP PKK Desa Darmasaba bersama Ketua Kelompok PKK Banjar se-Desa Darmasaba melakukan kegiatan gotong royong membersihkan area Pura Desa dan Pura Dalem untuk mendukung kebersihan dan kesehatan lingkungan desa.",
|
||||
"tanggal": "2024-01-28T00:00:00.000Z",
|
||||
"lokasi": "Pura Desa dan Pura Dalem, Desa Adat Tegal, Desa Darmasaba, Badung",
|
||||
"partisipan": 30,
|
||||
"imageId": "cmknb59md0000vnmam828iuzt",
|
||||
"kategoriKegiatanId": "cmknan39v000004l8eiql149r"
|
||||
},
|
||||
{
|
||||
"id": "dead9da0-e2e2-494c-9f88-721f2c3aa62a",
|
||||
"judul": "Mareresik (Gotong Royong)",
|
||||
"deskripsiSingkat": "Kegiatan mareresik (gotong royong) yang dilaksanakan di lingkungan desa Darmasaba.",
|
||||
"deskripsiLengkap": "Mareresik (gotong royong) dilakukan pada tanggal 17 November 2023 oleh warga Desa Darmasaba sebagai bagian dari tradisi membersihkan dan menjaga lingkungan desa secara kolektif.",
|
||||
"tanggal": "2023-11-17T00:00:00.000Z",
|
||||
"lokasi": "Desa Darmasaba, Badung",
|
||||
"partisipan": 25,
|
||||
"imageId": "cmknbp3vd0001vnmarjz542o7",
|
||||
"kategoriKegiatanId": "cmknan39v000004l8eiql149r"
|
||||
},
|
||||
{
|
||||
"id": "5186e23b-28a6-4f64-89b8-43a35e5048a5",
|
||||
"judul": "Gotong Royong dan Rapat Rutin TP PKK Desa Darmasaba",
|
||||
"deskripsiSingkat": "Gotong royong bersama TP PKK Desa Darmasaba di Pura Dalem Kangin Desa Adat Tegal sekaligus rapat rutin.",
|
||||
"deskripsiLengkap": "Pada tanggal 26 Mei 2022, TP PKK Desa Darmasaba bersama anggota se-Desa Darmasaba melaksanakan gotong royong mereresik Pura Dalem Kangin Desa Adat Tegal dan dilanjutkan dengan rapat rutin TP PKK sebagai wujud semangat kerja bersama dan kebersamaan sosial.",
|
||||
"tanggal": "2022-05-26T00:00:00.000Z",
|
||||
"lokasi": "Pura Dalem Kangin, Desa Adat Tegal, Desa Darmasaba, Badung",
|
||||
"partisipan": 28,
|
||||
"imageId": "cmknbrj4r0002vnmantw9rn0l",
|
||||
"kategoriKegiatanId": "cmknan39v000004l8eiql149r"
|
||||
}
|
||||
]
|
||||
@@ -1,6 +1,6 @@
|
||||
[
|
||||
{ "nama": "Kebersihan" },
|
||||
{ "nama": "Infrastruktur" },
|
||||
{ "nama": "Sosial" },
|
||||
{ "nama": "Lingkungan" }
|
||||
]
|
||||
{ "id": "cmknan39v000004l8eiql816o", "nama": "Kebersihan" },
|
||||
{ "id": "cmknan39v000004l8eiql927p", "nama": "Infrastruktur" },
|
||||
{ "id": "cmknan39v000004l8eiql038q", "nama": "Sosial" },
|
||||
{ "id": "cmknan39v000004l8eiql149r", "nama": "Lingkungan" }
|
||||
]
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkm8z5v70000vnrmu60qyd7b",
|
||||
"name": "TPS 3R Pudak Mesari",
|
||||
"alamat": "Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali 80352",
|
||||
"namaTempatMaps": "TPS 3R Pudak Mesari",
|
||||
"linkPetunjukArah": "https://www.google.com/maps/dir/?api=1&destination=-8.5680,115.2040",
|
||||
"lat": -8.5680,
|
||||
"lng": 115.2040
|
||||
},
|
||||
{
|
||||
"id": "dummy0000000000000000000001",
|
||||
"name": "Bank Sampah Darmasaba Mandiri",
|
||||
"alamat": "Banjar Darmasaba Tengah, Desa Darmasaba, Kecamatan Abiansemal, Kabupaten Badung, Bali",
|
||||
"namaTempatMaps": "Bank Sampah Darmasaba Mandiri",
|
||||
"linkPetunjukArah": "https://www.google.com/maps/dir/?api=1&destination=-8.5670,115.2000",
|
||||
"lat": -8.5670,
|
||||
"lng": 115.2000
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,27 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkkshcox000504l88lp54coc",
|
||||
"name": "Pilah sampah sesuai jenisnya",
|
||||
"icon": "trash"
|
||||
},
|
||||
{
|
||||
"id": "cmkkshcox000504l99mq65dpd",
|
||||
"name": "Bawa sampah ke Bank Sampah",
|
||||
"icon": "truck"
|
||||
},
|
||||
{
|
||||
"id": "cmkkshcox000504l00nr76eqe",
|
||||
"name": "Timbang sampah di Bank Sampah",
|
||||
"icon": "scale"
|
||||
},
|
||||
{
|
||||
"id": "cmkkshcox000504l11os87frf",
|
||||
"name": "Catat hasil timbangan di buku tabungan",
|
||||
"icon": "clipboard"
|
||||
},
|
||||
{
|
||||
"id": "cmkkshcox000504l22pt98gsg",
|
||||
"name": "Sampah didaur ulang oleh petugas Bank Sampah",
|
||||
"icon": "sampah"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkmdp3zg0000vn8issps1eg8",
|
||||
"name": "Penghijauan Desa Darmasaba",
|
||||
"judul": "Program Penghijauan Lingkungan",
|
||||
"deskripsi": "<p>Program penghijauan desa Darmasaba bertujuan menanam pohon di area publik dan pinggiran jalan desa sebagai upaya meningkatkan kualitas lingkungan, menyerap karbon, dan memperindah desa.</p>",
|
||||
"icon": "pohon"
|
||||
},
|
||||
{
|
||||
"id": "cmkmdp3zg0000vn8isspt2fh9",
|
||||
"name": "Komunitas Tanam Pohon",
|
||||
"judul": "Gerakan Komunitas Tanam Pohon",
|
||||
"deskripsi": "<p>Pelibatan warga desa dalam kegiatan rutin penanaman pohon di area perbukitan dan ruang terbuka hijau untuk meningkatkan kesadaran lingkungan dan mengurangi erosi.</p>",
|
||||
"icon": "pohon"
|
||||
},
|
||||
{
|
||||
"id": "cmkmdp3zg0000vn8isspu3gi0",
|
||||
"name": "Taman Hijau Bersama",
|
||||
"judul": "Pembangunan Taman Hijau Desa",
|
||||
"deskripsi": "<p>Pembangunan taman hijau di beberapa titik strategis desa, melibatkan banjar adat dan kelompok pemuda untuk menciptakan ruang publik yang nyaman dan ramah lingkungan.</p>",
|
||||
"icon": "pohon"
|
||||
}
|
||||
]
|
||||
22
prisma/data/pendidikan/data-pendidikan/data-pendidikan.json
Normal file
22
prisma/data/pendidikan/data-pendidikan/data-pendidikan.json
Normal file
@@ -0,0 +1,22 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkqmqbv30000vn84kf0ogf61",
|
||||
"name": "TK",
|
||||
"jumlah": "120"
|
||||
},
|
||||
{
|
||||
"id": "cmkqmr20h0001vn84jxtuukfk",
|
||||
"name": "SD",
|
||||
"jumlah": "874"
|
||||
},
|
||||
{
|
||||
"id": "cmkqmshcx0002vn84ufnz9mue",
|
||||
"name": "SMP",
|
||||
"jumlah": "50"
|
||||
},
|
||||
{
|
||||
"id": "cmkqmsuoc0003vn84glk1d0rc",
|
||||
"name": "SMA",
|
||||
"jumlah": "862"
|
||||
}
|
||||
]
|
||||
97
prisma/data/pendidikan/info-sekolah/lembaga.json
Normal file
97
prisma/data/pendidikan/info-sekolah/lembaga.json
Normal file
@@ -0,0 +1,97 @@
|
||||
[
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd200",
|
||||
"nama": "TK Widya Kumara",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc301"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd202",
|
||||
"nama": "TK Widya Sari",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc301"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd203",
|
||||
"nama": "TK Kuntala Dewi I",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc301"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd204",
|
||||
"nama": "TK Widya Kumarayasa",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc301"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd205",
|
||||
"nama": "TK Dewi Ganadwati",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc301"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd400",
|
||||
"nama": "SD No. 1 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd300",
|
||||
"nama": "SD No. 2 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd401",
|
||||
"nama": "SD No. 3 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd402",
|
||||
"nama": "SD No. 4 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd403",
|
||||
"nama": "SD No. 5 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd404",
|
||||
"nama": "SD No. 6 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd405",
|
||||
"nama": "SD No. 7 Darmasaba",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc302"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd406",
|
||||
"nama": "SMP Negeri 1 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc303"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd407",
|
||||
"nama": "SMP Negeri 2 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc303"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd408",
|
||||
"nama": "SMP Negeri 3 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc303"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd409",
|
||||
"nama": "SMP Negeri 4 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc303"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd410",
|
||||
"nama": "SMP Negeri 5 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc303"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd411",
|
||||
"nama": "SMA Negeri 1 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc304"
|
||||
},
|
||||
{
|
||||
"id": "cmghqwjs4000404l8c6vwd412",
|
||||
"nama": "SMA Negeri 2 Abiansemal",
|
||||
"jenjangId": "cmghqwjs4000404l8c5uvc304"
|
||||
}
|
||||
]
|
||||
967
prisma/data/pendidikan/info-sekolah/pengajar.json
Normal file
967
prisma/data/pendidikan/info-sekolah/pengajar.json
Normal file
@@ -0,0 +1,967 @@
|
||||
[
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3arm",
|
||||
"nama": "I Kadek Ariyasa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3brm",
|
||||
"nama": "Ni Luh Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3crm",
|
||||
"nama": "I Made Dharma Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3drm",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3erm",
|
||||
"nama": "I Komang Aditya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3frm",
|
||||
"nama": "Ni Made Intan Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3grm",
|
||||
"nama": "I Putu Bayu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3hrm",
|
||||
"nama": "Ni Ketut Sri Wahyuni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3irm",
|
||||
"nama": "I Nyoman Yoga Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "dnkowzpeu000004l7exka3jrm",
|
||||
"nama": "Ni Komang Ratna Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z5r",
|
||||
"nama": "I Made Satria",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z1r",
|
||||
"nama": "Ni Luh Putri Ayu",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z2r",
|
||||
"nama": "I Kadek Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z3r",
|
||||
"nama": "Ni Made Rani Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z4r",
|
||||
"nama": "I Komang Yuda Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z5r",
|
||||
"nama": "Ni Kadek Ayu Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z6r",
|
||||
"nama": "I Putu Ardi Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z7r",
|
||||
"nama": "Ni Ketut Melati",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z8r",
|
||||
"nama": "I Nyoman Agung",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "dnkox31m7000004lagpwk9z9r",
|
||||
"nama": "Ni Komang Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67yy",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67zz",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67aa",
|
||||
"nama": "I Komang Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67bb",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67cc",
|
||||
"nama": "I Putu Gede Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67dd",
|
||||
"nama": "Ni Made Cahya Utami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67ee",
|
||||
"nama": "I Nyoman Aditya Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67ff",
|
||||
"nama": "Ni Komang Ratna Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67gg",
|
||||
"nama": "I Kadek Bima Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "dnkox64cu000104la7mge67hh",
|
||||
"nama": "Ni Putu Ayu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pag",
|
||||
"nama": "I Made Yoga Wirawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pbg",
|
||||
"nama": "Ni Luh Desi Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pcg",
|
||||
"nama": "I Komang Putra Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pdg",
|
||||
"nama": "Ni Kadek Intan Paramitha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1peg",
|
||||
"nama": "I Putu Adi Wicaksana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pfg",
|
||||
"nama": "Ni Made Ayu Kirana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1phg",
|
||||
"nama": "I Nyoman Bayu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pih",
|
||||
"nama": "Ni Komang Sri Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pjh",
|
||||
"nama": "I Kadek Rama Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pjk",
|
||||
"nama": "Ni Putu Diah Anggraini",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzg",
|
||||
"nama": "I Made Krisna Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzh",
|
||||
"nama": "Ni Luh Ayu Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzi",
|
||||
"nama": "I Komang Yuda Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzj",
|
||||
"nama": "Ni Kadek Putri Anjani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzk",
|
||||
"nama": "I Putu Surya Adi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzl",
|
||||
"nama": "Ni Made Ayu Cahyani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzm",
|
||||
"nama": "I Nyoman Artha Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzn",
|
||||
"nama": "Ni Komang Sinta Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzo",
|
||||
"nama": "I Kadek Gede Pranaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "dnkox9520000204la1ans1pzp",
|
||||
"nama": "Ni Putu Ratih Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5a",
|
||||
"nama": "I Made Arya Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5b",
|
||||
"nama": "I Nyoman Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5c",
|
||||
"nama": "I Kadek Surya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5d",
|
||||
"nama": "I Komang Aditya Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5e",
|
||||
"nama": "Ni Luh Putri Ayu",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5f",
|
||||
"nama": "Ni Made Intan Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5g",
|
||||
"nama": "I Gede Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5h",
|
||||
"nama": "Ni Kadek Sri Wahyuni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5i",
|
||||
"nama": "I Putu Andika Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "dnkoxzl8u000704la0jla6y5j",
|
||||
"nama": "Ni Komang Diah Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq1",
|
||||
"nama": "I Made Bima Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq2",
|
||||
"nama": "I Nyoman Rizky Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq3",
|
||||
"nama": "I Kadek Wahyu Nugraha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq4",
|
||||
"nama": "I Komang Fajar Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq5",
|
||||
"nama": "Ni Luh Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq6",
|
||||
"nama": "Ni Made Putu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq7",
|
||||
"nama": "I Gede Arjuna Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq8",
|
||||
"nama": "Ni Kadek Ayu Puspita",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq9",
|
||||
"nama": "I Putu Danu Kresna",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy1mvk000804ladmmq5qq0",
|
||||
"nama": "Ni Komang Ratna Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtda",
|
||||
"nama": "I Made Yoga Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdb",
|
||||
"nama": "I Nyoman Bayu Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdc",
|
||||
"nama": "I Kadek Rama Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdd",
|
||||
"nama": "I Komang Agus Prabawa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtde",
|
||||
"nama": "Ni Luh Ayu Citra Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdf",
|
||||
"nama": "Ni Made Sari Indrayani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdg",
|
||||
"nama": "I Gede Mahesa Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdh",
|
||||
"nama": "Ni Kadek Purnami Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdi",
|
||||
"nama": "I Putu Arta Gunawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy2m6j000904la2fbthtdj",
|
||||
"nama": "Ni Komang Indah Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpya",
|
||||
"nama": "I Made Arya Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyb",
|
||||
"nama": "I Nyoman Dika Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyc",
|
||||
"nama": "I Kadek Putra Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyd",
|
||||
"nama": "I Komang Agus Setiawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpye",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyf",
|
||||
"nama": "Ni Kadek Ayu Puspita",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyg",
|
||||
"nama": "I Putu Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyh",
|
||||
"nama": "Ni Komang Dwi Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyi",
|
||||
"nama": "I Made Bayu Kurniawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy5cs5000a04la9jlcbpyj",
|
||||
"nama": "Ni Putu Ayu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ua",
|
||||
"nama": "I Made Dewa Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ub",
|
||||
"nama": "I Nyoman Surya Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60uc",
|
||||
"nama": "I Kadek Bima Santosa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ud",
|
||||
"nama": "I Komang Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ue",
|
||||
"nama": "Ni Luh Made Pertiwi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60uf",
|
||||
"nama": "Ni Kadek Citra Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ug",
|
||||
"nama": "I Putu Rangga Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60uh",
|
||||
"nama": "Ni Komang Rina Apriyani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60ui",
|
||||
"nama": "I Made Aditya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy6dtp000b04la1zlo60uj",
|
||||
"nama": "Ni Putu Ayu Cahyaningrum",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcaa",
|
||||
"nama": "I Made Krisna Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcab",
|
||||
"nama": "I Nyoman Gede Putrawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcac",
|
||||
"nama": "I Kadek Yoga Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcad",
|
||||
"nama": "I Komang Danu Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcae",
|
||||
"nama": "Ni Luh Ayu Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcaf",
|
||||
"nama": "Ni Kadek Intan Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcag",
|
||||
"nama": "I Putu Wira Gunawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcah",
|
||||
"nama": "Ni Komang Ayu Ratnasari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcai",
|
||||
"nama": "I Made Fajar Nugraha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy76ux000c04lags2adcaj",
|
||||
"nama": "Ni Putu Desi Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn1",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn2",
|
||||
"nama": "I Nyoman Surya Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn3",
|
||||
"nama": "I Komang Aditya Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn4",
|
||||
"nama": "I Putu Gede Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn5",
|
||||
"nama": "Ni Luh Putri Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn6",
|
||||
"nama": "Ni Kadek Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn7",
|
||||
"nama": "I Made Yoga Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn8",
|
||||
"nama": "I Nyoman Wira Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn9",
|
||||
"nama": "Ni Komang Diah Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy85nz000d04lahr5hepn0",
|
||||
"nama": "I Putu Bayu Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390na",
|
||||
"nama": "I Made Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nb",
|
||||
"nama": "I Nyoman Agus Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nc",
|
||||
"nama": "I Komang Yuda Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nd",
|
||||
"nama": "I Putu Gede Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390ne",
|
||||
"nama": "Ni Luh Desi Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nf",
|
||||
"nama": "Ni Kadek Ayu Prameswari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390ng",
|
||||
"nama": "I Made Rizky Ananta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nh",
|
||||
"nama": "I Nyoman Dika Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390ni",
|
||||
"nama": "Ni Komang Puspita Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy91wc000e04la966390nj",
|
||||
"nama": "I Putu Andika Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi1",
|
||||
"nama": "I Made Wahyu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi2",
|
||||
"nama": "I Nyoman Kevin Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi3",
|
||||
"nama": "I Komang Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi4",
|
||||
"nama": "I Putu Gede Satya Wibawa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi5",
|
||||
"nama": "Ni Luh Ayu Citra Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi6",
|
||||
"nama": "Ni Kadek Putri Anggraini",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi7",
|
||||
"nama": "I Made Fajar Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi8",
|
||||
"nama": "I Nyoman Rama Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi9",
|
||||
"nama": "Ni Komang Sinta Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoy9zzy000f04la7rze3fi0",
|
||||
"nama": "I Putu Dimas Pradipta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wya",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyb",
|
||||
"nama": "I Nyoman Adi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyc",
|
||||
"nama": "I Wayan Putra Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyd",
|
||||
"nama": "Ni Kadek Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyf",
|
||||
"nama": "I Komang Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyg",
|
||||
"nama": "Ni Luh Putu Anggreni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyh",
|
||||
"nama": "I Made Dewa Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyi",
|
||||
"nama": "Ni Putu Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyj",
|
||||
"nama": "I Nyoman Agus Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyapqt000g04laaob10wyk",
|
||||
"nama": "Ni Komang Ratih Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc1",
|
||||
"nama": "I Wayan Surya Dharma",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc2",
|
||||
"nama": "Ni Kadek Ayu Prameswari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc3",
|
||||
"nama": "I Made Gede Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc4",
|
||||
"nama": "I Nyoman Krisna Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc5",
|
||||
"nama": "Ni Luh Desi Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc6",
|
||||
"nama": "I Komang Bima Santosa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc7",
|
||||
"nama": "Ni Putu Cahya Utami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc8",
|
||||
"nama": "I Wayan Dimas Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc9",
|
||||
"nama": "Ni Kadek Purnama Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "dnkoybh2p000h04lahbds4wc0",
|
||||
"nama": "I Made Yoga Kencana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1a",
|
||||
"nama": "I Nyoman Gede Sapta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1b",
|
||||
"nama": "Ni Luh Ayu Pertiwi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1c",
|
||||
"nama": "I Wayan Danu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1d",
|
||||
"nama": "Ni Kadek Melati Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1e",
|
||||
"nama": "I Made Raka Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1f",
|
||||
"nama": "Ni Komang Sinta Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1g",
|
||||
"nama": "I Nyoman Arta Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1h",
|
||||
"nama": "Ni Putu Indah Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1i",
|
||||
"nama": "I Wayan Bagus Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoyc6ij000i04la3r8i7f1j",
|
||||
"nama": "Ni Kadek Ayu Wulandari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9ba",
|
||||
"nama": "I Made Arya Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bb",
|
||||
"nama": "I Komang Adi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bc",
|
||||
"nama": "I Nyoman Dewa Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bd",
|
||||
"nama": "I Ketut Agus Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9be",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bf",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bg",
|
||||
"nama": "I Made Surya Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bh",
|
||||
"nama": "I Komang Yoga Pradipta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bi",
|
||||
"nama": "Ni Putu Citra Wulandari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "dnkoycyfl000j04la757zg9bj",
|
||||
"nama": "I Nyoman Bayu Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfa",
|
||||
"nama": "I Made Gede Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfb",
|
||||
"nama": "I Komang Krisna Yudha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfc",
|
||||
"nama": "I Nyoman Putra Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfd",
|
||||
"nama": "I Ketut Wira Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfe",
|
||||
"nama": "Ni Luh Kadek Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbff",
|
||||
"nama": "Ni Made Ayu Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfg",
|
||||
"nama": "I Putu Yoga Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfh",
|
||||
"nama": "I Komang Dimas Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfi",
|
||||
"nama": "Ni Kadek Sinta Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "dnkoydnnl000k04lae6jvhbfj",
|
||||
"nama": "I Nyoman Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
}
|
||||
]
|
||||
967
prisma/data/pendidikan/info-sekolah/siswa.json
Normal file
967
prisma/data/pendidikan/info-sekolah/siswa.json
Normal file
@@ -0,0 +1,967 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3arm",
|
||||
"nama": "I Kadek Ariyasa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3brm",
|
||||
"nama": "Ni Luh Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3crm",
|
||||
"nama": "I Made Dharma Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3drm",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3erm",
|
||||
"nama": "I Komang Aditya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3frm",
|
||||
"nama": "Ni Made Intan Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3grm",
|
||||
"nama": "I Putu Bayu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3hrm",
|
||||
"nama": "Ni Ketut Sri Wahyuni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3irm",
|
||||
"nama": "I Nyoman Yoga Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
{
|
||||
"id": "cmkowzpeu000004l7exka3jrm",
|
||||
"nama": "Ni Komang Ratna Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd200"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z5r",
|
||||
"nama": "I Made Satria",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z1r",
|
||||
"nama": "Ni Luh Putri Ayu",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z2r",
|
||||
"nama": "I Kadek Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z3r",
|
||||
"nama": "Ni Made Rani Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z4r",
|
||||
"nama": "I Komang Yuda Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z5r",
|
||||
"nama": "Ni Kadek Ayu Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z6r",
|
||||
"nama": "I Putu Ardi Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z7r",
|
||||
"nama": "Ni Ketut Melati",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z8r",
|
||||
"nama": "I Nyoman Agung",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
{
|
||||
"id": "cmkox31m7000004lagpwk9z9r",
|
||||
"nama": "Ni Komang Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd202"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67yy",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67zz",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67aa",
|
||||
"nama": "I Komang Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67bb",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67cc",
|
||||
"nama": "I Putu Gede Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67dd",
|
||||
"nama": "Ni Made Cahya Utami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67ee",
|
||||
"nama": "I Nyoman Aditya Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67ff",
|
||||
"nama": "Ni Komang Ratna Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67gg",
|
||||
"nama": "I Kadek Bima Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
{
|
||||
"id": "cmkox64cu000104la7mge67hh",
|
||||
"nama": "Ni Putu Ayu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd203"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pag",
|
||||
"nama": "I Made Yoga Wirawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pbg",
|
||||
"nama": "Ni Luh Desi Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pcg",
|
||||
"nama": "I Komang Putra Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pdg",
|
||||
"nama": "Ni Kadek Intan Paramitha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1peg",
|
||||
"nama": "I Putu Adi Wicaksana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pfg",
|
||||
"nama": "Ni Made Ayu Kirana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1phg",
|
||||
"nama": "I Nyoman Bayu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pih",
|
||||
"nama": "Ni Komang Sri Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pjh",
|
||||
"nama": "I Kadek Rama Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pjk",
|
||||
"nama": "Ni Putu Diah Anggraini",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd204"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzg",
|
||||
"nama": "I Made Krisna Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzh",
|
||||
"nama": "Ni Luh Ayu Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzi",
|
||||
"nama": "I Komang Yuda Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzj",
|
||||
"nama": "Ni Kadek Putri Anjani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzk",
|
||||
"nama": "I Putu Surya Adi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzl",
|
||||
"nama": "Ni Made Ayu Cahyani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzm",
|
||||
"nama": "I Nyoman Artha Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzn",
|
||||
"nama": "Ni Komang Sinta Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzo",
|
||||
"nama": "I Kadek Gede Pranaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
{
|
||||
"id": "cmkox9520000204la1ans1pzp",
|
||||
"nama": "Ni Putu Ratih Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd205"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5a",
|
||||
"nama": "I Made Arya Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5b",
|
||||
"nama": "I Nyoman Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5c",
|
||||
"nama": "I Kadek Surya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5d",
|
||||
"nama": "I Komang Aditya Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5e",
|
||||
"nama": "Ni Luh Putri Ayu",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5f",
|
||||
"nama": "Ni Made Intan Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5g",
|
||||
"nama": "I Gede Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5h",
|
||||
"nama": "Ni Kadek Sri Wahyuni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5i",
|
||||
"nama": "I Putu Andika Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
{
|
||||
"id": "cmkoxzl8u000704la0jla6y5j",
|
||||
"nama": "Ni Komang Diah Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd400"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq1",
|
||||
"nama": "I Made Bima Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq2",
|
||||
"nama": "I Nyoman Rizky Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq3",
|
||||
"nama": "I Kadek Wahyu Nugraha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq4",
|
||||
"nama": "I Komang Fajar Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq5",
|
||||
"nama": "Ni Luh Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq6",
|
||||
"nama": "Ni Made Putu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq7",
|
||||
"nama": "I Gede Arjuna Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq8",
|
||||
"nama": "Ni Kadek Ayu Puspita",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq9",
|
||||
"nama": "I Putu Danu Kresna",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy1mvk000804ladmmq5qq0",
|
||||
"nama": "Ni Komang Ratna Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd300"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtda",
|
||||
"nama": "I Made Yoga Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdb",
|
||||
"nama": "I Nyoman Bayu Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdc",
|
||||
"nama": "I Kadek Rama Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdd",
|
||||
"nama": "I Komang Agus Prabawa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtde",
|
||||
"nama": "Ni Luh Ayu Citra Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdf",
|
||||
"nama": "Ni Made Sari Indrayani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdg",
|
||||
"nama": "I Gede Mahesa Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdh",
|
||||
"nama": "Ni Kadek Purnami Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdi",
|
||||
"nama": "I Putu Arta Gunawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy2m6j000904la2fbthtdj",
|
||||
"nama": "Ni Komang Indah Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd401"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpya",
|
||||
"nama": "I Made Arya Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyb",
|
||||
"nama": "I Nyoman Dika Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyc",
|
||||
"nama": "I Kadek Putra Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyd",
|
||||
"nama": "I Komang Agus Setiawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpye",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyf",
|
||||
"nama": "Ni Kadek Ayu Puspita",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyg",
|
||||
"nama": "I Putu Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyh",
|
||||
"nama": "Ni Komang Dwi Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyi",
|
||||
"nama": "I Made Bayu Kurniawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy5cs5000a04la9jlcbpyj",
|
||||
"nama": "Ni Putu Ayu Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd402"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ua",
|
||||
"nama": "I Made Dewa Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ub",
|
||||
"nama": "I Nyoman Surya Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60uc",
|
||||
"nama": "I Kadek Bima Santosa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ud",
|
||||
"nama": "I Komang Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ue",
|
||||
"nama": "Ni Luh Made Pertiwi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60uf",
|
||||
"nama": "Ni Kadek Citra Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ug",
|
||||
"nama": "I Putu Rangga Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60uh",
|
||||
"nama": "Ni Komang Rina Apriyani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60ui",
|
||||
"nama": "I Made Aditya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy6dtp000b04la1zlo60uj",
|
||||
"nama": "Ni Putu Ayu Cahyaningrum",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd403"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcaa",
|
||||
"nama": "I Made Krisna Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcab",
|
||||
"nama": "I Nyoman Gede Putrawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcac",
|
||||
"nama": "I Kadek Yoga Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcad",
|
||||
"nama": "I Komang Danu Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcae",
|
||||
"nama": "Ni Luh Ayu Sinta Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcaf",
|
||||
"nama": "Ni Kadek Intan Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcag",
|
||||
"nama": "I Putu Wira Gunawan",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcah",
|
||||
"nama": "Ni Komang Ayu Ratnasari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcai",
|
||||
"nama": "I Made Fajar Nugraha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy76ux000c04lags2adcaj",
|
||||
"nama": "Ni Putu Desi Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd404"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn1",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn2",
|
||||
"nama": "I Nyoman Surya Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn3",
|
||||
"nama": "I Komang Aditya Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn4",
|
||||
"nama": "I Putu Gede Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn5",
|
||||
"nama": "Ni Luh Putri Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn6",
|
||||
"nama": "Ni Kadek Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn7",
|
||||
"nama": "I Made Yoga Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn8",
|
||||
"nama": "I Nyoman Wira Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn9",
|
||||
"nama": "Ni Komang Diah Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy85nz000d04lahr5hepn0",
|
||||
"nama": "I Putu Bayu Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd405"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390na",
|
||||
"nama": "I Made Dwi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nb",
|
||||
"nama": "I Nyoman Agus Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nc",
|
||||
"nama": "I Komang Yuda Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nd",
|
||||
"nama": "I Putu Gede Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390ne",
|
||||
"nama": "Ni Luh Desi Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nf",
|
||||
"nama": "Ni Kadek Ayu Prameswari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390ng",
|
||||
"nama": "I Made Rizky Ananta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nh",
|
||||
"nama": "I Nyoman Dika Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390ni",
|
||||
"nama": "Ni Komang Puspita Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy91wc000e04la966390nj",
|
||||
"nama": "I Putu Andika Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd406"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi1",
|
||||
"nama": "I Made Wahyu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi2",
|
||||
"nama": "I Nyoman Kevin Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi3",
|
||||
"nama": "I Komang Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi4",
|
||||
"nama": "I Putu Gede Satya Wibawa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi5",
|
||||
"nama": "Ni Luh Ayu Citra Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi6",
|
||||
"nama": "Ni Kadek Putri Anggraini",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi7",
|
||||
"nama": "I Made Fajar Pranata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi8",
|
||||
"nama": "I Nyoman Rama Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi9",
|
||||
"nama": "Ni Komang Sinta Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoy9zzy000f04la7rze3fi0",
|
||||
"nama": "I Putu Dimas Pradipta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd407"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wya",
|
||||
"nama": "I Made Arya Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyb",
|
||||
"nama": "I Nyoman Adi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyc",
|
||||
"nama": "I Wayan Putra Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyd",
|
||||
"nama": "Ni Kadek Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyf",
|
||||
"nama": "I Komang Yoga Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyg",
|
||||
"nama": "Ni Luh Putu Anggreni",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyh",
|
||||
"nama": "I Made Dewa Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyi",
|
||||
"nama": "Ni Putu Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyj",
|
||||
"nama": "I Nyoman Agus Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyapqt000g04laaob10wyk",
|
||||
"nama": "Ni Komang Ratih Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd408"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc1",
|
||||
"nama": "I Wayan Surya Dharma",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc2",
|
||||
"nama": "Ni Kadek Ayu Prameswari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc3",
|
||||
"nama": "I Made Gede Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc4",
|
||||
"nama": "I Nyoman Krisna Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc5",
|
||||
"nama": "Ni Luh Desi Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc6",
|
||||
"nama": "I Komang Bima Santosa",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc7",
|
||||
"nama": "Ni Putu Cahya Utami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc8",
|
||||
"nama": "I Wayan Dimas Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc9",
|
||||
"nama": "Ni Kadek Purnama Sari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
{
|
||||
"id": "cmkoybh2p000h04lahbds4wc0",
|
||||
"nama": "I Made Yoga Kencana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd409"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1a",
|
||||
"nama": "I Nyoman Gede Sapta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1b",
|
||||
"nama": "Ni Luh Ayu Pertiwi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1c",
|
||||
"nama": "I Wayan Danu Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1d",
|
||||
"nama": "Ni Kadek Melati Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1e",
|
||||
"nama": "I Made Raka Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1f",
|
||||
"nama": "Ni Komang Sinta Laksmi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1g",
|
||||
"nama": "I Nyoman Arta Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1h",
|
||||
"nama": "Ni Putu Indah Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1i",
|
||||
"nama": "I Wayan Bagus Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoyc6ij000i04la3r8i7f1j",
|
||||
"nama": "Ni Kadek Ayu Wulandari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd410"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9ba",
|
||||
"nama": "I Made Arya Putra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bb",
|
||||
"nama": "I Komang Adi Saputra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bc",
|
||||
"nama": "I Nyoman Dewa Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bd",
|
||||
"nama": "I Ketut Agus Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9be",
|
||||
"nama": "Ni Luh Putu Sari Dewi",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bf",
|
||||
"nama": "Ni Kadek Ayu Lestari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bg",
|
||||
"nama": "I Made Surya Mahendra",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bh",
|
||||
"nama": "I Komang Yoga Pradipta",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bi",
|
||||
"nama": "Ni Putu Citra Wulandari",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
{
|
||||
"id": "cmkoycyfl000j04la757zg9bj",
|
||||
"nama": "I Nyoman Bayu Pramana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd411"
|
||||
},
|
||||
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfa",
|
||||
"nama": "I Made Gede Pratama",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfb",
|
||||
"nama": "I Komang Krisna Yudha",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfc",
|
||||
"nama": "I Nyoman Putra Santika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfd",
|
||||
"nama": "I Ketut Wira Adnyana",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfe",
|
||||
"nama": "Ni Luh Kadek Maharani",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbff",
|
||||
"nama": "Ni Made Ayu Purnami",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfg",
|
||||
"nama": "I Putu Yoga Mahardika",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfh",
|
||||
"nama": "I Komang Dimas Prasetya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfi",
|
||||
"nama": "Ni Kadek Sinta Permata",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
},
|
||||
{
|
||||
"id": "cmkoydnnl000k04lae6jvhbfj",
|
||||
"nama": "I Nyoman Arta Wijaya",
|
||||
"lembagaId": "cmghqwjs4000404l8c6vwd412"
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,47 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkqb11mc000104jibq76bdzu",
|
||||
"name": "Fiksi"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibq87bdzu",
|
||||
"name": "Non Fiksi"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibq97bdzu",
|
||||
"name": "Pendidikan"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqa7bdzu",
|
||||
"name": "Ilmiah"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqb7bdzu",
|
||||
"name": "Drama"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqc7bdzu",
|
||||
"name": "Sejarah"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqd7bdzu",
|
||||
"name": "Teknologi"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqe7bdzu",
|
||||
"name": "Agama"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqf7bdzu",
|
||||
"name": "Pengembangan Diri"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqg7bdzu",
|
||||
"name": "Kesehatan"
|
||||
},
|
||||
{
|
||||
"id": "cmkqb11mc000104jibqh7bdzu",
|
||||
"name": "Anak Dan Remaja"
|
||||
}
|
||||
|
||||
]
|
||||
@@ -0,0 +1,142 @@
|
||||
[
|
||||
{
|
||||
"id": "cmkqhbi6f0002vneao4my49k9",
|
||||
"judul": "Laskar Pelangi",
|
||||
"deskripsi": "<p>Novel inspiratif tentang perjuangan anak-anak di Belitung dalam meraih pendidikan dan mimpi mereka</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq76bdzu",
|
||||
"imageId": "cmkqhbhxi0000vneamj3din9u"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhedff0005vneas3rtbumi",
|
||||
"judul": "Bumi Manusia",
|
||||
"deskripsi": "<p>Kisah kehidupan Minke di masa kolonial yang menggambarkan perjuangan, pendidikan, dan identitas bangsa</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqc7bdzu",
|
||||
"imageId": "cmkqhed8x0003vneakx0c7me2"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhg1g70008vneajbpz8phh",
|
||||
"judul": "Atomic Habits",
|
||||
"deskripsi": "<p>Panduan membangun kebiasaan kecil yang konsisten untuk menghasilkan perubahan besar dalam hidup</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqf7bdzu",
|
||||
"imageId": "cmkqhg1cb0006vneagsxa6t4t"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhl6sr000bvneampx0svus",
|
||||
"judul": "Clean Code",
|
||||
"deskripsi": "<p>Buku wajib programmer tentang cara menulis kode yang bersih, mudah dibaca, dan mudah dirawat</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqd7bdzu",
|
||||
"imageId": "cmkqhl6mv0009vneasgix42ud"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhoaa1000evnearppgpyxo",
|
||||
"judul": "Sejarah Indonesia Modern",
|
||||
"deskripsi": "<p>Membahas perjalanan sejarah Indonesia dari masa kolonial hingga era modern</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqc7bdzu",
|
||||
"imageId": "cmkqhoa5w000cvneah15n28zq"
|
||||
},
|
||||
{
|
||||
"id": "cmkqhr9oc000hvnea677ad3kb",
|
||||
"judul": "Ensiklopedia Anak Pintar",
|
||||
"deskripsi": "<p>Buku referensi bergambar yang membantu anak mengenal ilmu pengetahuan secara menyenangkan</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqh7bdzu",
|
||||
"imageId": "cmkqhr9lg000fvneai3q8qw0s"
|
||||
},
|
||||
{
|
||||
"id": "cmkqi5ksf000kvnea9c04n2hy",
|
||||
"judul": "Filosofi Teras",
|
||||
"deskripsi": "<p>Pengenalan filsafat Stoikisme untuk menghadapi kehidupan modern dengan lebih tenang</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq87bdzu",
|
||||
"imageId": "cmkqi5knc000ivnea8grp7j06"
|
||||
},
|
||||
{
|
||||
"id": "cmkqi97hq000nvneaparjbcrm",
|
||||
"judul": "Pemrograman JavaScript Dasar",
|
||||
"deskripsi": "<p>Panduan dasar belajar JavaScript untuk pemula dalam dunia pengembangan web</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqd7bdzu",
|
||||
"imageId": "cmkqi9799000lvneamskmvpq5"
|
||||
},
|
||||
{
|
||||
"id": "cmkqibjt9000qvnea13ox7fmv",
|
||||
"judul": "Pendidikan Karakter",
|
||||
"deskripsi": "<p>Buku yang membahas pentingnya pendidikan karakter dalam membentuk generasi bangsa</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqf7bdzu",
|
||||
"imageId": "cmkqibjj2000ovnea3zmmvdop"
|
||||
},
|
||||
{
|
||||
"id": "cmkqidnar000tvneaohk5v8k6",
|
||||
"judul": "Psikologi Kepribadian",
|
||||
"deskripsi": "<p>Mengenal teori-teori kepribadian manusia dalam perspektif psikologi</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq87bdzu",
|
||||
"imageId": "cmkqidn7e000rvnea5rl58f2e"
|
||||
},
|
||||
{
|
||||
"id": "cmkqifdiu000wvnea7xd0yi4f",
|
||||
"judul": "Ayat-Ayat Cinta",
|
||||
"deskripsi": "<p>Novel religi yang mengangkat kisah cinta, iman, dan perjuangan hidup</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqe7bdzu",
|
||||
"imageId": "cmkqifdfs000uvneajss8zswp"
|
||||
},
|
||||
{
|
||||
"id": "cmkqik7vi000zvneae7d5cq9i",
|
||||
"judul": "Negeri 5 Menara",
|
||||
"deskripsi": "<p>Cerita persahabatan dan perjuangan santri dalam mengejar mimpi hingga ke mancanegara</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq76bdzu",
|
||||
"imageId": "cmkqik7p5000xvnea6krii3vw"
|
||||
},
|
||||
{
|
||||
"id": "cmkqinno30012vneac1sgsvis",
|
||||
"judul": "Belajar UI/UX Design",
|
||||
"deskripsi": "<p>Panduan praktis memahami desain antarmuka dan pengalaman pengguna</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqd7bdzu",
|
||||
"imageId": "cmkqinnih0010vneakpjb9egl"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiqegd0015vneawv5u5tpm",
|
||||
"judul": "Manajemen Waktu Efektif",
|
||||
"deskripsi": "<p>Teknik mengatur waktu agar lebih produktif dan fokus pada hal penting</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqf7bdzu",
|
||||
"imageId": "cmkqiqeb60013vnea2ygrq5rs"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiurc60018vneavyd3pj9q",
|
||||
"judul": "Dongeng Nusantara",
|
||||
"deskripsi": "<p>Kumpulan dongeng tradisional Indonesia yang sarat pesan moral</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq76bdzu",
|
||||
"imageId": "cmkqiur960016vnea3werdoey"
|
||||
},
|
||||
{
|
||||
"id": "cmkqix2kb001bvnea5v81cw7p",
|
||||
"judul": "Ekonomi Makro",
|
||||
"deskripsi": "<p>Pembahasan konsep ekonomi makro secara sistematis dan mudah dipahami</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq87bdzu",
|
||||
"imageId": "cmkqix2go0019vnea8coousvn"
|
||||
},
|
||||
{
|
||||
"id": "cmkqiyts2001evneahnk45ry5",
|
||||
"judul": "Seni Berpikir Kritis",
|
||||
"deskripsi": "<p>Buku yang membantu pembaca menghindari kesalahan berpikir dalam pengambilan keputusan</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq87bdzu",
|
||||
"imageId": "cmkqiytnv001cvnea7o2sv1vt"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj0nq0001hvnea06r8m3kj",
|
||||
"judul": "Seni Berpikir Kritis",
|
||||
"deskripsi": "<p>Buku yang membantu pembaca menghindari kesalahan berpikir dalam pengambilan keputusan</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibq87bdzu",
|
||||
"imageId": "cmkqj0nn0001fvneaufur3nke"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj37w4001kvnea04n9w2bx",
|
||||
"judul": "Panduan Shalat Lengkap",
|
||||
"deskripsi": "<p>Panduan praktis dan lengkap tentang tata cara shalat sesuai tuntunan</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqe7bdzu",
|
||||
"imageId": "cmkqj37rg001ivneam29fgayr"
|
||||
},
|
||||
{
|
||||
"id": "cmkqj5qp6001nvnea4xhvluz3",
|
||||
"judul": "Cerita Sains untuk Anak",
|
||||
"deskripsi": "<p>Cerita edukatif yang mengenalkan sains kepada anak dengan bahasa sederhana</p>",
|
||||
"kategoriId": "cmkqb11mc000104jibqh7bdzu",
|
||||
"imageId": "cmkqj5ql6001lvnea6p0afr9f"
|
||||
}
|
||||
]
|
||||
84
prisma/migrations/20260122074939_21_jan_26/migration.sql
Normal file
84
prisma/migrations/20260122074939_21_jan_26/migration.sql
Normal file
@@ -0,0 +1,84 @@
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "Berita" DROP CONSTRAINT "Berita_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "InfoWabahPenyakit" DROP CONSTRAINT "InfoWabahPenyakit_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "KontakDarurat" DROP CONSTRAINT "KontakDarurat_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "PenangananDarurat" DROP CONSTRAINT "PenangananDarurat_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "Posyandu" DROP CONSTRAINT "Posyandu_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "ProgramKesehatan" DROP CONSTRAINT "ProgramKesehatan_imageId_fkey";
|
||||
|
||||
-- DropForeignKey
|
||||
ALTER TABLE "Puskesmas" DROP CONSTRAINT "Puskesmas_imageId_fkey";
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Berita" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "InfoWabahPenyakit" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "KontakDarurat" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "PasarDesa" ADD COLUMN "deskripsi" TEXT;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "PenangananDarurat" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Posyandu" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "ProgramKesehatan" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "Puskesmas" ALTER COLUMN "imageId" DROP NOT NULL;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "LayananToPolsek" (
|
||||
"id" TEXT NOT NULL,
|
||||
"layananId" TEXT NOT NULL,
|
||||
"polsekTerdekatId" TEXT NOT NULL,
|
||||
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||
"deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
||||
|
||||
CONSTRAINT "LayananToPolsek_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Berita" ADD CONSTRAINT "Berita_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Posyandu" ADD CONSTRAINT "Posyandu_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "Puskesmas" ADD CONSTRAINT "Puskesmas_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "ProgramKesehatan" ADD CONSTRAINT "ProgramKesehatan_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "PenangananDarurat" ADD CONSTRAINT "PenangananDarurat_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "KontakDarurat" ADD CONSTRAINT "KontakDarurat_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "InfoWabahPenyakit" ADD CONSTRAINT "InfoWabahPenyakit_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "LayananToPolsek" ADD CONSTRAINT "LayananToPolsek_layananId_fkey" FOREIGN KEY ("layananId") REFERENCES "LayananPolsek"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
|
||||
-- AddForeignKey
|
||||
ALTER TABLE "LayananToPolsek" ADD CONSTRAINT "LayananToPolsek_polsekTerdekatId_fkey" FOREIGN KEY ("polsekTerdekatId") REFERENCES "PolsekTerdekat"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||
@@ -607,7 +607,7 @@ model Berita {
|
||||
id String @id @default(cuid())
|
||||
judul String
|
||||
deskripsi String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
content String @db.Text
|
||||
createdAt DateTime @default(now())
|
||||
@@ -1113,17 +1113,17 @@ model DoctorSign {
|
||||
|
||||
// ========================================= POSYANDU ========================================= //
|
||||
model Posyandu {
|
||||
id String @id @default(cuid())
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
nomor String
|
||||
deskripsi String
|
||||
jadwalPelayanan String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= PUSKESMAS ========================================= //
|
||||
@@ -1133,12 +1133,12 @@ model Puskesmas {
|
||||
alamat String
|
||||
jam JamOperasional @relation(fields: [jamId], references: [id])
|
||||
jamId String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
kontak KontakPuskesmas @relation(fields: [kontakId], references: [id])
|
||||
kontakId String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
@@ -1170,57 +1170,57 @@ model KontakPuskesmas {
|
||||
|
||||
// ========================================= PROGRAM KESSEHATAN ========================================= //
|
||||
model ProgramKesehatan {
|
||||
id String @id @default(cuid())
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
deskripsiSingkat String
|
||||
deskripsi String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= PENANGANAN DARURAT ========================================= //
|
||||
model PenangananDarurat {
|
||||
id String @id @default(cuid())
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
deskripsi String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= KONTAK DARURAT ========================================= //
|
||||
model KontakDarurat {
|
||||
id String @id @default(cuid())
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
deskripsi String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
whatsapp String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= INFO WABAH PENYAKIT ========================================= //
|
||||
model InfoWabahPenyakit {
|
||||
id String @id @default(cuid())
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
deskripsiSingkat String
|
||||
deskripsiLengkap String
|
||||
image FileStorage? @relation(fields: [imageId], references: [id])
|
||||
imageId String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= MENU KEAMANAN ========================================= //
|
||||
@@ -1239,7 +1239,7 @@ model KeamananLingkungan {
|
||||
|
||||
// ========================================= POLSEK TERDEKAT ========================================= //
|
||||
model PolsekTerdekat {
|
||||
id String @id @default(uuid())
|
||||
id String @id @default(uuid())
|
||||
nama String
|
||||
jarakKeDesa String
|
||||
alamat String
|
||||
@@ -1249,22 +1249,36 @@ model PolsekTerdekat {
|
||||
namaTempatMaps String
|
||||
alamatMaps String
|
||||
linkPetunjukArah String
|
||||
layananPolsek LayananPolsek @relation(fields: [layananPolsekId], references: [id])
|
||||
layananPolsek LayananPolsek @relation(fields: [layananPolsekId], references: [id])
|
||||
layananPolsekId String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
LayananToPolsek LayananToPolsek[]
|
||||
}
|
||||
|
||||
model LayananPolsek {
|
||||
id String @id @default(uuid())
|
||||
nama String // contoh: "Pelayanan SKCK", "Laporan Kriminal"
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime?
|
||||
isActive Boolean @default(true)
|
||||
PolsekTerdekat PolsekTerdekat[]
|
||||
id String @id @default(uuid())
|
||||
nama String // contoh: "Pelayanan SKCK", "Laporan Kriminal"
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime?
|
||||
isActive Boolean @default(true)
|
||||
PolsekTerdekat PolsekTerdekat[]
|
||||
LayananToPolsek LayananToPolsek[]
|
||||
}
|
||||
|
||||
model LayananToPolsek {
|
||||
id String @id @default(uuid())
|
||||
layanan LayananPolsek @relation(fields: [layananId], references: [id])
|
||||
layananId String
|
||||
polsekTerdekat PolsekTerdekat @relation(fields: [polsekTerdekatId], references: [id])
|
||||
polsekTerdekatId String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= KONTAK DARURAT ========================================= //
|
||||
@@ -1377,6 +1391,7 @@ model PasarDesa {
|
||||
rating Float
|
||||
alamatUsaha String
|
||||
kontak String
|
||||
deskripsi String?
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
@@ -1919,7 +1934,7 @@ model NilaiKonservasiAdat {
|
||||
// ========================================= INFO SEKOLAH & PAUD ========================================= //
|
||||
model JenjangPendidikan {
|
||||
id String @id @default(cuid())
|
||||
nama String // TK/PAUD, SD, SMP, SMA/SMK
|
||||
nama String // TK/PAUD, SD, SMP, SMA/SMK
|
||||
lembagas Lembaga[] // Relasi ke lembaga
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
@@ -2164,6 +2179,18 @@ enum StatusPeminjaman {
|
||||
Dibatalkan
|
||||
}
|
||||
|
||||
|
||||
// ========================================= DATA PENDIDIKAN ========================================= //
|
||||
model DataPendidikan {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
jumlah String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
// ========================================= USER ========================================= //
|
||||
|
||||
model User {
|
||||
@@ -2234,14 +2261,3 @@ model UserMenuAccess {
|
||||
|
||||
@@unique([userId, menuId]) // Satu user tidak bisa punya akses menu yang sama dua kali
|
||||
}
|
||||
|
||||
// ========================================= DATA PENDIDIKAN ========================================= //
|
||||
model DataPendidikan {
|
||||
id String @id @default(cuid())
|
||||
name String
|
||||
jumlah String
|
||||
createdAt DateTime @default(now())
|
||||
updatedAt DateTime @updatedAt
|
||||
deletedAt DateTime @default(now())
|
||||
isActive Boolean @default(true)
|
||||
}
|
||||
|
||||
1234
prisma/seed.ts
1234
prisma/seed.ts
File diff suppressed because it is too large
Load Diff
@@ -7,8 +7,7 @@ import path from "path";
|
||||
import sharp from "sharp";
|
||||
import fetchWithRetry from "./data/fetchWithRetry";
|
||||
|
||||
const UPLOADS_DIR =
|
||||
process.env.WIBU_UPLOAD_DIR || path.join(process.cwd(), "uploads");
|
||||
const UPLOADS_DIR = path.resolve(process.env.WIBU_UPLOAD_DIR || "uploads");
|
||||
|
||||
// --- Helper: deteksi kategori file ---
|
||||
function detectCategory(filename: string): "image" | "document" | "other" {
|
||||
@@ -21,7 +20,7 @@ function detectCategory(filename: string): "image" | "document" | "other" {
|
||||
// --- Helper: recursive walk dir ---
|
||||
async function walkDir(
|
||||
dir: string,
|
||||
fileList: string[] = []
|
||||
fileList: string[] = [],
|
||||
): Promise<string[]> {
|
||||
const entries = await fs.readdir(dir, { withFileTypes: true });
|
||||
|
||||
@@ -42,10 +41,13 @@ async function walkDir(
|
||||
|
||||
export default async function seedAssets() {
|
||||
console.log("🚀 Seeding assets...");
|
||||
console.log("📁 Upload dir:", UPLOADS_DIR);
|
||||
|
||||
await fs.mkdir(UPLOADS_DIR, { recursive: true });
|
||||
|
||||
// 1. Download zip
|
||||
const url =
|
||||
"https://cld-dkr-makuro-seafile.wibudev.com/f/1d6104cdf2b849f89533/?dl=1";
|
||||
"https://cld-dkr-makuro-seafile.wibudev.com/f/03be4043989e4caeb36b/?dl=1";
|
||||
const res = await fetchWithRetry(url, 3, 20000);
|
||||
|
||||
// Validasi content-type
|
||||
@@ -158,7 +160,6 @@ export default async function seedAssets() {
|
||||
|
||||
console.log("✅ Selesai seed assets!");
|
||||
console.log("DB URL (asset):", process.env.DATABASE_URL);
|
||||
|
||||
}
|
||||
|
||||
// --- Auto run kalau dipanggil langsung ---
|
||||
@@ -172,3 +173,193 @@ if (import.meta.main) {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
}
|
||||
|
||||
// prisma/seedAssets.ts
|
||||
// import prisma from "@/lib/prisma";
|
||||
// import AdmZip from "adm-zip";
|
||||
// import fs from "fs/promises";
|
||||
// import path from "path";
|
||||
// import sharp from "sharp";
|
||||
// import mime from "mime-types";
|
||||
// import fetchWithRetry from "./data/fetchWithRetry";
|
||||
|
||||
// /* =========================
|
||||
// * CONFIG
|
||||
// * ========================= */
|
||||
// const UPLOADS_DIR = path.resolve(
|
||||
// process.env.WIBU_UPLOAD_DIR || "uploads"
|
||||
// );
|
||||
|
||||
// const TMP_DIR = path.join(process.cwd(), "tmp_assets");
|
||||
|
||||
// const CATEGORY_DIR: Record<FileCategory, string> = {
|
||||
// image: "images",
|
||||
// document: "documents",
|
||||
// other: "other",
|
||||
// };
|
||||
|
||||
// type FileCategory = "image" | "document" | "other";
|
||||
|
||||
// /* =========================
|
||||
// * HELPERS
|
||||
// * ========================= */
|
||||
// function detectCategory(filename: string): FileCategory {
|
||||
// const ext = path.extname(filename).toLowerCase();
|
||||
// if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) return "image";
|
||||
// if ([".pdf", ".doc", ".docx", ".txt"].includes(ext)) return "document";
|
||||
// return "other";
|
||||
// }
|
||||
|
||||
// async function walkDir(
|
||||
// dir: string,
|
||||
// result: string[] = []
|
||||
// ): Promise<string[]> {
|
||||
// const entries = await fs.readdir(dir, { withFileTypes: true });
|
||||
|
||||
// for (const entry of entries) {
|
||||
// const fullPath = path.join(dir, entry.name);
|
||||
|
||||
// if (entry.isDirectory()) {
|
||||
// if (entry.name === "__MACOSX") continue;
|
||||
// await walkDir(fullPath, result);
|
||||
// } else {
|
||||
// if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue;
|
||||
// result.push(fullPath);
|
||||
// }
|
||||
// }
|
||||
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// async function ensureDir(dir: string) {
|
||||
// await fs.mkdir(dir, { recursive: true });
|
||||
// }
|
||||
|
||||
// /* =========================
|
||||
// * FILE PROCESSORS
|
||||
// * ========================= */
|
||||
// async function processImage(filePath: string, entryName: string) {
|
||||
// const baseName = path.parse(entryName).name;
|
||||
// const finalName = `${baseName}.webp`;
|
||||
// const targetDir = path.join(UPLOADS_DIR, CATEGORY_DIR.image);
|
||||
// const targetPath = path.join(targetDir, finalName);
|
||||
|
||||
// await ensureDir(targetDir);
|
||||
// await sharp(filePath).webp({ quality: 80 }).toFile(targetPath);
|
||||
|
||||
// return {
|
||||
// finalName,
|
||||
// targetPath,
|
||||
// mimeType: "image/webp",
|
||||
// };
|
||||
// }
|
||||
|
||||
// async function processNonImage(
|
||||
// filePath: string,
|
||||
// entryName: string,
|
||||
// category: FileCategory
|
||||
// ) {
|
||||
// const targetDir = path.join(UPLOADS_DIR, CATEGORY_DIR[category]);
|
||||
// const targetPath = path.join(targetDir, entryName);
|
||||
|
||||
// await ensureDir(targetDir);
|
||||
// await fs.copyFile(filePath, targetPath);
|
||||
|
||||
// return {
|
||||
// finalName: entryName,
|
||||
// targetPath,
|
||||
// mimeType: mime.lookup(entryName) || "application/octet-stream",
|
||||
// };
|
||||
// }
|
||||
|
||||
// /* =========================
|
||||
// * MAIN
|
||||
// * ========================= */
|
||||
// export default async function seedAssets() {
|
||||
// console.log("🚀 Seeding assets...");
|
||||
// console.log("📁 Upload dir:", UPLOADS_DIR);
|
||||
|
||||
// await ensureDir(UPLOADS_DIR);
|
||||
|
||||
// /* ===== Download ZIP ===== */
|
||||
// const url =
|
||||
// "https://cld-dkr-makuro-seafile.wibudev.com/f/e13d5429785640c098ae/?dl=1";
|
||||
// const res = await fetchWithRetry(url, 3, 20000);
|
||||
|
||||
// if (!res.headers.get("content-type")?.includes("zip")) {
|
||||
// throw new Error("Invalid ZIP content-type");
|
||||
// }
|
||||
|
||||
// const buffer = Buffer.from(await res.arrayBuffer());
|
||||
// if (buffer.length < 100 || buffer.toString("utf8", 0, 2) !== "PK") {
|
||||
// throw new Error("Corrupted ZIP file");
|
||||
// }
|
||||
|
||||
// /* ===== Extract ===== */
|
||||
// await fs.rm(TMP_DIR, { recursive: true, force: true });
|
||||
// await ensureDir(TMP_DIR);
|
||||
|
||||
// const zip = new AdmZip(buffer);
|
||||
// zip.extractAllTo(TMP_DIR, true);
|
||||
|
||||
// /* ===== Process Files ===== */
|
||||
// const files = await walkDir(TMP_DIR);
|
||||
|
||||
// for (const filePath of files) {
|
||||
// const entryName = path.basename(filePath);
|
||||
// const category = detectCategory(entryName);
|
||||
|
||||
// let result;
|
||||
|
||||
// if (category === "image") {
|
||||
// result = await processImage(filePath, entryName);
|
||||
// } else {
|
||||
// result = await processNonImage(filePath, entryName, category);
|
||||
// }
|
||||
|
||||
// const { finalName, targetPath, mimeType } = result;
|
||||
|
||||
// const existing = await prisma.fileStorage.findUnique({
|
||||
// where: { name: finalName },
|
||||
// });
|
||||
|
||||
// const data = {
|
||||
// name: finalName,
|
||||
// realName: entryName,
|
||||
// path: targetPath,
|
||||
// mimeType,
|
||||
// link: `/uploads/${CATEGORY_DIR[category]}/${finalName}`,
|
||||
// category,
|
||||
// deletedAt: null,
|
||||
// isActive: true,
|
||||
// };
|
||||
|
||||
// if (existing) {
|
||||
// await prisma.fileStorage.update({
|
||||
// where: { name: finalName },
|
||||
// data,
|
||||
// });
|
||||
// console.log(`♻️ restored: ${category}/${finalName}`);
|
||||
// } else {
|
||||
// await prisma.fileStorage.create({ data });
|
||||
// console.log(`📂 created: ${category}/${finalName}`);
|
||||
// }
|
||||
// }
|
||||
|
||||
// /* ===== Cleanup ===== */
|
||||
// await fs.rm(TMP_DIR, { recursive: true, force: true });
|
||||
|
||||
// console.log("✅ Selesai seed assets!");
|
||||
// }
|
||||
|
||||
// /* ===== Auto Run ===== */
|
||||
// if (import.meta.main) {
|
||||
// seedAssets()
|
||||
// .catch((err) => {
|
||||
// console.error("❌ Error seeding assets:", err);
|
||||
// process.exit(1);
|
||||
// })
|
||||
// .finally(async () => {
|
||||
// await prisma.$disconnect();
|
||||
// });
|
||||
// }
|
||||
|
||||
@@ -27,8 +27,26 @@ import {
|
||||
IconFiretruck,
|
||||
IconBuilding,
|
||||
IconAlertTriangle,
|
||||
|
||||
// ===== Tambahan =====
|
||||
IconLifebuoy,
|
||||
IconRun,
|
||||
IconShield,
|
||||
IconPhoneCall,
|
||||
IconFirstAidKit,
|
||||
IconStethoscope,
|
||||
IconBuildingCommunity,
|
||||
IconFileText,
|
||||
IconInfoCircle,
|
||||
IconMessageReport,
|
||||
IconUsers,
|
||||
IconQuestionMark,
|
||||
IconBook,
|
||||
} from '@tabler/icons-react'
|
||||
|
||||
/* =======================
|
||||
Icon Keys (DB Safe)
|
||||
======================= */
|
||||
export type IconKey =
|
||||
| 'ekowisata'
|
||||
| 'kompetisi'
|
||||
@@ -50,14 +68,34 @@ export type IconKey =
|
||||
| 'pelatihan'
|
||||
| 'subsidi'
|
||||
| 'layananKesehatan'
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
| 'polisi'
|
||||
| 'ambulans'
|
||||
| 'pemadam'
|
||||
| 'rumahSakit'
|
||||
| 'bangunan'
|
||||
| 'darurat'
|
||||
| 'sar'
|
||||
| 'evakuasi'
|
||||
| 'keamanan'
|
||||
| 'teleponDarurat'
|
||||
|
||||
// ===== Kesehatan =====
|
||||
| 'rumahSakit'
|
||||
| 'puskesmas'
|
||||
| 'klinik'
|
||||
|
||||
// ===== Pemerintahan =====
|
||||
| 'bangunan'
|
||||
| 'kantorDesa'
|
||||
| 'administrasi'
|
||||
| 'informasi'
|
||||
| 'pengaduan'
|
||||
| 'layananPublik'
|
||||
| 'book'
|
||||
|
||||
/* =======================
|
||||
Icon Map
|
||||
======================= */
|
||||
const iconMap: Record<IconKey, React.FC<any>> = {
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
@@ -79,22 +117,46 @@ const iconMap: Record<IconKey, React.FC<any>> = {
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan =====
|
||||
bangunan: IconBuilding,
|
||||
darurat: IconAlertTriangle
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
}
|
||||
|
||||
/* =======================
|
||||
Icon Mapper Component
|
||||
======================= */
|
||||
type Props = {
|
||||
name: IconKey
|
||||
size?: number
|
||||
color?: string
|
||||
}
|
||||
|
||||
export const IconMapper: React.FC<Props> = ({ name, size = 24, color }) => {
|
||||
const IconComponent = iconMap[name]
|
||||
if (!IconComponent) return null
|
||||
export const IconMapper: React.FC<Props> = ({
|
||||
name,
|
||||
size = 24,
|
||||
color,
|
||||
}) => {
|
||||
const IconComponent = iconMap[name] ?? IconQuestionMark
|
||||
return <IconComponent size={size} color={color} />
|
||||
}
|
||||
|
||||
@@ -5,28 +5,40 @@ import { Box, rem, Select } from '@mantine/core';
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconBook,
|
||||
IconBuilding,
|
||||
IconBuildingCommunity,
|
||||
IconCash,
|
||||
IconChartLine,
|
||||
IconChristmasTreeFilled,
|
||||
IconClipboardTextFilled,
|
||||
IconDroplet,
|
||||
IconFileText,
|
||||
IconFiretruck,
|
||||
IconFirstAidKit,
|
||||
IconHome,
|
||||
IconHomeEco,
|
||||
IconHospital,
|
||||
IconInfoCircle,
|
||||
IconLeaf,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconRecycle,
|
||||
IconRun,
|
||||
IconScale,
|
||||
IconSchool,
|
||||
IconShield,
|
||||
IconShieldFilled,
|
||||
IconShoppingCart,
|
||||
IconStethoscope,
|
||||
IconTent,
|
||||
IconTrashFilled,
|
||||
IconTree,
|
||||
IconTrendingUp,
|
||||
IconTrophy,
|
||||
IconTruckFilled,
|
||||
IconUsers,
|
||||
} from '@tabler/icons-react';
|
||||
import { useEffect, useState } from 'react';
|
||||
|
||||
@@ -51,15 +63,33 @@ const iconMap = {
|
||||
pelatihan: { label: 'Pelatihan', icon: IconSchool },
|
||||
subsidi: { label: 'Subsidi', icon: IconShoppingCart },
|
||||
layananKesehatan: { label: 'Layanan Kesehatan', icon: IconHospital },
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: { label: 'Polisi', icon: IconShieldFilled },
|
||||
ambulans: { label: 'Ambulans', icon: IconAmbulance },
|
||||
pemadam: { label: 'Pemadam', icon: IconFiretruck },
|
||||
rumahSakit: { label: 'Rumah Sakit', icon: IconHospital },
|
||||
bangunan: { label: 'Bangunan', icon: IconBuilding },
|
||||
pemadam: { label: 'Pemadam Kebakaran', icon: IconFiretruck },
|
||||
darurat: { label: 'Darurat', icon: IconAlertTriangle },
|
||||
sar: { label: 'SAR / Basarnas', icon: IconLifebuoy },
|
||||
evakuasi: { label: 'Evakuasi', icon: IconRun },
|
||||
keamanan: { label: 'Keamanan', icon: IconShield },
|
||||
teleponDarurat: { label: 'Telepon Darurat', icon: IconPhoneCall },
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: { label: 'Rumah Sakit', icon: IconHospital },
|
||||
puskesmas: { label: 'Puskesmas', icon: IconFirstAidKit },
|
||||
klinik: { label: 'Klinik', icon: IconStethoscope },
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: { label: 'Bangunan', icon: IconBuilding },
|
||||
kantorDesa: { label: 'Kantor Desa', icon: IconBuildingCommunity },
|
||||
administrasi: { label: 'Administrasi', icon: IconFileText },
|
||||
informasi: { label: 'Informasi', icon: IconInfoCircle },
|
||||
pengaduan: { label: 'Pengaduan', icon: IconMessageReport },
|
||||
layananPublik: { label: 'Layanan Publik', icon: IconUsers },
|
||||
book: { label: 'Buku', icon: IconBook }
|
||||
};
|
||||
|
||||
|
||||
type IconKey = keyof typeof iconMap;
|
||||
|
||||
const iconList = Object.entries(iconMap).map(([value, data]) => ({
|
||||
|
||||
@@ -26,6 +26,18 @@ import {
|
||||
IconTruckFilled,
|
||||
IconBuilding,
|
||||
IconAlertTriangle,
|
||||
IconBuildingCommunity,
|
||||
IconFileText,
|
||||
IconFirstAidKit,
|
||||
IconInfoCircle,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconRun,
|
||||
IconShield,
|
||||
IconStethoscope,
|
||||
IconUsers,
|
||||
IconBook,
|
||||
} from '@tabler/icons-react';
|
||||
|
||||
const iconMap = {
|
||||
@@ -49,12 +61,30 @@ const iconMap = {
|
||||
pelatihan: { label: 'Pelatihan', icon: IconSchool },
|
||||
subsidi: { label: 'Subsidi', icon: IconShoppingCart },
|
||||
layananKesehatan: { label: 'Layanan Kesehatan', icon: IconHospital },
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: { label: 'Polisi', icon: IconShieldFilled },
|
||||
ambulans: { label: 'Ambulans', icon: IconAmbulance },
|
||||
pemadam: { label: 'Pemadam', icon: IconFiretruck },
|
||||
rumahSakit: { label: 'Rumah Sakit', icon: IconHospital },
|
||||
bangunan: { label: 'Bangunan', icon: IconBuilding },
|
||||
pemadam: { label: 'Pemadam Kebakaran', icon: IconFiretruck },
|
||||
darurat: { label: 'Darurat', icon: IconAlertTriangle },
|
||||
sar: { label: 'SAR / Basarnas', icon: IconLifebuoy },
|
||||
evakuasi: { label: 'Evakuasi', icon: IconRun },
|
||||
keamanan: { label: 'Keamanan', icon: IconShield },
|
||||
teleponDarurat: { label: 'Telepon Darurat', icon: IconPhoneCall },
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: { label: 'Rumah Sakit', icon: IconHospital },
|
||||
puskesmas: { label: 'Puskesmas', icon: IconFirstAidKit },
|
||||
klinik: { label: 'Klinik', icon: IconStethoscope },
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: { label: 'Bangunan', icon: IconBuilding },
|
||||
kantorDesa: { label: 'Kantor Desa', icon: IconBuildingCommunity },
|
||||
administrasi: { label: 'Administrasi', icon: IconFileText },
|
||||
informasi: { label: 'Informasi', icon: IconInfoCircle },
|
||||
pengaduan: { label: 'Pengaduan', icon: IconMessageReport },
|
||||
layananPublik: { label: 'Layanan Publik', icon: IconUsers },
|
||||
book: { label: 'Buku', icon: IconBook }
|
||||
};
|
||||
|
||||
export type IconKey = keyof typeof iconMap;
|
||||
|
||||
@@ -13,6 +13,7 @@ const templatePasarDesaForm = z.object({
|
||||
rating: z.number().min(1, "Rating minimal 1"),
|
||||
kategoriId: z.array(z.string()).min(1, "Minimal pilih satu kategori"),
|
||||
kontak: z.string().min(1, "Kontak wajib diisi"),
|
||||
deskripsi: z.string().min(1, "Deskripsi wajib diisi"),
|
||||
});
|
||||
|
||||
const defaultPasarDesaForm = {
|
||||
@@ -23,6 +24,7 @@ const defaultPasarDesaForm = {
|
||||
rating: 0,
|
||||
kategoriId: [] as string[],
|
||||
kontak: "",
|
||||
deskripsi: ""
|
||||
};
|
||||
|
||||
const pasarDesa = proxy({
|
||||
@@ -191,6 +193,7 @@ const pasarDesa = proxy({
|
||||
rating: data.rating,
|
||||
kategoriId: data.kategoriId,
|
||||
kontak: data.kontak,
|
||||
deskripsi: data.deskripsi
|
||||
};
|
||||
return data;
|
||||
} else {
|
||||
@@ -229,6 +232,7 @@ const pasarDesa = proxy({
|
||||
rating: this.form.rating,
|
||||
kategoriId: this.form.kategoriId,
|
||||
kontak: this.form.kontak,
|
||||
deskripsi: this.form.deskripsi
|
||||
}),
|
||||
});
|
||||
if (!response.ok) {
|
||||
|
||||
@@ -15,7 +15,7 @@ const templateForm = z.object({
|
||||
namaTempatMaps: z.string().min(1, "Nama Tempat Maps minimal 1 karakter"),
|
||||
alamatMaps: z.string().min(1, "Alamat Maps minimal 1 karakter"),
|
||||
linkPetunjukArah: z.string().min(1, "Link Petunjuk Arah minimal 1 karakter"),
|
||||
layananPolsekId: z.string().min(1, "Layanan Polsek Id minimal 1 karakter"),
|
||||
layananPolsekId: z.array(z.string()).min(1, "Pilih minimal 1 layanan polsek"),
|
||||
});
|
||||
|
||||
const defaultForm = {
|
||||
@@ -28,7 +28,7 @@ const defaultForm = {
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: "",
|
||||
layananPolsekId: [] as string[],
|
||||
};
|
||||
|
||||
const polsekTerdekatState = proxy({
|
||||
@@ -66,6 +66,11 @@ const polsekTerdekatState = proxy({
|
||||
| Prisma.PolsekTerdekatGetPayload<{
|
||||
include: {
|
||||
layananPolsek: true;
|
||||
LayananToPolsek: {
|
||||
include: {
|
||||
layanan: true;
|
||||
}
|
||||
}
|
||||
};
|
||||
}>[]
|
||||
| null,
|
||||
@@ -104,7 +109,14 @@ const polsekTerdekatState = proxy({
|
||||
},
|
||||
findUnique: {
|
||||
data: null as Prisma.PolsekTerdekatGetPayload<{
|
||||
include: { layananPolsek: true };
|
||||
include: {
|
||||
layananPolsek: true;
|
||||
LayananToPolsek: {
|
||||
include: {
|
||||
layanan: true;
|
||||
}
|
||||
}
|
||||
};
|
||||
}> | null,
|
||||
async load(id: string) {
|
||||
try {
|
||||
@@ -117,7 +129,7 @@ const polsekTerdekatState = proxy({
|
||||
polsekTerdekatState.findUnique.data = null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error fetching data:", error);
|
||||
console.error("Gagal fetch detail polsek terdekat:", error);
|
||||
polsekTerdekatState.findUnique.data = null;
|
||||
}
|
||||
},
|
||||
@@ -273,10 +285,13 @@ const polsekTerdekatState = proxy({
|
||||
};
|
||||
}> | null,
|
||||
loading: false,
|
||||
load: async () => { // Changed to arrow function
|
||||
load: async () => {
|
||||
// Changed to arrow function
|
||||
polsekTerdekatState.findFirst.loading = true;
|
||||
try {
|
||||
const res = await ApiFetch.api.keamanan.polsekterdekat["find-first"].get();
|
||||
const res = await ApiFetch.api.keamanan.polsekterdekat[
|
||||
"find-first"
|
||||
].get();
|
||||
if (res.status === 200 && res.data?.success) {
|
||||
polsekTerdekatState.findFirst.data = res.data.data || null;
|
||||
} else {
|
||||
@@ -287,8 +302,284 @@ const polsekTerdekatState = proxy({
|
||||
} finally {
|
||||
polsekTerdekatState.findFirst.loading = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export default polsekTerdekatState;
|
||||
const templateFormLayananPolsek = z.object({
|
||||
nama: z.string().min(1, "Nama harus diisi"),
|
||||
});
|
||||
|
||||
const defaultFormLayananPolsek = {
|
||||
nama: "",
|
||||
};
|
||||
|
||||
const layananPolsek = proxy({
|
||||
create: {
|
||||
form: { ...defaultFormLayananPolsek },
|
||||
loading: false,
|
||||
async create() {
|
||||
const cek = templateFormLayananPolsek.safeParse(
|
||||
layananPolsek.create.form
|
||||
);
|
||||
if (!cek.success) {
|
||||
const err = `[${cek.error.issues
|
||||
.map((v) => `${v.path.join(".")}`)
|
||||
.join("\n")}] required`;
|
||||
return toast.error(err);
|
||||
}
|
||||
|
||||
try {
|
||||
layananPolsek.create.loading = true;
|
||||
const res = await ApiFetch.api.keamanan["layananpolsek"][
|
||||
"create"
|
||||
].post(layananPolsek.create.form);
|
||||
if (res.status === 200) {
|
||||
layananPolsek.findManyAll.load();
|
||||
return toast.success("Data Kategori Berita Berhasil Dibuat");
|
||||
}
|
||||
console.log(res);
|
||||
return toast.error("failed create");
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
return toast.error("failed create");
|
||||
} finally {
|
||||
layananPolsek.create.loading = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
findMany: {
|
||||
data: null as
|
||||
| Prisma.LayananPolsekGetPayload<{
|
||||
omit: {
|
||||
isActive: true;
|
||||
};
|
||||
}>[]
|
||||
| null,
|
||||
page: 1,
|
||||
totalPages: 1,
|
||||
loading: false,
|
||||
search: "",
|
||||
load: async (page = 1, limit = 10, search = "") => {
|
||||
layananPolsek.findMany.loading = true; // ✅ Akses langsung via nama path
|
||||
layananPolsek.findMany.page = page;
|
||||
layananPolsek.findMany.search = search;
|
||||
|
||||
try {
|
||||
const query: any = { page, limit };
|
||||
if (search) query.search = search;
|
||||
|
||||
const res = await ApiFetch.api.keamanan["layananpolsek"]["findMany"].get({ query });
|
||||
|
||||
if (res.status === 200 && res.data?.success) {
|
||||
layananPolsek.findMany.data = res.data.data ?? [];
|
||||
layananPolsek.findMany.totalPages = res.data.totalPages ?? 1;
|
||||
} else {
|
||||
layananPolsek.findMany.data = [];
|
||||
layananPolsek.findMany.totalPages = 1;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("Gagal fetch layanan polsek paginated:", err);
|
||||
layananPolsek.findMany.data = [];
|
||||
layananPolsek.findMany.totalPages = 1;
|
||||
} finally {
|
||||
layananPolsek.findMany.loading = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
findManyAll: {
|
||||
data: [] as Prisma.LayananPolsekGetPayload<{ omit: { isActive: true } }>[],
|
||||
loading: false,
|
||||
|
||||
async load() {
|
||||
this.loading = true;
|
||||
try {
|
||||
const res = await ApiFetch.api.keamanan["layananpolsek"][
|
||||
"findManyAll"
|
||||
].get();
|
||||
|
||||
if (res.status === 200 && res.data?.success) {
|
||||
this.data = (res.data.data ?? []).map((item: any) => ({
|
||||
id: String(item.id),
|
||||
nama: String(item.nama || ""),
|
||||
createdAt: item.createdAt ? new Date(item.createdAt) : new Date(),
|
||||
updatedAt: item.updatedAt ? new Date(item.updatedAt) : new Date(),
|
||||
deletedAt: item.deletedAt ? new Date(item.deletedAt) : null,
|
||||
}));
|
||||
} else {
|
||||
this.data = [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Gagal fetch layanan polsek:", error);
|
||||
this.data = [];
|
||||
} finally {
|
||||
this.loading = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
findUnique: {
|
||||
data: null as Prisma.LayananPolsekGetPayload<{
|
||||
omit: {
|
||||
isActive: true;
|
||||
};
|
||||
}> | null,
|
||||
loading: false,
|
||||
async load(id: string) {
|
||||
try {
|
||||
const res = await fetch(`/api/keamanan/layananpolsek/${id}`);
|
||||
if (res.ok) {
|
||||
const data = await res.json();
|
||||
layananPolsek.findUnique.data = data.data ?? null;
|
||||
} else {
|
||||
console.error("Failed to fetch data", res.status, res.statusText);
|
||||
layananPolsek.findUnique.data = null;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error fetching data:", error);
|
||||
layananPolsek.findUnique.data = null;
|
||||
}
|
||||
},
|
||||
},
|
||||
delete: {
|
||||
loading: false,
|
||||
async delete(id: string) {
|
||||
if (!id) return toast.warn("ID tidak valid");
|
||||
|
||||
try {
|
||||
layananPolsek.delete.loading = true;
|
||||
|
||||
const response = await fetch(`/api/keamanan/layananpolsek/del/${id}`, {
|
||||
method: "DELETE",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (response.ok && result?.success) {
|
||||
toast.success(
|
||||
result.message || "Data layanan polsek berhasil dihapus"
|
||||
);
|
||||
await layananPolsek.findManyAll.load(); // refresh list
|
||||
} else {
|
||||
toast.error(result?.message || "Gagal menghapus Data layanan polsek");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Gagal delete:", error);
|
||||
toast.error("Terjadi kesalahan saat menghapus Data layanan polsek");
|
||||
} finally {
|
||||
layananPolsek.delete.loading = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
update: {
|
||||
id: "",
|
||||
form: { ...defaultFormLayananPolsek },
|
||||
loading: false,
|
||||
async load(id: string) {
|
||||
if (!id) {
|
||||
toast.warn("ID tidak valid");
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api/keamanan/layananpolsek/${id}`, {
|
||||
method: "GET",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
});
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result?.success) {
|
||||
const data = result.data;
|
||||
this.id = data.id;
|
||||
this.form = {
|
||||
nama: data.nama,
|
||||
};
|
||||
return data; // Return the loaded data
|
||||
} else {
|
||||
throw new Error(result?.message || "Gagal memuat data");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error loading layanan polsek:", error);
|
||||
toast.error(
|
||||
error instanceof Error ? error.message : "Gagal memuat data"
|
||||
);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
async update() {
|
||||
const cek = templateFormLayananPolsek.safeParse(
|
||||
layananPolsek.update.form
|
||||
);
|
||||
if (!cek.success) {
|
||||
const err = `[${cek.error.issues
|
||||
.map((v) => `${v.path.join(".")}`)
|
||||
.join("\n")}] required`;
|
||||
toast.error(err);
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
layananPolsek.update.loading = true;
|
||||
|
||||
const response = await fetch(
|
||||
`/api/keamanan/layananpolsek/${this.id}`,
|
||||
{
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
nama: this.form.nama,
|
||||
}),
|
||||
}
|
||||
);
|
||||
|
||||
if (!response.ok) {
|
||||
const errorData = await response.json().catch(() => ({}));
|
||||
throw new Error(
|
||||
errorData.message || `HTTP error! status: ${response.status}`
|
||||
);
|
||||
}
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
toast.success("Berhasil update data layanan polsek");
|
||||
await layananPolsek.findManyAll.load(); // refresh list
|
||||
return true;
|
||||
} else {
|
||||
throw new Error(result.message || "Gagal update data layanan polsek");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error updating data layanan polsek:", error);
|
||||
toast.error(
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Terjadi kesalahan saat update data layanan polsek"
|
||||
);
|
||||
return false;
|
||||
} finally {
|
||||
layananPolsek.update.loading = false;
|
||||
}
|
||||
},
|
||||
reset() {
|
||||
layananPolsek.update.id = "";
|
||||
layananPolsek.update.form = { ...defaultFormLayananPolsek };
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const statePolsekTerdekat = proxy({
|
||||
polsekTerdekatState,
|
||||
layananPolsek,
|
||||
});
|
||||
|
||||
export default statePolsekTerdekat;
|
||||
|
||||
@@ -400,6 +400,42 @@ const kategoriBuku = proxy({
|
||||
}
|
||||
},
|
||||
},
|
||||
findManyAll: {
|
||||
data: [] as Prisma.KategoriBukuGetPayload<{
|
||||
omit: {
|
||||
isActive: true;
|
||||
};
|
||||
}>[],
|
||||
loading: false,
|
||||
search: "",
|
||||
load: async (search = "") => {
|
||||
// Change to arrow function
|
||||
kategoriBuku.findManyAll.loading = true; // Use the full path to access the property
|
||||
kategoriBuku.findManyAll.search = search;
|
||||
try {
|
||||
const query: any = { search };
|
||||
if (search) query.search = search;
|
||||
|
||||
const res = await ApiFetch.api.pendidikan.perpustakaandigital.kategoribuku[
|
||||
"findManyAll"
|
||||
].get({
|
||||
query,
|
||||
});
|
||||
|
||||
if (res.status === 200 && res.data?.success) {
|
||||
kategoriBuku.findManyAll.data = res.data.data || [];
|
||||
} else {
|
||||
console.error("Failed to load pegawai:", res.data?.message);
|
||||
kategoriBuku.findManyAll.data = [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error loading pegawai:", error);
|
||||
kategoriBuku.findManyAll.data = [];
|
||||
} finally {
|
||||
kategoriBuku.findManyAll.loading = false;
|
||||
}
|
||||
},
|
||||
},
|
||||
findUnique: {
|
||||
data: null as Prisma.KategoriBukuGetPayload<{
|
||||
omit: {
|
||||
|
||||
@@ -222,7 +222,6 @@ function ListKategoriBerita({ search }: { search: string }) {
|
||||
</Stack>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center mt={{ base: 'lg', md: 'xl' }}>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -235,7 +234,6 @@ function ListKategoriBerita({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
|
||||
{/* Modal Konfirmasi Hapus */}
|
||||
<ModalKonfirmasiHapus
|
||||
|
||||
@@ -186,7 +186,6 @@ function ListAjukanPermohonan({ search }: { search: string }) {
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center mt="md">
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -199,7 +198,6 @@ function ListAjukanPermohonan({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -267,8 +267,6 @@ function ListPendapatan({ search }: { search: string }) {
|
||||
</Stack>
|
||||
</Paper>
|
||||
|
||||
{/* Pagination */}
|
||||
{totalPages > 1 && (
|
||||
<Center mt={{ base: 'sm', md: 'md' }} mb={{ base: 'sm', md: 'md' }}>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -282,7 +280,6 @@ function ListPendapatan({ search }: { search: string }) {
|
||||
size="sm"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
|
||||
{/* Modal Konfirmasi Hapus */}
|
||||
<ModalKonfirmasiHapus
|
||||
|
||||
@@ -284,7 +284,6 @@ function ListPosisiOrganisasiBumDes({ search }: { search: string }) {
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -299,7 +298,6 @@ function ListPosisiOrganisasiBumDes({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
|
||||
{/* Modal Hapus */}
|
||||
<ModalKonfirmasiHapus
|
||||
|
||||
@@ -224,7 +224,6 @@ function ListDetailDataPengangguran({ search }: { search: string }) {
|
||||
</Paper>
|
||||
|
||||
{/* Pagination */}
|
||||
{totalPages > 1 && (
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -239,7 +238,6 @@ function ListDetailDataPengangguran({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
|
||||
{/* Chart Section */}
|
||||
<Paper withBorder bg={colors['white-1']} p={{ base: 'sm', md: 'lg' }} shadow="md" radius="md">
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
'use client';
|
||||
import EditEditor from '@/app/admin/(dashboard)/_com/editEditor';
|
||||
import pasarDesaState from '@/app/admin/(dashboard)/_state/ekonomi/pasar-desa/pasar-desa';
|
||||
import colors from '@/con/colors';
|
||||
import ApiFetch from '@/lib/api-fetch';
|
||||
@@ -33,6 +34,7 @@ type FormData = {
|
||||
rating: number;
|
||||
kategoriId: string[];
|
||||
kontak: string;
|
||||
deskripsi: string;
|
||||
};
|
||||
|
||||
function EditPasarDesa() {
|
||||
@@ -51,6 +53,7 @@ function EditPasarDesa() {
|
||||
rating: 0,
|
||||
kategoriId: [],
|
||||
kontak: '',
|
||||
deskripsi: ''
|
||||
});
|
||||
|
||||
const [originalData, setOriginalData] = useState({
|
||||
@@ -62,6 +65,7 @@ function EditPasarDesa() {
|
||||
rating: 0,
|
||||
kategoriId: [],
|
||||
kontak: '',
|
||||
deskripsi: ''
|
||||
});
|
||||
|
||||
// load data awal
|
||||
@@ -83,6 +87,7 @@ function EditPasarDesa() {
|
||||
rating: data.rating || 0,
|
||||
kategoriId: data.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
|
||||
kontak: data.kontak || '',
|
||||
deskripsi: data.deskripsi || ''
|
||||
});
|
||||
setOriginalData({
|
||||
nama: data.nama || '',
|
||||
@@ -93,6 +98,7 @@ function EditPasarDesa() {
|
||||
rating: data.rating || 0,
|
||||
kategoriId: data.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
|
||||
kontak: data.kontak || '',
|
||||
deskripsi: data.deskripsi || ''
|
||||
});
|
||||
if (data.image?.link) setPreviewImage(data.image.link);
|
||||
}
|
||||
@@ -120,12 +126,13 @@ function EditPasarDesa() {
|
||||
rating: originalData.rating,
|
||||
kategoriId: (originalData as any)?.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
|
||||
kontak: originalData.kontak,
|
||||
deskripsi: originalData.deskripsi
|
||||
});
|
||||
setPreviewImage(originalData.imageUrl || null);
|
||||
setFile(null);
|
||||
toast.info("Form dikembalikan ke data awal");
|
||||
};
|
||||
|
||||
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
@@ -157,7 +164,7 @@ function EditPasarDesa() {
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
<Group mb="md">
|
||||
<Button variant="subtle" onClick={() => router.back()} p="xs" radius="md">
|
||||
<IconArrowBack color={colors['blue-button']} size={24} />
|
||||
@@ -316,6 +323,19 @@ function EditPasarDesa() {
|
||||
error={!formData.kategoriId.length ? 'Pilih minimal satu kategori' : undefined}
|
||||
/>
|
||||
|
||||
{/* Input Deskripsi */}
|
||||
<Box>
|
||||
<Text fz="sm" fw="bold" mb={6}>
|
||||
Deskripsi
|
||||
</Text>
|
||||
<EditEditor
|
||||
value={formData.deskripsi}
|
||||
onChange={(htmlContent) =>
|
||||
setFormData((prev) => ({ ...prev, deskripsi: htmlContent }))
|
||||
}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
<Group justify="right">
|
||||
<Button
|
||||
variant="outline"
|
||||
|
||||
@@ -23,6 +23,7 @@ import { useEffect, useState } from 'react';
|
||||
import { toast } from 'react-toastify';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import pasarDesaState from '../../../../_state/ekonomi/pasar-desa/pasar-desa';
|
||||
import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor';
|
||||
|
||||
export default function CreatePasarDesa() {
|
||||
const router = useRouter();
|
||||
@@ -44,6 +45,7 @@ export default function CreatePasarDesa() {
|
||||
rating: 0,
|
||||
kategoriId: [],
|
||||
kontak: '',
|
||||
deskripsi: ''
|
||||
};
|
||||
setPreviewImage(null);
|
||||
setFile(null);
|
||||
@@ -80,7 +82,7 @@ export default function CreatePasarDesa() {
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Header dengan tombol kembali */}
|
||||
<Group mb="md">
|
||||
<Button variant="subtle" onClick={() => router.back()} p="xs" radius="md">
|
||||
@@ -234,6 +236,18 @@ export default function CreatePasarDesa() {
|
||||
}
|
||||
/>
|
||||
|
||||
<Box>
|
||||
<Text fw="bold" fz="sm" mb={6}>
|
||||
Deskripsi Produk
|
||||
</Text>
|
||||
<CreateEditor
|
||||
value={statePasar.pasarDesa.create.form.deskripsi}
|
||||
onChange={(val) => {
|
||||
statePasar.pasarDesa.create.form.deskripsi = val;
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
{/* Tombol Submit */}
|
||||
<Group justify="right">
|
||||
<Button
|
||||
|
||||
@@ -84,6 +84,13 @@ function CreateProgramKreatifDesa() {
|
||||
required
|
||||
/>
|
||||
|
||||
<TextInput
|
||||
label={<Text fz="sm" fw="bold">Deskripsi Singkat</Text>}
|
||||
placeholder="Masukkan deskripsi singkat"
|
||||
value={stateCreate.create.form.slug || ''}
|
||||
onChange={(e) => stateCreate.create.form.slug = e.currentTarget.value}
|
||||
/>
|
||||
|
||||
<YearPickerInput
|
||||
clearable
|
||||
value={stateCreate.create.form.tahun ? new Date(stateCreate.create.form.tahun, 0, 1) : null}
|
||||
@@ -95,6 +102,13 @@ function CreateProgramKreatifDesa() {
|
||||
}}
|
||||
/>
|
||||
|
||||
<TextInput
|
||||
label={<Text fz="sm" fw="bold">Kolaborator</Text>}
|
||||
placeholder="Masukkan kolaborator"
|
||||
value={stateCreate.create.form.kolaborator || ''}
|
||||
onChange={(e) => stateCreate.create.form.kolaborator = e.currentTarget.value}
|
||||
/>
|
||||
|
||||
<Box>
|
||||
<Text fw="bold" fz="sm" mb={6}>
|
||||
Deskripsi
|
||||
@@ -103,14 +117,7 @@ function CreateProgramKreatifDesa() {
|
||||
value={stateCreate.create.form.deskripsi}
|
||||
onChange={(val) => stateCreate.create.form.deskripsi = val}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
<TextInput
|
||||
label={<Text fz="sm" fw="bold">Kolaborator</Text>}
|
||||
placeholder="Masukkan kolaborator"
|
||||
value={stateCreate.create.form.kolaborator || ''}
|
||||
onChange={(e) => stateCreate.create.form.kolaborator = e.currentTarget.value}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
<Group justify="right" mt="md">
|
||||
<Button
|
||||
|
||||
@@ -245,7 +245,6 @@ function ListKolaborasiInovasi({ search }: { search: string }) {
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -260,7 +259,6 @@ function ListKolaborasiInovasi({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,14 +20,14 @@ import {
|
||||
Text,
|
||||
Title,
|
||||
} from '@mantine/core';
|
||||
import { IconEdit, IconPlus, IconSearch, IconX } from '@tabler/icons-react';
|
||||
import { useDebouncedValue } from '@mantine/hooks';
|
||||
import { IconEdit, IconPlus, IconSearch, IconTrash, IconX } from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import HeaderSearch from '../../../_com/header';
|
||||
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
|
||||
import mitraKolaborasi from '../../../_state/inovasi/mitra-kolaborasi';
|
||||
import { useDebouncedValue } from '@mantine/hooks';
|
||||
|
||||
function MitraKolaborasi() {
|
||||
const [search, setSearch] = useState('');
|
||||
@@ -56,7 +56,6 @@ function ListMitraKolaborasi({ search }: { search: string }) {
|
||||
mitraKolaborasi.delete.byId(selectedId);
|
||||
setModalHapus(false);
|
||||
setSelectedId(null);
|
||||
router.push('/admin/inovasi/kolaborasi-inovasi');
|
||||
}
|
||||
};
|
||||
|
||||
@@ -192,7 +191,7 @@ function ListMitraKolaborasi({ search }: { search: string }) {
|
||||
setModalHapus(true);
|
||||
}}
|
||||
>
|
||||
<IconX size={16} />
|
||||
<IconTrash size={16} />
|
||||
</Button>
|
||||
</TableTd>
|
||||
<TableTd>
|
||||
|
||||
@@ -234,7 +234,6 @@ function ListJenisLayanan({ search }: { search: string }) {
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -248,7 +247,6 @@ function ListJenisLayanan({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -20,37 +20,53 @@ import {
|
||||
Text,
|
||||
Title,
|
||||
} from '@mantine/core';
|
||||
import { useDebouncedValue } from '@mantine/hooks';
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconBook,
|
||||
IconBuilding,
|
||||
IconBuildingCommunity,
|
||||
IconCash,
|
||||
IconChartLine,
|
||||
IconChristmasTreeFilled,
|
||||
IconClipboard,
|
||||
IconClipboardTextFilled,
|
||||
IconDeviceImac,
|
||||
IconDroplet,
|
||||
IconFileText,
|
||||
IconFiretruck,
|
||||
IconFirstAidKit,
|
||||
IconHome,
|
||||
IconHomeEco,
|
||||
IconHospital,
|
||||
IconInfoCircle,
|
||||
IconLeaf,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconPlus,
|
||||
IconRecycle,
|
||||
IconRun,
|
||||
IconScale,
|
||||
IconSchool,
|
||||
IconSearch,
|
||||
IconShield,
|
||||
IconShieldFilled,
|
||||
IconShoppingCart,
|
||||
IconStethoscope,
|
||||
IconTent,
|
||||
IconTrash,
|
||||
IconTrashFilled,
|
||||
IconTree,
|
||||
IconTrendingUp,
|
||||
IconTrophy,
|
||||
IconTruck,
|
||||
IconTruckFilled,
|
||||
IconUsers
|
||||
} from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import HeaderSearch from '../../_com/header';
|
||||
import programKreatifState from '../../_state/inovasi/program-kreatif';
|
||||
import { useDebouncedValue } from '@mantine/hooks';
|
||||
|
||||
function ProgramKreatifDesa() {
|
||||
const [search, setSearch] = useState('');
|
||||
@@ -81,15 +97,16 @@ function ListProgramKreatifDesa({ search }: { search: string }) {
|
||||
const filteredData = data || [];
|
||||
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
// ===== Umum & Lingkungan =====
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruck,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboard,
|
||||
trash: IconTrash,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
@@ -101,6 +118,30 @@ function ListProgramKreatifDesa({ search }: { search: string }) {
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
if (loading || !data) {
|
||||
@@ -132,7 +173,7 @@ function ListProgramKreatifDesa({ search }: { search: string }) {
|
||||
</Button>
|
||||
</Group>
|
||||
|
||||
<Box visibleFrom="md" style={{ overflowX: 'auto' }}>
|
||||
<Box visibleFrom="md" style={{ overflowX: 'auto' }}>
|
||||
<Table
|
||||
highlightOnHover
|
||||
miw={0}
|
||||
|
||||
@@ -1,457 +0,0 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
"use client";
|
||||
|
||||
import polsekTerdekat from "@/app/admin/(dashboard)/_state/keamanan/polsek-terdekat";
|
||||
import colors from "@/con/colors";
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Card,
|
||||
Group,
|
||||
Loader,
|
||||
Modal,
|
||||
Paper,
|
||||
Select,
|
||||
Stack,
|
||||
Text,
|
||||
TextInput,
|
||||
Title
|
||||
} from "@mantine/core";
|
||||
import { IconArrowBack } from "@tabler/icons-react";
|
||||
import { useParams, useRouter } from "next/navigation";
|
||||
import { useEffect, useState } from "react";
|
||||
import { toast } from "react-toastify";
|
||||
import { useProxy } from "valtio/utils";
|
||||
|
||||
function EditPolsekTerdekat() {
|
||||
const polsekState = useProxy(polsekTerdekat);
|
||||
const params = useParams();
|
||||
const router = useRouter();
|
||||
|
||||
const [layananOptions, setLayananOptions] = useState<
|
||||
{ value: string; label: string }[]
|
||||
>([]);
|
||||
const [modalOpen, setModalOpen] = useState(false);
|
||||
const [modalUpdateOpen, setModalUpdateOpen] = useState(false);
|
||||
const [namaLayananBaru, setNamaLayananBaru] = useState("");
|
||||
const [selectedLayananId, setSelectedLayananId] = useState<string | null>(
|
||||
null
|
||||
);
|
||||
const [namaLayananUpdate, setNamaLayananUpdate] = useState("");
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const [formData, setFormData] = useState({
|
||||
nama: "",
|
||||
jarakKeDesa: "",
|
||||
alamat: "",
|
||||
nomorTelepon: "",
|
||||
jamOperasional: "",
|
||||
embedMapUrl: "",
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: "",
|
||||
});
|
||||
|
||||
const [originalData, setOriginalData] = useState({
|
||||
nama: "",
|
||||
jarakKeDesa: "",
|
||||
alamat: "",
|
||||
nomorTelepon: "",
|
||||
jamOperasional: "",
|
||||
embedMapUrl: "",
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: "",
|
||||
});
|
||||
|
||||
// load data untuk form edit
|
||||
useEffect(() => {
|
||||
const loadPolsekTerdekat = async () => {
|
||||
const id = params?.id as string;
|
||||
if (!id) return;
|
||||
|
||||
try {
|
||||
const data = await polsekState.edit.load(id);
|
||||
if (data) {
|
||||
setFormData({
|
||||
nama: data.nama || "",
|
||||
jarakKeDesa: data.jarakKeDesa || "",
|
||||
alamat: data.alamat || "",
|
||||
nomorTelepon: data.nomorTelepon || "",
|
||||
jamOperasional: data.jamOperasional || "",
|
||||
embedMapUrl: data.embedMapUrl || "",
|
||||
namaTempatMaps: data.namaTempatMaps || "",
|
||||
alamatMaps: data.alamatMaps || "",
|
||||
linkPetunjukArah: data.linkPetunjukArah || "",
|
||||
layananPolsekId: data.layananPolsekId || "",
|
||||
});
|
||||
|
||||
setOriginalData({
|
||||
nama: data.nama || "",
|
||||
jarakKeDesa: data.jarakKeDesa || "",
|
||||
alamat: data.alamat || "",
|
||||
nomorTelepon: data.nomorTelepon || "",
|
||||
jamOperasional: data.jamOperasional || "",
|
||||
embedMapUrl: data.embedMapUrl || "",
|
||||
namaTempatMaps: data.namaTempatMaps || "",
|
||||
alamatMaps: data.alamatMaps || "",
|
||||
linkPetunjukArah: data.linkPetunjukArah || "",
|
||||
layananPolsekId: data.layananPolsekId || "",
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error loading polsek terdekat:", error);
|
||||
toast.error("Gagal memuat data polsek terdekat");
|
||||
}
|
||||
};
|
||||
|
||||
loadPolsekTerdekat();
|
||||
}, [params?.id]);
|
||||
|
||||
const fetchLayanan = async () => {
|
||||
try {
|
||||
const res = await fetch("/api/keamanan/layanan-polsek/find-many");
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
const options = data.data.map((item: any) => ({
|
||||
value: item.id,
|
||||
label: item.nama,
|
||||
}));
|
||||
setLayananOptions(options);
|
||||
}
|
||||
} catch {
|
||||
toast.error("Gagal memuat layanan polsek");
|
||||
}
|
||||
};
|
||||
|
||||
const handleTambahLayanan = async () => {
|
||||
if (!namaLayananBaru.trim())
|
||||
return toast.warn("Nama layanan tidak boleh kosong");
|
||||
|
||||
try {
|
||||
const res = await fetch("/api/keamanan/layanan-polsek/create", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ nama: namaLayananBaru }),
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
const newLayanan = {
|
||||
value: data.data.id,
|
||||
label: data.data.nama,
|
||||
};
|
||||
setLayananOptions((prev) => [...prev, newLayanan]);
|
||||
await fetchLayanan();
|
||||
polsekState.create.form.layananPolsekId = data.data.id;
|
||||
toast.success("Layanan baru ditambahkan!");
|
||||
setModalOpen(false);
|
||||
setNamaLayananBaru("");
|
||||
} else {
|
||||
toast.error(data.message || "Gagal menambah layanan");
|
||||
}
|
||||
} catch {
|
||||
toast.error("Error menambah layanan");
|
||||
}
|
||||
};
|
||||
|
||||
const handleUpdateLayanan = async (id: string, namaBaru: string) => {
|
||||
if (!namaBaru.trim())
|
||||
return toast.warn("Nama layanan tidak boleh kosong");
|
||||
|
||||
try {
|
||||
const res = await fetch(`/api/keamanan/layanan-polsek/update/${id}`, {
|
||||
method: "PUT",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ nama: namaBaru }),
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
await fetchLayanan();
|
||||
toast.success("Layanan berhasil diupdate!");
|
||||
setModalUpdateOpen(false);
|
||||
setNamaLayananUpdate("");
|
||||
} else {
|
||||
toast.error(data.message || "Gagal mengupdate layanan");
|
||||
}
|
||||
} catch {
|
||||
toast.error("Error mengupdate layanan");
|
||||
}
|
||||
};
|
||||
|
||||
const handleDeleteLayanan = async (id: string) => {
|
||||
const confirmDelete = confirm("Yakin ingin menghapus layanan ini?");
|
||||
if (!confirmDelete) return;
|
||||
|
||||
try {
|
||||
const res = await fetch(`/api/keamanan/layanan-polsek/del/${id}`, {
|
||||
method: "DELETE",
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
await fetchLayanan();
|
||||
setLayananOptions((prev) =>
|
||||
prev.filter((layanan) => layanan.value !== id)
|
||||
);
|
||||
toast.success("Layanan berhasil dihapus!");
|
||||
} else {
|
||||
toast.error(data.message || "Gagal menghapus layanan");
|
||||
}
|
||||
} catch {
|
||||
toast.error("Error menghapus layanan");
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchLayanan();
|
||||
}, []);
|
||||
|
||||
const handleChange = (field: string, value: string) => {
|
||||
setFormData(prev => ({ ...prev, [field]: value }));
|
||||
};
|
||||
|
||||
const handleResetForm = () => {
|
||||
setFormData({
|
||||
nama: originalData.nama,
|
||||
jarakKeDesa: originalData.jarakKeDesa,
|
||||
alamat: originalData.alamat,
|
||||
nomorTelepon: originalData.nomorTelepon,
|
||||
jamOperasional: originalData.jamOperasional,
|
||||
embedMapUrl: originalData.embedMapUrl,
|
||||
namaTempatMaps: originalData.namaTempatMaps,
|
||||
alamatMaps: originalData.alamatMaps,
|
||||
linkPetunjukArah: originalData.linkPetunjukArah,
|
||||
layananPolsekId: originalData.layananPolsekId,
|
||||
});
|
||||
toast.info("Form dikembalikan ke data awal");
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
polsekState.edit.form = { ...formData }; // update global state hanya di sini
|
||||
await polsekState.edit.update();
|
||||
toast.success("Polsek terdekat berhasil diperbarui!");
|
||||
router.push("/admin/keamanan/polsek-terdekat");
|
||||
} catch (error) {
|
||||
console.error("Error updating polsek terdekat:", error);
|
||||
toast.error("Gagal memperbarui data polsek terdekat");
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Modal Tambah */}
|
||||
<Modal
|
||||
opened={modalOpen}
|
||||
onClose={() => setModalOpen(false)}
|
||||
title="Tambah Layanan Polsek"
|
||||
centered
|
||||
>
|
||||
<Stack>
|
||||
<TextInput
|
||||
label="Nama Layanan"
|
||||
placeholder="Masukkan nama layanan"
|
||||
value={namaLayananBaru}
|
||||
onChange={(e) => setNamaLayananBaru(e.currentTarget.value)}
|
||||
/>
|
||||
<Button onClick={handleTambahLayanan}>Simpan</Button>
|
||||
</Stack>
|
||||
</Modal>
|
||||
|
||||
{/* Modal Update */}
|
||||
<Modal
|
||||
opened={modalUpdateOpen}
|
||||
onClose={() => setModalUpdateOpen(false)}
|
||||
title="Update Layanan Polsek"
|
||||
centered
|
||||
>
|
||||
<Stack>
|
||||
<TextInput
|
||||
label="Nama Layanan"
|
||||
placeholder="Masukkan nama layanan"
|
||||
value={namaLayananUpdate}
|
||||
onChange={(e) => setNamaLayananUpdate(e.currentTarget.value)}
|
||||
/>
|
||||
<Button
|
||||
onClick={() => {
|
||||
if (!selectedLayananId)
|
||||
return toast.warn("ID layanan tidak ditemukan");
|
||||
handleUpdateLayanan(selectedLayananId, namaLayananUpdate);
|
||||
}}
|
||||
>
|
||||
Simpan
|
||||
</Button>
|
||||
</Stack>
|
||||
</Modal>
|
||||
|
||||
{/* Header */}
|
||||
<Group mb="md">
|
||||
<Button
|
||||
variant="subtle"
|
||||
onClick={() => router.back()}
|
||||
p="xs"
|
||||
radius="md"
|
||||
>
|
||||
<IconArrowBack color={colors["blue-button"]} size={24} />
|
||||
</Button>
|
||||
<Title order={4} ml="sm" c="dark">
|
||||
Edit Polsek Terdekat
|
||||
</Title>
|
||||
</Group>
|
||||
|
||||
{/* Form utama */}
|
||||
<Paper
|
||||
w={{ base: "100%", md: "50%" }}
|
||||
bg={colors["white-1"]}
|
||||
p="lg"
|
||||
radius="md"
|
||||
shadow="sm"
|
||||
style={{ border: "1px solid #e0e0e0" }}
|
||||
>
|
||||
<Stack gap="md">
|
||||
{/* Input fields */}
|
||||
<TextInput
|
||||
value={formData.nama}
|
||||
onChange={(e) => handleChange("nama", e.currentTarget.value)}
|
||||
label="Nama Polsek Terdekat"
|
||||
placeholder="Masukkan nama Polsek Terdekat"
|
||||
required
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.jarakKeDesa}
|
||||
onChange={(e) => handleChange("jarakKeDesa", e.currentTarget.value)}
|
||||
label="Jarak Polsek Terdekat"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.alamat}
|
||||
onChange={(e) => handleChange("alamat", e.currentTarget.value)}
|
||||
label="Alamat Polsek Terdekat"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.nomorTelepon}
|
||||
onChange={(e) => handleChange("nomorTelepon", e.currentTarget.value)}
|
||||
label="Nomor Telepon"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.jamOperasional}
|
||||
onChange={(e) => handleChange("jamOperasional", e.currentTarget.value)}
|
||||
label="Jam Operasional"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.embedMapUrl}
|
||||
onChange={(e) => handleChange("embedMapUrl", e.currentTarget.value)}
|
||||
label="Embed Map URL"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.namaTempatMaps}
|
||||
onChange={(e) => handleChange("namaTempatMaps", e.currentTarget.value)}
|
||||
label="Nama Tempat Maps"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.alamatMaps}
|
||||
onChange={(e) => handleChange("alamatMaps", e.currentTarget.value)}
|
||||
label="Alamat Maps"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.linkPetunjukArah}
|
||||
onChange={(e) => handleChange("linkPetunjukArah", e.currentTarget.value)}
|
||||
label="Link Petunjuk Arah"
|
||||
/>
|
||||
|
||||
<Select
|
||||
label="Layanan Polsek"
|
||||
placeholder="Pilih layanan polsek"
|
||||
data={layananOptions}
|
||||
value={formData.layananPolsekId}
|
||||
onChange={(val) => handleChange("layananPolsekId", val || "")}
|
||||
/>
|
||||
<Button
|
||||
variant="light"
|
||||
size="xs"
|
||||
onClick={() => setModalOpen(true)}
|
||||
>
|
||||
+ Tambah Layanan Baru
|
||||
</Button>
|
||||
|
||||
{/* List layanan */}
|
||||
<Text fw="bold" fz="sm">
|
||||
Daftar Layanan Polsek
|
||||
</Text>
|
||||
{layananOptions.map((item) => (
|
||||
<Card
|
||||
key={item.value}
|
||||
style={{ border: "1px solid #ccc" }}
|
||||
bg={colors["white-1"]}
|
||||
p="md"
|
||||
radius="md"
|
||||
shadow="sm"
|
||||
>
|
||||
<Group justify="space-between">
|
||||
<Text>{item.label}</Text>
|
||||
<Group>
|
||||
<Button
|
||||
variant="light"
|
||||
size="xs"
|
||||
onClick={() => {
|
||||
setSelectedLayananId(item.value);
|
||||
setNamaLayananUpdate(item.label);
|
||||
setModalUpdateOpen(true);
|
||||
}}
|
||||
>
|
||||
Edit
|
||||
</Button>
|
||||
<Button
|
||||
variant="outline"
|
||||
color="red"
|
||||
size="xs"
|
||||
onClick={() => handleDeleteLayanan(item.value)}
|
||||
>
|
||||
Hapus
|
||||
</Button>
|
||||
</Group>
|
||||
</Group>
|
||||
</Card>
|
||||
))}
|
||||
|
||||
{/* Submit */}
|
||||
<Group justify="right">
|
||||
{/* Tombol Batal */}
|
||||
<Button
|
||||
variant="outline"
|
||||
color="gray"
|
||||
radius="md"
|
||||
size="md"
|
||||
onClick={handleResetForm}
|
||||
>
|
||||
Batal
|
||||
</Button>
|
||||
|
||||
{/* Tombol Simpan */}
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
radius="md"
|
||||
size="md"
|
||||
style={{
|
||||
background: `linear-gradient(135deg, ${colors['blue-button']}, #4facfe)`,
|
||||
color: '#fff',
|
||||
boxShadow: '0 4px 15px rgba(79, 172, 254, 0.4)',
|
||||
}}
|
||||
>
|
||||
{isSubmitting ? <Loader size="sm" color="white" /> : 'Simpan'}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Paper>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
export default EditPolsekTerdekat;
|
||||
@@ -0,0 +1,150 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
'use client'
|
||||
import colors from '@/con/colors';
|
||||
import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
|
||||
import { IconBuilding, IconTool } from '@tabler/icons-react';
|
||||
import { usePathname, useRouter } from 'next/navigation';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
|
||||
function LayoutPolsek({ children }: { children: React.ReactNode }) {
|
||||
const router = useRouter();
|
||||
const pathname = usePathname();
|
||||
|
||||
const tabs = [
|
||||
{
|
||||
label: "Daftar Polsek Terdekat",
|
||||
value: "daftar-polsek-terdekat",
|
||||
href: "/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat",
|
||||
icon: <IconBuilding size={18} stroke={1.8} />
|
||||
},
|
||||
{
|
||||
label: "Layanan Polsek",
|
||||
value: "layanan-polsek",
|
||||
href: "/admin/keamanan/polsek-terdekat/layanan-polsek",
|
||||
icon: <IconTool size={18} stroke={1.8} />
|
||||
}
|
||||
];
|
||||
|
||||
const currentTab = tabs.find(tab => tab.href === pathname);
|
||||
const [activeTab, setActiveTab] = useState<string | null>(currentTab?.value || tabs[0].value);
|
||||
|
||||
const handleTabChange = (value: string | null) => {
|
||||
const tab = tabs.find(t => t.value === value);
|
||||
if (tab) {
|
||||
router.push(tab.href);
|
||||
}
|
||||
setActiveTab(value);
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const match = tabs.find(tab => tab.href === pathname);
|
||||
if (match) {
|
||||
setActiveTab(match.value);
|
||||
}
|
||||
}, [pathname]);
|
||||
|
||||
return (
|
||||
<Stack gap="lg">
|
||||
<Title order={2} fw={700} style={{ color: "#1A1B1E" }}>
|
||||
Polsek Terdekat
|
||||
</Title>
|
||||
<Tabs
|
||||
color={colors["blue-button"]}
|
||||
variant="pills"
|
||||
value={activeTab}
|
||||
onChange={handleTabChange}
|
||||
radius="lg"
|
||||
keepMounted={false}
|
||||
>
|
||||
{/* ✅ Scroll horizontal wrapper */}
|
||||
<Box visibleFrom='md' pb={10}>
|
||||
<ScrollArea type="auto" offsetScrollbars>
|
||||
<TabsList
|
||||
p="sm"
|
||||
style={{
|
||||
background: "linear-gradient(135deg, #e7ebf7, #f9faff)",
|
||||
borderRadius: "1rem",
|
||||
boxShadow: "inset 0 0 10px rgba(0,0,0,0.05)",
|
||||
display: "flex",
|
||||
flexWrap: "nowrap",
|
||||
gap: "0.5rem",
|
||||
paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi
|
||||
}}
|
||||
>
|
||||
{tabs.map((tab, i) => (
|
||||
<TabsTab
|
||||
key={i}
|
||||
value={tab.value}
|
||||
leftSection={tab.icon}
|
||||
style={{
|
||||
fontWeight: 600,
|
||||
fontSize: "0.9rem",
|
||||
transition: "all 0.2s ease",
|
||||
flexShrink: 0, // ✅ jangan mengecil aneh-aneh
|
||||
}}
|
||||
>
|
||||
{tab.label}
|
||||
</TabsTab>
|
||||
))}
|
||||
</TabsList>
|
||||
</ScrollArea>
|
||||
</Box>
|
||||
|
||||
<Box hiddenFrom='md' pb={10}>
|
||||
<ScrollArea
|
||||
type="auto"
|
||||
offsetScrollbars={false}
|
||||
w="100%"
|
||||
>
|
||||
|
||||
<TabsList
|
||||
p="xs" // lebih kecil
|
||||
style={{
|
||||
background: "linear-gradient(135deg, #e7ebf7, #f9faff)",
|
||||
borderRadius: "1rem",
|
||||
display: "flex",
|
||||
flexWrap: "nowrap",
|
||||
gap: "0.5rem",
|
||||
width: "max-content", // ⬅️ kunci
|
||||
maxWidth: "100%", // ⬅️ penting
|
||||
}}
|
||||
>
|
||||
{tabs.map((tab, i) => (
|
||||
<TabsTab
|
||||
key={i}
|
||||
value={tab.value}
|
||||
leftSection={tab.icon}
|
||||
style={{
|
||||
fontWeight: 600,
|
||||
fontSize: "0.9rem",
|
||||
paddingInline: "0.75rem", // ⬅️ lebih ramping
|
||||
flexShrink: 0, // ✅ jangan mengecil aneh-aneh
|
||||
}}
|
||||
>
|
||||
{tab.label}
|
||||
</TabsTab>
|
||||
))}
|
||||
</TabsList>
|
||||
</ScrollArea>
|
||||
</Box>
|
||||
|
||||
{tabs.map((tab, i) => (
|
||||
<TabsPanel
|
||||
key={i}
|
||||
value={tab.value}
|
||||
style={{
|
||||
padding: "1.5rem",
|
||||
background: "linear-gradient(180deg, #ffffff, #f5f6fa)",
|
||||
borderRadius: "1rem",
|
||||
boxShadow: "0 4px 16px rgba(0,0,0,0.05)",
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</TabsPanel>
|
||||
))}
|
||||
</Tabs>
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
export default LayoutPolsek;
|
||||
@@ -0,0 +1,279 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
"use client";
|
||||
|
||||
import statePolsekTerdekat from "@/app/admin/(dashboard)/_state/keamanan/polsek-terdekat";
|
||||
import colors from "@/con/colors";
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Group,
|
||||
Loader,
|
||||
MultiSelect,
|
||||
Paper,
|
||||
Stack,
|
||||
TextInput,
|
||||
Title
|
||||
} from "@mantine/core";
|
||||
import { IconArrowBack } from "@tabler/icons-react";
|
||||
import { useParams, useRouter } from "next/navigation";
|
||||
import { useEffect, useState } from "react";
|
||||
import { toast } from "react-toastify";
|
||||
import { useProxy } from "valtio/utils";
|
||||
|
||||
|
||||
type FormData = {
|
||||
nama: string;
|
||||
jarakKeDesa: string;
|
||||
alamat: string;
|
||||
nomorTelepon: string;
|
||||
jamOperasional: string;
|
||||
embedMapUrl: string;
|
||||
namaTempatMaps: string;
|
||||
alamatMaps: string;
|
||||
linkPetunjukArah: string;
|
||||
layananPolsekId: string[];
|
||||
};
|
||||
|
||||
function EditPolsekTerdekat() {
|
||||
const polsekState = useProxy(statePolsekTerdekat.polsekTerdekatState);
|
||||
const params = useParams();
|
||||
const router = useRouter();
|
||||
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
const [formData, setFormData] = useState<FormData>({
|
||||
nama: "",
|
||||
jarakKeDesa: "",
|
||||
alamat: "",
|
||||
nomorTelepon: "",
|
||||
jamOperasional: "",
|
||||
embedMapUrl: "",
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: []
|
||||
});
|
||||
|
||||
const [originalData, setOriginalData] = useState({
|
||||
nama: "",
|
||||
jarakKeDesa: "",
|
||||
alamat: "",
|
||||
nomorTelepon: "",
|
||||
jamOperasional: "",
|
||||
embedMapUrl: "",
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: []
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
statePolsekTerdekat.layananPolsek.findManyAll.load();
|
||||
}, []);
|
||||
|
||||
// load data untuk form edit
|
||||
useEffect(() => {
|
||||
const loadPolsekTerdekat = async () => {
|
||||
const id = params?.id as string;
|
||||
if (!id) return;
|
||||
|
||||
try {
|
||||
const data = await polsekState.edit.load(id);
|
||||
if (data) {
|
||||
setFormData({
|
||||
nama: data.nama || "",
|
||||
jarakKeDesa: data.jarakKeDesa || "",
|
||||
alamat: data.alamat || "",
|
||||
nomorTelepon: data.nomorTelepon || "",
|
||||
jamOperasional: data.jamOperasional || "",
|
||||
embedMapUrl: data.embedMapUrl || "",
|
||||
namaTempatMaps: data.namaTempatMaps || "",
|
||||
alamatMaps: data.alamatMaps || "",
|
||||
linkPetunjukArah: data.linkPetunjukArah || "",
|
||||
layananPolsekId: data.LayananToPolsek?.map((l: any) => l.layananId) || [],
|
||||
});
|
||||
|
||||
setOriginalData({
|
||||
nama: data.nama || "",
|
||||
jarakKeDesa: data.jarakKeDesa || "",
|
||||
alamat: data.alamat || "",
|
||||
nomorTelepon: data.nomorTelepon || "",
|
||||
jamOperasional: data.jamOperasional || "",
|
||||
embedMapUrl: data.embedMapUrl || "",
|
||||
namaTempatMaps: data.namaTempatMaps || "",
|
||||
alamatMaps: data.alamatMaps || "",
|
||||
linkPetunjukArah: data.linkPetunjukArah || "",
|
||||
layananPolsekId: data.LayananToPolsek?.map((l: any) => l.layananId) || [],
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error loading polsek terdekat:", error);
|
||||
toast.error("Gagal memuat data polsek terdekat");
|
||||
}
|
||||
};
|
||||
|
||||
loadPolsekTerdekat();
|
||||
}, [params?.id]);
|
||||
|
||||
|
||||
const handleChange = (key: keyof FormData, value: any) => {
|
||||
setFormData((prev) => ({ ...prev, [key]: value }));
|
||||
};
|
||||
|
||||
const handleResetForm = () => {
|
||||
setFormData({
|
||||
nama: originalData.nama,
|
||||
jarakKeDesa: originalData.jarakKeDesa,
|
||||
alamat: originalData.alamat,
|
||||
nomorTelepon: originalData.nomorTelepon,
|
||||
jamOperasional: originalData.jamOperasional,
|
||||
embedMapUrl: originalData.embedMapUrl,
|
||||
namaTempatMaps: originalData.namaTempatMaps,
|
||||
alamatMaps: originalData.alamatMaps,
|
||||
linkPetunjukArah: originalData.linkPetunjukArah,
|
||||
layananPolsekId: (originalData as any)?.LayananToPolsek?.map((l: any) => l.layananId) || [],
|
||||
});
|
||||
toast.info("Form dikembalikan ke data awal");
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
await polsekState.edit.update();
|
||||
toast.success("Polsek terdekat berhasil diperbarui!");
|
||||
router.push("/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat");
|
||||
} catch (error) {
|
||||
console.error("Error updating polsek terdekat:", error);
|
||||
toast.error("Gagal memperbarui data polsek terdekat");
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Header */}
|
||||
<Group mb="md">
|
||||
<Button
|
||||
variant="subtle"
|
||||
onClick={() => router.back()}
|
||||
p="xs"
|
||||
radius="md"
|
||||
>
|
||||
<IconArrowBack color={colors["blue-button"]} size={24} />
|
||||
</Button>
|
||||
<Title order={4} ml="sm" c="dark">
|
||||
Edit Polsek Terdekat
|
||||
</Title>
|
||||
</Group>
|
||||
|
||||
{/* Form utama */}
|
||||
<Paper
|
||||
w={{ base: "100%", md: "50%" }}
|
||||
bg={colors["white-1"]}
|
||||
p="lg"
|
||||
radius="md"
|
||||
shadow="sm"
|
||||
style={{ border: "1px solid #e0e0e0" }}
|
||||
>
|
||||
<Stack gap="md">
|
||||
{/* Input fields */}
|
||||
<TextInput
|
||||
value={formData.nama}
|
||||
onChange={(e) => handleChange("nama", e.currentTarget.value)}
|
||||
label="Nama Polsek Terdekat"
|
||||
placeholder="Masukkan nama Polsek Terdekat"
|
||||
required
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.jarakKeDesa}
|
||||
onChange={(e) => handleChange("jarakKeDesa", e.currentTarget.value)}
|
||||
label="Jarak Polsek Terdekat"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.alamat}
|
||||
onChange={(e) => handleChange("alamat", e.currentTarget.value)}
|
||||
label="Alamat Polsek Terdekat"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.nomorTelepon}
|
||||
onChange={(e) => handleChange("nomorTelepon", e.currentTarget.value)}
|
||||
label="Nomor Telepon"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.jamOperasional}
|
||||
onChange={(e) => handleChange("jamOperasional", e.currentTarget.value)}
|
||||
label="Jam Operasional"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.embedMapUrl}
|
||||
onChange={(e) => handleChange("embedMapUrl", e.currentTarget.value)}
|
||||
label="Embed Map URL"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.namaTempatMaps}
|
||||
onChange={(e) => handleChange("namaTempatMaps", e.currentTarget.value)}
|
||||
label="Nama Tempat Maps"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.alamatMaps}
|
||||
onChange={(e) => handleChange("alamatMaps", e.currentTarget.value)}
|
||||
label="Alamat Maps"
|
||||
/>
|
||||
<TextInput
|
||||
value={formData.linkPetunjukArah}
|
||||
onChange={(e) => handleChange("linkPetunjukArah", e.currentTarget.value)}
|
||||
label="Link Petunjuk Arah"
|
||||
/>
|
||||
|
||||
<MultiSelect
|
||||
label="Layanan Polsekl"
|
||||
placeholder="Pilih layanan polsek"
|
||||
value={formData.layananPolsekId}
|
||||
onChange={(val) => handleChange('layananPolsekId', val)}
|
||||
data={
|
||||
statePolsekTerdekat.layananPolsek.findManyAll.data?.map((v) => ({
|
||||
value: v.id,
|
||||
label: v.nama,
|
||||
})) || []
|
||||
}
|
||||
clearable
|
||||
searchable
|
||||
required
|
||||
error={!formData.layananPolsekId.length ? 'Pilih minimal satu layanan polsek' : undefined}
|
||||
/>
|
||||
|
||||
{/* Submit */}
|
||||
<Group justify="right">
|
||||
{/* Tombol Batal */}
|
||||
<Button
|
||||
variant="outline"
|
||||
color="gray"
|
||||
radius="md"
|
||||
size="md"
|
||||
onClick={handleResetForm}
|
||||
>
|
||||
Batal
|
||||
</Button>
|
||||
|
||||
{/* Tombol Simpan */}
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
radius="md"
|
||||
size="md"
|
||||
style={{
|
||||
background: `linear-gradient(135deg, ${colors['blue-button']}, #4facfe)`,
|
||||
color: '#fff',
|
||||
boxShadow: '0 4px 15px rgba(79, 172, 254, 0.4)',
|
||||
}}
|
||||
>
|
||||
{isSubmitting ? <Loader size="sm" color="white" /> : 'Simpan'}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Paper>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
export default EditPolsekTerdekat;
|
||||
@@ -6,12 +6,12 @@ import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react';
|
||||
import { useParams, useRouter } from 'next/navigation';
|
||||
import { useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
|
||||
import polsekTerdekat from '../../../_state/keamanan/polsek-terdekat';
|
||||
import { ModalKonfirmasiHapus } from '../../../../_com/modalKonfirmasiHapus';
|
||||
import statePolsekTerdekat from '../../../../_state/keamanan/polsek-terdekat';
|
||||
|
||||
function DetailPolsekTerdekat() {
|
||||
const router = useRouter();
|
||||
const polsekState = useProxy(polsekTerdekat);
|
||||
const polsekState = useProxy(statePolsekTerdekat.polsekTerdekatState);
|
||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
||||
const [modalHapus, setModalHapus] = useState(false);
|
||||
const params = useParams();
|
||||
@@ -25,7 +25,7 @@ function DetailPolsekTerdekat() {
|
||||
polsekState.delete.byId(selectedId);
|
||||
setModalHapus(false);
|
||||
setSelectedId(null);
|
||||
router.push("/admin/keamanan/polsek-terdekat");
|
||||
router.push("/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat");
|
||||
}
|
||||
};
|
||||
|
||||
@@ -40,7 +40,7 @@ function DetailPolsekTerdekat() {
|
||||
const data = polsekState.findUnique.data;
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Tombol Back */}
|
||||
<Button
|
||||
variant="subtle"
|
||||
@@ -149,10 +149,20 @@ function DetailPolsekTerdekat() {
|
||||
</Text>
|
||||
</Box>
|
||||
|
||||
{/* Layanan Polsek */}
|
||||
|
||||
<Box>
|
||||
<Text fz="lg" fw="bold">Layanan Polsek</Text>
|
||||
<Text fz="md" c="dimmed">{data?.layananPolsek?.nama || "-"}</Text>
|
||||
<Stack gap={4}>
|
||||
{data.LayananToPolsek && data.LayananToPolsek.length > 0 ? (
|
||||
data.LayananToPolsek.map((layanan) => (
|
||||
<Text fz="md" c="dimmed" key={layanan.id}>
|
||||
• {layanan.layanan.nama}
|
||||
</Text>
|
||||
))
|
||||
) : (
|
||||
<Text fz="sm" c="dimmed">Tidak ada layanan polsek</Text>
|
||||
)}
|
||||
</Stack>
|
||||
</Box>
|
||||
|
||||
{/* Aksi */}
|
||||
@@ -172,7 +182,7 @@ function DetailPolsekTerdekat() {
|
||||
|
||||
<Button
|
||||
color="green"
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/${data.id}/edit`)}
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat/${data.id}/edit`)}
|
||||
variant="light"
|
||||
radius="md"
|
||||
size="md"
|
||||
@@ -1,4 +1,3 @@
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
'use client'
|
||||
import colors from '@/con/colors';
|
||||
import {
|
||||
@@ -6,9 +5,8 @@ import {
|
||||
Button,
|
||||
Group,
|
||||
Loader,
|
||||
Modal,
|
||||
MultiSelect,
|
||||
Paper,
|
||||
Select,
|
||||
Stack,
|
||||
Text,
|
||||
TextInput,
|
||||
@@ -19,16 +17,17 @@ import { useRouter } from 'next/navigation';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { toast } from 'react-toastify';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import polsekTerdekat from '../../../_state/keamanan/polsek-terdekat';
|
||||
import statePolsekTerdekat from '../../../../_state/keamanan/polsek-terdekat';
|
||||
|
||||
function CreatePolsekTerdekat() {
|
||||
const polsekState = useProxy(polsekTerdekat);
|
||||
const polsekState = useProxy(statePolsekTerdekat.polsekTerdekatState);
|
||||
const router = useRouter();
|
||||
const [layananOptions, setLayananOptions] = useState<{ value: string; label: string }[]>([]);
|
||||
const [modalOpen, setModalOpen] = useState(false);
|
||||
const [namaLayananBaru, setNamaLayananBaru] = useState("");
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
statePolsekTerdekat.layananPolsek.findManyAll.load();
|
||||
}, []);
|
||||
|
||||
const resetForm = () => {
|
||||
polsekState.create.form = {
|
||||
nama: "",
|
||||
@@ -40,44 +39,44 @@ function CreatePolsekTerdekat() {
|
||||
namaTempatMaps: "",
|
||||
alamatMaps: "",
|
||||
linkPetunjukArah: "",
|
||||
layananPolsekId: "",
|
||||
layananPolsekId: [],
|
||||
};
|
||||
};
|
||||
|
||||
const isValidGoogleMapsEmbed = (url: string): boolean => {
|
||||
try {
|
||||
const u = new URL(url);
|
||||
return (
|
||||
u.hostname === 'www.google.com' &&
|
||||
u.pathname === '/maps/embed' &&
|
||||
u.searchParams.has('pb')
|
||||
);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
try {
|
||||
const u = new URL(url);
|
||||
return (
|
||||
u.hostname === 'www.google.com' &&
|
||||
u.pathname === '/maps/embed' &&
|
||||
u.searchParams.has('pb')
|
||||
);
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
const { embedMapUrl } = polsekState.create.form;
|
||||
const { embedMapUrl } = polsekState.create.form;
|
||||
|
||||
// ✅ Validasi Google Maps Embed URL (jika diisi)
|
||||
if (embedMapUrl && !isValidGoogleMapsEmbed(embedMapUrl)) {
|
||||
toast.error("URL embed peta tidak valid. Harap paste iframe dari Google Maps.");
|
||||
return;
|
||||
}
|
||||
// ✅ Validasi Google Maps Embed URL (jika diisi)
|
||||
if (embedMapUrl && !isValidGoogleMapsEmbed(embedMapUrl)) {
|
||||
toast.error("URL embed peta tidak valid. Harap paste iframe dari Google Maps.");
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
await polsekState.create.create();
|
||||
resetForm();
|
||||
router.push("/admin/keamanan/polsek-terdekat");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
toast.error("Gagal menambah polsek terdekat");
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
await polsekState.create.create();
|
||||
resetForm();
|
||||
router.push("/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat");
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
toast.error("Gagal menambah polsek terdekat");
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
const extractEmbedUrl = (input: string): string => {
|
||||
// Jika sudah berupa URL embed yang valid
|
||||
@@ -96,77 +95,8 @@ function CreatePolsekTerdekat() {
|
||||
return input.trim();
|
||||
};
|
||||
|
||||
const fetchLayanan = async () => {
|
||||
try {
|
||||
const res = await fetch("/api/keamanan/layanan-polsek/find-many");
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
const options = data.data.map((item: any) => ({
|
||||
value: item.id,
|
||||
label: item.nama,
|
||||
}));
|
||||
setLayananOptions(options);
|
||||
}
|
||||
} catch {
|
||||
toast.error("Gagal memuat layanan polsek");
|
||||
}
|
||||
};
|
||||
|
||||
const handleTambahLayanan = async () => {
|
||||
if (!namaLayananBaru.trim()) return toast.warn("Nama layanan tidak boleh kosong");
|
||||
|
||||
try {
|
||||
const res = await fetch("/api/keamanan/layanan-polsek/create", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ nama: namaLayananBaru }),
|
||||
});
|
||||
const data = await res.json();
|
||||
|
||||
if (data.success) {
|
||||
const newLayanan = {
|
||||
value: data.data.id,
|
||||
label: data.data.nama,
|
||||
};
|
||||
setLayananOptions((prev) => [...prev, newLayanan]);
|
||||
await fetchLayanan();
|
||||
polsekState.create.form.layananPolsekId = data.data.id;
|
||||
toast.success("Layanan baru ditambahkan!");
|
||||
setModalOpen(false);
|
||||
setNamaLayananBaru("");
|
||||
} else {
|
||||
toast.error(data.message || "Gagal menambah layanan");
|
||||
}
|
||||
} catch {
|
||||
toast.error("Error menambah layanan");
|
||||
}
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
fetchLayanan();
|
||||
}, []);
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Modal Tambah Layanan */}
|
||||
<Modal
|
||||
opened={modalOpen}
|
||||
onClose={() => setModalOpen(false)}
|
||||
title="Tambah Layanan Polsek"
|
||||
centered
|
||||
>
|
||||
<Stack>
|
||||
<TextInput
|
||||
label="Nama Layanan"
|
||||
placeholder="Masukkan nama layanan"
|
||||
value={namaLayananBaru}
|
||||
onChange={(e) => setNamaLayananBaru(e.currentTarget.value)}
|
||||
/>
|
||||
<Button onClick={handleTambahLayanan}>Simpan</Button>
|
||||
</Stack>
|
||||
</Modal>
|
||||
|
||||
<Box px={{ base: 0, md: 'xs' }} py="xs">
|
||||
{/* Header */}
|
||||
<Group mb="md">
|
||||
<Button
|
||||
@@ -255,36 +185,23 @@ function CreatePolsekTerdekat() {
|
||||
label={<Text fw="bold" fz="sm">Link Petunjuk Arah</Text>}
|
||||
placeholder="Masukkan link petunjuk arah"
|
||||
/>
|
||||
<Select
|
||||
<MultiSelect
|
||||
label="Layanan Polsek"
|
||||
placeholder="Pilih layanan polsek"
|
||||
data={layananOptions}
|
||||
value={polsekState.create.form.layananPolsekId || null}
|
||||
onChange={(val: string | null) => {
|
||||
if (val) {
|
||||
const selected = layananOptions.find(
|
||||
(item) => item.value === val
|
||||
);
|
||||
if (selected) {
|
||||
polsekState.create.form.layananPolsekId = selected.value;
|
||||
}
|
||||
} else {
|
||||
polsekState.create.form.layananPolsekId = '';
|
||||
}
|
||||
placeholder="Pilih layanan polsek (bisa lebih dari satu)"
|
||||
data={statePolsekTerdekat.layananPolsek.findManyAll.data?.map((v) => ({
|
||||
value: v.id,
|
||||
label: v.nama,
|
||||
})) || []}
|
||||
value={polsekState.create.form.layananPolsekId}
|
||||
onChange={(val) => {
|
||||
polsekState.create.form.layananPolsekId = val;
|
||||
}}
|
||||
searchable
|
||||
clearable
|
||||
nothingFoundMessage="Tidak ditemukan"
|
||||
nothingFoundMessage="Tidak ada layanan ditemukan"
|
||||
required
|
||||
error={polsekState.create.form.layananPolsekId?.length === 0 ? "Pilih minimal 1 layanan polsek" : undefined}
|
||||
/>
|
||||
<Button
|
||||
variant="light"
|
||||
size="xs"
|
||||
onClick={() => setModalOpen(true)}
|
||||
>
|
||||
+ Tambah Layanan Baru
|
||||
</Button>
|
||||
|
||||
{/* Tombol Submit */}
|
||||
<Group justify="right">
|
||||
<Button
|
||||
@@ -23,8 +23,9 @@ import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import HeaderSearch from '../../_com/header';
|
||||
import polsekTerdekat from '../../_state/keamanan/polsek-terdekat';
|
||||
import HeaderSearch from '../../../_com/header';
|
||||
import statePolsekTerdekat from '../../../_state/keamanan/polsek-terdekat';
|
||||
|
||||
|
||||
function PolsekTerdekat() {
|
||||
const [search, setSearch] = useState("");
|
||||
@@ -45,7 +46,7 @@ function PolsekTerdekat() {
|
||||
}
|
||||
|
||||
function ListPolsekTerdekat({ search }: { search: string }) {
|
||||
const polsekState = useProxy(polsekTerdekat);
|
||||
const polsekState = useProxy(statePolsekTerdekat.polsekTerdekatState);
|
||||
const router = useRouter();
|
||||
const [debouncedSearch] = useDebouncedValue(search, 1000);
|
||||
|
||||
@@ -82,7 +83,7 @@ function ListPolsekTerdekat({ search }: { search: string }) {
|
||||
leftSection={<IconPlus size={18} />}
|
||||
color="blue"
|
||||
variant="light"
|
||||
onClick={() => router.push('/admin/keamanan/polsek-terdekat/create')}
|
||||
onClick={() => router.push('/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat/create')}
|
||||
>
|
||||
Tambah Baru
|
||||
</Button>
|
||||
@@ -145,7 +146,7 @@ function ListPolsekTerdekat({ search }: { search: string }) {
|
||||
<Button
|
||||
variant="light"
|
||||
color="blue"
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/${item.id}`)}
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat/${item.id}`)}
|
||||
w="100%"
|
||||
>
|
||||
<IconDeviceImac size={18} />
|
||||
@@ -207,7 +208,7 @@ function ListPolsekTerdekat({ search }: { search: string }) {
|
||||
variant="light"
|
||||
color="blue"
|
||||
fullWidth
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/${item.id}`)}
|
||||
onClick={() => router.push(`/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat/${item.id}`)}
|
||||
>
|
||||
<IconDeviceImac size={18} />
|
||||
<Text ml={5} fz="sm" fw={500} lh={1.4}>
|
||||
@@ -0,0 +1,161 @@
|
||||
/* eslint-disable react-hooks/exhaustive-deps */
|
||||
'use client'
|
||||
|
||||
import statePolsekTerdekat from '@/app/admin/(dashboard)/_state/keamanan/polsek-terdekat';
|
||||
import colors from '@/con/colors';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Group,
|
||||
Loader,
|
||||
Paper,
|
||||
Stack,
|
||||
TextInput,
|
||||
Title
|
||||
} from '@mantine/core';
|
||||
import { IconArrowBack } from '@tabler/icons-react';
|
||||
import { useParams, useRouter } from 'next/navigation';
|
||||
import { useEffect, useState } from 'react';
|
||||
import { toast } from 'react-toastify';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
|
||||
function EditLayananPolsek() {
|
||||
const editState = useProxy(statePolsekTerdekat.layananPolsek);
|
||||
const router = useRouter();
|
||||
const params = useParams();
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
|
||||
const [originalData, setOriginalData] = useState({
|
||||
nama: '',
|
||||
});
|
||||
|
||||
const [formData, setFormData] = useState({
|
||||
nama: '',
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
const loadLayananPolsek = async () => {
|
||||
const id = params?.id as string;
|
||||
if (!id) return;
|
||||
|
||||
try {
|
||||
const data = await editState.update.load(id);
|
||||
if (data) {
|
||||
setFormData({
|
||||
nama: data.nama || '',
|
||||
});
|
||||
setOriginalData({
|
||||
nama: data.nama || '',
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading layanan polsek:', error);
|
||||
toast.error('Gagal memuat data layanan polsek');
|
||||
}
|
||||
};
|
||||
|
||||
loadLayananPolsek();
|
||||
}, [params?.id]);
|
||||
|
||||
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||
setFormData((prev) => ({
|
||||
...prev,
|
||||
[e.target.name]: e.target.value,
|
||||
}));
|
||||
};
|
||||
|
||||
const handleResetForm = () => {
|
||||
setFormData({
|
||||
nama: originalData.nama,
|
||||
});
|
||||
toast.info('Form dikembalikan ke data awal');
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
try {
|
||||
setIsSubmitting(true);
|
||||
// update global state hanya saat submit
|
||||
editState.update.form = {
|
||||
...editState.update.form,
|
||||
nama: formData.nama,
|
||||
};
|
||||
|
||||
await editState.update.update();
|
||||
toast.success('Layanan Polsek berhasil diperbarui!');
|
||||
router.push('/admin/keamanan/polsek-terdekat/layanan-polsek');
|
||||
} catch (error) {
|
||||
console.error('Error updating layanan polsek:', error);
|
||||
toast.error('Terjadi kesalahan saat memperbarui layanan polsek');
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'lg' }} py="xs">
|
||||
{/* Back Button + Title */}
|
||||
<Group mb="md">
|
||||
<Button
|
||||
variant="subtle"
|
||||
onClick={() => router.back()}
|
||||
p="xs"
|
||||
radius="md"
|
||||
>
|
||||
<IconArrowBack color={colors['blue-button']} size={24} />
|
||||
</Button>
|
||||
<Title order={4} ml="sm" c="dark">
|
||||
Edit Layanan Polsek
|
||||
</Title>
|
||||
</Group>
|
||||
|
||||
{/* Form Wrapper */}
|
||||
<Paper
|
||||
w={{ base: '100%', md: '50%' }}
|
||||
bg={colors['white-1']}
|
||||
p="lg"
|
||||
radius="md"
|
||||
shadow="sm"
|
||||
style={{ border: '1px solid #e0e0e0' }}
|
||||
>
|
||||
<Stack gap="md">
|
||||
<TextInput
|
||||
name="nama"
|
||||
label="Nama Layanan Polsek"
|
||||
placeholder="Masukkan nama layanan polsek"
|
||||
value={formData.nama}
|
||||
onChange={handleChange}
|
||||
required
|
||||
/>
|
||||
|
||||
<Group justify="right">
|
||||
<Button
|
||||
variant="outline"
|
||||
color="gray"
|
||||
radius="md"
|
||||
size="md"
|
||||
onClick={handleResetForm}
|
||||
>
|
||||
Batal
|
||||
</Button>
|
||||
|
||||
{/* Tombol Simpan */}
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
radius="md"
|
||||
size="md"
|
||||
style={{
|
||||
background: `linear-gradient(135deg, ${colors['blue-button']}, #4facfe)`,
|
||||
color: '#fff',
|
||||
boxShadow: '0 4px 15px rgba(79, 172, 254, 0.4)',
|
||||
}}
|
||||
>
|
||||
{isSubmitting ? <Loader size="sm" color="white" /> : 'Simpan'}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Paper>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
export default EditLayananPolsek;
|
||||
@@ -0,0 +1,111 @@
|
||||
'use client';
|
||||
import statePolsekTerdekat from '@/app/admin/(dashboard)/_state/keamanan/polsek-terdekat';
|
||||
import colors from '@/con/colors';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Group,
|
||||
Loader,
|
||||
Paper,
|
||||
Stack,
|
||||
TextInput,
|
||||
Title
|
||||
} from '@mantine/core';
|
||||
import { IconArrowBack } from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { useState } from 'react';
|
||||
import { toast } from 'react-toastify';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
|
||||
function CreateLayananPolsek() {
|
||||
const createState = useProxy(statePolsekTerdekat.layananPolsek);
|
||||
const router = useRouter();
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
|
||||
const resetForm = () => {
|
||||
createState.create.form = {
|
||||
nama: '',
|
||||
};
|
||||
};
|
||||
|
||||
const handleSubmit = async () => {
|
||||
setIsSubmitting(true);
|
||||
try {
|
||||
await createState.create.create();
|
||||
resetForm();
|
||||
router.push('/admin/keamanan/polsek-terdekat/layanan-polsek');
|
||||
} catch (error) {
|
||||
console.error('Error creating layanan polsek:', error);
|
||||
toast.error('Gagal menambahkan layanan polsek');
|
||||
} finally {
|
||||
setIsSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<Box px={{ base: 0, md: 'lg' }} py="xs">
|
||||
{/* Header dengan back button */}
|
||||
<Group mb="md">
|
||||
<Button
|
||||
variant="subtle"
|
||||
onClick={() => router.back()}
|
||||
p="xs"
|
||||
radius="md"
|
||||
>
|
||||
<IconArrowBack color={colors['blue-button']} size={24} />
|
||||
</Button>
|
||||
<Title order={4} ml="sm" c="dark">
|
||||
Tambah Layanan Polsek
|
||||
</Title>
|
||||
</Group>
|
||||
|
||||
{/* Form utama */}
|
||||
<Paper
|
||||
w={{ base: '100%', md: '50%' }}
|
||||
bg={colors['white-1']}
|
||||
p="lg"
|
||||
radius="md"
|
||||
shadow="sm"
|
||||
style={{ border: '1px solid #e0e0e0' }}
|
||||
>
|
||||
<Stack gap="md">
|
||||
<TextInput
|
||||
label="Nama Layanan Polsek"
|
||||
placeholder="Masukkan nama layanan polsek"
|
||||
value={createState.create.form.nama || ''}
|
||||
onChange={(e) => (createState.create.form.nama = e.target.value)}
|
||||
required
|
||||
/>
|
||||
|
||||
<Group justify="right">
|
||||
<Button
|
||||
variant="outline"
|
||||
color="gray"
|
||||
radius="md"
|
||||
size="md"
|
||||
onClick={resetForm}
|
||||
>
|
||||
Reset
|
||||
</Button>
|
||||
|
||||
{/* Tombol Simpan */}
|
||||
<Button
|
||||
onClick={handleSubmit}
|
||||
radius="md"
|
||||
size="md"
|
||||
style={{
|
||||
background: `linear-gradient(135deg, ${colors['blue-button']}, #4facfe)`,
|
||||
color: '#fff',
|
||||
boxShadow: '0 4px 15px rgba(79, 172, 254, 0.4)',
|
||||
}}
|
||||
>
|
||||
{isSubmitting ? <Loader size="sm" color="white" /> : 'Simpan'}
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Paper>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
export default CreateLayananPolsek;
|
||||
@@ -0,0 +1,265 @@
|
||||
'use client'
|
||||
import colors from '@/con/colors';
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Center,
|
||||
Group,
|
||||
Pagination,
|
||||
Paper,
|
||||
Skeleton,
|
||||
Stack,
|
||||
Table,
|
||||
TableTbody,
|
||||
TableTd,
|
||||
TableTh,
|
||||
TableThead,
|
||||
TableTr,
|
||||
Text,
|
||||
Title,
|
||||
} from '@mantine/core';
|
||||
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
|
||||
import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import { useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
import HeaderSearch from '../../../_com/header';
|
||||
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
|
||||
import statePolsekTerdekat from '../../../_state/keamanan/polsek-terdekat';
|
||||
|
||||
|
||||
function LayananPolsek() {
|
||||
const [search, setSearch] = useState("");
|
||||
|
||||
return (
|
||||
<Box>
|
||||
<HeaderSearch
|
||||
title='Layanan Polsek'
|
||||
placeholder='Cari layanan polsek...'
|
||||
searchIcon={<IconSearch size={20} />}
|
||||
value={search}
|
||||
onChange={(e) => setSearch(e.currentTarget.value)}
|
||||
/>
|
||||
|
||||
<ListLayananPolsek search={search} />
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
function ListLayananPolsek({ search }: { search: string }) {
|
||||
const layananState = useProxy(statePolsekTerdekat.layananPolsek);
|
||||
const [modalHapus, setModalHapus] = useState(false);
|
||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
||||
const router = useRouter();
|
||||
const [debouncedSearch] = useDebouncedValue(search, 1000);
|
||||
|
||||
const {
|
||||
data,
|
||||
page,
|
||||
totalPages,
|
||||
loading,
|
||||
load,
|
||||
} = layananState.findMany;
|
||||
|
||||
useShallowEffect(() => {
|
||||
load(page, 10, debouncedSearch);
|
||||
}, [page, debouncedSearch]);
|
||||
|
||||
const handleDelete = () => {
|
||||
if (selectedId) {
|
||||
layananState.delete.delete(selectedId);
|
||||
setModalHapus(false);
|
||||
setSelectedId(null);
|
||||
load(page, 10, search);
|
||||
}
|
||||
};
|
||||
|
||||
const filteredData = data || [];
|
||||
|
||||
if (loading || !data) {
|
||||
return (
|
||||
<Stack py={{ base: 'sm', md: 'lg' }}>
|
||||
<Skeleton height={600} radius="md" />
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<Box py={{ base: 'sm', md: 'lg' }}>
|
||||
<Paper withBorder bg={colors['white-1']} p={{ base: 'md', md: 'lg' }} shadow="md" radius="md">
|
||||
<Group justify="space-between" mb={{ base: 'md', md: 'lg' }}>
|
||||
<Title order={4} lh={{ base: 1.2, md: 1.2 }}>
|
||||
Daftar Layanan Polsek
|
||||
</Title>
|
||||
<Button
|
||||
leftSection={<IconPlus size={18} />}
|
||||
color="blue"
|
||||
variant="light"
|
||||
onClick={() => router.push('/admin/keamanan/polsek-terdekat/layanan-polsek/create')}
|
||||
>
|
||||
Tambah Baru
|
||||
</Button>
|
||||
</Group>
|
||||
|
||||
{/* Desktop Table */}
|
||||
<Box visibleFrom="md" style={{ overflowX: 'auto' }}>
|
||||
<Table
|
||||
highlightOnHover
|
||||
miw={0}
|
||||
style={{
|
||||
tableLayout: 'fixed',
|
||||
width: '100%',
|
||||
}}
|
||||
>
|
||||
<TableThead>
|
||||
<TableTr>
|
||||
<TableTh style={{ width: '25%' }}>
|
||||
<Text fz="sm" fw={600} lh={1.4}>
|
||||
Nama Layanan Polsek
|
||||
</Text>
|
||||
</TableTh>
|
||||
<TableTh w="20%">
|
||||
<Text fz="sm" fw={600} lh={1.4} ta="center">Edit</Text>
|
||||
</TableTh>
|
||||
<TableTh w="20%">
|
||||
<Text fz="sm" fw={600} lh={1.4} ta="center">Hapus</Text>
|
||||
</TableTh>
|
||||
</TableTr>
|
||||
</TableThead>
|
||||
<TableTbody>
|
||||
{filteredData.length > 0 ? (
|
||||
filteredData.map((item) => (
|
||||
<TableTr key={item.id}>
|
||||
<TableTd>
|
||||
<Text fz="md" fw={500} lh={1.5} truncate="end">
|
||||
{item.nama}
|
||||
</Text>
|
||||
</TableTd>
|
||||
<TableTd ta="center">
|
||||
<Button
|
||||
variant="light"
|
||||
color="green"
|
||||
onClick={() =>
|
||||
router.push(
|
||||
`/admin/keamanan/polsek-terdekat/layanan-polsek/${item.id}`
|
||||
)
|
||||
}
|
||||
size="compact-sm"
|
||||
>
|
||||
<IconEdit size={16} />
|
||||
</Button>
|
||||
</TableTd>
|
||||
<TableTd ta="center">
|
||||
<Button
|
||||
variant="light"
|
||||
color="red"
|
||||
disabled={layananState.delete.loading}
|
||||
onClick={() => {
|
||||
setSelectedId(item.id);
|
||||
setModalHapus(true);
|
||||
}}
|
||||
size="compact-sm"
|
||||
>
|
||||
<IconTrash size={16} />
|
||||
</Button>
|
||||
</TableTd>
|
||||
</TableTr>
|
||||
))
|
||||
) : (
|
||||
<TableTr>
|
||||
<TableTd colSpan={4}>
|
||||
<Center py={24}>
|
||||
<Text c="dimmed" fz="sm" lh={1.4}>
|
||||
Tidak ada data Polsek yang cocok
|
||||
</Text>
|
||||
</Center>
|
||||
</TableTd>
|
||||
</TableTr>
|
||||
)}
|
||||
</TableTbody>
|
||||
</Table>
|
||||
</Box>
|
||||
|
||||
{/* Mobile Cards */}
|
||||
<Box hiddenFrom="md">
|
||||
<Stack gap="sm">
|
||||
{filteredData.length > 0 ? (
|
||||
filteredData.map((item) => (
|
||||
<Paper key={item.id} withBorder p="sm" radius="sm">
|
||||
<Stack gap={"xs"}>
|
||||
<Box>
|
||||
<Text fz="sm" fw={600} lh={1.4}>
|
||||
Nama Layanan Polsek
|
||||
</Text>
|
||||
<Text fz="sm" fw={500} lh={1.45}>
|
||||
{item.nama}
|
||||
</Text>
|
||||
</Box>
|
||||
<Group mt="sm" justify="flex-end" gap="xs">
|
||||
<Button
|
||||
variant="light"
|
||||
color="green"
|
||||
size="compact-xs"
|
||||
onClick={() =>
|
||||
router.push(
|
||||
`/admin/keamanan/polsek-terdekat/layanan-polsek/${item.id}`
|
||||
)
|
||||
}
|
||||
>
|
||||
<IconEdit size={14} />
|
||||
</Button>
|
||||
<Button
|
||||
variant="light"
|
||||
color="red"
|
||||
size="compact-xs"
|
||||
disabled={layananState.delete.loading}
|
||||
onClick={() => {
|
||||
setSelectedId(item.id);
|
||||
setModalHapus(true);
|
||||
}}
|
||||
>
|
||||
<IconTrash size={14} />
|
||||
</Button>
|
||||
</Group>
|
||||
</Stack>
|
||||
</Paper>
|
||||
))
|
||||
) : (
|
||||
<Center py={24}>
|
||||
<Text c="dimmed" fz="sm" lh={1.4}>
|
||||
Tidak ada data Layanan Polsek yang cocok
|
||||
</Text>
|
||||
</Center>
|
||||
)}
|
||||
</Stack>
|
||||
</Box>
|
||||
</Paper>
|
||||
|
||||
{/* Pagination */}
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
onChange={(newPage) => {
|
||||
load(newPage, 10, search);
|
||||
window.scrollTo({ top: 0, behavior: 'smooth' });
|
||||
}}
|
||||
total={totalPages}
|
||||
mt={{ base: 'lg', md: 'xl' }}
|
||||
mb={{ base: 'lg', md: 'xl' }}
|
||||
color="blue"
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
|
||||
{/* Modal Konfirmasi Hapus */}
|
||||
<ModalKonfirmasiHapus
|
||||
opened={modalHapus}
|
||||
onClose={() => setModalHapus(false)}
|
||||
onConfirm={handleDelete}
|
||||
text="Apakah anda yakin ingin menghapus layanan polsek ini?"
|
||||
/>
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
export default LayananPolsek;
|
||||
@@ -0,0 +1,34 @@
|
||||
'use client'
|
||||
import React from 'react';
|
||||
import LayoutPolsek from './_com/layoutPolsek';
|
||||
import { usePathname } from 'next/navigation';
|
||||
import { Box } from '@mantine/core';
|
||||
|
||||
function Layout({ children }: { children: React.ReactNode }) {
|
||||
const pathname = usePathname();
|
||||
|
||||
// Contoh path:
|
||||
// - /darmasaba/desa/berita/semua → panjang 5 → list
|
||||
// - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list
|
||||
// - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail
|
||||
|
||||
const segments = pathname.split('/').filter(Boolean);
|
||||
const isDetailPage = segments.length >= 5;
|
||||
|
||||
if (isDetailPage) {
|
||||
// Tampilkan tanpa tab menu
|
||||
return (
|
||||
<Box>
|
||||
{children}
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<LayoutPolsek>
|
||||
{children}
|
||||
</LayoutPolsek>
|
||||
);
|
||||
}
|
||||
|
||||
export default Layout;
|
||||
@@ -230,7 +230,6 @@ function ListKelahiran({ search }: { search: string }) {
|
||||
</Paper>
|
||||
|
||||
{/* Pagination */}
|
||||
{totalPages > 1 && (
|
||||
<Center>
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -245,7 +244,6 @@ function ListKelahiran({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Stack>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -222,7 +222,6 @@ function ListKematian({ search }: { search: string }) {
|
||||
</Paper>
|
||||
|
||||
{/* Pagination */}
|
||||
{totalPages > 1 && (
|
||||
<Center mt="lg">
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -235,7 +234,6 @@ function ListKematian({ search }: { search: string }) {
|
||||
radius="md"
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Box>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -134,7 +134,6 @@ function ListKategoriPrestasi({ search }: { search: string }) {
|
||||
</TableTbody>
|
||||
</Table>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center mt="xl">
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -151,7 +150,6 @@ function ListKategoriPrestasi({ search }: { search: string }) {
|
||||
}}
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Box>
|
||||
|
||||
{/* MOBILE: Card */}
|
||||
@@ -194,7 +192,6 @@ function ListKategoriPrestasi({ search }: { search: string }) {
|
||||
))
|
||||
)}
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center py="lg">
|
||||
<Pagination
|
||||
value={page}
|
||||
@@ -211,7 +208,6 @@ function ListKategoriPrestasi({ search }: { search: string }) {
|
||||
}}
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
</Stack>
|
||||
</Box>
|
||||
|
||||
|
||||
@@ -73,9 +73,9 @@ function ListPrestasi({ search }: { search: string }) {
|
||||
|
||||
{/* Desktop Table */}
|
||||
<Box visibleFrom="md" style={{ overflowX: 'auto' }}>
|
||||
<Table highlightOnHover
|
||||
layout="fixed" // 🔥 PENTING
|
||||
withColumnBorders={false} striped verticalSpacing="sm" miw={800}>
|
||||
<Table highlightOnHover
|
||||
layout="fixed" // 🔥 PENTING
|
||||
withColumnBorders={false} striped verticalSpacing="sm" miw={800}>
|
||||
<TableThead>
|
||||
<TableTr>
|
||||
<TableTh>Nama Prestasi</TableTh>
|
||||
@@ -177,17 +177,15 @@ function ListPrestasi({ search }: { search: string }) {
|
||||
</Stack>
|
||||
</Paper>
|
||||
|
||||
{totalPages > 1 && (
|
||||
<Center mt={{ base: 'md', md: 'lg' }}>
|
||||
<Pagination
|
||||
value={page}
|
||||
onChange={load}
|
||||
total={totalPages}
|
||||
withEdges
|
||||
size={isMobile ? 'xs' : 'sm'}
|
||||
/>
|
||||
</Center>
|
||||
)}
|
||||
<Center mt={{ base: 'md', md: 'lg' }}>
|
||||
<Pagination
|
||||
value={page}
|
||||
onChange={load}
|
||||
total={totalPages}
|
||||
withEdges
|
||||
size={isMobile ? 'xs' : 'sm'}
|
||||
/>
|
||||
</Center>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
@@ -4,24 +4,45 @@ import colors from '@/con/colors';
|
||||
import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core';
|
||||
import { useShallowEffect } from '@mantine/hooks';
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconArrowBack,
|
||||
IconBook,
|
||||
IconBuilding,
|
||||
IconBuildingCommunity,
|
||||
IconCash,
|
||||
IconChartLine,
|
||||
IconChristmasTreeFilled,
|
||||
IconClipboard,
|
||||
IconClipboardTextFilled,
|
||||
IconDroplet,
|
||||
IconEdit,
|
||||
IconFileText,
|
||||
IconFiretruck,
|
||||
IconFirstAidKit,
|
||||
IconHome,
|
||||
IconHomeEco,
|
||||
IconHospital,
|
||||
IconInfoCircle,
|
||||
IconLeaf,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconRecycle,
|
||||
IconRun,
|
||||
IconScale,
|
||||
IconSchool,
|
||||
IconShield,
|
||||
IconShieldFilled,
|
||||
IconShoppingCart,
|
||||
IconStethoscope,
|
||||
IconTent,
|
||||
IconTrash,
|
||||
IconTrashFilled,
|
||||
IconTree,
|
||||
IconTrendingUp,
|
||||
IconTrophy,
|
||||
IconTruck,
|
||||
IconTruckFilled,
|
||||
IconUsers
|
||||
} from '@tabler/icons-react';
|
||||
import { useParams, useRouter } from 'next/navigation';
|
||||
import React, { useState } from 'react';
|
||||
@@ -36,24 +57,53 @@ function DetailDataLingkunganDesa() {
|
||||
const params = useParams();
|
||||
const [selectedId, setSelectedId] = useState<string | null>(null);
|
||||
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruck,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboard,
|
||||
trash: IconTrash,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
};
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
// ===== Umum & Lingkungan =====
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
useShallowEffect(() => {
|
||||
stateDataLingkungan.findUnique.load(params?.id as string);
|
||||
|
||||
@@ -23,31 +23,43 @@ import {
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconBook,
|
||||
IconBuilding,
|
||||
IconBuildingCommunity,
|
||||
IconCash,
|
||||
IconChartLine,
|
||||
IconChristmasTreeFilled,
|
||||
IconClipboardTextFilled,
|
||||
IconDeviceImacCog,
|
||||
IconDroplet,
|
||||
IconFileText,
|
||||
IconFiretruck,
|
||||
IconFirstAidKit,
|
||||
IconHome,
|
||||
IconHomeEco,
|
||||
IconHospital,
|
||||
IconInfoCircle,
|
||||
IconLeaf,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconPlus,
|
||||
IconRecycle,
|
||||
IconRun,
|
||||
IconScale,
|
||||
IconSchool,
|
||||
IconSearch,
|
||||
IconShield,
|
||||
IconShieldFilled,
|
||||
IconShoppingCart,
|
||||
IconStethoscope,
|
||||
IconTent,
|
||||
IconTrashFilled,
|
||||
IconTree,
|
||||
IconTrendingUp,
|
||||
IconTrophy,
|
||||
IconTruckFilled,
|
||||
IconUsers,
|
||||
} from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
@@ -84,34 +96,53 @@ function ListDataLingkunganDesa({ search }: { search: string }) {
|
||||
|
||||
const filteredData = data || [];
|
||||
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
rumahSakit: IconHospital,
|
||||
bangunan: IconBuilding,
|
||||
darurat: IconAlertTriangle
|
||||
};
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
// ===== Umum & Lingkungan =====
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
if (loading || !data) {
|
||||
return (
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import colors from '@/con/colors';
|
||||
import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
|
||||
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
|
||||
import { IconAlertTriangle, IconAmbulance, IconBuilding, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboardTextFilled, IconDroplet, IconEdit, IconFiretruck, IconHome, IconHomeEco, IconHospital, IconLeaf, IconPlus, IconRecycle, IconScale, IconSchool, IconSearch, IconShieldFilled, IconShoppingCart, IconTent, IconTrashFilled, IconTree, IconTrendingUp, IconTrophy, IconTruckFilled } from '@tabler/icons-react';
|
||||
import { IconAlertTriangle, IconAmbulance, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboardTextFilled, IconDroplet, IconEdit, IconFileText, IconFiretruck, IconFirstAidKit, IconHome, IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconPlus, IconRecycle, IconRun, IconScale, IconSchool, IconSearch, IconShield, IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrashFilled, IconTree, IconTrendingUp, IconTrophy, IconTruckFilled, IconUsers } from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import React, { useState } from 'react';
|
||||
import { useProxy } from 'valtio/utils';
|
||||
@@ -58,32 +58,51 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) {
|
||||
const filteredData = data || []
|
||||
|
||||
const iconMap: Record<string, React.FC<{ size: number; style?: React.CSSProperties }>> = {
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
rumahSakit: IconHospital,
|
||||
bangunan: IconBuilding,
|
||||
darurat: IconAlertTriangle,
|
||||
// ===== Umum & Lingkungan =====
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruckFilled,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboardTextFilled,
|
||||
trash: IconTrashFilled,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
if (loading || !data) {
|
||||
|
||||
@@ -6,12 +6,14 @@ import { useShallowEffect } from '@mantine/hooks';
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconArrowBack, IconBuilding, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard,
|
||||
IconArrowBack, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard,
|
||||
IconDroplet,
|
||||
IconEdit, IconFiretruck, IconHome, IconHomeEco, IconHospital, IconLeaf, IconRecycle, IconScale,
|
||||
IconEdit, IconFileText, IconFiretruck, IconFirstAidKit, IconHome, IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconRecycle, IconRun, IconScale,
|
||||
IconSchool,
|
||||
IconShieldFilled, IconShoppingCart, IconTent, IconTrash, IconTree, IconTrendingUp,
|
||||
IconTrophy, IconTruck
|
||||
IconShield,
|
||||
IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrash, IconTree, IconTrendingUp,
|
||||
IconTrophy, IconTruck,
|
||||
IconUsers
|
||||
} from '@tabler/icons-react';
|
||||
import { useParams, useRouter } from 'next/navigation';
|
||||
import React, { useState } from 'react';
|
||||
@@ -28,31 +30,49 @@ function DetailProgramPenghijauan() {
|
||||
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruck,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboard,
|
||||
trash: IconTrash,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
rumahSakit: IconHospital,
|
||||
bangunan: IconBuilding,
|
||||
darurat: IconAlertTriangle
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
ekonomi: IconChartLine,
|
||||
sampah: IconRecycle,
|
||||
truck: IconTruck,
|
||||
scale: IconScale,
|
||||
clipboard: IconClipboard,
|
||||
trash: IconTrash,
|
||||
lingkunganSehat: IconHomeEco,
|
||||
sumberOksigen: IconChristmasTreeFilled,
|
||||
ekonomiBerkelanjutan: IconTrendingUp,
|
||||
mencegahBencana: IconShieldFilled,
|
||||
rumah: IconHome,
|
||||
pohon: IconTree,
|
||||
air: IconDroplet,
|
||||
bantuan: IconCash,
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
useShallowEffect(() => {
|
||||
@@ -113,7 +133,7 @@ function DetailProgramPenghijauan() {
|
||||
|
||||
<Box>
|
||||
<Text fz="lg" fw="bold">Ikon Program</Text>
|
||||
{iconMap[data?.icon] ? (
|
||||
{iconMap[data?.icon] ? (
|
||||
<Box title={data?.icon}>
|
||||
{React.createElement(iconMap[data.icon], { size: 28, color: colors['blue-button'] })}
|
||||
</Box>
|
||||
|
||||
@@ -23,31 +23,43 @@ import {
|
||||
import {
|
||||
IconAlertTriangle,
|
||||
IconAmbulance,
|
||||
IconBook,
|
||||
IconBuilding,
|
||||
IconBuildingCommunity,
|
||||
IconCash,
|
||||
IconChartLine,
|
||||
IconChristmasTreeFilled,
|
||||
IconClipboardTextFilled,
|
||||
IconDeviceImac,
|
||||
IconDroplet,
|
||||
IconFileText,
|
||||
IconFiretruck,
|
||||
IconFirstAidKit,
|
||||
IconHome,
|
||||
IconHomeEco,
|
||||
IconHospital,
|
||||
IconInfoCircle,
|
||||
IconLeaf,
|
||||
IconLifebuoy,
|
||||
IconMessageReport,
|
||||
IconPhoneCall,
|
||||
IconPlus,
|
||||
IconRecycle,
|
||||
IconRun,
|
||||
IconScale,
|
||||
IconSchool,
|
||||
IconSearch,
|
||||
IconShield,
|
||||
IconShieldFilled,
|
||||
IconShoppingCart,
|
||||
IconStethoscope,
|
||||
IconTent,
|
||||
IconTrashFilled,
|
||||
IconTree,
|
||||
IconTrendingUp,
|
||||
IconTrophy,
|
||||
IconTruckFilled,
|
||||
IconUsers,
|
||||
} from '@tabler/icons-react';
|
||||
import { useRouter } from 'next/navigation';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
@@ -85,6 +97,7 @@ function ListProgramPenghijauan({ search }: { search: string }) {
|
||||
const filteredData = data || [];
|
||||
|
||||
const iconMap: Record<string, React.FC<any>> = {
|
||||
// ===== Umum & Lingkungan =====
|
||||
ekowisata: IconLeaf,
|
||||
kompetisi: IconTrophy,
|
||||
wisata: IconTent,
|
||||
@@ -105,12 +118,30 @@ function ListProgramPenghijauan({ search }: { search: string }) {
|
||||
pelatihan: IconSchool,
|
||||
subsidi: IconShoppingCart,
|
||||
layananKesehatan: IconHospital,
|
||||
|
||||
// ===== Keamanan & Darurat =====
|
||||
polisi: IconShieldFilled,
|
||||
ambulans: IconAmbulance,
|
||||
pemadam: IconFiretruck,
|
||||
rumahSakit: IconHospital,
|
||||
bangunan: IconBuilding,
|
||||
darurat: IconAlertTriangle,
|
||||
sar: IconLifebuoy,
|
||||
evakuasi: IconRun,
|
||||
keamanan: IconShield,
|
||||
teleponDarurat: IconPhoneCall,
|
||||
|
||||
// ===== Kesehatan =====
|
||||
rumahSakit: IconHospital,
|
||||
puskesmas: IconFirstAidKit,
|
||||
klinik: IconStethoscope,
|
||||
|
||||
// ===== Pemerintahan & Fasilitas =====
|
||||
bangunan: IconBuilding,
|
||||
kantorDesa: IconBuildingCommunity,
|
||||
administrasi: IconFileText,
|
||||
informasi: IconInfoCircle,
|
||||
pengaduan: IconMessageReport,
|
||||
layananPublik: IconUsers,
|
||||
book: IconBook
|
||||
};
|
||||
|
||||
if (loading || !data) {
|
||||
|
||||
@@ -40,7 +40,7 @@ function EditPerpustakaanDigital() {
|
||||
|
||||
// Load kategori & data awal
|
||||
useEffect(() => {
|
||||
perpustakaanDigitalState.kategoriBuku.findMany.load();
|
||||
perpustakaanDigitalState.kategoriBuku.findManyAll.load();
|
||||
|
||||
const loadData = async () => {
|
||||
const id = Array.isArray(params?.id) ? params.id[0] : params?.id;
|
||||
|
||||
@@ -19,7 +19,7 @@ function CreateDataPerpustakaan() {
|
||||
const [isSubmitting, setIsSubmitting] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
perpustakaanDigitalState.kategoriBuku.findMany.load();
|
||||
perpustakaanDigitalState.kategoriBuku.findManyAll.load();
|
||||
}, []);
|
||||
|
||||
const resetForm = () => {
|
||||
@@ -109,7 +109,7 @@ function CreateDataPerpustakaan() {
|
||||
placeholder='Pilih kategori'
|
||||
value={createState.create.form.kategoriId || ""}
|
||||
onChange={(val) => { createState.create.form.kategoriId = val ?? ""; }}
|
||||
data={perpustakaanDigitalState.kategoriBuku.findMany.data?.map((item) => ({
|
||||
data={perpustakaanDigitalState.kategoriBuku.findManyAll.data?.map((item) => ({
|
||||
value: item.id,
|
||||
label: item.name,
|
||||
}))}
|
||||
|
||||
@@ -14,11 +14,6 @@ export const devBar = [
|
||||
name: "Desa Anti Korupsi",
|
||||
path: "/admin/landing-page/desa-anti-korupsi/list-desa-anti-korupsi"
|
||||
},
|
||||
// {
|
||||
// id: "Landing_Page_3",
|
||||
// name: "Indeks Kepuasan Masyarakat",
|
||||
// path: "/admin/landing-page/indeks-kepuasan-masyarakat/grafik-kepuasan-masyarakat"
|
||||
// },
|
||||
{
|
||||
id: "Landing_Page_3",
|
||||
name: "SDGs",
|
||||
@@ -182,7 +177,7 @@ export const devBar = [
|
||||
{
|
||||
id: "Keamanan_2",
|
||||
name: "Polsek Terdekat",
|
||||
path: "/admin/keamanan/polsek-terdekat"
|
||||
path: "/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat"
|
||||
},
|
||||
{
|
||||
id: "Keamanan_3",
|
||||
@@ -418,11 +413,6 @@ export const navBar = [
|
||||
name: "Desa Anti Korupsi",
|
||||
path: "/admin/landing-page/desa-anti-korupsi/list-desa-anti-korupsi"
|
||||
},
|
||||
// {
|
||||
// id: "Landing_Page_3",
|
||||
// name: "Indeks Kepuasan Masyarakat",
|
||||
// path: "/admin/landing-page/indeks-kepuasan-masyarakat/grafik-kepuasan-masyarakat"
|
||||
// },
|
||||
{
|
||||
id: "Landing_Page_3",
|
||||
name: "SDGs",
|
||||
@@ -586,7 +576,7 @@ export const navBar = [
|
||||
{
|
||||
id: "Keamanan_2",
|
||||
name: "Polsek Terdekat",
|
||||
path: "/admin/keamanan/polsek-terdekat"
|
||||
path: "/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat"
|
||||
},
|
||||
{
|
||||
id: "Keamanan_3",
|
||||
@@ -822,11 +812,6 @@ export const role1 = [
|
||||
name: "Desa Anti Korupsi",
|
||||
path: "/admin/landing-page/desa-anti-korupsi/list-desa-anti-korupsi"
|
||||
},
|
||||
// {
|
||||
// id: "Landing_Page_3",
|
||||
// name: "Indeks Kepuasan Masyarakat",
|
||||
// path: "/admin/landing-page/indeks-kepuasan-masyarakat/grafik-kepuasan-masyarakat"
|
||||
// },
|
||||
{
|
||||
id: "Landing_Page_3",
|
||||
name: "SDGs",
|
||||
@@ -948,7 +933,7 @@ export const role1 = [
|
||||
{
|
||||
id: "Keamanan_2",
|
||||
name: "Polsek Terdekat",
|
||||
path: "/admin/keamanan/polsek-terdekat"
|
||||
path: "/admin/keamanan/polsek-terdekat/daftar-polsek-terdekat"
|
||||
},
|
||||
{
|
||||
id: "Keamanan_3",
|
||||
|
||||
@@ -9,6 +9,7 @@ type FormCreate = {
|
||||
rating: number;
|
||||
kategoriId: string[];
|
||||
kontak: string;
|
||||
deskripsi: string;
|
||||
// Array of KategoriProduk IDs
|
||||
};
|
||||
|
||||
@@ -31,7 +32,8 @@ export default async function pasarDesaCreate(context: Context) {
|
||||
imageId: body.imageId,
|
||||
rating: Number(body.rating),
|
||||
kategoriProdukId: body.kategoriId[0],
|
||||
kontak: body.kontak
|
||||
kontak: body.kontak,
|
||||
deskripsi: body.deskripsi,
|
||||
// Use the first category as the main one
|
||||
},
|
||||
});
|
||||
|
||||
@@ -38,6 +38,7 @@ const PasarDesa = new Elysia({
|
||||
rating: t.Number(),
|
||||
kategoriId: t.Array(t.String()),
|
||||
kontak: t.String(),
|
||||
deskripsi: t.String(),
|
||||
}),
|
||||
}
|
||||
)
|
||||
@@ -81,6 +82,7 @@ const PasarDesa = new Elysia({
|
||||
rating: t.Number(),
|
||||
kategoriId: t.Array(t.String()),
|
||||
kontak: t.String(),
|
||||
deskripsi: t.String(),
|
||||
}),
|
||||
}
|
||||
);
|
||||
|
||||
@@ -10,6 +10,7 @@ type FormUpdate = {
|
||||
rating: number;
|
||||
kategoriId: string[]; // Array of KategoriProduk IDs
|
||||
kontak: string;
|
||||
deskripsi: string;
|
||||
};
|
||||
|
||||
export default async function pasarDesaUpdate(context: Context) {
|
||||
@@ -32,7 +33,8 @@ export default async function pasarDesaUpdate(context: Context) {
|
||||
alamatUsaha: body.alamatUsaha,
|
||||
imageId: body.imageId,
|
||||
rating: Number(body.rating),
|
||||
kontak: body.kontak
|
||||
kontak: body.kontak,
|
||||
deskripsi: body.deskripsi
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user