Compare commits

...

5 Commits

Author SHA1 Message Date
c2ad515366 Fix Seed Image 27 Jan 2026-01-27 10:50:33 +08:00
d9ce4aac6d Seed Pendidikan 2026-01-23 16:51:35 +08:00
3fcfec22fb Fix seeder statistik kemiskinan 2026-01-21 14:25:20 +08:00
6ca1e032a6 Fix uploads -1 2026-01-21 14:09:27 +08:00
78c55a8a71 Seed data menu ekonomi - lingkungan
fix iconmap
2026-01-21 12:07:52 +08:00
87 changed files with 5371 additions and 509 deletions

BIN
bun.lockb

Binary file not shown.

View File

@@ -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",
@@ -53,6 +54,7 @@
"bun": "^1.2.2",
"chart.js": "^4.4.8",
"classnames": "^2.5.1",
"cli-progress": "^3.12.0",
"colors": "^1.4.0",
"date-fns": "^4.1.0",
"dayjs": "^1.11.13",
@@ -72,6 +74,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",
@@ -102,6 +105,7 @@
},
"devDependencies": {
"@eslint/eslintrc": "^3",
"@types/cli-progress": "^3.11.6",
"@types/jsonwebtoken": "^9.0.10",
"@types/node": "^20",
"@types/react": "^19",

View File

@@ -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
}
]

View File

@@ -0,0 +1,10 @@
[
{
"id": "cmkko983k000104l2ff4i8awk",
"SD": "35",
"SMP": "28",
"SMA": "20",
"D3": "8",
"S1": "15"
}
]

View File

@@ -0,0 +1,9 @@
[
{
"id": "cmkko8wam000004l2h99rekid",
"usia18_25": "25",
"usia26_35": "18",
"usia36_45": "12",
"usia46_keatas": "10"
}
]

View File

@@ -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
}
]

View File

@@ -0,0 +1,6 @@
[
{
"id": "6b52d644-09b7-4af5-a78b-3dad854973e7",
"tahun": 2025
}
]

View File

@@ -0,0 +1,7 @@
[
{
"id": "82b8c96f-7817-482f-ba5e-85ad78c7bd57",
"name": "Belanja Desa (Realisasi Semester I)",
"nilai": 43871400
}
]

View File

@@ -0,0 +1,7 @@
[
{
"id": "cb593f99-9f15-4294-9c17-a93c8c149a25",
"name": "Pembiayaan Neto (SILPA 2024)",
"nilai": 69289666
}
]

View File

@@ -0,0 +1,7 @@
[
{
"id": "24576ca1-3dee-4608-9fb3-51f16efce901",
"name": "Pendapatan Asli Desa (PADes)",
"nilai": 10610011
}
]

View File

@@ -1,23 +1,23 @@
[
{
"id": "dd92a029-cd7d-4b60-8a3b-dd88e61fe715",
"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>",
"statistikId": "d59481a3-ff7f-4e52-cd5c-89e143eeb869"
"tahun": 2023
},
{
"id": "dd92a029-cd7d-4b60-9b4c-dd88e61fe715",
"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>",
"statistikId": "d59481a3-ff7f-4e52-de6d-89e143eeb869"
"tahun": 2024
},
{
"id": "dd92a029-cd7d-4b60-0c5d-dd88e61fe715",
"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>",
"statistikId": "d59481a3-ff7f-4e52-df7e-89e143eeb869"
"tahun": 2025
}
]

View File

@@ -1,16 +1,16 @@
[
{
"id": "d59481a3-ff7f-4e52-cd5c-89e143eeb869",
"id": "85d8a150-f770-11f0-89ff-719f813f71b3",
"tahun": 2023,
"jumlah": 20
},
{
"id": "d59481a3-ff7f-4e52-de6d-89e143eeb869",
"id": "993b8d20-f770-11f0-89ff-719f813f71b3",
"tahun": 2024,
"jumlah": 30
},
{
"id": "d59481a3-ff7f-4e52-df7e-89e143eeb869",
"id": "9eb3b2a0-f770-11f0-89ff-719f813f71b3",
"tahun": 2025,
"jumlah": 20
}

View File

@@ -1144,21 +1144,21 @@
"category": "image"
},
{
"id": "cmkccs50d0000vn2mfuk0d9dw",
"name": "U7rePDZq5E59z-Eo9tLBe-desktop.webp",
"id": "cmkp70z5g0000vnu9b0aieem8",
"name": "vwZsaxcoFWDlxG1PW7FC0-desktop.webp",
"realName": "tips-keamanan-1.jpg",
"path": "uploads/images",
"mimeType": "image/webp",
"link": "/api/fileStorage/findUnique/U7rePDZq5E59z-Eo9tLBe-desktop.webp",
"link": "/api/fileStorage/findUnique/vwZsaxcoFWDlxG1PW7FC0-desktop.webp",
"category": "image"
},
{
"id": "cmkccyh7t0003vn2mjdrqtuu0",
"name": "TTur8BttDlAS9UgZVe3M8-desktop.webp",
"id": "cmkp71pub0003vnu9ef60huuv",
"name": "dSe0xyvNLkP2t2f6iq-Hk-desktop.webp",
"realName": "tipskaman.jpg",
"path": "uploads/images",
"mimeType": "image/webp",
"link": "/api/fileStorage/findUnique/TTur8BttDlAS9UgZVe3M8-desktop.webp",
"link": "/api/fileStorage/findUnique/dSe0xyvNLkP2t2f6iq-Hk-desktop.webp",
"category": "image"
},
{
@@ -1169,5 +1169,392 @@
"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"
}
]

View 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."
}
]

View 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": "DDAMART (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"
}
]

View 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"
}
]

View File

@@ -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"
}
]

View 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"
}
]

View File

@@ -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"
}
]

View 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)"
}
]

View 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"
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View File

@@ -1,14 +1,14 @@
[
{
"id": "cmh48wo9c0006qq09txnxusql",
"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": "cmkccs50d0000vn2mfuk0d9dw"
"imageId": "cmkp71pub0003vnu9ef60huuv"
},
{
"id": "cmh48wo9c1117rr10txnxusql",
"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": "cmkccyh7t0003vn2mjdrqtuu0"
"imageId": "cmkp70z5g0000vnu9b0aieem8"
}
]

View File

@@ -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"
}
]

View 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"
}
]

View File

@@ -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" }
]

View File

@@ -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
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View 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"
}
]

View 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"
}
]

View 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"
}
]

View 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"
}
]

View File

@@ -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"
}
]

View File

@@ -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"
}
]

View 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;

View File

@@ -1,25 +1,78 @@
// import prisma from "@/lib/prisma";
// // Ganti nama fungsi dan logikanya
// export default async function resolveImageById(
// imageId?: string | null
// ): Promise<string | null> {
// if (!imageId) return null;
// const image = await prisma.fileStorage.findFirst({
// where: {
// id: imageId, // ← cari berdasarkan ID
// category: "image",
// isActive: true,
// deletedAt: null,
// },
// select: { id: true },
// });
// if (!image) {
// console.warn(`⚠️ Image with ID ${imageId} not found`);
// return null;
// }
// return image.id;
// }
import prisma from "@/lib/prisma";
// Ganti nama fungsi dan logikanya
export default async function resolveImageById(
imageId?: string | null
): Promise<string | null> {
/**
* Resolve image ID by checking multiple possible names
* @param imageId - The ID from JSON (could be filename or actual ID)
* @returns The actual database ID or null
*/
export default async function resolveImageById(imageId: string | null): Promise<string | null> {
if (!imageId) return null;
const image = await prisma.fileStorage.findFirst({
where: {
id: imageId, // ← cari berdasarkan ID
category: "image",
isActive: true,
deletedAt: null,
},
select: { id: true },
});
try {
// 1. Coba cari berdasarkan ID langsung
const byId = await prisma.fileStorage.findUnique({
where: { id: imageId },
select: { id: true },
});
if (byId) return byId.id;
if (!image) {
console.warn(`⚠️ Image with ID ${imageId} not found`);
// 2. Coba cari berdasarkan name (exact match)
const byName = await prisma.fileStorage.findUnique({
where: { name: imageId },
select: { id: true },
});
if (byName) return byName.id;
// 3. Coba cari berdasarkan realName
const byRealName = await prisma.fileStorage.findFirst({
where: { realName: imageId },
select: { id: true },
});
if (byRealName) return byRealName.id;
// 4. Coba dengan menambahkan ekstensi .webp
const withWebp = `${imageId.replace(/\.(jpg|jpeg|png)$/i, '')}.webp`;
const byWebp = await prisma.fileStorage.findFirst({
where: {
OR: [
{ name: withWebp },
{ name: { contains: imageId.split('.')[0] } },
],
},
select: { id: true },
});
if (byWebp) return byWebp.id;
console.warn(`⚠️ Image not found for: ${imageId}`);
return null;
} catch (error) {
console.error(`❌ Error resolving image ${imageId}:`, error);
return null;
}
return image.id;
}

45
prisma/safeSeedMany.ts Normal file
View File

@@ -0,0 +1,45 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
/* eslint-disable @typescript-eslint/no-explicit-any */
import { PrismaClient } from "@prisma/client";
import { safeSeedUnique } from "./safeseedUnique";
import cliProgress from 'cli-progress';
type SafeSeedOptions = {
skipUpdate?: boolean;
silent?: boolean; // Opsional: untuk suppress log
};
/**
* Batch upsert with progress logging
*/
export async function safeSeedMany<T extends keyof PrismaClient>(
model: T,
items: Array<{ where: Record<string, any>; data: Record<string, any> }>,
options: SafeSeedOptions = {}
) {
const bar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);
bar.start(items.length, 0);
let success = 0;
let failed = 0;
let skipped = 0;
for (const [index, item] of items.entries()) {
try {
const result = await safeSeedUnique(model, item.where, item.data, {
...options,
silent: true,
});
if (result) success++;
else skipped++;
} catch (err) {
failed++;
}
bar.update(index + 1);
}
bar.stop();
console.log(`${String(model)}: ${success} seeded, ${skipped} skipped, ${failed} failed`);
return { success, skipped, failed };
}

View File

@@ -4,9 +4,16 @@ import { PrismaClient } from "@prisma/client";
type SafeSeedOptions = {
skipUpdate?: boolean;
silent?: boolean; // Opsional: untuk suppress log
};
// prisma/safeseedUnique.ts
/**
* Safely upsert data with error handling
* @param model - Prisma model name
* @param where - Unique identifier(s)
* @param data - Full data object (will be used for create)
* @param options - Additional options
*/
export async function safeSeedUnique<T extends keyof PrismaClient>(
model: T,
where: Record<string, any>,
@@ -14,23 +21,87 @@ export async function safeSeedUnique<T extends keyof PrismaClient>(
options: SafeSeedOptions = {}
) {
const m = prisma[model] as any;
if (!m) throw new Error(`Model ${String(model)} tidak ditemukan`);
if (!m) {
throw new Error(`❌ Model ${String(model)} tidak ditemukan di Prisma Client`);
}
try {
// Pastikan `where` berisi field yang benar-benar unique (misal: `id`)
const result = await m.upsert({
where,
update: options.skipUpdate ? {} : data,
create: data, // ✅ Jangan duplikasi `where` ke `create`
create: data,
});
console.log(`✅ Seed ${String(model)}:`, where);
if (!options.silent) {
console.log(`✅ Seeded ${String(model)}:`, where);
}
return result;
} catch (err) {
console.error(`❌ Gagal seed ${String(model)}:`, where, err);
throw err; // ✅ Rethrow agar seeding berhenti jika kritis
} catch (err: any) {
// Handle specific Prisma errors
if (err.code === "P2002") {
console.warn(`⚠️ Duplicate ${String(model)} (skipped):`, where);
return null;
}
if (err.code === "P2003") {
console.error(`❌ Foreign key constraint failed for ${String(model)}:`, where);
console.error(" Missing relation:", err.meta?.field_name);
throw err;
}
if (err.code === "P2025") {
console.error(`❌ Record not found for ${String(model)}:`, where);
throw err;
}
// Log unexpected errors with full details
console.error(`❌ Failed to seed ${String(model)}:`, where);
console.error(" Error:", err.message);
console.error(" Code:", err.code);
throw err;
}
}
//ini yang bener pertama
// /* eslint-disable @typescript-eslint/no-explicit-any */
// import prisma from "@/lib/prisma";
// import { PrismaClient } from "@prisma/client";
// type SafeSeedOptions = {
// skipUpdate?: boolean;
// };
// // prisma/safeseedUnique.ts
// export async function safeSeedUnique<T extends keyof PrismaClient>(
// model: T,
// where: Record<string, any>,
// data: Record<string, any>,
// options: SafeSeedOptions = {}
// ) {
// const m = prisma[model] as any;
// if (!m) throw new Error(`Model ${String(model)} tidak ditemukan`);
// try {
// // Pastikan `where` berisi field yang benar-benar unique (misal: `id`)
// const result = await m.upsert({
// where,
// update: options.skipUpdate ? {} : data,
// create: data, // ✅ Jangan duplikasi `where` ke `create`
// });
// console.log(`✅ Seed ${String(model)}:`, where);
// return result;
// } catch (err) {
// console.error(`❌ Gagal seed ${String(model)}:`, where, err);
// throw err; // ✅ Rethrow agar seeding berhenti jika kritis
// }
// }
// /* eslint-disable @typescript-eslint/no-explicit-any */
// import { PrismaClient } from "@prisma/client";

View File

@@ -1934,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
@@ -2179,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 {
@@ -2249,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)
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,16 +1,382 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
// prisma/seedAssets.ts
// /* eslint-disable @typescript-eslint/no-unused-vars */
// // 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 fetchWithRetry from "./data/fetchWithRetry";
// const UPLOADS_DIR = path.resolve(process.env.WIBU_UPLOAD_DIR || "uploads");
// // --- Helper: deteksi kategori file ---
// function detectCategory(filename: string): "image" | "document" | "other" {
// const ext = path.extname(filename).toLowerCase();
// if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) return "image";
// if ([".pdf", ".doc", ".docx"].includes(ext)) return "document";
// return "other";
// }
// // --- Helper: recursive walk dir ---
// async function walkDir(
// dir: string,
// fileList: 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; // skip folder sampah
// await walkDir(fullPath, fileList);
// } else {
// if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue; // skip file sampah
// fileList.push(fullPath);
// }
// }
// return fileList;
// }
// 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/03be4043989e4caeb36b/?dl=1";
// const res = await fetchWithRetry(url, 3, 20000);
// // Validasi content-type
// const contentType = res.headers.get("content-type");
// if (!contentType?.includes("zip")) {
// throw new Error(`Invalid content-type (${contentType}). Expected ZIP file`);
// }
// const buffer = Buffer.from(await res.arrayBuffer());
// // Validasi ukuran file
// if (buffer.length < 100) {
// throw new Error("Downloaded ZIP is empty or corrupted");
// }
// // Validasi signature ZIP ("PK")
// if (buffer.toString("utf8", 0, 2) !== "PK") {
// throw new Error("Invalid ZIP signature (PK not found)");
// }
// // 2. Extract zip ke folder tmp
// const extractDir = path.join(process.cwd(), "tmp_assets");
// await fs.rm(extractDir, { recursive: true, force: true });
// await fs.mkdir(extractDir, { recursive: true });
// let zip: AdmZip;
// try {
// zip = new AdmZip(buffer);
// } catch (err) {
// throw new Error("Failed to parse ZIP file (corrupted or invalid)");
// }
// try {
// zip.extractAllTo(extractDir, true);
// } catch (err) {
// throw new Error("Failed to extract ZIP contents");
// }
// // 3. Cari semua file valid (recursive)
// const files = await walkDir(extractDir);
// // 4. Loop tiap file & simpan
// for (const filePath of files) {
// const entryName = path.basename(filePath);
// const category = detectCategory(entryName);
// let finalName = entryName;
// let mimeType = "application/octet-stream";
// let targetPath = "";
// if (category === "image") {
// const fileBaseName = path.parse(entryName).name;
// finalName = `${fileBaseName}.webp`;
// targetPath = path.join(UPLOADS_DIR, "images", finalName);
// await fs.mkdir(path.dirname(targetPath), { recursive: true });
// await sharp(filePath).webp({ quality: 80 }).toFile(targetPath);
// mimeType = "image/webp";
// } else if (category === "document") {
// targetPath = path.join(UPLOADS_DIR, "documents", entryName);
// await fs.mkdir(path.dirname(targetPath), { recursive: true });
// await fs.copyFile(filePath, targetPath);
// mimeType = "application/pdf";
// } else {
// targetPath = path.join(UPLOADS_DIR, "other", entryName);
// await fs.mkdir(path.dirname(targetPath), { recursive: true });
// await fs.copyFile(filePath, targetPath);
// }
// const existing = await prisma.fileStorage.findUnique({
// where: { name: finalName },
// });
// if (existing) {
// // Restore kalau soft deleted
// await prisma.fileStorage.update({
// where: { name: finalName },
// data: {
// path: targetPath,
// realName: entryName,
// mimeType,
// link: `/uploads/${category}/${finalName}`,
// category,
// deletedAt: null,
// isActive: true,
// },
// });
// console.log(`♻️ restored: ${category}/${finalName}`);
// } else {
// await prisma.fileStorage.create({
// data: {
// name: finalName,
// realName: entryName,
// path: targetPath,
// mimeType,
// link: `/uploads/${category}/${finalName}`,
// category,
// },
// });
// console.log(`📂 created: ${category}/${finalName}`);
// }
// console.log(`📂 saved: ${category}/${finalName}`);
// }
// // 6. Cleanup
// await fs.rm(extractDir, { recursive: true, force: true });
// console.log("✅ Selesai seed assets!");
// console.log("DB URL (asset):", process.env.DATABASE_URL);
// }
// // --- Auto run kalau dipanggil langsung ---
// if (import.meta.main) {
// seedAssets()
// .catch((err) => {
// console.error("❌ Error seeding assets:", err);
// process.exit(1);
// })
// .finally(async () => {
// 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();
// // });
// // }
import prisma from "@/lib/prisma";
import AdmZip from "adm-zip";
import fs from "fs/promises";
import path from "path";
import sharp from "sharp";
import fetchWithRetry from "./data/fetchWithRetry";
import { constants } from "fs";
// ✅ Gunakan env variable dengan fallback
const UPLOADS_DIR = path.join(process.cwd(), process.env.WIBU_UPLOAD_DIR || "uploads");
const UPLOADS_DIR =
process.env.WIBU_UPLOAD_DIR || path.join(process.cwd(), "uploads");
// --- Helper: deteksi kategori file ---
function detectCategory(filename: string): "image" | "document" | "other" {
const ext = path.extname(filename).toLowerCase();
if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) return "image";
@@ -18,77 +384,103 @@ function detectCategory(filename: string): "image" | "document" | "other" {
return "other";
}
// --- Helper: recursive walk dir ---
async function walkDir(
dir: string,
fileList: string[] = []
fileList: 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; // skip folder sampah
if (entry.name === "__MACOSX") continue;
await walkDir(fullPath, fileList);
} else {
if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue; // skip file sampah
if (entry.name.startsWith(".") || entry.name === ".DS_Store") continue;
fileList.push(fullPath);
}
}
return fileList;
}
export default async function seedAssets() {
console.log("🚀 Seeding assets...");
console.log("📁 Upload dir:", UPLOADS_DIR);
try {
await fs.access(UPLOADS_DIR, fs.constants.W_OK);
} catch (err) {
console.error("❌ Upload directory is not writable:", UPLOADS_DIR);
throw new Error(
`UPLOADS_DIR not writable: ${UPLOADS_DIR}. Check Docker volume or permissions`
);
}
// ✅ Pastikan folder exist
await fs.mkdir(UPLOADS_DIR, { recursive: true });
try {
await fs.access(UPLOADS_DIR, constants.W_OK);
} catch {
throw new Error(
`UPLOADS_DIR not writable: ${UPLOADS_DIR}. Check Docker volume or permissions`
);
}
await fs.mkdir(path.join(UPLOADS_DIR, "images"), { recursive: true });
await fs.mkdir(path.join(UPLOADS_DIR, "documents"), { recursive: true });
await fs.mkdir(path.join(UPLOADS_DIR, "other"), { recursive: true });
// 1. Download zip
const url =
"https://cld-dkr-makuro-seafile.wibudev.com/f/88293b915cf34b939819/?dl=1";
const res = await fetchWithRetry(url, 3, 20000);
"https://cld-dkr-makuro-seafile.wibudev.com/f/8e9e42e9f3e94c80919e/?dl=1";
// Validasi content-type
const contentType = res.headers.get("content-type");
if (!contentType?.includes("zip")) {
throw new Error(`Invalid content-type (${contentType}). Expected ZIP file`);
let buffer: Buffer;
try {
console.log("⬇️ Downloading ZIP from:", url);
const res = await fetchWithRetry(url, 3, 20000);
const contentType = res.headers.get("content-type");
if (
!contentType?.includes("zip") &&
!contentType?.includes("octet-stream")
) {
throw new Error(
`Invalid content-type (${contentType}). Expected ZIP file`,
);
}
buffer = Buffer.from(await res.arrayBuffer());
if (buffer.length < 100) {
throw new Error("Downloaded ZIP is empty or corrupted");
}
if (buffer.toString("utf8", 0, 2) !== "PK") {
throw new Error("Invalid ZIP signature (PK not found)");
}
console.log(`✅ Downloaded ${(buffer.length / 1024 / 1024).toFixed(2)} MB`);
} catch (err) {
console.error("❌ Failed to download ZIP:", err);
throw err;
}
const buffer = Buffer.from(await res.arrayBuffer());
// Validasi ukuran file
if (buffer.length < 100) {
throw new Error("Downloaded ZIP is empty or corrupted");
}
// Validasi signature ZIP ("PK")
if (buffer.toString("utf8", 0, 2) !== "PK") {
throw new Error("Invalid ZIP signature (PK not found)");
}
// 2. Extract zip ke folder tmp
// Extract ZIP
const extractDir = path.join(process.cwd(), "tmp_assets");
await fs.rm(extractDir, { recursive: true, force: true });
await fs.mkdir(extractDir, { recursive: true });
let zip: AdmZip;
try {
zip = new AdmZip(buffer);
} catch (err) {
throw new Error("Failed to parse ZIP file (corrupted or invalid)");
}
try {
zip.extractAllTo(extractDir, true);
console.log("✅ ZIP extracted successfully");
} catch (err) {
throw new Error("Failed to extract ZIP contents");
console.error("Failed to extract ZIP:", err);
throw err;
}
// 3. Cari semua file valid (recursive)
const files = await walkDir(extractDir);
console.log(`📦 Found ${files.length} files to process`);
// 4. Loop tiap file & simpan
// Process files
for (const filePath of files) {
const entryName = path.basename(filePath);
const category = detectCategory(entryName);
@@ -97,71 +489,60 @@ export default async function seedAssets() {
let mimeType = "application/octet-stream";
let targetPath = "";
if (category === "image") {
const fileBaseName = path.parse(entryName).name;
finalName = `${fileBaseName}.webp`;
targetPath = path.join(UPLOADS_DIR, "images", finalName);
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await sharp(filePath).webp({ quality: 80 }).toFile(targetPath);
mimeType = "image/webp";
} else if (category === "document") {
targetPath = path.join(UPLOADS_DIR, "documents", entryName);
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await fs.copyFile(filePath, targetPath);
mimeType = "application/pdf";
} else {
targetPath = path.join(UPLOADS_DIR, "other", entryName);
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await fs.copyFile(filePath, targetPath);
}
try {
if (category === "image") {
const fileBaseName = path.parse(entryName).name;
finalName = `${fileBaseName}.webp`;
targetPath = path.join(UPLOADS_DIR, "images", finalName);
const existing = await prisma.fileStorage.findUnique({
where: { name: finalName },
});
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await sharp(filePath).webp({ quality: 80 }).toFile(targetPath);
mimeType = "image/webp";
} else if (category === "document") {
targetPath = path.join(UPLOADS_DIR, "documents", entryName);
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await fs.copyFile(filePath, targetPath);
mimeType = "application/pdf";
} else {
targetPath = path.join(UPLOADS_DIR, "other", entryName);
await fs.mkdir(path.dirname(targetPath), { recursive: true });
await fs.copyFile(filePath, targetPath);
}
if (existing) {
// Restore kalau soft deleted
await prisma.fileStorage.update({
// ✅ Upsert ke database
await prisma.fileStorage.upsert({
where: { name: finalName },
data: {
path: targetPath,
update: {
path: path.dirname(targetPath),
realName: entryName,
mimeType,
link: `/uploads/${category}/${finalName}`,
link: `/api/fileStorage/findUnique/${finalName}`,
category,
deletedAt: null,
isActive: true,
},
});
console.log(`♻️ restored: ${category}/${finalName}`);
} else {
await prisma.fileStorage.create({
data: {
create: {
name: finalName,
realName: entryName,
path: targetPath,
path: path.dirname(targetPath),
mimeType,
link: `/uploads/${category}/${finalName}`,
link: `/api/fileStorage/findUnique/${finalName}`,
category,
},
});
console.log(`📂 created: ${category}/${finalName}`);
console.log(`✅ Processed: ${category}/${finalName}`);
} catch (err) {
console.error(`❌ Failed to process ${entryName}`, err);
throw err; // ⛔ penting
}
console.log(`📂 saved: ${category}/${finalName}`);
}
// 6. Cleanup
// Cleanup
await fs.rm(extractDir, { recursive: true, force: true });
console.log("✅ Selesai seed assets!");
console.log("DB URL (asset):", process.env.DATABASE_URL);
console.log("✅ Asset seeding completed!");
}
// --- Auto run kalau dipanggil langsung ---
if (import.meta.main) {
seedAssets()
.catch((err) => {

View File

@@ -41,6 +41,7 @@ import {
IconMessageReport,
IconUsers,
IconQuestionMark,
IconBook,
} from '@tabler/icons-react'
/* =======================
@@ -90,6 +91,7 @@ export type IconKey =
| 'informasi'
| 'pengaduan'
| 'layananPublik'
| 'book'
/* =======================
Icon Map
@@ -138,6 +140,7 @@ const iconMap: Record<IconKey, React.FC<any>> = {
informasi: IconInfoCircle,
pengaduan: IconMessageReport,
layananPublik: IconUsers,
book: IconBook
}
/* =======================

View File

@@ -5,6 +5,7 @@ import { Box, rem, Select } from '@mantine/core';
import {
IconAlertTriangle,
IconAmbulance,
IconBook,
IconBuilding,
IconBuildingCommunity,
IconCash,
@@ -85,6 +86,7 @@ const iconMap = {
informasi: { label: 'Informasi', icon: IconInfoCircle },
pengaduan: { label: 'Pengaduan', icon: IconMessageReport },
layananPublik: { label: 'Layanan Publik', icon: IconUsers },
book: { label: 'Buku', icon: IconBook }
};

View File

@@ -37,6 +37,7 @@ import {
IconShield,
IconStethoscope,
IconUsers,
IconBook,
} from '@tabler/icons-react';
const iconMap = {
@@ -83,6 +84,7 @@ const iconMap = {
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;

View File

@@ -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: {

View File

@@ -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

View File

@@ -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>
);
}

View File

@@ -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

View File

@@ -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

View File

@@ -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">

View File

@@ -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

View File

@@ -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>
);
}

View File

@@ -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>

View File

@@ -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>
);
}

View File

@@ -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}

View File

@@ -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>
);
}

View File

@@ -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>
);
}

View File

@@ -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>

View File

@@ -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>
)
}

View File

@@ -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);

View File

@@ -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 (

View File

@@ -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) {

View File

@@ -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>

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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,
}))}

View File

@@ -0,0 +1,7 @@
export default function serializeBigInt<T>(data: T): T {
return JSON.parse(
JSON.stringify(data, (_, value) =>
typeof value === "bigint" ? value.toString() : value
)
);
}

View File

@@ -8,7 +8,8 @@ async function pengajarFindMany(context: Context) {
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
const search = (context.query.search as string) || "";
const jenjangPendidikanName = (context.query.jenjangPendidikanId as string) || "";
const jenjangPendidikanName =
(context.query.jenjangPendidikanId as string) || "";
const where: any = { isActive: true };
@@ -19,17 +20,17 @@ async function pengajarFindMany(context: Context) {
where: {
nama: {
equals: jenjangPendidikanName,
mode: 'insensitive'
mode: "insensitive",
},
isActive: true
isActive: true,
},
orderBy: { nama: 'desc' },
orderBy: { nama: "desc" },
});
if (jenjangPendidikan) {
where.lembaga = {
...where.lembaga,
jenjangId: jenjangPendidikan.id
jenjangId: jenjangPendidikan.id,
};
} else {
// Jika tidak ditemukan, return data kosong
@@ -48,8 +49,8 @@ async function pengajarFindMany(context: Context) {
// Add search condition if search term exists
if (search) {
where.OR = [
{ nama: { contains: search, mode: 'insensitive' } },
{ lembaga: { nama: { contains: search, mode: 'insensitive' } } }
{ nama: { contains: search, mode: "insensitive" } },
{ lembaga: { nama: { contains: search, mode: "insensitive" } } },
];
}
@@ -59,17 +60,15 @@ async function pengajarFindMany(context: Context) {
include: {
lembaga: {
include: {
jenjangPendidikan: true
}
}
jenjangPendidikan: true,
},
},
},
skip,
take: limit,
orderBy: { nama: 'asc' },
orderBy: [{ nama: "asc" }, { lembaga: { nama: "asc" } }],
}),
prisma.pengajar.count({
where,
})
prisma.pengajar.count({ where }),
]);
return {
@@ -85,8 +84,8 @@ async function pengajarFindMany(context: Context) {
console.error("Error in pengajarFindMany:", error);
return {
success: false,
message: `Failed fetch pengajar: ${error instanceof Error ? error.message : 'Unknown error'}`,
message: `Failed fetch pengajar: ${error instanceof Error ? error.message : "Unknown error"}`,
};
}
}
export default pengajarFindMany;
export default pengajarFindMany;

View File

@@ -8,7 +8,8 @@ async function siswaFindMany(context: Context) {
const limit = Number(context.query.limit) || 10;
const skip = (page - 1) * limit;
const search = (context.query.search as string) || "";
const jenjangPendidikanName = (context.query.jenjangPendidikanName as string) || "";
const jenjangPendidikanName =
(context.query.jenjangPendidikanName as string) || "";
// Buat where clause
const where: any = { isActive: true };
@@ -20,16 +21,16 @@ async function siswaFindMany(context: Context) {
where: {
nama: {
equals: jenjangPendidikanName,
mode: 'insensitive'
mode: "insensitive",
},
isActive: true,
}
},
});
if (jenjangPendidikan) {
where.lembaga = {
...where.lembaga,
jenjangId: jenjangPendidikan.id
jenjangId: jenjangPendidikan.id,
};
} else {
// Jika tidak ditemukan, return data kosong
@@ -48,8 +49,8 @@ async function siswaFindMany(context: Context) {
// Add search functionality
if (search) {
where.OR = [
{ nama: { contains: search, mode: 'insensitive' } },
{ lembaga: { nama: { contains: search, mode: 'insensitive' } } }
{ nama: { contains: search, mode: "insensitive" } },
{ lembaga: { nama: { contains: search, mode: "insensitive" } } },
];
}
@@ -65,15 +66,13 @@ async function siswaFindMany(context: Context) {
},
skip,
take: limit,
orderBy: { nama: 'asc' },
orderBy: [{ nama: "asc" }, { lembaga: { nama: "asc" } }],
}),
prisma.siswa.count({
where,
})
prisma.siswa.count({ where }),
]);
console.log('Fetched siswa data count:', data.length);
console.log('Total siswa count:', total);
console.log("Fetched siswa data count:", data.length);
console.log("Total siswa count:", total);
return {
success: true,
@@ -88,7 +87,7 @@ async function siswaFindMany(context: Context) {
console.error("Error in siswaFindMany:", error);
return {
success: false,
message: `Failed fetch siswa: ${error instanceof Error ? error.message : 'Unknown error'}`,
message: `Failed fetch siswa: ${error instanceof Error ? error.message : "Unknown error"}`,
};
}
}

View File

@@ -0,0 +1,43 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import prisma from "@/lib/prisma";
import { Context } from "elysia";
export default async function kategoriBukuFindManyAll(context: Context) {
const search = (context.query.search as string) || "";
const isActiveParam = context.query.isActive;
// Buat where clause dinamis
const where: any = {};
if (isActiveParam !== undefined) {
where.isActive = isActiveParam === "true";
}
if (search) {
where.OR = [
{ name: { contains: search, mode: "insensitive" } },
];
}
try {
const data = await prisma.kategoriBuku.findMany({
where,
orderBy: { name: "asc" },
});
return {
success: true,
message: "Success fetch all kategori buku (non-paginated)",
total: data.length,
data,
};
} catch (error) {
console.error("Find many all error:", error);
return {
success: false,
message: "Failed fetch all kategori buku",
total: 0,
data: [],
};
}
}

View File

@@ -4,6 +4,7 @@ import kategoriBukuDelete from "./del";
import kategoriBukuFindMany from "./findMany";
import kategoriBukuFindUnique from "./findUnique";
import kategoriBukuUpdate from "./updt";
import kategoriBukuFindManyAll from "./findManyAll";
const KategoriBuku = new Elysia({
prefix: "/kategoribuku",
@@ -17,6 +18,7 @@ const KategoriBuku = new Elysia({
})
.get("/findMany", kategoriBukuFindMany)
.get("/findManyAll", kategoriBukuFindManyAll)
.get("/:id", async (context) => {
const response = await kategoriBukuFindUnique(
new Request(context.request)

View File

@@ -65,7 +65,7 @@ const Utils = new Elysia({
}).get("/version", async () => {
const packageJson = await fs.readFile(
path.join(ROOT, "package.json"),
"utf-8"
"utf-8",
);
const version = JSON.parse(packageJson).version;
return { version };
@@ -78,9 +78,9 @@ const ApiServer = new Elysia()
.use(swagger({ path: "/api/docs" }))
.use(
staticPlugin({
assets: process.env.WIBU_UPLOAD_DIR,
assets: UPLOAD_DIR,
prefix: "/uploads",
})
}),
)
.use(cors(corsConfig))
.use(Utils)
@@ -127,9 +127,9 @@ const ApiServer = new Elysia()
query: t.Optional(
t.Object({
size: t.Optional(t.Number()),
})
}),
),
}
},
)
.delete(
"/img/:name",
@@ -143,7 +143,7 @@ const ApiServer = new Elysia()
params: t.Object({
name: t.String(),
}),
}
},
)
.get(
"/imgs",
@@ -161,9 +161,9 @@ const ApiServer = new Elysia()
page: t.Number({ default: 1 }),
count: t.Number({ default: 10 }),
search: t.String({ default: "" }),
})
}),
),
}
},
)
.post(
"/upl-img",
@@ -176,7 +176,7 @@ const ApiServer = new Elysia()
title: t.String(),
files: t.Files({ multiple: true }),
}),
}
},
)
.post(
"/upl-img-single",
@@ -192,7 +192,7 @@ const ApiServer = new Elysia()
name: t.String(),
file: t.File(),
}),
}
},
)
.post(
"/upl-csv-single",
@@ -204,7 +204,7 @@ const ApiServer = new Elysia()
name: t.String(),
file: t.File(),
}),
}
},
)
.post(
"/upl-csv",
@@ -215,8 +215,8 @@ const ApiServer = new Elysia()
body: t.Object({
files: t.Files(),
}),
}
)
},
),
);
export const GET = ApiServer.handle;

View File

@@ -1,7 +1,9 @@
'use client';
import stateGallery from '@/app/admin/(dashboard)/_state/desa/gallery';
import colors from '@/con/colors';
import {
ActionIcon,
Alert,
Box,
Button,
@@ -15,12 +17,10 @@ import {
Title,
} from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { IconArrowBack, IconInfoCircle, IconVideo } from '@tabler/icons-react';
import { IconArrowBack, IconArrowLeft, IconInfoCircle, IconVideo } from '@tabler/icons-react';
import { useParams, useRouter } from 'next/navigation';
import { useState } from 'react';
import { useProxy } from 'valtio/utils';
import stateGallery from '@/app/admin/(dashboard)/_state/desa/gallery';
import BackButton from '../../../layanan/_com/BackButto';
function convertToEmbedUrl(youtubeUrl: string): string {
@@ -95,7 +95,9 @@ export default function DetailVideoUser() {
<Box py="xl" px={{ base: 'md', md: 100 }}>
{/* Tombol Kembali */}
<Box>
<BackButton />
<ActionIcon bg={colors["blue-button"]} onClick={() => router.push('/darmasaba/desa/galery/video')}>
<IconArrowLeft />
</ActionIcon>
</Box>
{/* Header - Dijadikan Title */}

View File

@@ -40,6 +40,13 @@ function PengaduanMasyarakat() {
};
};
const resetAll = () => {
resetForm();
setFile(null);
setPreviewImage(null);
};
const handleSubmit = async () => {
if (!file) {
return toast.error("Silahkan pilih file gambar terlebih dahulu")
@@ -64,7 +71,7 @@ function PengaduanMasyarakat() {
const success = await state.pengaduanMasyarakat.create.create()
if (success) {
resetForm()
resetAll()
close()
}
} catch (error) {
@@ -190,7 +197,7 @@ function PengaduanMasyarakat() {
</Group>
</Dropzone>
{previewImage ? (
<Image alt="" src={previewImage} w={200} h={200} loading="lazy"/>
<Image alt="" src={previewImage} w={200} h={200} loading="lazy" />
) : (
<Center w={200} h={200} bg={"gray"}>
<IconImageInPicture />

View File

@@ -124,7 +124,6 @@ function ListPencegahanKriminalitas({ search }: { search: string }) {
)}
</Stack>
{totalPages > 1 && (
<Center>
<Pagination
value={page}
@@ -138,7 +137,6 @@ function ListPencegahanKriminalitas({ search }: { search: string }) {
radius="lg"
/>
</Center>
)}
</Box>
);
}

View File

@@ -179,7 +179,6 @@ export default function Page() {
))}
</SimpleGrid>
{totalPages > 1 && (
<Center>
<Pagination
value={page}
@@ -191,7 +190,6 @@ export default function Page() {
mt="md"
/>
</Center>
)}
<Stack gap="sm">
<Flex align="center" gap="xs">

View File

@@ -225,7 +225,6 @@ export default function Page() {
))}
</SimpleGrid>
{totalPages > 1 && (
<Center>
<Pagination
value={page}
@@ -242,7 +241,6 @@ export default function Page() {
}}
/>
</Center>
)}
</Box>
<Box px={{ base: "md", md: 100 }} py="xl">

View File

@@ -127,7 +127,6 @@ function Page() {
)}
</Box>
{totalPages > 1 && (
<Center>
<Pagination
value={page}
@@ -138,7 +137,6 @@ function Page() {
mt="lg"
/>
</Center>
)}
</Stack>
);
}

View File

@@ -3,7 +3,7 @@ import dataLingkunganDesaState from '@/app/admin/(dashboard)/_state/lingkungan/d
import colors from '@/con/colors';
import { Badge, Box, Center, Group, Pagination, Paper, SimpleGrid, Skeleton, Stack, Text, TextInput, Tooltip } from '@mantine/core';
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { Icon, IconChartLine, IconChristmasTreeFilled, IconClipboardTextFilled, IconDroplet, IconHome, IconHomeEco, IconLeaf, IconRecycle, IconScale, IconSearch, IconShieldFilled, IconTent, IconTrashFilled, IconTree, IconTrendingUp, IconTrophy, IconTruckFilled } from '@tabler/icons-react';
import { Icon, IconAlertTriangle, IconAmbulance, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard, IconDroplet, IconFileText, IconFiretruck, IconFirstAidKit, IconHome, IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconRecycle, IconRun, IconScale, IconSchool, IconSearch, IconShield, IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrash, IconTree, IconTrendingUp, IconTrophy, IconTruck, IconUsers } from '@tabler/icons-react';
import React, { useState } from 'react';
import { useProxy } from 'valtio/utils';
import BackButton from '../../desa/layanan/_com/BackButto';
@@ -21,24 +21,51 @@ function Page() {
} = state
const iconMap: Record<string, Icon> = {
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
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,
};
// ===== 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(() => {
load(page, 6, debouncedSearch)

View File

@@ -3,11 +3,11 @@ import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pe
import colors from '@/con/colors';
import { Box, Center, Flex, Group, Pagination, Paper, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core';
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { Icon, IconChartLine, IconClipboardTextFilled, IconLeaf, IconRecycle, IconRoute, IconScale, IconSearch, IconTent, IconTrashFilled, IconTrophy, IconTruckFilled } from '@tabler/icons-react';
import { Icon, IconAlertTriangle, IconAmbulance, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard, IconDroplet, IconFileText, IconFiretruck, IconFirstAidKit, IconHome, IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconRecycle, IconRoute, IconRun, IconScale, IconSchool, IconSearch, IconShield, IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrash, IconTree, IconTrendingUp, IconTrophy, IconTruck, IconUsers } from '@tabler/icons-react';
import dynamic from 'next/dynamic';
import React, { useState } from 'react';
import { useProxy } from 'valtio/utils';
import BackButton from '../../desa/layanan/_com/BackButto';
import dynamic from 'next/dynamic';
// Dynamically import the map component to avoid SSR issues with Leaflet
const LeafletMultiMarkerMap = dynamic(
@@ -42,16 +42,51 @@ function Page() {
}, [page, debouncedSearch])
const iconMap: Record<string, Icon> = {
ekowisata: IconLeaf,
kompetisi: IconTrophy,
wisata: IconTent,
ekonomi: IconChartLine,
sampah: IconRecycle,
truck: IconTruckFilled,
scale: IconScale,
clipboard: IconClipboardTextFilled,
trash: IconTrashFilled,
};
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,
// ===== 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
};
if (state.findMany.loading || !data) {
return (

View File

@@ -4,10 +4,21 @@ import programPenghijauanState from '@/app/admin/(dashboard)/_state/lingkungan/p
import { Box, Button, Paper, Skeleton, Stack, Text, ThemeIcon } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import {
IconArrowLeft, IconChartLine, IconChristmasTreeFilled, IconClipboard,
IconHomeEco, IconLeaf, IconRecycle, IconScale,
IconShieldFilled, IconTent, IconTrash,
IconTrendingUp, IconTrophy, IconTruck
IconAlertTriangle,
IconAmbulance,
IconArrowLeft, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard,
IconDroplet,
IconFileText,
IconFiretruck,
IconFirstAidKit,
IconHome,
IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconRecycle, IconRun, IconScale,
IconSchool,
IconShield,
IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrash,
IconTree,
IconTrendingUp, IconTrophy, IconTruck,
IconUsers
} from '@tabler/icons-react';
import { useParams, useRouter } from 'next/navigation';
import React from 'react';
@@ -32,6 +43,37 @@ function Page() {
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(() => {

View File

@@ -4,11 +4,11 @@ import programPenghijauanState from '@/app/admin/(dashboard)/_state/lingkungan/p
import colors from '@/con/colors';
import { Box, Center, Group, Pagination, Paper, SimpleGrid, Skeleton, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core';
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { IconChartLine, IconChristmasTreeFilled, IconClipboardTextFilled, IconHomeEco, IconLeaf, IconRecycle, IconScale, IconSearch, IconShieldFilled, IconTent, IconTrashFilled, IconTrendingUp, IconTrophy, IconTruckFilled } from '@tabler/icons-react';
import { IconAlertTriangle, IconAmbulance, IconBook, IconBuilding, IconBuildingCommunity, IconCash, IconChartLine, IconChristmasTreeFilled, IconClipboard, IconDroplet, IconFileText, IconFiretruck, IconFirstAidKit, IconHome, IconHomeEco, IconHospital, IconInfoCircle, IconLeaf, IconLifebuoy, IconMessageReport, IconPhoneCall, IconRecycle, IconRun, IconScale, IconSchool, IconSearch, IconShield, IconShieldFilled, IconShoppingCart, IconStethoscope, IconTent, IconTrash, IconTree, IconTrendingUp, IconTrophy, IconTruck, IconUsers } from '@tabler/icons-react';
import { useTransitionRouter } from 'next-view-transitions';
import React, { useState } from 'react';
import { useProxy } from 'valtio/utils';
import BackButton from '../../desa/layanan/_com/BackButto';
import { useTransitionRouter } from 'next-view-transitions';
function Page() {
const state = useProxy(programPenghijauanState);
@@ -22,20 +22,51 @@ function Page() {
}, [page, debouncedSearch]);
const iconMap: Record<string, 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,
};
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,
// ===== 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
};
if (loading || !data) {
return (

View File

@@ -173,9 +173,9 @@ function Content({ kategoriBuku }: { kategoriBuku: string }) {
</Box>
<Center mt="lg">
<Pagination
total={totalPages}
value={currentPage}
onChange={handlePageChange}
total={totalPages}
color="blue"
radius="md"
/>

View File

@@ -46,7 +46,7 @@ export default function LayoutTabs({
// 🟦 Ambil kategori buku saat mount
useEffect(() => {
perpustakaanDigitalState.kategoriBuku.findMany.load();
perpustakaanDigitalState.kategoriBuku.findManyAll.load();
}, []);
useEffect(() => {
@@ -86,7 +86,7 @@ export default function LayoutTabs({
// 🟩 Tabs dinamis berdasarkan kategori dari state
const kategoriTabs =
snap.kategoriBuku.findMany.data?.map((item) => ({
snap.kategoriBuku.findManyAll.data?.map((item) => ({
label: item.name,
value: item.name.toLowerCase().replace(/\s+/g, '-'),
href: `/darmasaba/pendidikan/perpustakaan-digital/${encodeURIComponent(item.name.toLowerCase().replace(/\s+/g, '-'))}`,

51
xx.ts
View File

@@ -1,4 +1,51 @@
import 'colors'
// // import {v4} from 'uuid'
// import prisma from "@/lib/prisma";
console.log("halo".blue)
// // console.log(v4())
// const listNama = [
// { name: "Adi Pratama", phone: "081234567801" },
// { name: "Budi Santoso", phone: "081234567802" },
// { name: "Citra Lestari", phone: "081234567803" },
// { name: "Dewi Anggraini", phone: "081234567804" },
// { name: "Eka Putra", phone: "081234567805" },
// { name: "Fajar Nugroho", phone: "081234567806" },
// { name: "Gita Maharani", phone: "081234567807" },
// { name: "Hadi Wijaya", phone: "081234567808" },
// { name: "Indah Purnama", phone: "081234567809" },
// { name: "Joko Susilo", phone: "081234567810" },
// { name: "Kartika Sari", phone: "081234567811" },
// { name: "Lukman Hakim", phone: "081234567812" },
// { name: "Maya Fitriani", phone: "081234567813" },
// { name: "Nanda Saputra", phone: "081234567814" },
// { name: "Oka Mahendra", phone: "081234567815" },
// { name: "Putri Ayu", phone: "081234567816" },
// { name: "Rizky Kurniawan", phone: "081234567817" },
// { name: "Sari Wulandari", phone: "081234567818" },
// { name: "Taufik Hidayat", phone: "081234567819" },
// { name: "Yoga Prasetya", phone: "081234567820" },
// ];
// (async () => {
// for (const n of listNama) {
// await prisma.percobaan.upsert({
// create: {
// nama: n.name,
// phone: n.phone,
// },
// update: {
// nama: n.name,
// },
// where: {
// phone: n.phone,
// },
// });
// }
// })()
// .then(() => {
// console.log("success");
// })
// .catch((e) => {
// console.log(e);
// });