From dbd56a1493c32eec73b1852f54634b6f0e51fbff Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 29 Sep 2025 14:06:04 +0800 Subject: [PATCH 01/56] Fix All Text Input User & Admin, fix deskripsi detail break word --- .gitignore | 3 + bun.lockb | Bin 350235 -> 355236 bytes package.json | 4 + prisma/data/user/roles.json | 18 +-- prisma/data/user/users.json | 53 ++++---- prisma/safeseedUnique.ts | 30 +++++ prisma/seed.ts | 48 +++---- prisma/seed_assets.ts | 118 ++++++++++++++++++ .../desa/berita/kategori-berita/[id]/page.tsx | 2 +- .../berita/kategori-berita/create/page.tsx | 7 +- .../berita/list-berita/[id]/edit/page.tsx | 47 ++++--- .../desa/berita/list-berita/[id]/page.tsx | 2 +- .../desa/berita/list-berita/create/page.tsx | 7 +- .../desa/gallery/video/[id]/edit/page.tsx | 4 +- .../desa/gallery/video/[id]/page.tsx | 1 + .../desa/gallery/video/create/page.tsx | 4 +- .../ajukan_permohonan/[id]/edit/page.tsx | 8 +- .../layanan/ajukan_permohonan/[id]/page.tsx | 20 +-- .../edit/page.tsx | 2 +- .../pelayanan_penduduk_non_permanent/page.tsx | 1 + .../edit/page.tsx | 4 +- .../pelayanan_perizinan_berusaha/page.tsx | 1 + .../[id]/edit/page.tsx | 2 +- .../pelayanan_surat_keterangan/[id]/page.tsx | 1 + .../create/page.tsx | 4 +- .../pelayanan_surat_keterangan/page.tsx | 1 + .../[id]/edit/page.tsx | 4 +- .../[id]/page.tsx | 2 + .../create/page.tsx | 19 +-- .../pelayanan_telunjuk_sakti_desa/page.tsx | 2 +- .../desa/penghargaan/[id]/edit/page.tsx | 4 +- .../desa/penghargaan/[id]/page.tsx | 1 + .../desa/penghargaan/create/page.tsx | 8 +- .../(dashboard)/desa/penghargaan/page.tsx | 1 + .../kategori-pengumuman/[id]/page.tsx | 9 +- .../kategori-pengumuman/create/page.tsx | 7 +- .../list-pengumuman/[id]/edit/page.tsx | 4 +- .../pengumuman/list-pengumuman/[id]/page.tsx | 3 +- .../list-pengumuman/create/page.tsx | 10 +- .../potensi/kategori-potensi/[id]/page.tsx | 2 +- .../potensi/kategori-potensi/create/page.tsx | 7 +- .../potensi/list-potensi/[id]/edit/page.tsx | 4 +- .../desa/potensi/list-potensi/[id]/page.tsx | 3 +- .../desa/potensi/list-potensi/create/page.tsx | 10 +- .../desa/potensi/list-potensi/page.tsx | 1 + .../profile-desa/[id]/lambang_desa/page.tsx | 2 +- .../profile-desa/[id]/maskot_desa/page.tsx | 2 +- .../profile-desa/[id]/sejarah_desa/page.tsx | 2 +- .../desa/profile/profile-desa/page.tsx | 10 +- .../[id]/edit/page.tsx | 6 +- .../create/page.tsx | 12 +- .../desa/profile/profile-perbekel/page.tsx | 8 +- .../apbdesa/[id]/edit/page.tsx | 2 +- .../apbdesa/create/page.tsx | 2 +- .../belanja/[id]/page.tsx | 4 +- .../belanja/create/page.tsx | 4 +- .../pembiayaan/[id]/page.tsx | 4 +- .../pembiayaan/create/page.tsx | 4 +- .../pendapatan/[id]/page.tsx | 4 +- .../pendapatan/create/page.tsx | 19 +-- .../ekonomi/demografi-pekerjaan/[id]/page.tsx | 6 +- .../demografi-pekerjaan/create/page.tsx | 6 +- .../jumlah-penduduk-miskin/[id]/page.tsx | 4 +- .../jumlah-penduduk-miskin/create/page.tsx | 4 +- .../[id]/page.tsx | 10 +- .../create/page.tsx | 10 +- .../[id]/page.tsx | 8 +- .../create/page.tsx | 8 +- .../jumlah-pengangguran/[id]/edit/page.tsx | 9 +- .../lowongan-kerja-lokal/[id]/edit/page.tsx | 10 +- .../lowongan-kerja-lokal/[id]/page.tsx | 4 +- .../lowongan-kerja-lokal/create/page.tsx | 10 +- .../pasar-desa/kategori-produk/[id]/page.tsx | 2 +- .../kategori-produk/create/page.tsx | 2 +- .../produk-pasar-desa/[id]/edit/page.tsx | 8 +- .../produk-pasar-desa/create/page.tsx | 8 +- .../program-kemiskinan/[id]/edit/page.tsx | 6 +- .../ekonomi/program-kemiskinan/[id]/page.tsx | 1 + .../program-kemiskinan/create/page.tsx | 6 +- .../sektor-unggulan-desa/[id]/edit/page.tsx | 4 +- .../sektor-unggulan-desa/[id]/page.tsx | 2 +- .../sektor-unggulan-desa/create/page.tsx | 4 +- .../hubungan-organisasi/[id]/page.tsx | 2 +- .../hubungan-organisasi/create/page.tsx | 2 +- .../pegawai/[id]/edit/page.tsx | 12 +- .../pegawai/[id]/page.tsx | 4 +- .../pegawai/create/page.tsx | 14 +-- .../posisi-organisasi/[id]/page.tsx | 4 +- .../posisi-organisasi/create/page.tsx | 4 +- .../inovasi/ajukan-ide-inovatif/[id]/page.tsx | 6 +- .../[id]/edit/page.tsx | 2 +- .../desa-digital-smart-village/[id]/page.tsx | 2 +- .../create/page.tsx | 2 +- .../[id]/edit/page.tsx | 2 +- .../info-teknologi-tepat-guna/[id]/page.tsx | 1 + .../info-teknologi-tepat-guna/create/page.tsx | 2 +- .../[id]/edit/page.tsx | 8 +- .../list-kolaborasi-inovasi/[id]/page.tsx | 4 +- .../list-kolaborasi-inovasi/create/page.tsx | 4 +- .../mitra-kolaborasi/[id]/page.tsx | 2 +- .../mitra-kolaborasi/create/page.tsx | 2 +- .../jenis-layanan/[id]/edit/page.tsx | 2 +- .../jenis-layanan/[id]/page.tsx | 1 + .../jenis-layanan/create/page.tsx | 4 +- .../jenis-pengaduan/[id]/page.tsx | 2 +- .../jenis-pengaduan/create/page.tsx | 2 +- .../pengaduan-masyarakat/[id]/page.tsx | 2 +- .../program-kreatif-desa/[id]/edit/page.tsx | 4 +- .../program-kreatif-desa/[id]/page.tsx | 4 +- .../program-kreatif-desa/create/page.tsx | 4 +- .../[id]/edit/page.tsx | 2 +- .../[id]/page.tsx | 2 +- .../create/page.tsx | 2 +- .../kontak-darurat-item/[id]/edit/page.tsx | 4 +- .../kontak-darurat-item/create/page.tsx | 4 +- .../[id]/edit/page.tsx | 2 +- .../kontak-darurat-keamanan/create/page.tsx | 2 +- .../laporan-publik/[id]/edit/page.tsx | 4 +- .../keamanan/laporan-publik/[id]/page.tsx | 7 +- .../keamanan/laporan-publik/create/page.tsx | 6 +- .../[id]/edit/page.tsx | 6 +- .../pencegahan-kriminalitas/[id]/page.tsx | 4 +- .../pencegahan-kriminalitas/create/page.tsx | 6 +- .../polsek-terdekat/[id]/edit/page.tsx | 22 ++-- .../keamanan/polsek-terdekat/[id]/page.tsx | 10 +- .../keamanan/polsek-terdekat/create/page.tsx | 20 +-- .../keamanan/tips-keamanan/[id]/edit/page.tsx | 2 +- .../keamanan/tips-keamanan/[id]/page.tsx | 3 +- .../keamanan/tips-keamanan/create/page.tsx | 2 +- .../artikel_kesehatan/[id]/edit/page.tsx | 14 +-- .../artikel_kesehatan/[id]/page.tsx | 16 +-- .../artikel_kesehatan/create/page.tsx | 14 +-- .../fasilitas_kesehatan/[id]/edit/page.tsx | 18 +-- .../fasilitas_kesehatan/[id]/page.tsx | 8 +- .../fasilitas_kesehatan/create/page.tsx | 18 +-- .../dokter-tenaga-medis/create/page.tsx | 4 +- .../grafik_hasil_kepuasan/[id]/edit/page.tsx | 10 +- .../grafik_hasil_kepuasan/create/page.tsx | 10 +- .../jadwal_kegiatan/[id]/edit/page.tsx | 19 ++- .../jadwal_kegiatan/[id]/page.tsx | 10 +- .../jadwal_kegiatan/create/page.tsx | 10 +- .../kelahiran/[id]/edit/page.tsx | 8 +- .../kelahiran/[id]/page.tsx | 2 +- .../kelahiran/create/page.tsx | 8 +- .../kematian/[id]/edit/page.tsx | 8 +- .../kematian/[id]/page.tsx | 4 +- .../kematian/create/page.tsx | 8 +- .../info-wabah-penyakit/[id]/edit/page.tsx | 4 +- .../info-wabah-penyakit/[id]/page.tsx | 3 +- .../info-wabah-penyakit/create/page.tsx | 4 +- .../kontak-darurat/[id]/edit/page.tsx | 2 +- .../kesehatan/kontak-darurat/[id]/page.tsx | 1 + .../kesehatan/kontak-darurat/create/page.tsx | 2 +- .../penanganan-darurat/[id]/edit/page.tsx | 2 +- .../penanganan-darurat/[id]/page.tsx | 1 + .../penanganan-darurat/create/page.tsx | 2 +- .../kesehatan/posyandu/[id]/edit/page.tsx | 4 +- .../kesehatan/posyandu/[id]/page.tsx | 2 + .../kesehatan/posyandu/create/page.tsx | 4 +- .../program-kesehatan/[id]/edit/page.tsx | 4 +- .../kesehatan/program-kesehatan/[id]/page.tsx | 4 +- .../program-kesehatan/create/page.tsx | 4 +- .../kesehatan/puskesmas/[id]/edit/page.tsx | 18 +-- .../kesehatan/puskesmas/[id]/page.tsx | 2 +- .../kesehatan/puskesmas/create/page.tsx | 18 +-- .../landing-page/apbdes/[id]/edit/page.tsx | 4 +- .../landing-page/apbdes/create/page.tsx | 4 +- .../kategori-desa-anti-korupsi/[id]/page.tsx | 2 +- .../create/page.tsx | 2 +- .../list-desa-anti-korupsi/[id]/edit/page.tsx | 2 +- .../list-desa-anti-korupsi/[id]/page.tsx | 3 +- .../list-desa-anti-korupsi/create/page.tsx | 2 +- .../responden/[id]/edit/page.tsx | 16 +-- .../responden/create/page.tsx | 4 +- .../kategori-prestasi-desa/[id]/page.tsx | 2 +- .../kategori-prestasi-desa/create/page.tsx | 2 +- .../list-prestasi-desa/[id]/edit/page.tsx | 2 +- .../list-prestasi-desa/[id]/page.tsx | 1 + .../list-prestasi-desa/create/page.tsx | 2 +- .../profile/media-sosial/[id]/edit/page.tsx | 4 +- .../profile/media-sosial/create/page.tsx | 4 +- .../profile/pejabat-desa/[id]/page.tsx | 4 +- .../program-inovasi/[id]/edit/page.tsx | 4 +- .../profile/program-inovasi/[id]/page.tsx | 2 +- .../profile/program-inovasi/create/page.tsx | 4 +- .../landing-page/sdgs-desa/[id]/edit/page.tsx | 4 +- .../landing-page/sdgs-desa/create/page.tsx | 10 +- .../data-lingkungan-desa/[id]/edit/page.tsx | 4 +- .../data-lingkungan-desa/[id]/page.tsx | 2 +- .../data-lingkungan-desa/create/page.tsx | 4 +- .../contoh-kegiatan-desa-darmasaba/page.tsx | 2 + .../materi-edukasi-yang-diberikan/page.tsx | 2 + .../tujuan-edukasi-lingkungan/page.tsx | 2 + .../kategori-kegiatan/[id]/page.tsx | 2 +- .../kategori-kegiatan/create/page.tsx | 2 +- .../kegiatan-desa/[id]/edit/page.tsx | 10 +- .../gotong-royong/kegiatan-desa/[id]/page.tsx | 6 +- .../kegiatan-desa/create/page.tsx | 10 +- .../page.tsx | 2 + .../filosofi-tri-hita-karana/page.tsx | 2 + .../nilai-konservasi-adat/page.tsx | 2 + .../[id]/edit/page.tsx | 6 +- .../[id]/page.tsx | 4 +- .../create/page.tsx | 6 +- .../[id]/page.tsx | 2 +- .../create/page.tsx | 2 +- .../program-penghijauan/[id]/edit/page.tsx | 4 +- .../program-penghijauan/[id]/page.tsx | 2 +- .../program-penghijauan/create/page.tsx | 4 +- .../beasiswa-pendaftar/[id]/page.tsx | 8 +- .../keunggulan-program/[id]/page.tsx | 2 +- .../keunggulan-program/create/page.tsx | 2 +- .../fasilitas-yang-disediakan/edit/page.tsx | 2 +- .../fasilitas-yang-disediakan/page.tsx | 1 + .../lokasi-dan-jadwal/edit/page.tsx | 2 +- .../lokasi-dan-jadwal/page.tsx | 2 + .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 1 + .../pendidikan/data-pendidikan/[id]/page.tsx | 4 +- .../data-pendidikan/create/page.tsx | 4 +- .../jenjang-pendidikan/[id]/page.tsx | 2 +- .../jenjang-pendidikan/create/page.tsx | 2 +- .../info-sekolah/lembaga/[id]/edit/page.tsx | 2 +- .../info-sekolah/lembaga/create/page.tsx | 2 +- .../info-sekolah/pengajar/[id]/edit/page.tsx | 2 +- .../info-sekolah/pengajar/[id]/page.tsx | 2 +- .../info-sekolah/pengajar/create/page.tsx | 2 +- .../info-sekolah/siswa/[id]/edit/page.tsx | 2 +- .../info-sekolah/siswa/[id]/page.tsx | 2 +- .../info-sekolah/siswa/create/page.tsx | 2 +- .../edit/page.tsx | 2 +- .../page.tsx | 2 + .../tempat-kegiatan/edit/page.tsx | 2 +- .../tempat-kegiatan/page.tsx | 2 + .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 2 + .../data-perpustakaan/[id]/edit/page.tsx | 2 +- .../data-perpustakaan/[id]/page.tsx | 2 +- .../data-perpustakaan/create/page.tsx | 2 +- .../kategori-buku/[id]/page.tsx | 2 +- .../kategori-buku/create/page.tsx | 2 +- .../program-unggulan/edit/page.tsx | 2 +- .../program-unggulan/page.tsx | 2 + .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 2 + .../[id]/edit/page.tsx | 4 +- .../[id]/page.tsx | 1 + .../create/page.tsx | 4 +- .../(dashboard)/ppid/dasar-hukum/page.tsx | 7 +- .../responden/[id]/edit/page.tsx | 42 ++----- .../responden/create/page.tsx | 4 +- .../page.tsx | 6 +- .../ppid/profile-ppid/[id]/page.tsx | 2 +- .../(dashboard)/ppid/profile-ppid/page.tsx | 8 +- .../struktur-ppid/pegawai/[id]/edit/page.tsx | 36 ++---- .../ppid/struktur-ppid/pegawai/[id]/page.tsx | 4 +- .../struktur-ppid/pegawai/create/page.tsx | 36 ++---- .../posisi-organisasi/[id]/page.tsx | 4 +- .../posisi-organisasi/create/page.tsx | 4 +- .../(dashboard)/ppid/visi-misi-ppid/page.tsx | 12 +- .../(dashboard)/user&role/role/[id]/page.tsx | 2 +- .../user&role/role/create/page.tsx | 2 +- .../desa/berita/[kategori]/[id]/page.tsx | 2 +- .../(pages)/desa/galery/video/Content.tsx | 1 + .../(pages)/desa/layanan/[id]/page.tsx | 1 + .../_com/pelayananPendudukNonPermanent.tsx | 1 + .../_com/pelayananPerizinanBerusaha.tsx | 2 +- .../desa/pengumuman/[name]/[id]/page.tsx | 2 +- .../(pages)/desa/pengumuman/page.tsx | 1 + .../(pages)/desa/profile/ui/lambangDesa.tsx | 2 +- .../(pages)/desa/profile/ui/maskotDesa.tsx | 1 + .../desa/profile/ui/profilPerbekel.tsx | 4 + .../(pages)/desa/profile/ui/sejarahDesa.tsx | 2 +- .../(pages)/desa/profile/ui/visimisiDesa.tsx | 2 + .../ekonomi/program-kemiskinan/page.tsx | 2 +- .../ekonomi/sektor-unggulan-desa/page.tsx | 2 +- .../desa-digital-smart-village/page.tsx | 2 +- .../info-teknologi-tepat-guna/page.tsx | 2 +- .../informasi-desa/page.tsx | 4 +- .../program-kreatif-desa/[id]/page.tsx | 1 + .../page.tsx | 2 +- .../keamanan/laporan-publik/[id]/page.tsx | 3 +- .../(pages)/keamanan/laporan-publik/page.tsx | 7 +- .../pencegahan-kriminalitas/[id]/page.tsx | 4 +- .../program-lainnya/page.tsx | 1 + .../(pages)/keamanan/tips-keamanan/page.tsx | 2 +- .../artikel-kesehatan-page/[id]/page.tsx | 10 +- .../fasilitas-kesehatan-page/[id]/page.tsx | 6 +- .../jadwal-kegiatan-page/[id]/page.tsx | 8 +- .../kesehatan/info-wabah-penyakit/page.tsx | 1 + .../(pages)/kesehatan/kontak-darurat/page.tsx | 2 +- .../kesehatan/penanganan-darurat/page.tsx | 1 + .../(pages)/kesehatan/posyandu/page.tsx | 3 +- .../kesehatan/program-kesehatan/[id]/page.tsx | 1 + .../kesehatan/program-kesehatan/page.tsx | 1 + .../lingkungan/data-lingkungan-desa/page.tsx | 2 +- .../gotong-royong/[kategori]/[id]/page.tsx | 2 +- .../gotong-royong/[kategori]/content.tsx | 2 +- .../program-penghijauan/[id]/page.tsx | 1 + .../bimbingan-belajar-desa/page.tsx | 6 +- .../pendidikan/pendidikan-non-formal/page.tsx | 6 +- .../[kategoriBuku]/content.tsx | 1 + .../perpustakaan-digital/semua/content.tsx | 1 + .../program-pendidikan-anak/page.tsx | 4 +- .../[id]/page.tsx | 1 + .../page.tsx | 2 +- .../(pages)/ppid/dasar-hukum/page.tsx | 2 +- .../(pages)/ppid/ikm-desa-darmasaba/page.tsx | 10 +- .../(pages)/ppid/profile-ppid/page.tsx | 8 +- .../(pages)/ppid/visi-misi-ppid/page.tsx | 2 + .../(tambahan)/penghargaan/[id]/page.tsx | 1 + .../(tambahan)/prestasi-desa/[id]/page.tsx | 2 +- .../(tambahan)/prestasi-desa/page.tsx | 4 +- .../(tambahan)/program-inovasi/[id]/page.tsx | 1 + .../_com/main-page/kepuasan/index.tsx | 10 +- .../_com/main-page/prestasi/index.tsx | 1 + types/env.d.ts | 4 +- xx | 1 + xx.ts | 4 + 319 files changed, 965 insertions(+), 817 deletions(-) create mode 100644 prisma/safeseedUnique.ts create mode 100644 prisma/seed_assets.ts create mode 100755 xx create mode 100644 xx.ts diff --git a/.gitignore b/.gitignore index fb70e68f..ebd64b35 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,9 @@ next-env.d.ts # uploads /uploads +# download +/download + # cache /cache diff --git a/bun.lockb b/bun.lockb index b7d17ba048f5d33d350f678125136bfef55b0b68..7de6015e87a13828903e794e39fd8876578c5739 100755 GIT binary patch delta 66393 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 a$%m3!N|p{PAP@A%jna2}hAoxWAN)Vq-xQAk delta 63220 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 + model: T, + where: Record, + data: Record +) { + const m = prisma[model]; + + if (!m) throw new Error(`Model ${String(model)} tidak ditemukan di PrismaClient`); + + try { + // @ts-expect-error upsert dynamic + await m.upsert({ + where, + update: data, + create: { ...where, ...data }, + }); + console.log(`✅ Seeded ${String(model)} -> ${JSON.stringify(where)}`); + } catch (err) { + console.error(`❌ Gagal seed ${String(model)} -> ${JSON.stringify(where)}`, err); + } +} diff --git a/prisma/seed.ts b/prisma/seed.ts index ab793335..c3c7af27 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -56,6 +56,8 @@ import tujuanProgram from "./data/pendidikan/program-pendidikan-anak/tujuan-prog import roles from "./data/user/roles.json"; import users from "./data/user/users.json"; import fileStorage from "./data/file-storage.json"; +import seedAssets from "./seed_assets"; +import { safeSeedUnique } from "./safeseedUnique"; (async () => { // =========== USER & ROLE =========== @@ -63,23 +65,14 @@ import fileStorage from "./data/file-storage.json"; // =========== ROLES =========== console.log("🔄 Seeding roles..."); for (const r of roles) { - await prisma.role.upsert({ - where: { id: r.id }, - update: { - name: r.name, - description: r.description, - permissions: r.permissions, - isActive: r.isActive, - }, - create: { - id: r.id, - name: r.name, - description: r.description, - permissions: r.permissions, - isActive: r.isActive, - }, + await safeSeedUnique("role", { id: r.id }, { + name: r.name, + description: r.description, + permissions: r.permissions, + isActive: r.isActive, }); } + console.log("✅ Roles seeded"); // =========== USERS =========== @@ -95,22 +88,12 @@ import fileStorage from "./data/file-storage.json"; continue; } - await prisma.user.upsert({ - where: { id: u.id }, - update: { - username: u.nama, - nomor: u.nomor, - roleId: u.roleId, + await safeSeedUnique("user", { id: u.id }, { + username: u.nama, + nomor: u.nomor, + roleId: u.roleId, isActive: u.isActive, - }, - create: { - id: u.id, - username: u.nama, - nomor: u.nomor, - roleId: u.roleId, - isActive: u.isActive, - }, - }); + }); } console.log("✅ Users seeded"); @@ -364,6 +347,7 @@ import fileStorage from "./data/file-storage.json"; jumlah: l.jumlah, }, create: { + id: l.id, name: l.name, jumlah: l.jumlah, }, @@ -1169,6 +1153,10 @@ import fileStorage from "./data/file-storage.json"; console.log( "✅ fasilitas bimbingan belajar desa seeded (editable later via UI)" ); + + // seed assets + await seedAssets(); + })() .then(() => prisma.$disconnect()) .catch((e) => { diff --git a/prisma/seed_assets.ts b/prisma/seed_assets.ts new file mode 100644 index 00000000..f92c0d36 --- /dev/null +++ b/prisma/seed_assets.ts @@ -0,0 +1,118 @@ +// prisma/seedAssets.ts +import fs from "fs/promises"; +import path from "path"; +import sharp from "sharp"; +import fetch from "node-fetch"; +import AdmZip from "adm-zip"; +import prisma from "@/lib/prisma"; + +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"; + if ([".pdf", ".doc", ".docx"].includes(ext)) return "document"; + return "other"; +} + +// --- Helper: recursive walk dir --- +async function walkDir(dir: string, fileList: string[] = []): Promise { + 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..."); + + // 1. Download zip + const url = + "https://cld-dkr-makuro-seafile.wibudev.com/f/ffd5a548a04f47939474/?dl=1"; + const res = await fetch(url); + if (!res.ok) throw new Error(`Gagal download assets: ${res.statusText}`); + const buffer = Buffer.from(await res.arrayBuffer()); + + // 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 }); + + const zip = new AdmZip(buffer); + zip.extractAllTo(extractDir, true); + + // 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); + } + + // 5. Simpan ke DB + await prisma.fileStorage.create({ + data: { + name: finalName, + realName: entryName, + path: targetPath, + mimeType, + link: `/uploads/${category}/${finalName}`, + category, + }, + }); + + console.log(`📂 saved: ${category}/${finalName}`); + } + + // 6. Cleanup + await fs.rm(extractDir, { recursive: true, force: true }); + + console.log("✅ Selesai seed assets!"); +} + +// --- 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(); + }); +} diff --git a/src/app/admin/(dashboard)/desa/berita/kategori-berita/[id]/page.tsx b/src/app/admin/(dashboard)/desa/berita/kategori-berita/[id]/page.tsx index e42a0071..19eaebd5 100644 --- a/src/app/admin/(dashboard)/desa/berita/kategori-berita/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/kategori-berita/[id]/page.tsx @@ -96,7 +96,7 @@ function EditKategoriBerita() { setFormData({ ...formData, name: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/desa/berita/kategori-berita/create/page.tsx b/src/app/admin/(dashboard)/desa/berita/kategori-berita/create/page.tsx index 06fa984b..db9e2b6a 100644 --- a/src/app/admin/(dashboard)/desa/berita/kategori-berita/create/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/kategori-berita/create/page.tsx @@ -7,10 +7,9 @@ import { Group, Paper, Stack, - Text, TextInput, Title, - Tooltip, + Tooltip } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -62,9 +61,9 @@ function CreateKategoriBerita() { > Nama Kategori Berita} + label="Nama Kategori Berita" placeholder="Masukkan nama kategori berita" - value={createState.create.form.name || ''} + defaultValue={createState.create.form.name || ''} onChange={(e) => (createState.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/edit/page.tsx index 7c52837f..8757e17c 100644 --- a/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/desa/berita/list-berita/[id]/edit/page.tsx @@ -131,17 +131,36 @@ function EditBerita() { setFormData({ ...formData, judul: e.target.value }) } required /> + - setFormData({ ...formData, kategoriBeritaId: val || "" }) - } - label="Kategori" - placeholder="Pilih kategori" - data={ - beritaState.kategoriBerita.findMany.data?.map((v) => ({ - value: v.id, - label: v.name, - })) || [] - } - clearable - searchable - required - error={!formData.kategoriBeritaId ? "Pilih kategori" : undefined} - /> - diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/create/page.tsx index 39e0a23a..32b57b80 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/hubungan-organisasi/create/page.tsx @@ -67,7 +67,7 @@ export default function CreateHubunganOrganisasi() { setForm({ ...form, tipe: e.currentTarget.value })} /> diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx index 7cf73d5d..7bcb21e4 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx @@ -151,13 +151,13 @@ export default function EditPegawai() { setFormData({ ...formData, namaLengkap: e.target.value })} /> setFormData({ ...formData, gelarAkademik: e.target.value })} /> @@ -217,25 +217,25 @@ export default function EditPegawai() { label="Tanggal Masuk" type="date" placeholder="Contoh: 2022-01-01" - value={formatDateForInput(formData.tanggalMasuk)} + defaultValue={formatDateForInput(formData.tanggalMasuk)} onChange={(e) => setFormData({ ...formData, tanggalMasuk: e.target.value })} /> (formData.email = e.currentTarget.value)} /> (formData.telepon = e.currentTarget.value)} /> (formData.alamat = e.currentTarget.value)} /> { if (value) stateOrganisasi.pegawai.create.form.posisiId = value; }} diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx index 508647a3..274d4270 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx @@ -114,7 +114,7 @@ function EditPosisiOrganisasi() { > setFormData({ ...formData, nama: e.target.value }) } @@ -137,7 +137,7 @@ function EditPosisiOrganisasi() { setFormData({ ...formData, diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx index ded7678a..48d3712e 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx @@ -75,7 +75,7 @@ function CreatePosisiOrganisasi() { (stateOrganisasi.create.form.nama = e.currentTarget.value)} required /> @@ -94,7 +94,7 @@ function CreatePosisiOrganisasi() { label="Hierarki" type="number" placeholder="Contoh: 1" - value={stateOrganisasi.create.form.hierarki} + defaultValue={stateOrganisasi.create.form.hierarki} onChange={(e) => { const value = parseInt(e.currentTarget.value, 10); if (!isNaN(value)) { diff --git a/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx index c00259b1..f1857aec 100644 --- a/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx @@ -94,7 +94,7 @@ function DetailAjukanIdeInofativDesa() { Alamat - + @@ -104,12 +104,12 @@ function DetailAjukanIdeInofativDesa() { Deskripsi - + Masalah - {data?.masalah || '-'} + {data?.masalah || '-'} diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx index 715e3c0d..0f073faa 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx @@ -91,7 +91,7 @@ function EditPenghargaan() { Edit Desa Digital Smart Village setFormData({ ...formData, name: e.target.value })} label={Judul} placeholder="masukkan judul" diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx index 1fcbdbeb..c6fbf1db 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx @@ -56,7 +56,7 @@ function DetailDesaDigital() { Deskripsi - + Gambar diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx index 289651f0..5694b96a 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx @@ -98,7 +98,7 @@ function CreateDesaDigital() { (stateDesaDigital.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx index 0916fef3..f9d13e21 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx @@ -119,7 +119,7 @@ function EditInfoTeknologiTepatGuna() { setFormData({ ...formData, name: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx index 4313fcaa..facf1cf2 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx @@ -78,6 +78,7 @@ function DetailInfoTeknologiTepatGuna() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data?.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx index d2d09028..be8b23b7 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx @@ -94,7 +94,7 @@ function CreateInfoTeknologiTepatGuna() { {/* Nama */} { stateInfoTekno.create.form.name = val.target.value; }} diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx index 24827165..a4edc6cd 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx @@ -104,7 +104,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, name: e.target.value })} required /> @@ -112,7 +112,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, slug: e.target.value })} required /> @@ -120,7 +120,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, tahun: e.target.value })} required /> @@ -128,7 +128,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, kolaborator: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx index cc4d06f5..0d3b0f9a 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx @@ -81,12 +81,12 @@ function DetailKolaborasiInovasi() { Deskripsi Singkat - {data?.slug || '-'} + {data?.slug || '-'} Deskripsi - + diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx index a45d50ad..8ed78d71 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx @@ -77,7 +77,7 @@ function CreateProgramKreatifDesa() { Nama Kolaborasi Inovasi} placeholder="Masukkan nama kolaborasi inovasi" - value={stateCreate.create.form.name || ''} + defaultValue={stateCreate.create.form.name || ''} onChange={(val) => stateCreate.create.form.name = val.target.value} required /> @@ -106,7 +106,7 @@ function CreateProgramKreatifDesa() { Kolaborator} placeholder="Masukkan kolaborator" - value={stateCreate.create.form.kolaborator || ''} + defaultValue={stateCreate.create.form.kolaborator || ''} onChange={(e) => stateCreate.create.form.kolaborator = e.currentTarget.value} /> diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx index ac9c1ea2..0b5174b2 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx @@ -118,7 +118,7 @@ function EditMitraKolaborasi() { setFormData({ ...formData, name: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx index 2c9a077c..d7da8e8b 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx @@ -85,7 +85,7 @@ function CreateMitraKolaborasi() { (state.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/edit/page.tsx index 93ffb0ef..0ba4d7da 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/edit/page.tsx @@ -66,7 +66,7 @@ function EditJenisLayanan() { Edit Jenis Layanan { setFormData({ ...formData, nama: val.target.value }); }} diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx index 427aaada..41990ab2 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx @@ -79,6 +79,7 @@ function DetailJenisLayanan() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data?.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx index 50d76bc1..b1b5a107 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx @@ -69,7 +69,7 @@ function CreateJenisLayanan() { > { statePasar.create.form.nama = val.target.value; }} @@ -78,7 +78,7 @@ function CreateJenisLayanan() { required /> { statePasar.create.form.deskripsi = val.target.value; }} diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx index 6444952c..2f7e1220 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx @@ -108,7 +108,7 @@ function EditJenisPengaduan() { > setFormData({ ...formData, nama: e.target.value })} label="Nama Jenis Pengaduan" placeholder="Masukkan nama jenis pengaduan" diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx index e3175ede..bb0ae5b9 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx @@ -64,7 +64,7 @@ function CreateJenisPengaduan() { (state.create.form.nama = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx index abcbb91f..a9a9ad3e 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx @@ -102,7 +102,7 @@ function DetailPengaduanMasyarakat() { Deskripsi Pengaduan - + diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx index fc9b335f..bc1a49ee 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx @@ -114,7 +114,7 @@ function EditProgramKreatifDesa() { setFormData({ ...formData, name: e.target.value })} required /> @@ -122,7 +122,7 @@ function EditProgramKreatifDesa() { setFormData({ ...formData, slug: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx index 94dd1015..e402bf15 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx @@ -86,12 +86,12 @@ function DetailProgramKreatifDesa() { Deskripsi Singkat - {data?.slug || '-'} + {data?.slug || '-'} Deskripsi - + diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx index 883529be..b5969bf7 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx @@ -64,7 +64,7 @@ function CreateProgramKreatifDesa() { Nama Program Kreatif Desa} placeholder="Masukkan nama program kreatif desa" - value={stateCreate.create.form.name || ""} + defaultValue={stateCreate.create.form.name || ""} onChange={(e) => (stateCreate.create.form.name = e.currentTarget.value)} required /> @@ -81,7 +81,7 @@ function CreateProgramKreatifDesa() { Deskripsi Singkat Program Kreatif Desa} placeholder="Masukkan deskripsi singkat program kreatif desa" - value={stateCreate.create.form.slug || ""} + defaultValue={stateCreate.create.form.slug || ""} onChange={(e) => (stateCreate.create.form.slug = e.currentTarget.value)} required /> diff --git a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/edit/page.tsx index d11e7981..6b35fc71 100644 --- a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/edit/page.tsx @@ -194,7 +194,7 @@ function EditKeamananLingkungan() { )} setFormData({ ...formData, name: e.target.value }) } diff --git a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/page.tsx b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/page.tsx index 50f49d8c..1ce73db9 100644 --- a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/[id]/page.tsx @@ -88,7 +88,7 @@ function DetailKeamananLingkungan() { Deskripsi - + {/* Aksi */} diff --git a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/create/page.tsx b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/create/page.tsx index ea5c2604..4ff05394 100644 --- a/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/keamanan-lingkungan-pecalang-patwal/create/page.tsx @@ -172,7 +172,7 @@ function CreateKeamananLingkungan() { {/* Input Nama */} { keamananState.create.form.name = val.target.value; }} diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/[id]/edit/page.tsx index df6c56a8..cfd5fa86 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/[id]/edit/page.tsx @@ -99,7 +99,7 @@ function EditKontakItem() { setFormData({ ...formData, name: e.target.value })} required /> @@ -107,7 +107,7 @@ function EditKontakItem() { setFormData({ ...formData, nomorTelepon: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/create/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/create/page.tsx index f318bce5..3b962470 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-item/create/page.tsx @@ -65,7 +65,7 @@ function CreateKontakItem() { {/* Input Nama Kategori */} { kontakState.create.form.nama = val.target.value; }} @@ -77,7 +77,7 @@ function CreateKontakItem() { Nomor Telepon Kontak} placeholder="Masukkan nomor telepon" - value={kontakState.create.form.nomorTelepon} + defaultValue={kontakState.create.form.nomorTelepon} onChange={(val) => { kontakState.create.form.nomorTelepon = val.target.value; }} diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/[id]/edit/page.tsx index 6057918b..9cc5192c 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/[id]/edit/page.tsx @@ -112,7 +112,7 @@ function EditKontakDaruratKeamanan() { {/* Nama kategori */} setFormData({ ...formData, name: e.target.value })} label="Nama Kontak Darurat" placeholder="Masukkan nama kontak darurat" diff --git a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/create/page.tsx b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/create/page.tsx index 4eb42efb..afdbd448 100644 --- a/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/kontak-darurat/kontak-darurat-keamanan/create/page.tsx @@ -72,7 +72,7 @@ function CreateKontakDaruratKeamanan() { {/* Input Nama Kategori */} { kontakState.create.form.nama = val.target.value; }} diff --git a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx index 5d2c2789..5b9103e2 100644 --- a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx @@ -111,7 +111,7 @@ function EditLaporanPublik() { > setFormData({ ...formData, judul: e.target.value })} label={Judul Laporan Publik} placeholder="Masukkan judul laporan publik" @@ -119,7 +119,7 @@ function EditLaporanPublik() { /> setFormData({ ...formData, lokasi: e.target.value })} label={Lokasi Laporan Publik} placeholder="Masukkan lokasi laporan publik" diff --git a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/page.tsx b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/page.tsx index 396c59df..b5f83ee9 100644 --- a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/page.tsx @@ -77,7 +77,7 @@ function DetailLaporanPublik() { Judul Laporan Publik - {data.judul || '-'} + {data.judul || '-'} @@ -91,7 +91,7 @@ function DetailLaporanPublik() { Lokasi - {data.lokasi || '-'} + {data.lokasi || '-'} @@ -121,7 +121,7 @@ function DetailLaporanPublik() { Kronologi - + @@ -133,6 +133,7 @@ function DetailLaporanPublik() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: item.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> )) diff --git a/src/app/admin/(dashboard)/keamanan/laporan-publik/create/page.tsx b/src/app/admin/(dashboard)/keamanan/laporan-publik/create/page.tsx index 7df96049..994af691 100644 --- a/src/app/admin/(dashboard)/keamanan/laporan-publik/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/laporan-publik/create/page.tsx @@ -63,7 +63,7 @@ function CreateLaporanPublik() { > (stateLaporan.create.form.judul = e.target.value)} label={Judul Laporan Publik} placeholder="Masukkan judul laporan publik" @@ -71,7 +71,7 @@ function CreateLaporanPublik() { /> (stateLaporan.create.form.lokasi = e.target.value)} label={Lokasi Laporan Publik} placeholder="Masukkan lokasi laporan publik" @@ -91,7 +91,7 @@ function CreateLaporanPublik() { /> (stateLaporan.create.form.kronologi = e.target.value)} label={Kronologi Laporan Publik} placeholder="Masukkan kronologi laporan publik" diff --git a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx index 42ab7cc9..b2292469 100644 --- a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx @@ -119,7 +119,7 @@ function EditPencegahanKriminalitas() { setFormData({ ...formData, judul: e.target.value })} required /> @@ -127,7 +127,7 @@ function EditPencegahanKriminalitas() { setFormData({ ...formData, deskripsiSingkat: e.target.value }) } @@ -150,7 +150,7 @@ function EditPencegahanKriminalitas() { setFormData({ ...formData, linkVideo: e.currentTarget.value }) } diff --git a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/page.tsx b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/page.tsx index 72371193..46ffedf0 100644 --- a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/page.tsx @@ -75,7 +75,7 @@ function DetailPencegahanKriminalitas() { Deskripsi Singkat {data?.deskripsiSingkat ? ( - + ) : ( Tidak ada deskripsi singkat )} @@ -84,7 +84,7 @@ function DetailPencegahanKriminalitas() { Deskripsi {data?.deskripsi ? ( - + ) : ( Tidak ada deskripsi )} diff --git a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/create/page.tsx b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/create/page.tsx index 69f06504..a22e001f 100644 --- a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/create/page.tsx @@ -82,7 +82,7 @@ function CreatePencegahanKriminalitas() { { kriminalitasState.create.form.judul = e.currentTarget.value; }} @@ -93,7 +93,7 @@ function CreatePencegahanKriminalitas() { { kriminalitasState.create.form.deskripsiSingkat = e.currentTarget.value; }} @@ -117,7 +117,7 @@ function CreatePencegahanKriminalitas() { setLink(e.currentTarget.value)} required /> diff --git a/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx index 4605c3be..c9bb69fb 100644 --- a/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx @@ -211,7 +211,7 @@ function EditPolsekTerdekat() { setNamaLayananBaru(e.currentTarget.value)} /> @@ -229,7 +229,7 @@ function EditPolsekTerdekat() { setNamaLayananUpdate(e.currentTarget.value)} /> @@ -148,59 +148,59 @@ function CreatePolsekTerdekat() { > (polsekState.create.form.nama = val.target.value)} label={Nama Polsek Terdekat} placeholder="Masukkan nama Polsek Terdekat" required /> (polsekState.create.form.jarakKeDesa = val.target.value)} label={Jarak Polsek Terdekat} placeholder="Masukkan jarak Polsek Terdekat" required /> (polsekState.create.form.alamat = val.target.value)} label={Alamat Polsek Terdekat} placeholder="Masukkan alamat Polsek Terdekat" required /> (polsekState.create.form.nomorTelepon = val.target.value)} label={Nomor Telepon Polsek Terdekat} placeholder="Masukkan nomor telepon Polsek Terdekat" required /> (polsekState.create.form.jamOperasional = val.target.value)} label={Jam Operasional Polsek Terdekat} placeholder="Masukkan jam operasional Polsek Terdekat" /> (polsekState.create.form.embedMapUrl = val.target.value)} label={Embed Map URL} placeholder="Masukkan embed map url" /> (polsekState.create.form.namaTempatMaps = val.target.value)} label={Nama Tempat Maps} placeholder="Masukkan nama tempat maps" /> (polsekState.create.form.alamatMaps = val.target.value)} label={Alamat Maps} placeholder="Masukkan alamat maps" /> (polsekState.create.form.linkPetunjukArah = val.target.value)} label={Link Petunjuk Arah} placeholder="Masukkan link petunjuk arah" diff --git a/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/edit/page.tsx index 270aec6c..c9fd2c24 100644 --- a/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/edit/page.tsx @@ -199,7 +199,7 @@ function EditTipsKeamanan() { setFormData({ ...formData, judul: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/page.tsx b/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/page.tsx index 0b8ec263..61bb32c9 100644 --- a/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/tips-keamanan/[id]/page.tsx @@ -68,7 +68,7 @@ function DetailTipsKeamanan() { Nama Tips Keamanan - {data.judul || '-'} + {data.judul || '-'} @@ -76,6 +76,7 @@ function DetailTipsKeamanan() { diff --git a/src/app/admin/(dashboard)/keamanan/tips-keamanan/create/page.tsx b/src/app/admin/(dashboard)/keamanan/tips-keamanan/create/page.tsx index c3227392..6f82636a 100644 --- a/src/app/admin/(dashboard)/keamanan/tips-keamanan/create/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/tips-keamanan/create/page.tsx @@ -138,7 +138,7 @@ function CreateKeamananLingkungan() { (stateKeamanan.create.form.judul = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx index 33d5f931..689a55c5 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx @@ -173,7 +173,7 @@ function EditArtikelKesehatan() { setFormData(prev => ({ ...prev, title: e.target.value }))} required /> @@ -235,14 +235,14 @@ function EditArtikelKesehatan() { setFormData(prev => ({ ...prev, content: e.target.value }))} required /> setFormData(prev => ({ ...prev, @@ -258,7 +258,7 @@ function EditArtikelKesehatan() { setFormData(prev => ({ ...prev, @@ -283,7 +283,7 @@ function EditArtikelKesehatan() { Pencegahan setFormData(prev => ({ ...prev, @@ -307,7 +307,7 @@ function EditArtikelKesehatan() { Pertolongan Pertama setFormData(prev => ({ ...prev, @@ -331,7 +331,7 @@ function EditArtikelKesehatan() { Mitos vs Fakta setFormData(prev => ({ ...prev, diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx index 59f980e2..e03b527f 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx @@ -103,13 +103,13 @@ function DetailArtikelKesehatan() { {/* Deskripsi */} Deskripsi - + {/* Pendahuluan */} Pendahuluan - + {/* Gejala */} @@ -118,7 +118,7 @@ function DetailArtikelKesehatan() { Judul {data.symptom?.title} Deskripsi - + {/* Pencegahan */} @@ -127,7 +127,7 @@ function DetailArtikelKesehatan() { Judul {data.prevention?.title} Deskripsi - + {/* Pertolongan Pertama */} @@ -136,7 +136,7 @@ function DetailArtikelKesehatan() { Judul {data.firstaid?.title} Deskripsi - + {/* Mitos vs Fakta */} @@ -145,15 +145,15 @@ function DetailArtikelKesehatan() { Judul {data.mythvsfact?.title} Mitos - + Fakta - + {/* Kapan ke Dokter */} Kapan Harus ke Dokter - + {/* Aksi */} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx index 6072684c..ce925f33 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx @@ -167,7 +167,7 @@ function CreateArtikelKesehatan() { { stateArtikelKesehatan.create.form.title = e.target.value; }} @@ -176,7 +176,7 @@ function CreateArtikelKesehatan() { { stateArtikelKesehatan.create.form.content = e.target.value; }} @@ -186,7 +186,7 @@ function CreateArtikelKesehatan() { label={"Pendahuluan"} placeholder="Masukkan pendahuluan" required - value={stateArtikelKesehatan.create.form.introduction.content} + defaultValue={stateArtikelKesehatan.create.form.introduction.content} onChange={(e) => { stateArtikelKesehatan.create.form.introduction.content = e.target.value; }} @@ -200,7 +200,7 @@ function CreateArtikelKesehatan() { label={"Judul Gejala"} required placeholder="Masukkan judul gejala penyakit" - value={stateArtikelKesehatan.create.form.symptom.title} + defaultValue={stateArtikelKesehatan.create.form.symptom.title} onChange={(e) => { stateArtikelKesehatan.create.form.symptom.title = e.target.value; }} @@ -224,7 +224,7 @@ function CreateArtikelKesehatan() { label={"Judul Pencegahan"} required placeholder="Masukkan judul" - value={stateArtikelKesehatan.create.form.prevention.title} + defaultValue={stateArtikelKesehatan.create.form.prevention.title} onChange={(e) => { stateArtikelKesehatan.create.form.prevention.title = e.target.value; }} @@ -245,7 +245,7 @@ function CreateArtikelKesehatan() { label={"Judul Pertolongan Pertama"} required placeholder="Masukkan judul" - value={stateArtikelKesehatan.create.form.firstAid.title} + defaultValue={stateArtikelKesehatan.create.form.firstAid.title} onChange={(e) => { stateArtikelKesehatan.create.form.firstAid.title = e.target.value; }} @@ -266,7 +266,7 @@ function CreateArtikelKesehatan() { label={"Judul Mitos dan Fakta"} required placeholder="Masukkan judul" - value={stateArtikelKesehatan.create.form.mythVsFact.title} + defaultValue={stateArtikelKesehatan.create.form.mythVsFact.title} onChange={(e) => { stateArtikelKesehatan.create.form.mythVsFact.title = e.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/edit/page.tsx index 3cd455ba..61ad4fda 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/edit/page.tsx @@ -156,7 +156,7 @@ function EditFasilitasKesehatan() { setFormData(prev => ({ ...prev, name: e.target.value }))} required /> @@ -166,7 +166,7 @@ function EditFasilitasKesehatan() { Informasi Umum setFormData(prev => ({ ...prev, @@ -176,7 +176,7 @@ function EditFasilitasKesehatan() { /> setFormData(prev => ({ ...prev, @@ -186,7 +186,7 @@ function EditFasilitasKesehatan() { /> setFormData(prev => ({ ...prev, @@ -215,7 +215,7 @@ function EditFasilitasKesehatan() { Dokter dan Tenaga Medis setFormData(prev => ({ ...prev, @@ -225,7 +225,7 @@ function EditFasilitasKesehatan() { /> setFormData(prev => ({ ...prev, @@ -235,7 +235,7 @@ function EditFasilitasKesehatan() { /> setFormData(prev => ({ ...prev, @@ -278,7 +278,7 @@ function EditFasilitasKesehatan() { Tarif dan Layanan setFormData(prev => ({ ...prev, @@ -288,7 +288,7 @@ function EditFasilitasKesehatan() { /> setFormData(prev => ({ ...prev, diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/page.tsx index 190eb675..d6640e65 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/[id]/page.tsx @@ -88,24 +88,24 @@ function DetailFasilitasKesehatan() { Fasilitas {data.informasiumum?.fasilitas || '-'} Alamat - {data.informasiumum?.alamat || '-'} + {data.informasiumum?.alamat || '-'} Jam Operasional {data.informasiumum?.jamOperasional || '-'} Layanan Unggulan - + Fasilitas Pendukung - + Prosedur Pendaftaran - + diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/create/page.tsx index 7d4338c6..530039a9 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/create/page.tsx @@ -92,7 +92,7 @@ function CreateFasilitasKesehatan() { (stateFasilitasKesehatan.create.form.name = e.target.value)} required /> @@ -103,21 +103,21 @@ function CreateFasilitasKesehatan() { (stateFasilitasKesehatan.create.form.informasiUmum.fasilitas = e.target.value)} required /> (stateFasilitasKesehatan.create.form.informasiUmum.alamat = e.target.value)} required /> (stateFasilitasKesehatan.create.form.informasiUmum.jamOperasional = e.target.value)} required /> @@ -138,21 +138,21 @@ function CreateFasilitasKesehatan() { (stateFasilitasKesehatan.create.form.dokterdanTenagaMedis.name = e.target.value)} required /> (stateFasilitasKesehatan.create.form.dokterdanTenagaMedis.specialist = e.target.value)} required /> (stateFasilitasKesehatan.create.form.dokterdanTenagaMedis.jadwal = e.target.value)} required /> @@ -182,14 +182,14 @@ function CreateFasilitasKesehatan() { (stateFasilitasKesehatan.create.form.tarifDanLayanan.tarif = e.target.value)} required /> (stateFasilitasKesehatan.create.form.tarifDanLayanan.layanan = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis/create/page.tsx index 3e33d305..71bf934b 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/fasilitas_kesehatan/dokter-tenaga-medis/create/page.tsx @@ -40,7 +40,7 @@ function CreateDokter() { Nama Dokter} placeholder="masukkan nama dokter" - value={createState.create.create.form.name} + defaultValue={createState.create.create.form.name} onChange={(e) => { createState.create.create.form.name = e.target.value; }} @@ -49,7 +49,7 @@ function CreateDokter() { Specialist} placeholder="masukkan specialist" - value={createState.create.create.form.specialist} + defaultValue={createState.create.create.form.specialist} onChange={(e) => { createState.create.create.form.specialist = e.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[id]/edit/page.tsx index c5f9bc20..32d0e8ba 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[id]/edit/page.tsx @@ -101,7 +101,7 @@ function EditGrafikHasilKepuasan() { > setFormData({ ...formData, nama: e.target.value })} label="Nama" placeholder="Masukkan nama" @@ -109,14 +109,14 @@ function EditGrafikHasilKepuasan() { /> setFormData({ ...formData, tanggal: e.target.value })} label="Tanggal" placeholder="Masukkan tanggal" required /> setFormData({ ...formData, jenisKelamin: e.target.value }) } @@ -125,14 +125,14 @@ function EditGrafikHasilKepuasan() { required /> setFormData({ ...formData, alamat: e.target.value })} label="Alamat" placeholder="Masukkan alamat" required /> setFormData({ ...formData, penyakit: e.target.value })} label="Penyakit" placeholder="Masukkan penyakit" diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/create/page.tsx index c84f14db..e33b6e1a 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/create/page.tsx @@ -72,7 +72,7 @@ function CreateGrafikHasilKepuasanMasyarakat() { (stateGrafikKepuasan.create.form.nama = e.target.value)} required /> @@ -80,28 +80,28 @@ function CreateGrafikHasilKepuasanMasyarakat() { type="date" label="Tanggal" placeholder="Masukkan tanggal" - value={stateGrafikKepuasan.create.form.tanggal} + defaultValue={stateGrafikKepuasan.create.form.tanggal} onChange={(e) => (stateGrafikKepuasan.create.form.tanggal = e.target.value)} required /> (stateGrafikKepuasan.create.form.jenisKelamin = e.target.value)} required /> (stateGrafikKepuasan.create.form.alamat = e.target.value)} required /> (stateGrafikKepuasan.create.form.penyakit = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx index a6aacc37..a2ef8b1c 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx @@ -160,7 +160,7 @@ function EditJadwalKegiatan() { setFormData((prev) => ({ ...prev, content: e.target.value }))} /> @@ -179,22 +179,31 @@ function EditJadwalKegiatan() { {/* Informasi Jadwal */} Informasi Jadwal Kegiatan - setFormData((prev) => ({ ...prev, informasiJadwalKegiatan: { ...prev.informasiJadwalKegiatan, name: e.target.value } }))} /> - setFormData((prev) => ({ ...prev, informasiJadwalKegiatan: { ...prev.informasiJadwalKegiatan, tanggal: e.target.value } }))} /> - setFormData((prev) => ({ ...prev, informasiJadwalKegiatan: { ...prev.informasiJadwalKegiatan, waktu: e.target.value } }))} /> - setFormData((prev) => ({ ...prev, informasiJadwalKegiatan: { ...prev.informasiJadwalKegiatan, lokasi: e.target.value } }))} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx index 45a1aade..383cc54c 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx @@ -83,31 +83,31 @@ function DetailJadwalKegiatan() { Waktu {data.informasijadwalkegiatan.waktu || '-'} Lokasi - {data.informasijadwalkegiatan.lokasi || '-'} + {data.informasijadwalkegiatan.lokasi || '-'} {/* Deskripsi */} Deskripsi - + {/* Layanan */} Layanan - + {/* Syarat Ketentuan */} Syarat Ketentuan - + {/* Dokumen */} Dokumen - + {/* Aksi */} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx index d847720d..55121d4a 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx @@ -87,7 +87,7 @@ function CreateJadwalKegiatan() { { stateJadwalKegiatan.create.form.content = e.target.value; }} @@ -110,7 +110,7 @@ function CreateJadwalKegiatan() { label="Nama" required placeholder="Masukkan nama" - value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name} + defaultValue={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name} onChange={(e) => { stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name = e.target.value; }} @@ -119,7 +119,7 @@ function CreateJadwalKegiatan() { type="date" required label="Tanggal" - value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal} + defaultValue={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal} onChange={(e) => { stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal = e.target.value; }} @@ -128,7 +128,7 @@ function CreateJadwalKegiatan() { label="Waktu" required placeholder="Masukkan waktu" - value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu} + defaultValue={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu} onChange={(e) => { stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu = e.target.value; }} @@ -137,7 +137,7 @@ function CreateJadwalKegiatan() { label="Lokasi" required placeholder="Masukkan lokasi" - value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi} + defaultValue={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi} onChange={(e) => { stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi = e.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx index e05848c5..f13052a2 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/edit/page.tsx @@ -109,7 +109,7 @@ function EditKelahiran() { > setFormData({ ...formData, nama: e.target.value })} label="Nama" placeholder="Masukkan nama" @@ -117,21 +117,21 @@ function EditKelahiran() { /> setFormData({ ...formData, tanggal: e.target.value })} label="Tanggal" placeholder="Masukkan tanggal" required /> setFormData({ ...formData, jenisKelamin: e.target.value })} label="Jenis Kelamin" placeholder="Masukkan jenis kelamin" required /> setFormData({ ...formData, alamat: e.target.value })} label="Alamat" placeholder="Masukkan alamat" diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/page.tsx index 2ce02278..18a2e587 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/[id]/page.tsx @@ -105,7 +105,7 @@ function DetailKelahiran() { Alamat - {data.alamat || '-'} + {data.alamat || '-'} diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/create/page.tsx index e668ac72..b8476a66 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kelahiran/create/page.tsx @@ -74,7 +74,7 @@ function CreateKelahiran() { Nama} placeholder="Masukkan nama" - value={createState.create.form.nama} + defaultValue={createState.create.form.nama} onChange={(e) => (createState.create.form.nama = e.target.value)} required /> @@ -82,21 +82,21 @@ function CreateKelahiran() { type="date" label={Tanggal} placeholder="Masukkan tanggal" - value={createState.create.form.tanggal} + defaultValue={createState.create.form.tanggal} onChange={(e) => (createState.create.form.tanggal = e.target.value)} required /> Jenis Kelamin} placeholder="Masukkan jenis kelamin" - value={createState.create.form.jenisKelamin} + defaultValue={createState.create.form.jenisKelamin} onChange={(e) => (createState.create.form.jenisKelamin = e.target.value)} required /> Alamat} placeholder="Masukkan alamat" - value={createState.create.form.alamat} + defaultValue={createState.create.form.alamat} onChange={(e) => (createState.create.form.alamat = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx index 510c60f3..3feba130 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/edit/page.tsx @@ -107,7 +107,7 @@ function EditKematian() { setFormData({ ...formData, nama: e.target.value })} required /> @@ -117,7 +117,7 @@ function EditKematian() { type="date" label="Tanggal" placeholder="Masukkan tanggal" - value={formData.tanggal} + defaultValue={formData.tanggal} onChange={(e) => setFormData({ ...formData, tanggal: e.target.value })} required /> @@ -126,7 +126,7 @@ function EditKematian() { setFormData({ ...formData, jenisKelamin: e.target.value })} required /> @@ -135,7 +135,7 @@ function EditKematian() { setFormData({ ...formData, alamat: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/page.tsx index eeb7913b..41b4fa96 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/[id]/page.tsx @@ -102,13 +102,13 @@ function DetailKematian() { Alamat - {data?.alamat || '-'} + {data?.alamat || '-'} Penyebab - + diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/create/page.tsx index f9477dd5..2f1c92b7 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/persentase_data_kelahiran_kematian/kematian/create/page.tsx @@ -83,7 +83,7 @@ function CreateKematian() { (createState.create.form.nama = e.target.value)} required /> @@ -91,21 +91,21 @@ function CreateKematian() { type="date" label="Tanggal" placeholder="Masukkan tanggal" - value={createState.create.form.tanggal} + defaultValue={createState.create.form.tanggal} onChange={(e) => (createState.create.form.tanggal = e.target.value)} required /> (createState.create.form.jenisKelamin = e.target.value)} required /> (createState.create.form.alamat = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx index 8d330f3c..0765066b 100644 --- a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/edit/page.tsx @@ -120,7 +120,7 @@ function EditInfoWabahPenyakit() { > setFormData({ ...formData, name: e.target.value })} label="Judul" placeholder="Masukkan judul" @@ -128,7 +128,7 @@ function EditInfoWabahPenyakit() { /> setFormData({ ...formData, deskripsiSingkat: e.target.value })} label="Deskripsi Singkat" placeholder="Masukkan deskripsi singkat" diff --git a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/page.tsx index 9e96bd7f..0fe252f3 100644 --- a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/[id]/page.tsx @@ -84,7 +84,7 @@ function DetailInfoWabahPenyakit() { Deskripsi Singkat - {data.deskripsiSingkat || '-'} + {data.deskripsiSingkat || '-'} @@ -93,6 +93,7 @@ function DetailInfoWabahPenyakit() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.deskripsiLengkap }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/create/page.tsx index 0e0b6255..adb5eecc 100644 --- a/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/info-wabah-penyakit/create/page.tsx @@ -91,7 +91,7 @@ function CreateInfoWabahPenyakit() { > { infoWabahPenyakitState.create.form.name = val.target.value; }} @@ -101,7 +101,7 @@ function CreateInfoWabahPenyakit() { /> { infoWabahPenyakitState.create.form.deskripsiSingkat = val.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx index c8562fe0..034be6ba 100644 --- a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/edit/page.tsx @@ -118,7 +118,7 @@ function EditKontakDarurat() { > setFormData({ ...formData, name: e.target.value })} label="Judul" placeholder="Masukkan judul" diff --git a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/page.tsx index a1088693..e257cb6e 100644 --- a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/[id]/page.tsx @@ -78,6 +78,7 @@ function DetailKontakDarurat() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/create/page.tsx index d1767f6a..85596d33 100644 --- a/src/app/admin/(dashboard)/kesehatan/kontak-darurat/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/kontak-darurat/create/page.tsx @@ -96,7 +96,7 @@ function CreateKontakDarurat() { > { kontakDaruratState.create.form.name = val.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx index 5e9921b8..db92b42c 100644 --- a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/edit/page.tsx @@ -117,7 +117,7 @@ function EditPenangananDarurat() { > setFormData({ ...formData, name: e.target.value })} label="Judul" placeholder="Masukkan judul" diff --git a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/page.tsx index c7f11f9b..36967755 100644 --- a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/[id]/page.tsx @@ -78,6 +78,7 @@ function DetailPenangananDarurat() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.deskripsi }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/create/page.tsx index 89dc64ff..f28e0a92 100644 --- a/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/penanganan-darurat/create/page.tsx @@ -99,7 +99,7 @@ function CreatePenangananDarurat() { Judul} placeholder="Masukkan judul" - value={penangananDaruratState.create.form.name} + defaultValue={penangananDaruratState.create.form.name} onChange={(val) => { penangananDaruratState.create.form.name = val.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx index 606f2538..811c23f2 100644 --- a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/edit/page.tsx @@ -192,7 +192,7 @@ function EditPosyandu() { setFormData({ ...formData, name: e.target.value })} required /> @@ -201,7 +201,7 @@ function EditPosyandu() { setFormData({ ...formData, nomor: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/page.tsx index 3629f800..75af2397 100644 --- a/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/posyandu/[id]/page.tsx @@ -93,6 +93,7 @@ function DetailPosyandu() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> @@ -103,6 +104,7 @@ function DetailPosyandu() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.jadwalPelayanan || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/kesehatan/posyandu/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/posyandu/create/page.tsx index ad5047be..9542eefe 100644 --- a/src/app/admin/(dashboard)/kesehatan/posyandu/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/posyandu/create/page.tsx @@ -155,14 +155,14 @@ function CreatePosyandu() { (statePosyandu.create.form.name = e.target.value)} required /> (statePosyandu.create.form.nomor = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/edit/page.tsx index 97b20c03..fddce89c 100644 --- a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/edit/page.tsx @@ -120,7 +120,7 @@ function EditProgramKesehatan() { > setFormData({ ...formData, name: e.target.value })} label="Judul" placeholder="Masukkan judul" @@ -128,7 +128,7 @@ function EditProgramKesehatan() { /> setFormData({ ...formData, deskripsiSingkat: e.target.value })} label="Deskripsi Singkat" placeholder="Masukkan deskripsi singkat" diff --git a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/page.tsx index aae520f5..9749c14f 100644 --- a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/[id]/page.tsx @@ -73,12 +73,12 @@ function DetailProgramKesehatan() { Deskripsi Singkat - {data?.deskripsiSingkat || '-'} + {data?.deskripsiSingkat || '-'} Deskripsi - + diff --git a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/create/page.tsx index b98f19ed..c529868f 100644 --- a/src/app/admin/(dashboard)/kesehatan/program-kesehatan/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/program-kesehatan/create/page.tsx @@ -92,7 +92,7 @@ function CreateProgramKesehatan() { > { programKesehatanState.create.form.name = val.target.value; }} @@ -102,7 +102,7 @@ function CreateProgramKesehatan() { /> { programKesehatanState.create.form.deskripsiSingkat = val.target.value; }} diff --git a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx index 6b37fb05..a89a1547 100644 --- a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/edit/page.tsx @@ -183,7 +183,7 @@ function EditPuskesmas() { label="Nama Puskesmas" placeholder="Masukkan nama puskesmas" name="name" - value={formData.name} + defaultValue={formData.name} onChange={handleInputChange} required /> @@ -192,7 +192,7 @@ function EditPuskesmas() { label="Alamat" placeholder="Masukkan alamat" name="alamat" - value={formData.alamat} + defaultValue={formData.alamat} onChange={handleInputChange} required /> @@ -200,7 +200,7 @@ function EditPuskesmas() { handleNestedChange('jam', 'workDays', e.target.value)} required /> @@ -208,7 +208,7 @@ function EditPuskesmas() { handleNestedChange('jam', 'weekDays', e.target.value)} required /> @@ -216,7 +216,7 @@ function EditPuskesmas() { handleNestedChange('jam', 'holiday', e.target.value)} required /> @@ -224,28 +224,28 @@ function EditPuskesmas() { handleNestedChange('kontak', 'kontakPuskesmas', e.target.value)} /> handleNestedChange('kontak', 'email', e.target.value)} /> handleNestedChange('kontak', 'facebook', e.target.value)} /> handleNestedChange('kontak', 'kontakUGD', e.target.value)} /> diff --git a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/page.tsx index e2f8bef6..2384ae36 100644 --- a/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/puskesmas/[id]/page.tsx @@ -73,7 +73,7 @@ function DetailPuskesmas() { Alamat - {data?.alamat || '-'} + {data?.alamat || '-'} diff --git a/src/app/admin/(dashboard)/kesehatan/puskesmas/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/puskesmas/create/page.tsx index ff69d499..871b1235 100644 --- a/src/app/admin/(dashboard)/kesehatan/puskesmas/create/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/puskesmas/create/page.tsx @@ -100,40 +100,40 @@ function CreatePuskesmas() { (statePuskesmas.create.form.name = e.target.value)} required /> (statePuskesmas.create.form.alamat = e.target.value)} required /> (statePuskesmas.create.form.jam.workDays = e.target.value)} /> (statePuskesmas.create.form.jam.weekDays = e.target.value)} /> (statePuskesmas.create.form.jam.holiday = e.target.value)} /> (statePuskesmas.create.form.kontak.kontakPuskesmas = e.target.value) } @@ -141,19 +141,19 @@ function CreatePuskesmas() { (statePuskesmas.create.form.kontak.email = e.target.value)} /> (statePuskesmas.create.form.kontak.facebook = e.target.value)} /> (statePuskesmas.create.form.kontak.kontakUGD = e.target.value)} /> diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx index c9ed189e..a3117aae 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/[id]/edit/page.tsx @@ -139,7 +139,7 @@ function EditAPBDes() { setFormData({ ...formData, name: e.target.value })} required /> @@ -147,7 +147,7 @@ function EditAPBDes() { setFormData({ ...formData, jumlah: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx index 80af1a3f..1925e0a5 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx @@ -218,14 +218,14 @@ function CreateAPBDes() { (stateAPBDes.create.form.name = e.target.value)} required /> (stateAPBDes.create.form.jumlah = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/[id]/page.tsx index 5e22c5fe..5d270d80 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/[id]/page.tsx @@ -96,7 +96,7 @@ export default function EditKategoriDesaAntiKorupsi() { setFormData({ ...formData, name: e.target.value })} required disabled={isLoading} diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create/page.tsx index 2ecb3429..15e3645c 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/kategori-desa-anti-korupsi/create/page.tsx @@ -57,7 +57,7 @@ export default function CreateKategoriDesaAntiKorupsi() { (stateKategori.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/edit/page.tsx index 85592ca7..2041f002 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/edit/page.tsx @@ -144,7 +144,7 @@ export default function EditDesaAntiKorupsi() { setFormData({ ...formData, name: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/page.tsx index d72d0ac3..919eb39d 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/[id]/page.tsx @@ -83,7 +83,8 @@ export default function DetailKegiatanDesa() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: data.deskripsi || '-' }} - style={{ lineHeight: 1.6 }} + style={{ wordBreak: "break-word", whiteSpace: "normal", lineHeight: 1.6 }} + /> diff --git a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/create/page.tsx b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/create/page.tsx index ae196e20..1756842b 100644 --- a/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/desa-anti-korupsi/list-desa-anti-korupsi/create/page.tsx @@ -165,7 +165,7 @@ export default function CreateDesaAntiKorupsi() { (stateKorupsi.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx index 58e82afc..2737f578 100644 --- a/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/[id]/edit/page.tsx @@ -100,14 +100,10 @@ function EditResponden() { > - Nama Responden - - } + label="Nama Responden" type='text' placeholder="Masukkan nama responden" - value={formData.name} + defaultValue={formData.name} onChange={(val) => { setFormData({ ...formData, @@ -118,14 +114,10 @@ function EditResponden() { required /> - Tanggal - - } + label="Tanggal" type="date" placeholder='Pilih tanggal' - value={formData.tanggal ? new Date(formData.tanggal).toISOString().split('T')[0] : ''} + defaultValue={formData.tanggal ? new Date(formData.tanggal).toISOString().split('T')[0] : ''} onChange={(e) => { const selectedDate = e.currentTarget.value; setFormData({ diff --git a/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/create/page.tsx b/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/create/page.tsx index 9feb87e7..7056c869 100644 --- a/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/indeks-kepuasan-masyarakat/responden/create/page.tsx @@ -64,7 +64,7 @@ function RespondenCreate() { label="Nama" type='text' placeholder="masukkan nama" - value={stategrafikBerdasarkanResponden.create.form.name} + defaultValue={stategrafikBerdasarkanResponden.create.form.name} onChange={(val) => { stategrafikBerdasarkanResponden.create.form.name = val.currentTarget.value; }} @@ -73,7 +73,7 @@ function RespondenCreate() { label="Tanggal" type="date" placeholder="masukkan tanggal" - value={stategrafikBerdasarkanResponden.create.form.tanggal} + defaultValue={stategrafikBerdasarkanResponden.create.form.tanggal} onChange={(val) => { stategrafikBerdasarkanResponden.create.form.tanggal = val.currentTarget.value; }} diff --git a/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/[id]/page.tsx index db646f03..50a0cf3d 100644 --- a/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/[id]/page.tsx @@ -94,7 +94,7 @@ function EditKategoriPrestasi() { setFormData({ ...formData, name: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/create/page.tsx b/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/create/page.tsx index da45b56b..c03a0ba6 100644 --- a/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/prestasi-desa/kategori-prestasi-desa/create/page.tsx @@ -54,7 +54,7 @@ function CreateKategoriPrestasi() { (stateKategori.create.form.name = val.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/edit/page.tsx index 4ba12632..aa2b2112 100644 --- a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/edit/page.tsx @@ -134,7 +134,7 @@ function EditPrestasiDesa() { { setFormData({ ...formData, diff --git a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/page.tsx index 97f0f67a..d7c3ecba 100644 --- a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/[id]/page.tsx @@ -82,6 +82,7 @@ function DetailPrestasiDesa() { fz="md" c="dimmed" dangerouslySetInnerHTML={{ __html: detailState.findUnique.data?.deskripsi || '-' }} + style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> diff --git a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/create/page.tsx b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/create/page.tsx index 25025d19..1a7530e1 100644 --- a/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/prestasi-desa/list-prestasi-desa/create/page.tsx @@ -141,7 +141,7 @@ function CreatePrestasiDesa() { (stateCreate.create.form.name = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/[id]/edit/page.tsx index a0320bff..5d36542c 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/[id]/edit/page.tsx @@ -161,7 +161,7 @@ function EditMediaSosial() { setFormData({ ...formData, name: e.target.value })} required /> @@ -169,7 +169,7 @@ function EditMediaSosial() { setFormData({ ...formData, iconUrl: e.target.value })} required /> diff --git a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx index 7101c3af..ae615815 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx @@ -138,14 +138,14 @@ export default function CreateMediaSosial() { (stateMediaSosial.create.form.name = e.target.value)} required /> (stateMediaSosial.create.form.iconUrl = e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx index c02906ee..0a0bfa02 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx @@ -170,7 +170,7 @@ function EditPejabatDesa() { Nama Perbekel} placeholder="Masukkan nama perbekel" - value={allState.edit.form.name} + defaultValue={allState.edit.form.name} onChange={(e) => handleFieldChange('name', e.currentTarget.value)} error={!allState.edit.form.name && "Nama wajib diisi"} /> @@ -179,7 +179,7 @@ function EditPejabatDesa() { Posisi} placeholder="Masukkan posisi" - value={allState.edit.form.position} + defaultValue={allState.edit.form.position} onChange={(e) => handleFieldChange('position', e.currentTarget.value)} error={!allState.edit.form.position && "Posisi wajib diisi"} /> diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx index 4d72ce2b..e5e8ef4d 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx @@ -173,7 +173,7 @@ function EditProgramInovasi() { setFormData({ ...formData, name: e.target.value })} required /> @@ -192,7 +192,7 @@ function EditProgramInovasi() { setFormData({ ...formData, link: e.target.value })} /> diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx index 428524b1..8d57d922 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/page.tsx @@ -82,7 +82,7 @@ function DetailProgramInovasi() { Deskripsi - + diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx index e214827a..de402dd6 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx @@ -144,7 +144,7 @@ function CreateProgramInovasi() { (stateProgramInovasi.create.form.name = e.target.value)} required /> @@ -162,7 +162,7 @@ function CreateProgramInovasi() { (stateProgramInovasi.create.form.link = e.target.value)} /> diff --git a/src/app/admin/(dashboard)/landing-page/sdgs-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/sdgs-desa/[id]/edit/page.tsx index b3003d71..3383e85e 100644 --- a/src/app/admin/(dashboard)/landing-page/sdgs-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/sdgs-desa/[id]/edit/page.tsx @@ -175,7 +175,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, name: e.target.value })} required /> @@ -183,7 +183,7 @@ function EditKolaborasiInovasi() { setFormData({ ...formData, jumlah: e.target.value })} required type="number" diff --git a/src/app/admin/(dashboard)/landing-page/sdgs-desa/create/page.tsx b/src/app/admin/(dashboard)/landing-page/sdgs-desa/create/page.tsx index 0acf75f9..0b1b6517 100644 --- a/src/app/admin/(dashboard)/landing-page/sdgs-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/sdgs-desa/create/page.tsx @@ -159,7 +159,7 @@ function CreateSDGsDesa() { } placeholder="Masukkan jumlah" - value={stateSDGSDesa.create.form.jumlah} + defaultValue={stateSDGSDesa.create.form.jumlah} onChange={(val) => { stateSDGSDesa.create.form.jumlah = val.target.value; }} @@ -167,14 +167,6 @@ function CreateSDGsDesa() { min={0} radius="md" /> - { - console.log(val.target.value) - }} - - /> - @@ -102,8 +116,8 @@ function EditVideo() { setFormData({ ...formData, name: e.target.value })} + value={formData.name} + onChange={(e) => handleChange('name', e.currentTarget.value)} required /> @@ -111,8 +125,8 @@ function EditVideo() { setFormData({ ...formData, linkVideo: e.currentTarget.value })} + value={formData.linkVideo} + onChange={(e) => handleChange('linkVideo', e.currentTarget.value)} required /> {embedLink && ( @@ -135,7 +149,7 @@ function EditVideo() { setFormData({ ...formData, deskripsi: val })} + onChange={(val) => handleChange('deskripsi', val)} /> diff --git a/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/edit/page.tsx index e3500a06..bd56c1c3 100644 --- a/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/edit/page.tsx @@ -1,17 +1,17 @@ -'use client' /* eslint-disable react-hooks/exhaustive-deps */ +'use client' import stateLayananDesa from '@/app/admin/(dashboard)/_state/desa/layananDesa'; import colors from '@/con/colors'; import { - Box, - Button, - Group, - Paper, - Select, - Stack, - TextInput, - Title, - Tooltip + Box, + Button, + Group, + Paper, + Select, + Stack, + TextInput, + Title, + Tooltip, } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -20,159 +20,159 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; function EditAjukanPermohonan() { - const router = useRouter(); - const params = useParams(); - const stateAjukan = useProxy(stateLayananDesa.ajukanPermohonan); + const router = useRouter(); + const params = useParams(); + const stateAjukan = useProxy(stateLayananDesa.ajukanPermohonan); - const [formData, setFormData] = useState({ - nama: stateAjukan.edit.form.nama, - nik: stateAjukan.edit.form.nik, - alamat: stateAjukan.edit.form.alamat, - nomorKk: stateAjukan.edit.form.nomorKk, - kategoriId: stateAjukan.edit.form.kategoriId, - }); + // State lokal form + const [formData, setFormData] = useState({ + nama: '', + nik: '', + alamat: '', + nomorKk: '', + kategoriId: '', + }); - useEffect(() => { - stateLayananDesa.suratKeterangan.findManyAll.load(); - const loadAjukan = async () => { - const id = params?.id as string; - if (!id) return; + // Load data awal + useEffect(() => { + stateLayananDesa.suratKeterangan.findManyAll.load(); - try { - const data = await stateAjukan.edit.load(id); - if (data) { - setFormData({ - nama: data.nama || '', - nik: data.nik || '', - alamat: data.alamat || '', - nomorKk: data.nomorKk || '', - kategoriId: data.kategoriId || '', - }); - } - } catch (error) { - console.error('Error loading ajukan:', error); - toast.error('Gagal memuat data ajukan'); - } - }; + const loadAjukan = async () => { + const id = params?.id as string; + if (!id) return; - loadAjukan(); - }, [params?.id]); - - const handleSubmit = async () => { - try { - stateAjukan.edit.form = { - ...stateAjukan.edit.form, - ...formData, - }; - toast.success('Ajukan berhasil diperbarui!'); - router.push('/admin/desa/layanan/ajukan_permohonan'); - } catch (error) { - console.error('Error updating ajukan:', error); - toast.error('Terjadi kesalahan saat memperbarui ajukan'); + try { + const data = await stateAjukan.edit.load(id); + if (data) { + setFormData({ + nama: data.nama || '', + nik: data.nik || '', + alamat: data.alamat || '', + nomorKk: data.nomorKk || '', + kategoriId: data.kategoriId || '', + }); } + } catch (error) { + console.error('Error loading ajukan:', error); + toast.error('Gagal memuat data ajukan'); + } }; - return ( - - {/* Back Button */} - - - - - - Edit Ajukan Permohonan - - + loadAjukan(); + }, [params?.id]); - { + setFormData((prev) => ({ + ...prev, + [field]: value, + })); + }; + + const handleSubmit = async () => { + try { + stateAjukan.edit.form = { + ...stateAjukan.edit.form, + ...formData, + }; + toast.success('Ajukan berhasil diperbarui!'); + router.push('/admin/desa/layanan/ajukan_permohonan'); + } catch (error) { + console.error('Error updating ajukan:', error); + toast.error('Terjadi kesalahan saat memperbarui ajukan'); + } + }; + + return ( + + {/* Back Button */} + + + + + + Edit Ajukan Permohonan + + + + + + handleChange('nama', e.target.value)} + required + /> + + handleChange('nik', e.target.value)} + required + /> + + handleChange('alamat', e.target.value)} + required + /> + + handleChange('nomorKk', e.target.value)} + required + /> + + ({ - label: item.name, - value: item.id, - }))} - value={formData.kategoriId || null} - onChange={(val: string | null) => { - if (val) { - const selected = stateLayananDesa.suratKeterangan.findMany.data?.find( - (item) => item.id === val - ); - if (selected) { - stateAjukan.edit.form.kategoriId = selected.id; - } - } else { - stateAjukan.edit.form.kategoriId = ''; - } - }} - searchable - clearable - nothingFoundMessage="Tidak ditemukan" - required - /> - - - - - - - - ); + Simpan + + + + + + ); } export default EditAjukanPermohonan; diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/edit/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/edit/page.tsx index b6264dec..7f26b666 100644 --- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/edit/page.tsx +++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/edit/page.tsx @@ -1,9 +1,20 @@ -'use client' /* eslint-disable react-hooks/exhaustive-deps */ +'use client' + import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import stateLayananDesa from '@/app/admin/(dashboard)/_state/desa/layananDesa'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { + Box, + Button, + Group, + Paper, + Stack, + Text, + TextInput, + Title, + Tooltip, +} from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -12,17 +23,22 @@ import { useProxy } from 'valtio/utils'; function EditPelayananPendudukNonPermanent() { const router = useRouter(); - const params = useParams() - const statePendudukNonPermanent = useProxy(stateLayananDesa.pelayananPendudukNonPermanen) - const [formData, setFormData] = useState({ - name: statePendudukNonPermanent.findById.data?.name || '', - deskripsi: statePendudukNonPermanent.findById.data?.deskripsi || '', - }) + const params = useParams(); + const statePendudukNonPermanent = useProxy( + stateLayananDesa.pelayananPendudukNonPermanen + ); + const [formData, setFormData] = useState({ + name: '', + deskripsi: '', + }); + + // Load data sekali dari backend useEffect(() => { - const loadPelayananPerizinan = async () => { + const loadData = async () => { const id = params?.id as string; if (!id) return; + try { const data = await statePendudukNonPermanent.update.load(id); if (data) { @@ -32,27 +48,48 @@ function EditPelayananPendudukNonPermanent() { }); } } catch (error) { - console.error("Error loading pelayanan perizinan berusaha:", error); - toast.error("Gagal memuat data pelayanan perizinan berusaha"); + console.error('Error loading data:', error); + toast.error('Gagal memuat data pelayanan penduduk non permanent'); } }; - loadPelayananPerizinan(); + + loadData(); }, [params?.id]); + const handleChange = + (field: keyof typeof formData) => + (value: string) => { + setFormData((prev) => ({ + ...prev, + [field]: value, + })); + }; + const handleSubmit = async () => { - if (statePendudukNonPermanent.findById.data) { - statePendudukNonPermanent.findById.data.name = formData.name; - statePendudukNonPermanent.findById.data.deskripsi = formData.deskripsi; - statePendudukNonPermanent.update.update(statePendudukNonPermanent.findById.data) - } - router.push('/admin/desa/layanan/pelayanan_penduduk_non_permanent') - } + if (!statePendudukNonPermanent.findById.data) return; + + // Update global state hanya di submit + const updated = { + ...statePendudukNonPermanent.findById.data, + name: formData.name, + deskripsi: formData.deskripsi, + }; + + await statePendudukNonPermanent.update.update(updated); + router.push('/admin/desa/layanan/pelayanan_penduduk_non_permanent'); + }; + return ( - @@ -62,7 +99,7 @@ function EditPelayananPendudukNonPermanent() { - setFormData({ ...formData, name: e.target.value }) - } + value={formData.name} + onChange={(e) => handleChange('name')(e.target.value)} required /> - {/* Posisi Field */} + {/* Deskripsi Field */} Deskripsi { - setFormData((prev) => ({ ...prev, deskripsi: htmlContent })); - }} + onChange={handleChange('deskripsi')} /> @@ -104,7 +137,9 @@ function EditPelayananPendudukNonPermanent() { loading={statePendudukNonPermanent.update.loading} disabled={!formData.name} > - {statePendudukNonPermanent.update.loading ? 'Menyimpan...' : 'Simpan Perubahan'} + {statePendudukNonPermanent.update.loading + ? 'Menyimpan...' + : 'Simpan Perubahan'} @@ -69,7 +99,7 @@ function EditPelayananPerizinanBerusaha() { {/* Form Section */} setFormData({ ...formData, name: e.target.value })} + value={formData.name} + onChange={(e) => handleChange('name')(e.target.value)} required /> @@ -92,8 +122,8 @@ function EditPelayananPerizinanBerusaha() { setFormData({ ...formData, link: e.target.value })} + value={formData.link} + onChange={(e) => handleChange('link')(e.target.value)} /> {/* Deskripsi Field */} @@ -101,7 +131,7 @@ function EditPelayananPerizinanBerusaha() { Deskripsi setFormData({ ...formData, deskripsi: val })} + onChange={handleChange('deskripsi')} /> @@ -113,7 +143,9 @@ function EditPelayananPerizinanBerusaha() { loading={statePerizinanBerusaha.update.loading} disabled={!formData.name} > - {statePerizinanBerusaha.update.loading ? 'Menyimpan...' : 'Simpan Perubahan'} + {statePerizinanBerusaha.update.loading + ? 'Menyimpan...' + : 'Simpan Perubahan'} diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx index f1c1f484..84cb3baf 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx @@ -97,17 +97,21 @@ function ListDesaDigitalSmartVillage({ search }: { search: string }) { filteredData.map((item) => ( - - {item.name} - + + + {item.name} + + - + + + @@ -170,74 +188,70 @@ function EditPejabatDesa() { Nama Perbekel} placeholder="Masukkan nama perbekel" - defaultValue={allState.edit.form.name} - onChange={(e) => handleFieldChange('name', e.currentTarget.value)} - error={!allState.edit.form.name && "Nama wajib diisi"} + value={formData.name} + onChange={(e) => handleChange('name', e.currentTarget.value)} + error={!formData.name && "Nama wajib diisi"} /> {/* Posisi Field */} Posisi} placeholder="Masukkan posisi" - defaultValue={allState.edit.form.position} - onChange={(e) => handleFieldChange('position', e.currentTarget.value)} - error={!allState.edit.form.position && "Posisi wajib diisi"} + value={formData.position} + onChange={(e) => handleChange('position', e.currentTarget.value)} + error={!formData.position && "Posisi wajib diisi"} /> {/* File Upload */} Gambar - - handleFileChange(files[0])} - onReject={() => toast.error('File tidak valid.')} - maxSize={5 * 1024 ** 2} // Maks 5MB - accept={{ 'image/*': [] }} - > - - - - - - - - - - + handleFileChange(files[0])} + onReject={() => toast.error('File tidak valid.')} + maxSize={5 * 1024 ** 2} + accept={{ 'image/*': [] }} + > + + + + + + + + + + -
- - Drag gambar ke sini atau klik untuk pilih file - - - Maksimal 5MB dan harus format gambar - -
-
-
+
+ + Drag gambar ke sini atau klik untuk pilih file + + + Maksimal 5MB dan harus format gambar + +
+
+
- {/* Tampilkan preview kalau ada */} - {previewImage && ( - - Preview - - )} - -
+ {previewImage && ( + + Preview + + )}
- {/* Preview Gambar */} + {/* Preview */} Preview Gambar {previewImage ? ( @@ -252,13 +266,13 @@ function EditPejabatDesa() { )} - {/* Submit Button */} + {/* Submit */} @@ -278,4 +292,4 @@ function EditPejabatDesa() { ); } -export default EditPejabatDesa; \ No newline at end of file +export default EditPejabatDesa; diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx index e5e8ef4d..d4b44eb3 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx @@ -31,10 +31,10 @@ function EditProgramInovasi() { const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const [formData, setFormData] = useState({ - name: stateProgramInovasi.update.form.name || "", - description: stateProgramInovasi.update.form.description || "", - imageId: stateProgramInovasi.update.form.imageId || "", - link: stateProgramInovasi.update.form.link || "", + name: "", + description: "", + imageId: "", + link: "", }) useEffect(() => { @@ -51,9 +51,12 @@ function EditProgramInovasi() { imageId: data.imageId || "", link: data.link || "" }); - // Tampilkan preview gambar + + // Preview image if (data.image?.link) { setPreviewImage(data.image.link); + } else { + setPreviewImage(null); } } } catch (error) { @@ -69,24 +72,25 @@ function EditProgramInovasi() { const handleSubmit = async () => { try { + // Upload file kalau ada file baru + let imageId = formData.imageId; + if (file) { + const res = await ApiFetch.api.fileStorage.create.post({ file, name: file.name }); + const uploaded = res.data?.data; + if (!uploaded?.id) { + return toast.error("Gagal upload gambar"); + } + imageId = uploaded.id; + } + + // Update global state form (baru di sini) stateProgramInovasi.update.form = { ...stateProgramInovasi.update.form, name: formData.name, description: formData.description, - imageId: formData.imageId, + imageId, link: formData.link, } - if (file) { - const res = await ApiFetch.api.fileStorage.create.post({ file, name: file.name }); - const uploaded = res.data?.data; - - if (!uploaded?.id) { - return toast.error("Gagal upload gambar"); - } - - // Update imageId in global state - stateProgramInovasi.update.form.imageId = uploaded.id; - } await stateProgramInovasi.update.update(); toast.success("Program Inovasi berhasil diperbarui!"); @@ -170,29 +174,31 @@ function EditProgramInovasi() { )} + setFormData({ ...formData, name: e.target.value })} required /> - Deskripsi + Deskripsi { - setFormData((prev) => ({ ...prev, description: htmlContent })); - stateProgramInovasi.update.form.description = htmlContent; - }} + onChange={(htmlContent) => + setFormData((prev) => ({ ...prev, description: htmlContent })) + } /> setFormData({ ...formData, link: e.target.value })} /> diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx index acc56ac6..b7addeaf 100644 --- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx @@ -115,7 +115,7 @@ function ListDataLingkunganDesa({ search }: { search: string }) { Daftar Data Lingkungan Desa - diff --git a/src/app/api/[[...slugs]]/_lib/desa/layanan/ajukan_permohonan/findUnique.ts b/src/app/api/[[...slugs]]/_lib/desa/layanan/ajukan_permohonan/findUnique.ts index 1eb4db95..99e6f442 100644 --- a/src/app/api/[[...slugs]]/_lib/desa/layanan/ajukan_permohonan/findUnique.ts +++ b/src/app/api/[[...slugs]]/_lib/desa/layanan/ajukan_permohonan/findUnique.ts @@ -1,9 +1,7 @@ import prisma from "@/lib/prisma"; -export default async function findUniqueAjukanPermohonan(request: Request) { - const url = new URL(request.url); - const pathSegments = url.pathname.split("/"); - const id = pathSegments[pathSegments.length - 1]; +export default async function findUniqueAjukanPermohonan({ params }: { params: { id: string } }) { + const { id } = params; if (!id) { return Response.json( diff --git a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/findByMonthYear.ts b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/findByMonthYear.ts index af787cd4..c733ae0b 100644 --- a/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/findByMonthYear.ts +++ b/src/app/api/[[...slugs]]/_lib/ekonomi/jumlah-pengangguran/detail-data-pengangguran/findByMonthYear.ts @@ -1,8 +1,8 @@ import prisma from "@/lib/prisma"; -import { Context } from "elysia"; -export default async function findByMonthYear(context: Context) { - const { month, year } = context.params as { month: string; year: string }; + +export default async function findByMonthYear({ params }: { params: { month: string; year: number } }) { + const { month, year } = params; if (!month || !year) { return { diff --git a/src/app/api/[[...slugs]]/_lib/img.ts b/src/app/api/[[...slugs]]/_lib/img.ts index 4752afbf..84cab823 100644 --- a/src/app/api/[[...slugs]]/_lib/img.ts +++ b/src/app/api/[[...slugs]]/_lib/img.ts @@ -23,7 +23,9 @@ async function img({ // Validasi ekstensi file if (![".jpg", ".jpeg", ".png"].includes(ext)) { console.warn(`Ekstensi file tidak didukung: ${ext}`); - return new Response(await fs.readFile(noImage), { + const buffer = await fs.readFile(noImage); + const uint8Array = new Uint8Array(buffer); + return new Response(new Blob([uint8Array], { type: 'image/jpeg' }), { headers: { "Content-Type": "image/jpeg" }, }); } @@ -43,7 +45,8 @@ async function img({ .resize(size || metadata.width) // Gunakan size jika diberikan, jika tidak gunakan width asli .toBuffer(); - return new Response(resizedImageBuffer, { + const uint8Array = new Uint8Array(resizedImageBuffer); + return new Response(new Blob([uint8Array], { type: 'image/jpeg' }), { headers: { "Cache-Control": "public, max-age=3600, stale-while-revalidate=600", "Content-Type": "image/jpeg", @@ -52,7 +55,9 @@ async function img({ } catch (error) { console.error(`Gagal memproses file: ${name}`, error); // Jika file tidak ditemukan atau gagal diproses, kembalikan default image - return new Response(await fs.readFile(noImage), { + const buffer = await fs.readFile(noImage); + const uint8Array = new Uint8Array(buffer); + return new Response(new Blob([uint8Array], { type: 'image/jpeg' }), { headers: { "Content-Type": "image/jpeg" }, }); } diff --git a/src/app/api/[[...slugs]]/_lib/inovasi/layanan-online-desa/pengaduan-masyarakat/findUnique.ts b/src/app/api/[[...slugs]]/_lib/inovasi/layanan-online-desa/pengaduan-masyarakat/findUnique.ts index bb0009a7..0e00fcb4 100644 --- a/src/app/api/[[...slugs]]/_lib/inovasi/layanan-online-desa/pengaduan-masyarakat/findUnique.ts +++ b/src/app/api/[[...slugs]]/_lib/inovasi/layanan-online-desa/pengaduan-masyarakat/findUnique.ts @@ -1,9 +1,7 @@ import prisma from "@/lib/prisma"; -export default async function pengaduanMasyarakatFindUnique(request: Request) { - const url = new URL(request.url); - const pathSegments = url.pathname.split("/"); - const id = pathSegments[pathSegments.length - 1]; +export default async function pengaduanMasyarakatFindUnique({ params }: { params: { id: string } }) { + const { id } = params; if (!id) { return Response.json({ diff --git a/src/app/darmasaba/(pages)/ekonomi/PADesa-pendapatan-asli-desa/page.tsx b/src/app/darmasaba/(pages)/ekonomi/PADesa-pendapatan-asli-desa/page.tsx index 75553230..9d54ae10 100644 --- a/src/app/darmasaba/(pages)/ekonomi/PADesa-pendapatan-asli-desa/page.tsx +++ b/src/app/darmasaba/(pages)/ekonomi/PADesa-pendapatan-asli-desa/page.tsx @@ -1,11 +1,174 @@ +// 'use client' +// import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa'; +// import colors from '@/con/colors'; +// import { Box, Grid, GridCol, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core'; +// import { useProxy } from 'valtio/utils'; +// import BackButton from '../../desa/layanan/_com/BackButto'; +// import { useShallowEffect } from '@mantine/hooks'; + + +// function Page() { +// const state = useProxy(PendapatanAsliDesa.ApbDesa); + +// useShallowEffect(() => { +// state.findMany.load(); +// }, []); + +// useShallowEffect(() => { +// PendapatanAsliDesa.pembiayaan.findMany.load(); +// PendapatanAsliDesa.belanja.findMany.load(); +// PendapatanAsliDesa.pendapatan.findMany.load(); +// }, []); + +// // Get the latest APB data +// const latestApb = state.findMany.data?.[0]; + +// // Calculate totals +// const totalPendapatan = latestApb?.pendapatan?.reduce((sum, item) => sum + (item?.value || 0), 0) || 0; +// const totalBelanja = latestApb?.belanja?.reduce((sum, item) => sum + (item?.value || 0), 0) || 0; +// const totalPembiayaan = latestApb?.pembiayaan?.reduce((sum, item) => sum + (item?.value || 0), 0) || 0; + + +// return ( +// +// +// +// +// +// Pendapatan Asli Desa +// +// +// +// +// +// {/* Pendapatan Card */} +// +// +// Pendapatan +// {PendapatanAsliDesa.pendapatan.findMany.data?.map((item) => ( +// +// +// +// {item.name} +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(item.value)} +// +// +// +// ))} +// +// +// Total Pendapatan +// +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(totalPendapatan)} +// +// +// +// +// + +// {/* Belanja Card */} +// +// +// Belanja +// {PendapatanAsliDesa.belanja.findMany.data?.map((item) => ( +// +// +// +// {item.name} +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(item.value)} +// +// +// +// ))} +// +// +// Total Belanja +// +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(totalBelanja)} +// +// +// +// +// + +// {/* Pembiayaan Card */} +// +// +// Pembiayaan +// {PendapatanAsliDesa.pembiayaan.findMany.data?.map((item) => ( +// +// +// +// {item.name} +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(item.value)} +// +// +// +// ))} +// +// +// Total Pembiayaan +// +// +// +// {new Intl.NumberFormat('id-ID', { +// style: 'currency', +// currency: 'IDR', +// minimumFractionDigits: 0 +// }).format(totalPembiayaan)} +// +// +// +// +// + +// +// +// +// +// +// ); +// } + +// export default Page; + 'use client' import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa'; import colors from '@/con/colors'; -import { Box, Grid, GridCol, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core'; +import { Box, Paper, SimpleGrid, Stack, Table, Text, Title } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; import { useProxy } from 'valtio/utils'; import BackButton from '../../desa/layanan/_com/BackButto'; -import { useShallowEffect } from '@mantine/hooks'; - function Page() { const state = useProxy(PendapatanAsliDesa.ApbDesa); @@ -28,6 +191,9 @@ function Page() { const totalBelanja = latestApb?.belanja?.reduce((sum, item) => sum + (item?.value || 0), 0) || 0; const totalPembiayaan = latestApb?.pembiayaan?.reduce((sum, item) => sum + (item?.value || 0), 0) || 0; + // Hasil akhir + const sisaAnggaran = totalPendapatan - totalBelanja - totalPembiayaan; + return ( @@ -40,119 +206,51 @@ function Page() { - {/* Pendapatan Card */} - - - Pendapatan - {PendapatanAsliDesa.pendapatan.findMany.data?.map((item) => ( - - - - {item.name} - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(item.value)} - - - - ))} - - - Total Pendapatan - - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(totalPendapatan)} - - - - - - - {/* Belanja Card */} - - - Belanja - {PendapatanAsliDesa.belanja.findMany.data?.map((item) => ( - - - - {item.name} - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(item.value)} - - - - ))} - - - Total Belanja - - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(totalBelanja)} - - - - - - - {/* Pembiayaan Card */} - - - Pembiayaan - {PendapatanAsliDesa.pembiayaan.findMany.data?.map((item) => ( - - - - {item.name} - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(item.value)} - - - - ))} - - - Total Pembiayaan - - - - {new Intl.NumberFormat('id-ID', { - style: 'currency', - currency: 'IDR', - minimumFractionDigits: 0 - }).format(totalPembiayaan)} - - - - - - + {/* Pendapatan, Belanja, Pembiayaan Card sama seperti sebelumnya */} + {/* ... */} + + {/* 🔽 Tambahan Ringkasan Anggaran */} + + Ringkasan Anggaran + + + + Keterangan + Jumlah + + + + + Total Pendapatan + + {new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(totalPendapatan)} + + + + Total Belanja + + {new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(totalBelanja)} + + + + Total Pembiayaan + + {new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(totalPembiayaan)} + + + + Sisa Anggaran + = 0 ? "blue" : "red"}> + + {new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0 }).format(sisaAnggaran)} + + + + +
+
@@ -160,3 +258,4 @@ function Page() { } export default Page; + diff --git a/src/app/darmasaba/(pages)/keamanan/keamanan-lingkungan-pecalang-patwal/page.tsx b/src/app/darmasaba/(pages)/keamanan/keamanan-lingkungan-pecalang-patwal/page.tsx index 2d866b1c..238b41ef 100644 --- a/src/app/darmasaba/(pages)/keamanan/keamanan-lingkungan-pecalang-patwal/page.tsx +++ b/src/app/darmasaba/(pages)/keamanan/keamanan-lingkungan-pecalang-patwal/page.tsx @@ -1,7 +1,7 @@ 'use client' import keamananLingkunganState from '@/app/admin/(dashboard)/_state/keamanan/keamanan-lingkungan'; import colors from '@/con/colors'; -import { Box, Center, Grid, GridCol, Image, Pagination, Paper, SimpleGrid, Skeleton, Stack, Text, TextInput } from '@mantine/core'; +import { Box, Center, Grid, GridCol, Image, Pagination, Paper, SimpleGrid, Skeleton, Spoiler, Stack, Text, TextInput } from '@mantine/core'; import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconSearch } from '@tabler/icons-react'; import { useState } from 'react'; @@ -11,6 +11,7 @@ import BackButton from '../../desa/layanan/_com/BackButto'; function Page() { const state = useProxy(keamananLingkunganState) + const [expandedMap, setExpandedMap] = useState>({}); const [search, setSearch] = useState('') const [debouncedSearch] = useDebouncedValue(search, 500); // 500ms delay const { @@ -25,6 +26,13 @@ function Page() { load(page, 3, debouncedSearch) }, [page, debouncedSearch]) + const toggleExpanded = (index: number, value: boolean) => { + setExpandedMap((prev) => ({ + ...prev, + [index]: value, + })); + }; + if (loading || !data) { return ( @@ -80,7 +88,22 @@ function Page() { {v.name} - + + Show more + + } + hideLabel={ + + Hide details + + } + expanded={expandedMap[k] || false} + onExpandedChange={(val) => toggleExpanded(k, val)} + > + + @@ -89,7 +112,7 @@ function Page() { })} - +
{data.length > 0 ? ( data.map((item) => ( - router.push(`/darmasaba/keamanan/pencegahan-kriminalitas/${item.id}`)}> - - + router.push(`/darmasaba/keamanan/pencegahan-kriminalitas/${item.id}`)}> + + {item.judul} - - - - + + + )) ) : ( diff --git a/src/app/darmasaba/(pages)/pendidikan/beasiswa-desa/page.tsx b/src/app/darmasaba/(pages)/pendidikan/beasiswa-desa/page.tsx index dca68008..2b616538 100644 --- a/src/app/darmasaba/(pages)/pendidikan/beasiswa-desa/page.tsx +++ b/src/app/darmasaba/(pages)/pendidikan/beasiswa-desa/page.tsx @@ -76,7 +76,7 @@ function Page() { - Beasiswa Desa + Beasiswa Desa From 63054cedf0111c5d6bc362f3a3523c087a32ddf1 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 30 Sep 2025 21:41:26 +0800 Subject: [PATCH 04/56] fix inputan edit menu: desa, ekonomi, inovasi, keamanan, kesehatan, landing-page, & lingkungan --- .../kategori-pengumuman/[id]/page.tsx | 24 +- .../list-pengumuman/[id]/edit/page.tsx | 36 +- .../potensi/kategori-potensi/[id]/page.tsx | 24 +- .../potensi/list-potensi/[id]/edit/page.tsx | 54 ++- .../[id]/edit/page.tsx | 37 +- .../apbdesa/[id]/edit/page.tsx | 61 ++- .../belanja/[id]/page.tsx | 30 +- .../pembiayaan/[id]/page.tsx | 27 +- .../pendapatan/[id]/page.tsx | 32 +- .../ekonomi/demografi-pekerjaan/[id]/page.tsx | 57 ++- .../jumlah-penduduk-miskin/[id]/page.tsx | 57 ++- .../[id]/page.tsx | 57 ++- .../[id]/page.tsx | 72 ++- .../jumlah-pengangguran/[id]/edit/page.tsx | 163 ++++--- .../lowongan-kerja-lokal/[id]/edit/page.tsx | 52 ++- .../pasar-desa/kategori-produk/[id]/page.tsx | 44 +- .../produk-pasar-desa/[id]/edit/page.tsx | 65 ++- .../program-kemiskinan/[id]/edit/page.tsx | 119 +++-- .../sektor-unggulan-desa/[id]/edit/page.tsx | 66 +-- .../hubungan-organisasi/[id]/page.tsx | 66 ++- .../pegawai/[id]/edit/page.tsx | 189 ++++---- .../posisi-organisasi/[id]/page.tsx | 27 +- .../[id]/edit/page.tsx | 145 +++--- .../[id]/edit/page.tsx | 26 +- .../[id]/edit/page.tsx | 50 ++- .../mitra-kolaborasi/[id]/page.tsx | 47 +- .../jenis-layanan/[id]/edit/page.tsx | 68 +-- .../jenis-pengaduan/[id]/page.tsx | 62 +-- .../program-kreatif-desa/[id]/edit/page.tsx | 49 +- .../[id]/edit/page.tsx | 44 +- .../kontak-darurat-item/[id]/edit/page.tsx | 29 +- .../[id]/edit/page.tsx | 61 ++- .../laporan-publik/[id]/edit/page.tsx | 69 +-- .../[id]/edit/page.tsx | 40 +- .../polsek-terdekat/[id]/edit/page.tsx | 155 +++---- .../keamanan/tips-keamanan/[id]/edit/page.tsx | 51 ++- .../artikel_kesehatan/[id]/edit/page.tsx | 287 ++++++------ .../fasilitas_kesehatan/[id]/edit/page.tsx | 228 ++++------ .../grafik_hasil_kepuasan/[id]/edit/page.tsx | 95 ++-- .../jadwal_kegiatan/[id]/edit/page.tsx | 172 +++---- .../kelahiran/[id]/edit/page.tsx | 265 ++++++----- .../kematian/[id]/edit/page.tsx | 290 ++++++------ .../info-wabah-penyakit/[id]/edit/page.tsx | 81 ++-- .../kontak-darurat/[id]/edit/page.tsx | 55 ++- .../penanganan-darurat/[id]/edit/page.tsx | 85 ++-- .../kesehatan/posyandu/[id]/edit/page.tsx | 424 +++++++++--------- .../program-kesehatan/[id]/edit/page.tsx | 105 ++--- .../kesehatan/puskesmas/[id]/edit/page.tsx | 37 +- .../landing-page/apbdes/[id]/edit/page.tsx | 203 +++------ .../kategori-desa-anti-korupsi/[id]/page.tsx | 64 +-- .../list-desa-anti-korupsi/[id]/edit/page.tsx | 137 +++--- .../responden/[id]/edit/page.tsx | 255 +++++------ .../kategori-prestasi-desa/[id]/page.tsx | 63 ++- .../list-prestasi-desa/[id]/edit/page.tsx | 161 ++----- .../landing-page/sdgs-desa/[id]/edit/page.tsx | 93 ++-- .../data-lingkungan-desa/[id]/edit/page.tsx | 55 +-- .../edit/page.tsx | 68 +-- .../edit/page.tsx | 43 +- .../tujuan-edukasi-lingkungan/edit/page.tsx | 41 +- .../kategori-kegiatan/[id]/page.tsx | 57 +-- .../kegiatan-desa/[id]/edit/page.tsx | 119 ++--- .../edit/page.tsx | 37 +- .../filosofi-tri-hita-karana/edit/page.tsx | 41 +- .../nilai-konservasi-adat/edit/page.tsx | 37 +- .../[id]/edit/page.tsx | 86 ++-- .../[id]/page.tsx | 48 +- .../program-penghijauan/[id]/edit/page.tsx | 58 +-- 67 files changed, 3056 insertions(+), 2989 deletions(-) diff --git a/src/app/admin/(dashboard)/desa/pengumuman/kategori-pengumuman/[id]/page.tsx b/src/app/admin/(dashboard)/desa/pengumuman/kategori-pengumuman/[id]/page.tsx index f8891222..c2eeb624 100644 --- a/src/app/admin/(dashboard)/desa/pengumuman/kategori-pengumuman/[id]/page.tsx +++ b/src/app/admin/(dashboard)/desa/pengumuman/kategori-pengumuman/[id]/page.tsx @@ -1,5 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client'; + import stateDesaPengumuman from '@/app/admin/(dashboard)/_state/desa/pengumuman'; import colors from '@/con/colors'; import { @@ -10,7 +11,7 @@ import { Stack, TextInput, Title, - Tooltip + Tooltip, } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -23,10 +24,9 @@ function EditKategoriPengumuman() { const router = useRouter(); const params = useParams(); - const [formData, setFormData] = useState({ - name: editState.update.form.name || '', - }); + const [formData, setFormData] = useState({ name: '' }); + // Load data awal sekali aja useEffect(() => { const loadKategori = async () => { const id = params?.id as string; @@ -35,9 +35,7 @@ function EditKategoriPengumuman() { try { const data = await editState.update.load(id); if (data) { - setFormData({ - name: data.name || '', - }); + setFormData({ name: data.name || '' }); } } catch (error) { console.error('Error loading kategori Pengumuman:', error); @@ -48,8 +46,16 @@ function EditKategoriPengumuman() { loadKategori(); }, [params?.id]); + const handleChange = (field: string, value: string) => { + setFormData((prev) => ({ + ...prev, + [field]: value, + })); + }; + const handleSubmit = async () => { try { + // Update global state hanya di sini editState.update.form = { ...editState.update.form, name: formData.name, @@ -97,9 +103,7 @@ function EditKategoriPengumuman() { label="Nama Kategori Pengumuman" placeholder="Masukkan nama kategori Pengumuman" value={formData.name} - onChange={(e) => - setFormData({ ...formData, name: e.target.value }) - } + onChange={(e) => handleChange('name', e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/[id]/edit/page.tsx index 2ecca8ff..9e7a622f 100644 --- a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/[id]/edit/page.tsx @@ -28,16 +28,16 @@ function EditPengumuman() { const params = useParams(); const [formData, setFormData] = useState({ - judul: editState.pengumuman.edit.form.judul || "", - deskripsi: editState.pengumuman.edit.form.deskripsi || "", - categoryPengumumanId: - editState.pengumuman.edit.form.categoryPengumumanId || "", - content: editState.pengumuman.edit.form.content || "", + judul: "", + deskripsi: "", + categoryPengumumanId: "", + content: "", }); - // Load pengumuman by id saat pertama kali + // Load kategori & pengumuman by id saat pertama kali useEffect(() => { editState.category.findMany.load(); + const loadpengumuman = async () => { const id = params?.id as string; if (!id) return; @@ -61,9 +61,13 @@ function EditPengumuman() { loadpengumuman(); }, [params?.id]); + const handleChange = (field: keyof typeof formData, value: string) => { + setFormData((prev) => ({ ...prev, [field]: value })); + }; + const handleSubmit = async () => { try { - // update global state + // update global state hanya sekali pas submit editState.pengumuman.edit.form = { ...editState.pengumuman.edit.form, ...formData, @@ -108,26 +112,22 @@ function EditPengumuman() { setFormData({ ...formData, judul: e.target.value })} + value={formData.judul} + onChange={(e) => handleChange("judul", e.target.value)} required /> - setFormData({ ...formData, deskripsi: e.target.value }) - } + value={formData.deskripsi} + onChange={(e) => handleChange("deskripsi", e.target.value)} required /> setFormData({ ...formData, kategoriId: val || "" })} + onChange={(val) => handleChange("kategoriId", val || "")} label="Kategori" placeholder="Pilih kategori" data={ @@ -164,7 +180,9 @@ function EditPotensi() { setPreviewImage(URL.createObjectURL(selectedFile)); } }} - onReject={() => toast.error("File tidak valid, gunakan format gambar")} + onReject={() => + toast.error("File tidak valid, gunakan format gambar") + } maxSize={5 * 1024 ** 2} accept={{ "image/*": [] }} radius="md" @@ -172,7 +190,11 @@ function EditPotensi() { > - + @@ -214,7 +236,9 @@ function EditPotensi() { setFormData({ ...formData, content: htmlContent })} + onChange={(htmlContent) => + handleChange("content", htmlContent) + } /> diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx index 5cabb73a..56f2c2e2 100644 --- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx @@ -26,15 +26,17 @@ function EditPerbekelDariMasaKeMasa() { const state = useProxy(stateProfileDesa.mantanPerbekel); const router = useRouter(); const params = useParams(); + const [previewImage, setPreviewImage] = useState(null); const [file, setFile] = useState(null); const [formData, setFormData] = useState({ - nama: state.update.form.nama || '', - daerah: state.update.form.daerah || '', - periode: state.update.form.periode || '', - imageId: state.update.form.imageId || '' + nama: '', + daerah: '', + periode: '', + imageId: '' }); + // load data pertama kali useEffect(() => { const loadFoto = async () => { const id = params?.id as string; @@ -48,7 +50,9 @@ function EditPerbekelDariMasaKeMasa() { periode: data.periode || '', imageId: data.imageId || '' }); - if (data?.imageGalleryFoto?.link) setPreviewImage(data.imageGalleryFoto.link); + if (data?.imageGalleryFoto?.link) { + setPreviewImage(data.imageGalleryFoto.link); + } } } catch (error) { console.error('Error loading foto:', error); @@ -58,8 +62,17 @@ function EditPerbekelDariMasaKeMasa() { loadFoto(); }, [params?.id]); + // helper ubah state formData + const handleChange = (field: keyof typeof formData, value: string) => { + setFormData((prev) => ({ + ...prev, + [field]: value, + })); + }; + const handleSubmit = async () => { try { + // update global state hanya sekali pas submit state.update.form = { ...state.update.form, ...formData }; if (file) { @@ -106,8 +119,8 @@ function EditPerbekelDariMasaKeMasa() { setFormData({ ...formData, nama: e.target.value })} + value={formData.nama} + onChange={(e) => handleChange('nama', e.target.value)} required /> @@ -161,7 +174,7 @@ function EditPerbekelDariMasaKeMasa() { objectFit: 'contain', border: `1px solid ${colors['blue-button']}`, }} - loading='lazy' + loading="lazy" /> )} @@ -170,16 +183,16 @@ function EditPerbekelDariMasaKeMasa() { setFormData({ ...formData, daerah: e.target.value })} + value={formData.daerah} + onChange={(e) => handleChange('daerah', e.target.value)} required /> setFormData({ ...formData, periode: e.target.value })} + value={formData.periode} + onChange={(e) => handleChange('periode', e.target.value)} required /> diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx index 3c6b290b..956f84e1 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -'use client' /* eslint-disable react-hooks/exhaustive-deps */ +'use client' import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa'; import colors from '@/con/colors'; import { @@ -29,13 +29,13 @@ function EditAPBDesa() { const params = useParams(); const [formData, setFormData] = useState({ - tahun: apbState.update.form.tahun || '', - pendapatanIds: apbState.update.form.pendapatanIds || [], - belanjaIds: apbState.update.form.belanjaIds || [], - pembiayaanIds: apbState.update.form.pembiayaanIds || [], + tahun: '', + pendapatanIds: [] as string[], + belanjaIds: [] as string[], + pembiayaanIds: [] as string[], }); - // Load APB desa by id + // Load APB desa by id → hanya update formData, bukan global state useEffect(() => { const loadAPBdesa = async () => { const id = params?.id as string; @@ -45,7 +45,7 @@ function EditAPBDesa() { const data = await apbState.update.load(id); if (data) { setFormData({ - tahun: data.tahun || 0, + tahun: String(data.tahun || ''), pendapatanIds: data.pendapatan?.map((p: any) => p.id) || [], belanjaIds: data.belanja?.map((b: any) => b.id) || [], pembiayaanIds: data.pembiayaan?.map((p: any) => p.id) || [], @@ -60,8 +60,13 @@ function EditAPBDesa() { loadAPBdesa(); }, [params?.id]); + const handleChange = (field: keyof typeof formData, value: any) => { + setFormData(prev => ({ ...prev, [field]: value })); + }; + const handleSubmit = async () => { try { + // update global state cuma pas submit apbState.update.form = { ...apbState.update.form, tahun: Number(formData.tahun), @@ -111,10 +116,8 @@ function EditAPBDesa() { {/* Tahun */} - setFormData({ ...formData, tahun: e.target.value }) - } + value={formData.tahun} + onChange={(e) => handleChange("tahun", e.target.value)} label={Tahun} placeholder="Masukkan tahun anggaran" required @@ -123,23 +126,17 @@ function EditAPBDesa() { {/* Selects */} - setFormData({ ...formData, pendapatanIds: ids }) - } + onSelectionChange={(ids) => handleChange("pendapatanIds", ids)} /> - setFormData({ ...formData, belanjaIds: ids }) - } + onSelectionChange={(ids) => handleChange("belanjaIds", ids)} /> - setFormData({ ...formData, pembiayaanIds: ids }) - } + onSelectionChange={(ids) => handleChange("pembiayaanIds", ids)} /> {/* Save Button */} @@ -164,7 +161,13 @@ function EditAPBDesa() { /* --- Sub Components --- */ - function SelectPendapatan({ selectedIds, onSelectionChange }: { selectedIds: string[]; onSelectionChange: (ids: string[]) => void }) { + function SelectPendapatan({ + selectedIds, + onSelectionChange, + }: { + selectedIds: string[]; + onSelectionChange: (ids: string[]) => void; + }) { const pendapatanState = useProxy(PendapatanAsliDesa.pendapatan); useShallowEffect(() => { @@ -192,7 +195,13 @@ function EditAPBDesa() { ); } - function SelectBelanja({ selectedIds, onSelectionChange }: { selectedIds: string[]; onSelectionChange: (ids: string[]) => void }) { + function SelectBelanja({ + selectedIds, + onSelectionChange, + }: { + selectedIds: string[]; + onSelectionChange: (ids: string[]) => void; + }) { const belanjaState = useProxy(PendapatanAsliDesa.belanja); useShallowEffect(() => { @@ -220,7 +229,13 @@ function EditAPBDesa() { ); } - function SelectPembiayaan({ selectedIds, onSelectionChange }: { selectedIds: string[]; onSelectionChange: (ids: string[]) => void }) { + function SelectPembiayaan({ + selectedIds, + onSelectionChange, + }: { + selectedIds: string[]; + onSelectionChange: (ids: string[]) => void; + }) { const pembiayaanState = useProxy(PendapatanAsliDesa.pembiayaan); useShallowEffect(() => { diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx index 75ed35df..7c03d4a8 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx @@ -1,5 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' + import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa'; import colors from '@/con/colors'; import { @@ -24,12 +25,16 @@ function EditBelanja() { const params = useParams(); const [formData, setFormData] = useState({ - name: belanjaState.update.form.name || '', - value: belanjaState.update.form.value || '', + name: '', + value: '', }); + // format angka ke rupiah const formatRupiah = (value: number | string) => { - const number = typeof value === 'number' ? value : Number(value.replace(/\D/g, '')); + const number = + typeof value === 'number' + ? value + : Number(value.replace(/\D/g, '')) || 0; return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', @@ -37,8 +42,9 @@ function EditBelanja() { }).format(number); }; + // buang semua simbol jadi angka murni const unformatRupiah = (value: string) => { - return Number(value.replace(/\D/g, '')); + return Number(value.replace(/\D/g, '')) || 0; }; useEffect(() => { @@ -51,7 +57,7 @@ function EditBelanja() { if (data) { setFormData({ name: data.name || '', - value: data.value || '', + value: String(data.value || ''), }); } } catch (error) { @@ -69,7 +75,7 @@ function EditBelanja() { ...belanjaState.update.form, name: formData.name, value: Number(formData.value), - } + }; await belanjaState.update.update(); toast.success("Jenis Belanja berhasil diperbarui!"); @@ -78,7 +84,7 @@ function EditBelanja() { console.error("Error updating jenis belanja:", error); toast.error("Terjadi kesalahan saat memperbarui jenis belanja"); } - } + }; return ( @@ -112,19 +118,21 @@ function EditBelanja() { setFormData({ ...formData, name: e.target.value })} + value={formData.name} + onChange={(e) => + setFormData({ ...formData, name: e.target.value }) + } required /> { const raw = e.currentTarget.value; const cleanValue = unformatRupiah(raw); - setFormData({ ...formData, value: cleanValue }); + setFormData({ ...formData, value: String(cleanValue) }); }} required /> diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx index 988b9eda..25df9c5b 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx @@ -24,12 +24,15 @@ function EditPembiayaan() { const params = useParams(); const [formData, setFormData] = useState({ - name: pembiayaanState.update.form.name || '', - value: pembiayaanState.update.form.value || '', + name: '', + value: '', }); const formatRupiah = (value: number | string) => { - const number = typeof value === 'number' ? value : Number(value.toString().replace(/\D/g, '')); + const number = + typeof value === 'number' + ? value + : Number(value.toString().replace(/\D/g, '')) || 0; return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', @@ -38,7 +41,7 @@ function EditPembiayaan() { }; const unformatRupiah = (value: string) => { - return Number(value.replace(/\D/g, '')); + return Number(value.replace(/\D/g, '')) || 0; }; useEffect(() => { @@ -51,7 +54,7 @@ function EditPembiayaan() { if (data) { setFormData({ name: data.name || '', - value: data.value || '', + value: String(data.value || ''), }); } } catch (error) { @@ -68,7 +71,7 @@ function EditPembiayaan() { pembiayaanState.update.form = { ...pembiayaanState.update.form, name: formData.name, - value: Number(formData.value), + value: unformatRupiah(formData.value), }; await pembiayaanState.update.update(); @@ -82,7 +85,7 @@ function EditPembiayaan() { return ( - {/* Header dengan Back Button */} + {/* Header */} @@ -78,10 +111,8 @@ function EditJumlahPendudukMiskin() { placeholder="Masukkan tahun" type="number" required - defaultValue={stateJPM.update.form.year} - onChange={(val) => { - stateJPM.update.form.year = Number(val.currentTarget.value); - }} + value={formData.year} + onChange={(e) => handleChange('year', e.currentTarget.value)} /> { - stateJPM.update.form.totalPoorPopulation = Number(val.currentTarget.value); - }} + value={formData.totalPoorPopulation} + onChange={(e) => + handleChange('totalPoorPopulation', e.currentTarget.value) + } /> diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx index fb6cef40..7e069310 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx @@ -1,11 +1,11 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client'; import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; -/* eslint-disable react-hooks/exhaustive-deps */ import colors from '@/con/colors'; import { Box, Button, Group, Paper, Stack, TextInput, Title, Tooltip } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; function EditGrafikBerdasarkanPendidikan() { @@ -14,34 +14,59 @@ function EditGrafikBerdasarkanPendidikan() { const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanPendidikan); const id = params.id; + // state lokal untuk form + const [formData, setFormData] = useState({ + SD: '', + SMP: '', + SMA: '', + D3: '', + S1: '', + }); + useEffect(() => { if (id) { stategrafik.findUnique.load(id).then(() => { const data = stategrafik.findUnique.data; if (data) { - stategrafik.update.form = { + setFormData({ SD: data.SD || '', SMP: data.SMP || '', SMA: data.SMA || '', D3: data.D3 || '', S1: data.S1 || '', - }; + }); } }); } }, [id]); + const handleChange = (field: keyof typeof formData) => + (e: React.ChangeEvent) => { + setFormData((prev) => ({ + ...prev, + [field]: e.currentTarget.value, + })); + }; + const handleSubmit = async () => { stategrafik.update.id = id; + stategrafik.update.form = { ...formData }; // update global state pas submit aja await stategrafik.update.submit(); - router.push('/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan'); + router.push( + '/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan' + ); }; return ( - @@ -63,36 +88,36 @@ function EditGrafikBerdasarkanPendidikan() { label="SD" type="number" placeholder="Masukkan jumlah" - defaultValue={stategrafik.update.form.SD} - onChange={(val) => (stategrafik.update.form.SD = val.currentTarget.value)} + value={formData.SD} + onChange={handleChange('SD')} /> (stategrafik.update.form.SMP = val.currentTarget.value)} + value={formData.SMP} + onChange={handleChange('SMP')} /> (stategrafik.update.form.SMA = val.currentTarget.value)} + value={formData.SMA} + onChange={handleChange('SMA')} /> (stategrafik.update.form.D3 = val.currentTarget.value)} + value={formData.D3} + onChange={handleChange('D3')} /> (stategrafik.update.form.S1 = val.currentTarget.value)} + value={formData.S1} + onChange={handleChange('S1')} /> diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx index f80dd83a..f5e77711 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx @@ -2,39 +2,70 @@ 'use client'; import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, TextInput, Title, Group, Tooltip } from '@mantine/core'; +import { + Box, + Button, + Paper, + Stack, + TextInput, + Title, + Group, + Tooltip, +} from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { const router = useRouter(); const params = useParams() as { id: string }; - const stategrafik = useProxy(grafikNganggur.grafikBerdasarkanUsiaKerjaNganggur); + const stategrafik = useProxy( + grafikNganggur.grafikBerdasarkanUsiaKerjaNganggur + ); const id = params.id; + // ✅ state lokal, controlled + const [formData, setFormData] = useState({ + usia18_25: '', + usia26_35: '', + usia36_45: '', + usia46_keatas: '', + }); + + // load data dari global state -> masukin ke local state useEffect(() => { if (id) { stategrafik.findUnique.load(id).then(() => { const data = stategrafik.findUnique.data; if (data) { - stategrafik.update.form = { + setFormData({ usia18_25: data.usia18_25 || '', usia26_35: data.usia26_35 || '', usia36_45: data.usia36_45 || '', usia46_keatas: data.usia46_keatas || '', - }; + }); } }); } }, [id]); + const handleChange = (field: string, value: string) => { + setFormData((prev) => ({ + ...prev, + [field]: value, + })); + }; + const handleSubmit = async () => { try { + // ✅ baru update global state pas submit stategrafik.update.id = id; + stategrafik.update.form = { ...formData }; + await stategrafik.update.submit(); + toast.success('Data grafik berhasil diperbarui!'); router.push( '/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia' @@ -49,7 +80,12 @@ function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { - @@ -71,40 +107,32 @@ function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { label="Usia 18 - 25" type="number" placeholder="Masukkan jumlah" - defaultValue={stategrafik.update.form.usia18_25} - onChange={(val) => { - stategrafik.update.form.usia18_25 = val.currentTarget.value; - }} + value={formData.usia18_25} + onChange={(e) => handleChange('usia18_25', e.currentTarget.value)} required /> { - stategrafik.update.form.usia26_35 = val.currentTarget.value; - }} + value={formData.usia26_35} + onChange={(e) => handleChange('usia26_35', e.currentTarget.value)} required /> { - stategrafik.update.form.usia36_45 = val.currentTarget.value; - }} + value={formData.usia36_45} + onChange={(e) => handleChange('usia36_45', e.currentTarget.value)} required /> { - stategrafik.update.form.usia46_keatas = val.currentTarget.value; - }} + value={formData.usia46_keatas} + onChange={(e) => handleChange('usia46_keatas', e.currentTarget.value)} required /> diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx index 29f9a929..426a1fc7 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/edit/page.tsx @@ -2,10 +2,21 @@ 'use client'; import jumlahPengangguranState from '@/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Select, NumberInput } from '@mantine/core'; +import { + Box, + Button, + Group, + Paper, + Stack, + Text, + TextInput, + Title, + Select, + NumberInput, +} from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; +import { useEffect, useState, useCallback } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; @@ -24,40 +35,57 @@ function EditDetailDataPengangguran() { }); // Hitung total & perubahan otomatis - const calculateTotalAndChange = async () => { - const total = formData.educatedUnemployment + formData.uneducatedUnemployment; + const calculateTotalAndChange = useCallback( + async (data: typeof formData) => { + const total = data.educatedUnemployment + data.uneducatedUnemployment; - let percentageChange = 0; - const monthOrder = ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des']; - const currentMonthIndex = monthOrder.indexOf(formData.month); + let percentageChange = 0; + const monthOrder = [ + 'Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', + 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des', + ]; + const currentMonthIndex = monthOrder.indexOf(data.month); - if (currentMonthIndex !== -1) { - let prevMonthIndex = currentMonthIndex - 1; - let prevYear = formData.year; + if (currentMonthIndex !== -1) { + let prevMonthIndex = currentMonthIndex - 1; + let prevYear = data.year; - if (prevMonthIndex < 0) { - prevMonthIndex = 11; - prevYear--; + if (prevMonthIndex < 0) { + prevMonthIndex = 11; + prevYear--; + } + + const prevMonth = monthOrder[prevMonthIndex]; + const prevData = await stateDetail.findByMonthYear.load({ + month: prevMonth, + year: prevYear, + }); + + if (prevData && prevData.totalUnemployment > 0) { + const change = + ((total - prevData.totalUnemployment) / + prevData.totalUnemployment) * + 100; + percentageChange = parseFloat(change.toFixed(1)); + } } - const prevMonth = monthOrder[prevMonthIndex]; - const prevData = await stateDetail.findByMonthYear.load({ month: prevMonth, year: prevYear }); - - if (prevData && prevData.totalUnemployment > 0) { - const change = ((total - prevData.totalUnemployment) / prevData.totalUnemployment) * 100; - percentageChange = parseFloat(change.toFixed(1)); - } - } - - return { total, percentageChange }; - }; + return { total, percentageChange }; + }, + [stateDetail.findByMonthYear] + ); const updateFormData = async (updates: Partial) => { const newData = { ...formData, ...updates }; - const { total, percentageChange } = await calculateTotalAndChange(); - setFormData({ ...newData, totalUnemployment: total, percentageChange }); + const { total, percentageChange } = await calculateTotalAndChange(newData); + setFormData({ + ...newData, + totalUnemployment: total, + percentageChange, + }); }; + // Load detail hanya sekali useEffect(() => { const loadDetail = async () => { const id = params?.id as string; @@ -68,45 +96,39 @@ function EditDetailDataPengangguran() { const data = stateDetail.findUnique.data; if (data) { + const yearValue = + data.year && typeof data.year === 'object' && 'getFullYear' in data.year + ? (data.year as Date).getFullYear() + : Number(data.year); - // Convert year from Date to number if needed - const yearValue = data.year && typeof data.year === 'object' && 'getFullYear' in data.year - ? (data.year as Date).getFullYear() - : Number(data.year); + stateDetail.update.id = id; // set ID untuk update - // Set the ID for update - stateDetail.update.id = id; - - // Update Valtio state with converted year - stateDetail.update.form = { - ...data, - year: yearValue, - percentageChange: data.percentageChange || 0 // Ensure it's always a number - }; - - // Update local formData with converted year setFormData({ month: data.month, year: yearValue, totalUnemployment: data.totalUnemployment, educatedUnemployment: data.educatedUnemployment, uneducatedUnemployment: data.uneducatedUnemployment, - percentageChange: data.percentageChange || 0, // Ensure it's always a number + percentageChange: data.percentageChange || 0, }); } } catch (error) { - console.error("Error loading detail:", error); - toast.error("Gagal memuat data detail"); + console.error('Error loading detail:', error); + toast.error('Gagal memuat data detail'); } }; loadDetail(); - }, [params?.id]); + }, [params?.id, stateDetail.findUnique]); const handleSubmit = async () => { - const { total, percentageChange } = await calculateTotalAndChange(); + const { total, percentageChange } = await calculateTotalAndChange(formData); try { - stateDetail.update.form = { ...formData, totalUnemployment: total, percentageChange }; + stateDetail.update.form = { + ...formData, + totalUnemployment: total, + percentageChange, + }; const success = await stateDetail.update.submit(); if (success) { toast.success('Detail data pengangguran berhasil diperbarui!'); @@ -121,7 +143,12 @@ function EditDetailDataPengangguran() { return ( - @@ -129,36 +156,57 @@ function EditDetailDataPengangguran() { - + ({ - value: p.id, - label: p.namaLengkap, - })) || []} + data={ + pegawaiList?.map(p => ({ + value: p.id, + label: p.namaLengkap, + })) || [] + } value={form.atasanId} - onChange={(val) => setForm({ ...form, atasanId: val || '' })} + onChange={val => handleChange('atasanId', val || '')} /> + ({ - value: p.id, // harus string - label: p.nama, - })) || [] + strukturorganisasiState.posisiOrganisasi.findMany.data?.map( + (p) => ({ + value: p.id, + label: p.nama, + }) + ) || [] } value={formData.posisiId} onChange={(value) => { - if (value !== null) { - setFormData({ ...formData, posisiId: value }); // value harus string - } + if (value !== null) updateForm('posisiId', value); }} /> + setFormData({ ...formData, status: e as Status })} + onChange={(val) => handleChange('status', val as Status)} label={Status Laporan Publik} placeholder="Pilih status laporan publik" data={[ @@ -152,10 +161,7 @@ function EditLaporanPublik() { Kronologi Laporan Publik { - setFormData((prev) => ({ ...prev, kronologi: htmlContent })); - stateLaporan.edit.form.kronologi = htmlContent; - }} + onChange={(htmlContent) => handleChange('kronologi', htmlContent)} /> @@ -163,10 +169,7 @@ function EditLaporanPublik() { Penanganan Laporan Publik { - setFormData((prev) => ({ ...prev, penanganan: htmlContent })); - stateLaporan.edit.form.penanganan = htmlContent; - }} + onChange={(htmlContent) => handleChange('penanganan', htmlContent)} /> diff --git a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx index b2292469..9918b93e 100644 --- a/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/pencegahan-kriminalitas/[id]/edit/page.tsx @@ -12,7 +12,7 @@ import { Stack, TextInput, Title, - Tooltip + Tooltip, } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -32,6 +32,7 @@ function EditPencegahanKriminalitas() { linkVideo: '', }); + // load data hanya sekali pas id berubah useEffect(() => { const loadKriminalitas = async () => { const id = params?.id as string; @@ -41,10 +42,10 @@ function EditPencegahanKriminalitas() { const data = await kriminalitasState.update.load(id); if (data) { setFormData({ - judul: data.judul || '', - deskripsi: data.deskripsi || '', - deskripsiSingkat: data.deskripsiSingkat || '', - linkVideo: data.linkVideo || '', + judul: data.judul ?? '', + deskripsi: data.deskripsi ?? '', + deskripsiSingkat: data.deskripsiSingkat ?? '', + linkVideo: data.linkVideo ?? '', }); } } catch (error) { @@ -58,6 +59,12 @@ function EditPencegahanKriminalitas() { const embedLink = convertYoutubeUrlToEmbed(formData.linkVideo); + const handleChange = + (field: keyof typeof formData) => + (e: React.ChangeEvent) => { + setFormData((prev) => ({ ...prev, [field]: e.target.value })); + }; + const handleSubmit = async () => { const converted = convertYoutubeUrlToEmbed(formData.linkVideo); if (!converted) { @@ -66,16 +73,13 @@ function EditPencegahanKriminalitas() { } try { - // Update the form data first + // update global state saat submit kriminalitasState.update.form = { - ...kriminalitasState.update.form, judul: formData.judul, deskripsi: formData.deskripsi, deskripsiSingkat: formData.deskripsiSingkat, linkVideo: formData.linkVideo, }; - - // Set the ID and then call update kriminalitasState.update.id = params?.id as string; await kriminalitasState.update.update(); @@ -119,18 +123,16 @@ function EditPencegahanKriminalitas() { setFormData({ ...formData, judul: e.target.value })} + value={formData.judul} + onChange={handleChange('judul')} required /> - setFormData({ ...formData, deskripsiSingkat: e.target.value }) - } + value={formData.deskripsiSingkat} + onChange={handleChange('deskripsiSingkat')} required /> @@ -141,7 +143,7 @@ function EditPencegahanKriminalitas() { - setFormData({ ...formData, deskripsi: val }) + setFormData((prev) => ({ ...prev, deskripsi: val })) } /> @@ -150,10 +152,8 @@ function EditPencegahanKriminalitas() { - setFormData({ ...formData, linkVideo: e.currentTarget.value }) - } + value={formData.linkVideo} + onChange={handleChange('linkVideo')} required /> {embedLink && ( diff --git a/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx index c9bb69fb..bf826e3d 100644 --- a/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/polsek-terdekat/[id]/edit/page.tsx @@ -52,50 +52,36 @@ function EditPolsekTerdekat() { layananPolsekId: "", }); - useEffect(() => { - const loadPolsekTerdekat = async () => { - const id = params?.id as string; - if (!id) return; - - try { - const data = await polsekState.edit.load(id); - if (data) { - setFormData({ - nama: data.nama || "", - jarakKeDesa: data.jarakKeDesa || "", - alamat: data.alamat || "", - nomorTelepon: data.nomorTelepon || "", - jamOperasional: data.jamOperasional || "", - embedMapUrl: data.embedMapUrl || "", - namaTempatMaps: data.namaTempatMaps || "", - alamatMaps: data.alamatMaps || "", - linkPetunjukArah: data.linkPetunjukArah || "", - layananPolsekId: data.layananPolsekId || "", - }); + // load data untuk form edit + useEffect(() => { + const loadPolsekTerdekat = async () => { + const id = params?.id as string; + if (!id) return; + + try { + const data = await polsekState.edit.load(id); + if (data) { + setFormData({ + nama: data.nama || "", + jarakKeDesa: data.jarakKeDesa || "", + alamat: data.alamat || "", + nomorTelepon: data.nomorTelepon || "", + jamOperasional: data.jamOperasional || "", + embedMapUrl: data.embedMapUrl || "", + namaTempatMaps: data.namaTempatMaps || "", + alamatMaps: data.alamatMaps || "", + linkPetunjukArah: data.linkPetunjukArah || "", + layananPolsekId: data.layananPolsekId || "", + }); + } + } catch (error) { + console.error("Error loading polsek terdekat:", error); + toast.error("Gagal memuat data polsek terdekat"); } - } catch (error) { - console.error("Error loading polsek terdekat:", error); - toast.error("Gagal memuat data polsek terdekat"); - } - }; - - loadPolsekTerdekat(); - }, [params?.id]); - - const handleSubmit = async () => { - try { - polsekState.edit.form = { - ...polsekState.edit.form, - ...formData, }; - await polsekState.edit.update(); - toast.success("Polsek terdekat berhasil diperbarui!"); - router.push("/admin/keamanan/polsek-terdekat"); - } catch (error) { - console.error("Error updating polsek terdekat:", error); - toast.error("Gagal memperbarui data polsek terdekat"); - } - }; + + loadPolsekTerdekat(); + }, [params?.id]); const fetchLayanan = async () => { try { @@ -198,6 +184,22 @@ function EditPolsekTerdekat() { fetchLayanan(); }, []); + const handleChange = (field: string, value: string) => { + setFormData(prev => ({ ...prev, [field]: value })); + }; + + const handleSubmit = async () => { + try { + polsekState.edit.form = { ...formData }; // update global state hanya di sini + await polsekState.edit.update(); + toast.success("Polsek terdekat berhasil diperbarui!"); + router.push("/admin/keamanan/polsek-terdekat"); + } catch (error) { + console.error("Error updating polsek terdekat:", error); + toast.error("Gagal memperbarui data polsek terdekat"); + } + }; + return ( {/* Modal Tambah */} @@ -273,88 +275,59 @@ function EditPolsekTerdekat() { {/* Input fields */} - setFormData({ ...formData, nama: val.target.value }) - } + value={formData.nama} + onChange={(e) => handleChange("nama", e.currentTarget.value)} label="Nama Polsek Terdekat" placeholder="Masukkan nama Polsek Terdekat" required /> - setFormData({ ...formData, jarakKeDesa: val.target.value }) - } + value={formData.jarakKeDesa} + onChange={(e) => handleChange("jarakKeDesa", e.currentTarget.value)} label="Jarak Polsek Terdekat" - placeholder="Masukkan jarak Polsek Terdekat" /> - setFormData({ ...formData, alamat: val.target.value }) - } + value={formData.alamat} + onChange={(e) => handleChange("alamat", e.currentTarget.value)} label="Alamat Polsek Terdekat" - placeholder="Masukkan alamat Polsek Terdekat" /> - setFormData({ ...formData, nomorTelepon: val.target.value }) - } + value={formData.nomorTelepon} + onChange={(e) => handleChange("nomorTelepon", e.currentTarget.value)} label="Nomor Telepon" - placeholder="Masukkan nomor telepon Polsek Terdekat" /> - setFormData({ ...formData, jamOperasional: val.target.value }) - } + value={formData.jamOperasional} + onChange={(e) => handleChange("jamOperasional", e.currentTarget.value)} label="Jam Operasional" - placeholder="Masukkan jam operasional Polsek Terdekat" /> - setFormData({ ...formData, embedMapUrl: val.target.value }) - } + value={formData.embedMapUrl} + onChange={(e) => handleChange("embedMapUrl", e.currentTarget.value)} label="Embed Map URL" - placeholder="Masukkan embed map url" /> - setFormData({ ...formData, namaTempatMaps: val.target.value }) - } + value={formData.namaTempatMaps} + onChange={(e) => handleChange("namaTempatMaps", e.currentTarget.value)} label="Nama Tempat Maps" - placeholder="Masukkan nama tempat di maps" /> - setFormData({ ...formData, alamatMaps: val.target.value }) - } + value={formData.alamatMaps} + onChange={(e) => handleChange("alamatMaps", e.currentTarget.value)} label="Alamat Maps" - placeholder="Masukkan alamat di maps" /> - setFormData({ ...formData, linkPetunjukArah: val.target.value }) - } + value={formData.linkPetunjukArah} + onChange={(e) => handleChange("linkPetunjukArah", e.currentTarget.value)} label="Link Petunjuk Arah" - placeholder="Masukkan link petunjuk arah" /> - {/* Dropdown Layanan */} setFormData({ ...formData, kategoriId: val || '' })} - data={ - korupsiState.kategoriDesaAntiKorupsi.findMany.data?.map((v) => ({ - value: v.id, - label: v.name, - })) || [] - } + onChange={handleSelectChange('kategoriId')} + data={korupsiState.kategoriDesaAntiKorupsi.findMany.data?.map((v) => ({ + value: v.id, + label: v.name, + })) || []} required searchable clearable @@ -180,13 +176,7 @@ export default function EditDesaAntiKorupsi() { Dokumen { - const selectedFile = files[0]; - if (selectedFile) { - setFile(selectedFile); - setPreviewFile(URL.createObjectURL(selectedFile)); - } - }} + onDrop={handleDrop} onReject={() => toast.error('File tidak valid, gunakan format dokumen')} maxSize={5 * 1024 ** 2} accept={{ @@ -229,12 +219,7 @@ export default function EditDesaAntiKorupsi() { width: '100%', }} > - + + - + - ) : null} + )} diff --git a/src/app/darmasaba/(pages)/keamanan/tips-keamanan/page.tsx b/src/app/darmasaba/(pages)/keamanan/tips-keamanan/page.tsx index e4709396..d24e95e6 100644 --- a/src/app/darmasaba/(pages)/keamanan/tips-keamanan/page.tsx +++ b/src/app/darmasaba/(pages)/keamanan/tips-keamanan/page.tsx @@ -56,8 +56,11 @@ function Page() { /> - - Keamanan dan ketertiban lingkungan di Desa Darmasaba dijaga melalui peran aktif Pecalang dan Patwal (Patroli Pengawal). Mereka bertugas memastikan desa tetap aman, tertib, dan kondusif bagi seluruh warga. + + Keamanan dan ketertiban lingkungan di Desa Darmasaba dijaga melalui peran aktif Pecalang dan Patwal (Patroli Pengawal). + + + Mereka bertugas memastikan desa tetap aman, tertib, dan kondusif bagi seluruh warga. @@ -82,7 +85,7 @@ function Page() { {v.judul} - + diff --git a/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx b/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx index 5ca70ed1..0e7913f3 100644 --- a/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/kontak-darurat/page.tsx @@ -88,59 +88,83 @@ function Page() { ) : ( {data.map((v, k) => ( - - - - {v.name} (e.currentTarget.style.transform = 'scale(1.05)')} - onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')} - /> - - - - {v.name} - - - - - - - + + + + {v.name} (e.currentTarget.style.transform = 'scale(1.05)')} + onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')} + /> + + + + {v.name} + + + + + + + + {/* ✅ Tombol selalu di bagian bawah card */} +
+ +
+
+ + ))}
)} diff --git a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/[id]/page.tsx b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/[id]/page.tsx index 399d7f4f..633bff4b 100644 --- a/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/kesehatan/penanganan-darurat/[id]/page.tsx @@ -1,15 +1,14 @@ 'use client'; import penangananDarurat from '@/app/admin/(dashboard)/_state/kesehatan/penanganan-darurat/penangananDarurat'; import colors from '@/con/colors'; -import { Box, Button, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; +import { Box, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useParams, useRouter } from 'next/navigation'; +import { useParams } from 'next/navigation'; import { useProxy } from 'valtio/utils'; +import BackButton from '../../../desa/layanan/_com/BackButto'; function DetailPenangananDaruratUser() { const state = useProxy(penangananDarurat); - const router = useRouter(); const params = useParams(); useShallowEffect(() => { @@ -32,14 +31,7 @@ function DetailPenangananDaruratUser() { {/* Tombol Back */} - + {/* Wrapper Detail */} diff --git a/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/component/edukasiCard.tsx b/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/component/edukasiCard.tsx index a91947bf..92fe9f3a 100644 --- a/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/component/edukasiCard.tsx +++ b/src/app/darmasaba/(pages)/lingkungan/edukasi-lingkungan/component/edukasiCard.tsx @@ -1,7 +1,7 @@ // Create a new component: components/EdukasiCard.tsx 'use client'; -import { Box, Paper, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Paper, Stack, Text } from '@mantine/core'; import { ReactNode } from 'react'; interface EdukasiCardProps { @@ -31,7 +31,6 @@ export function EdukasiCard({ icon, title, description, color = '#1e88e5' }: Edu {icon} - - @@ -78,21 +77,21 @@ export default function EdukasiLingkunganPage() { verticalSpacing={{ base: 'md', md: 'xl' }} > } + icon={} title={tujuan.data?.judul || ''} description={tujuan.data?.deskripsi || ''} color={colors['blue-button']} /> } + icon={} title={materi.data?.judul || ''} description={materi.data?.deskripsi || ''} color={colors['blue-button']} /> } + icon={} title={contoh.data?.judul || ''} description={contoh.data?.deskripsi || ''} color={colors['blue-button']} diff --git a/src/app/darmasaba/(pages)/lingkungan/konservasi-adat-bali/page.tsx b/src/app/darmasaba/(pages)/lingkungan/konservasi-adat-bali/page.tsx index 718cb23e..76a39cf6 100644 --- a/src/app/darmasaba/(pages)/lingkungan/konservasi-adat-bali/page.tsx +++ b/src/app/darmasaba/(pages)/lingkungan/konservasi-adat-bali/page.tsx @@ -44,13 +44,12 @@ function Page() { @@ -74,13 +73,12 @@ function Page() { @@ -105,13 +103,12 @@ function Page() { diff --git a/src/app/darmasaba/(pages)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx b/src/app/darmasaba/(pages)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx index 48d4baf9..d50df75c 100644 --- a/src/app/darmasaba/(pages)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx +++ b/src/app/darmasaba/(pages)/lingkungan/pengelolaan-sampah-bank-sampah/page.tsx @@ -91,7 +91,7 @@ function Page() { {iconMap[v.icon] ? React.createElement(iconMap[v.icon]) : null} - {v.name} + {v.name} diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx similarity index 100% rename from src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx rename to src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx similarity index 99% rename from src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx rename to src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx index 94358ae4..d1909407 100644 --- a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx @@ -68,7 +68,7 @@ function Page() { Logo Desa Darmasaba
- Daftar Informasi Publik Desa Darmasaba + Daftar Informasi Publik diff --git a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx b/src/app/darmasaba/(pages)/ppid/indeks-kepuasan-masyarakat/page.tsx similarity index 99% rename from src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx rename to src/app/darmasaba/(pages)/ppid/indeks-kepuasan-masyarakat/page.tsx index 9e134b39..514d9f59 100644 --- a/src/app/darmasaba/(pages)/ppid/ikm-desa-darmasaba/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/indeks-kepuasan-masyarakat/page.tsx @@ -239,7 +239,7 @@ const state = useProxy(indeksKepuasanState.responden); {/* Chart Rating */} - Pilihan + Ulasan {donutDataRating.every(item => item.value === 0) ? ( Belum ada data untuk ditampilkan dalam grafik @@ -505,7 +505,7 @@ const state = useProxy(indeksKepuasanState.responden); {/* Chart Rating */} - Pilihan + Ulasan {donutDataRating.every(item => item.value === 0) ? ( Belum ada data untuk ditampilkan dalam grafik diff --git a/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx b/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx index 36a02bc3..9b0d45cc 100644 --- a/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx @@ -39,9 +39,9 @@ function DetailPegawaiUser() { const data = statePegawai.findUnique.data; return ( - + {/* Back button */} - + router.back()} style={{ diff --git a/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx b/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx index 17637cb4..1d921cab 100644 --- a/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/struktur-ppid/page.tsx @@ -1,7 +1,6 @@ /* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' - import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID' import ScrollToTopButton from '@/app/darmasaba/_com/scrollToTopButton' import colors from '@/con/colors' @@ -10,7 +9,6 @@ import { Button, Card, Center, - Container, Group, Image, Loader, @@ -36,6 +34,7 @@ import { OrganizationChart } from 'primereact/organizationchart' import { useEffect, useRef, useState } from 'react' import { useProxy } from 'valtio/utils' import BackButton from '../../desa/layanan/_com/BackButto' +import './struktur.css' export default function Page() { return ( @@ -47,10 +46,9 @@ export default function Page() { paddingBottom: 48, }} > - - - - + + + </Stack> + <Box mt="lg"> <StrukturOrganisasiPPID /> </Box> - </Container> + </Box> - {/* Tombol Scroll ke Atas */} <ScrollToTopButton /> </Box> ) @@ -84,7 +82,7 @@ function StrukturOrganisasiPPID() { const [isFullscreen, setFullscreen] = useState(false) const [searchQuery, setSearchQuery] = useState('') - // debounce untuk pencarian + // debounce pencarian const debouncedSearch = useRef( debounce((value: string) => { setSearchQuery(value) @@ -112,7 +110,8 @@ function StrukturOrganisasiPPID() { ) } - if (!stateOrganisasi.findMany.data || stateOrganisasi.findMany.data.length === 0) { + const data = stateOrganisasi.findMany.data || [] + if (data.length === 0) { return ( <Center py={40}> <Stack align="center" gap="md"> @@ -151,9 +150,9 @@ function StrukturOrganisasiPPID() { ) } - // Buat struktur organisasi + // 🧩 buat struktur organisasi const posisiMap = new Map<string, any>() - const aktifPegawai = stateOrganisasi.findMany.data.filter((p: any) => p.isActive) + const aktifPegawai = data.filter((p: any) => p.isActive) for (const pegawai of aktifPegawai) { const posisiId = pegawai.posisi.id @@ -176,19 +175,15 @@ function StrukturOrganisasiPPID() { } else root.push(posisi) }) - function toOrgChartFormat(node: any): any { + const toOrgChartFormat = (node: any): any => { const pegawai = node.pegawaiList?.[0] return { expanded: true, - type: 'person', - styleClass: 'p-person', data: { - id: pegawai?.id || null, - name: pegawai?.namaLengkap || 'Belum ditugaskan', - title: node.nama || 'Tanpa jabatan', + id: pegawai?.id, + name: pegawai?.namaLengkap || 'Belum Ditugaskan', + title: node.nama || 'Tanpa Jabatan', image: pegawai?.image?.link || '/img/default.png', - description: node.deskripsi || '', - positionId: node.id || null, }, children: node.children?.map(toOrgChartFormat) || [], } @@ -213,7 +208,7 @@ function StrukturOrganisasiPPID() { chartData = filterNodes(chartData) } - // 🧭 fungsi fullscreen + // 🎬 fullscreen & zoom control const toggleFullscreen = () => { if (!document.fullscreenElement) { chartContainerRef.current?.requestFullscreen() @@ -224,138 +219,249 @@ function StrukturOrganisasiPPID() { } } - // 🧭 fungsi zoom - const handleZoomIn = () => setScale((prev) => Math.min(prev + 0.1, 2)) - const handleZoomOut = () => setScale((prev) => Math.max(prev - 0.1, 0.5)) + const handleZoomIn = () => setScale((s) => Math.min(s + 0.1, 2)) + const handleZoomOut = () => setScale((s) => Math.max(s - 0.1, 0.5)) const resetZoom = () => setScale(1) return ( <Stack align="center" mt="xl"> - {/* 🔍 Search + Zoom + Fullscreen controls */} - <Group mb="md" justify="center" gap="sm" align="center"> - <TextInput - placeholder="Cari nama atau jabatan..." - leftSection={<IconSearch size={16} />} - onChange={(e) => debouncedSearch(e.target.value)} - /> - - <Button variant="light" size="sm" onClick={handleZoomOut}> - <IconZoomOut size={16} /> - </Button> - - {/* 🔍 Tambahkan indikator zoom di sini */} - {/* Floating Zoom Indicator */} - <Box - bg="#C3D0E8" - c="blue" - px={9} - py={8} - style={{ - fontSize: 14, - fontWeight: 600, - borderRadius: '5px', - }} - > - {Math.round(scale * 100)}% - </Box> - - - <Button variant="light" size="sm" onClick={handleZoomIn}> - <IconZoomIn size={16} /> - </Button> - - <Button variant="light" size="sm" onClick={resetZoom}> - Reset - </Button> - - <Button - variant="light" - size="sm" - onClick={toggleFullscreen} - leftSection={ - isFullscreen ? <IconArrowsMinimize size={16} /> : <IconArrowsMaximize size={16} /> - } - > - {isFullscreen ? 'Keluar' : 'Fullscreen'} - </Button> - </Group> - - - {/* Chart Container */} - <Box - ref={chartContainerRef} + {/* 🔍 Controls */} + <Paper + shadow="xs" + p="md" + radius="md" style={{ - overflow: 'auto', - transform: `scale(${scale})`, - transformOrigin: 'center top', - transition: 'transform 0.25s ease', + background: colors['blue-button'] }} > - <OrganizationChart - value={chartData} - nodeTemplate={(node) => nodeTemplate(node, router)} - /> - </Box> + <Group gap="sm" wrap="wrap" justify="center"> + <TextInput + placeholder="Cari nama atau jabatan..." + leftSection={<IconSearch size={16} />} + onChange={(e) => debouncedSearch(e.target.value)} + styles={{ + input: { + minWidth: 250, + }, + }} + /> + + <Group gap="xs"> + <Button + variant="light" + bg={colors['blue-button-2']} + size="sm" + onClick={handleZoomOut} + leftSection={<IconZoomOut size={16} />} + c={colors['blue-button']} + > + Zoom Out + </Button> + + <Box + bg={colors['blue-button-2']} + c={colors['blue-button']} + px={16} + py={8} + style={{ + fontSize: 14, + fontWeight: 700, + borderRadius: '8px', + minWidth: 70, + textAlign: 'center', + }} + > + {Math.round(scale * 100)}% + </Box> + + <Button + bg={colors['blue-button-2']} + c={colors['blue-button']} + variant="light" + size="sm" + onClick={handleZoomIn} + leftSection={<IconZoomIn size={16} />} + > + Zoom In + </Button> + + <Button + bg={colors['blue-button-2']} + c={colors['blue-button']} + variant="light" + size="sm" + onClick={resetZoom} + > + Reset + </Button> + + <Button + bg={colors['blue-button-2']} + c={colors['blue-button']} + size="sm" + onClick={toggleFullscreen} + leftSection={ + isFullscreen ? ( + <IconArrowsMinimize size={16} /> + ) : ( + <IconArrowsMaximize size={16} /> + ) + } + > + Fullscreen + </Button> + </Group> + </Group> + </Paper> + + {/* 🧩 Chart Container */} + <Center style={{ width: '100%' }}> + <Box + ref={chartContainerRef} + style={{ + overflowX: 'auto', + overflowY: 'auto', + width: '100%', + maxWidth: '100%', + padding: '32px 16px', + transition: 'transform 0.2s ease', + transform: `scale(${scale})`, + transformOrigin: 'center top', + }} + > + <OrganizationChart + value={chartData} + nodeTemplate={(node) => <NodeCard node={node} router={router} />} + className="p-organizationchart p-organizationchart-horizontal" + /> + </Box> + </Center> </Stack> ) } -function nodeTemplate(node: any, router: ReturnType<typeof useTransitionRouter>) { +function NodeCard({ node, router }: any) { const imageSrc = node?.data?.image || '/img/default.png' const name = node?.data?.name || 'Tanpa Nama' const title = node?.data?.title || 'Tanpa Jabatan' - const description = node?.data?.description || '' + const hasId = Boolean(node?.data?.id) return ( - <Transition mounted transition="pop" duration={240}> + <Transition mounted transition="pop" duration={300}> {(styles) => ( <Card - radius="lg" + shadow="md" + radius="xl" withBorder style={{ ...styles, - width: 260, - padding: 16, - background: 'rgba(28,110,164,0.3)', - borderColor: 'rgba(255,255,255,0.15)', - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - textAlign: 'center', + width: 240, + minHeight: 280, + padding: 20, + background: 'linear-gradient(135deg, rgba(28,110,164,0.15) 0%, rgba(255,255,255,0.95) 100%)', + borderColor: 'rgba(28, 110, 164, 0.3)', + borderWidth: 2, + transition: 'all 0.3s ease', + cursor: hasId ? 'pointer' : 'default', + }} + onMouseEnter={(e) => { + if (hasId) { + e.currentTarget.style.transform = 'translateY(-4px)' + e.currentTarget.style.boxShadow = '0 8px 24px rgba(28, 110, 164, 0.25)' + } + }} + onMouseLeave={(e) => { + if (hasId) { + e.currentTarget.style.transform = 'translateY(0)' + e.currentTarget.style.boxShadow = '' + } }} > - <Image - src={imageSrc} - alt={name} - radius="md" - width={60} - height={60} - fit="cover" - style={{ - objectFit: 'cover', - border: '2px solid rgba(255,255,255,0.2)', - marginBottom: 12, - }} - loading="lazy" - /> - <Text fw={700}>{name}</Text> - <Text size="sm" c="dimmed" mt={4}> - {title} - </Text> - <Text size="xs" c="dimmed" mt={8} lineClamp={3}> - {description || 'Belum ada deskripsi.'} - </Text> - <Button - variant="light" - size="xs" - mt="md" - onClick={() => { - const id = node?.data?.id - router.push(`/darmasaba/ppid/struktur-ppid/${id}`) + <Stack align="center" gap={12}> + {/* Photo */} + <Box + style={{ + width: 96, + height: 96, + borderRadius: '50%', + overflow: 'hidden', + border: '3px solid rgba(28, 110, 164, 0.4)', + boxShadow: '0 4px 12px rgba(0, 0, 0, 0.1)', + background: 'white', }} > - Lihat Detail - </Button> + <Image + src={imageSrc} + alt={name} + width={96} + height={96} + fit="cover" + loading="lazy" + style={{ + objectFit: 'cover', + }} + /> + </Box> + + {/* Name */} + <Text + fw={700} + size="sm" + ta="center" + c={colors['blue-button']} + lineClamp={2} + style={{ + minHeight: 40, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + wordBreak: 'break-word', + lineHeight: 1.3, + }} + > + {name} + </Text> + + {/* Title/Position */} + <Text + size="xs" + c="dimmed" + ta="center" + fw={500} + lineClamp={2} + style={{ + minHeight: 32, + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + wordBreak: 'break-word', + lineHeight: 1.2, + }} + > + {title} + </Text> + + {/* Detail Button */} + {hasId && ( + <Button + variant="gradient" + gradient={{ from: 'blue', to: 'cyan' }} + size="xs" + fullWidth + mt={8} + radius="md" + onClick={() => + router.push(`/darmasaba/ppid/struktur-ppid/${node.data.id}`) + } + style={{ + height: 32, + fontWeight: 600, + }} + > + Lihat Detail + </Button> + )} + </Stack> </Card> )} </Transition> diff --git a/src/app/darmasaba/(pages)/ppid/struktur-ppid/struktur.css b/src/app/darmasaba/(pages)/ppid/struktur-ppid/struktur.css new file mode 100644 index 00000000..0f9f4fdb --- /dev/null +++ b/src/app/darmasaba/(pages)/ppid/struktur-ppid/struktur.css @@ -0,0 +1,68 @@ +/* ============================================ + STRUKTUR ORGANISASI PPID - STYLING + ============================================ */ + +/* Tabel chart selalu center */ +.p-organizationchart-table { + margin: 0 auto !important; + } + + /* Jarak vertikal antar level - lebih lega */ + .p-organizationchart-line-down { + height: 32px !important; + } + + /* Padding di dalam node - lebih rapi */ + .p-organizationchart-node-content { + padding: 0 !important; + background: transparent !important; + border: none !important; + } + + /* Garis connector antar node - lebih tebal dan jelas */ + .p-organizationchart-line-down, + .p-organizationchart-line-left, + .p-organizationchart-line-right, + .p-organizationchart-line-top { + border-color: rgba(28, 110, 164, 0.4) !important; + border-width: 2px !important; + } + + /* Garis horizontal */ + .p-organizationchart-line-left, + .p-organizationchart-line-right { + border-top-width: 2px !important; + } + + /* Jarak horizontal antar node - lebih proporsional */ + .p-organizationchart-table > tbody > tr > td { + padding: 0 24px !important; + vertical-align: top !important; + } + + /* Node container spacing */ + .p-organizationchart-node { + padding: 8px !important; + } + + /* Responsive adjustments */ + @media (max-width: 768px) { + .p-organizationchart-table > tbody > tr > td { + padding: 0 12px !important; + } + + .p-organizationchart-line-down { + height: 24px !important; + } + } + + /* Smooth transitions untuk zoom */ + .p-organizationchart { + transition: transform 0.2s ease; + } + + /* Fullscreen mode adjustments */ + .p-organizationchart-table:fullscreen { + background: rgba(230, 240, 255, 0.98); + padding: 40px; + } \ No newline at end of file diff --git a/src/app/darmasaba/_com/Navbar.tsx b/src/app/darmasaba/_com/Navbar.tsx index 65da725e..28225d7f 100644 --- a/src/app/darmasaba/_com/Navbar.tsx +++ b/src/app/darmasaba/_com/Navbar.tsx @@ -116,7 +116,7 @@ function NavbarMobile({ listNavbar }: { listNavbar: MenuItem[] }) { radius="md" p="sm" withBorder - bg={active ? "blue.0" : "gray.0"} + bg={active ? colors["blue-button-2"] : "gray.0"} onClick={() => { if (item.href) { router.push(item.href); @@ -126,21 +126,21 @@ function NavbarMobile({ listNavbar }: { listNavbar: MenuItem[] }) { style={{ cursor: item.href ? "pointer" : "default", transition: "background 0.15s ease", - borderLeft: active ? "4px solid #1e66f5" : "4px solid transparent", + borderLeft: active ? `4px solid ${colors['blue-button']}` : "4px solid transparent", }} > <Group justify="space-between" align="center" wrap="nowrap"> <Text fw={active ? 700 : 600} fz="md" - c={active ? "blue.7" : "dark.9"} + c={active ? colors['blue-button'] : "dark.9"} > {item.name} </Text> {item.href && ( <IconSquareArrowRight size={18} - color={active ? "#1e66f5" : "inherit"} + color={active ? colors['blue-button'] : "inherit"} /> )} </Group> @@ -167,21 +167,21 @@ function NavbarMobile({ listNavbar }: { listNavbar: MenuItem[] }) { cursor: child.href ? "pointer" : "default", opacity: child.href ? 1 : 0.8, borderRadius: "0.5rem", - backgroundColor: childActive ? "#e7f0ff" : "transparent", - borderLeft: childActive ? "3px solid #1e66f5" : "3px solid transparent", + backgroundColor: childActive ? colors["blue-button-2"] : "transparent", + borderLeft: childActive ? `3px solid ${colors['blue-button']}` : "3px solid transparent", transition: "background 0.15s ease", }} > <Text fz="sm" fw={childActive ? 600 : 400} - c={childActive ? "blue.7" : "dark.8"} + c={childActive ? colors['blue-button'] : "dark.8"} > {child.name} </Text> <IconSquareArrowRight size={14} - color={childActive ? "#1e66f5" : "inherit"} + color={childActive ? colors['blue-button'] : "inherit"} /> </Group> ); diff --git a/src/app/darmasaba/_com/NavbarMainMenu.tsx b/src/app/darmasaba/_com/NavbarMainMenu.tsx index 5d796d23..96548a8e 100644 --- a/src/app/darmasaba/_com/NavbarMainMenu.tsx +++ b/src/app/darmasaba/_com/NavbarMainMenu.tsx @@ -112,7 +112,7 @@ function MenuItemCom({ item, isActive = false }: { item: MenuItem, isActive?: bo <MenuTarget> <Button variant="subtle" - color={isActive ? 'blue' : 'gray'} + color={isActive ? colors['blue-button'] : 'gray'} onClick={() => { if (item.href) { router.push(item.href); diff --git a/src/app/darmasaba/_com/NavbarSubMenu.tsx b/src/app/darmasaba/_com/NavbarSubMenu.tsx index db816ec0..256f8fd4 100644 --- a/src/app/darmasaba/_com/NavbarSubMenu.tsx +++ b/src/app/darmasaba/_com/NavbarSubMenu.tsx @@ -49,12 +49,12 @@ export function NavbarSubMenu({ item }: { item: MenuItem[] | null }) { rightSection={<IconArrowRight size={18} />} styles={(theme) => ({ root: { - background: link.href && pathname.startsWith(link.href) ? theme.colors.blue[0] : 'transparent', - color: link.href && pathname.startsWith(link.href) ? theme.colors.blue[7] : colors['blue-button'], + background: link.href && pathname.startsWith(link.href) ? colors['blue-button-2'] : 'transparent', + color: link.href && pathname.startsWith(link.href) ? colors['blue-button'] : 'gray', fontWeight: link.href && pathname.startsWith(link.href) ? 600 : 500, transition: "all 0.2s ease", "&:hover": { - background: link.href && pathname.startsWith(link.href) ? theme.colors.blue[1] : theme.colors.gray[0], + background: link.href && pathname.startsWith(link.href) ? colors['blue-button-2'] : theme.colors.gray[0], } }, })} diff --git a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx index 1cc7a035..80c78308 100644 --- a/src/app/darmasaba/_com/main-page/kepuasan/index.tsx +++ b/src/app/darmasaba/_com/main-page/kepuasan/index.tsx @@ -245,7 +245,7 @@ function Kepuasan() { {/* Chart Rating */} <Paper bg={colors['white-1']} p="md" radius="md"> <Stack> - <Title order={4}>Pilihan + Ulasan {donutDataRating.every(item => item.value === 0) ? ( Belum ada data untuk ditampilkan dalam grafik @@ -517,7 +517,7 @@ function Kepuasan() { {/* Chart Rating */} - Pilihan + Ulasan {donutDataRating.every(item => item.value === 0) ? ( Belum ada data untuk ditampilkan dalam grafik diff --git a/src/con/navbar-list-menu.ts b/src/con/navbar-list-menu.ts index 28eaf9c2..f9f0455b 100644 --- a/src/con/navbar-list-menu.ts +++ b/src/con/navbar-list-menu.ts @@ -35,13 +35,13 @@ const navbarListMenu = [ }, { id: "1.7", - name: "Daftar Informasi Publik Desa Darmasaba", - href: "/darmasaba/ppid/daftar-informasi-publik-desa-darmasaba" + name: "Daftar Informasi Publik", + href: "/darmasaba/ppid/daftar-informasi-publik" }, { id: "1.8", - name: "IKM Desa Darmasaba", - href: "/darmasaba/ppid/ikm-desa-darmasaba" + name: "Indeks Kepuasan Masyarakat", + href: "/darmasaba/ppid/indeks-kepuasan-masyarakat" }, ] From 7b4bb1e58eeda7972dabd47575bc66f9467d23c5 Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 3 Nov 2025 10:28:03 +0800 Subject: [PATCH 28/56] QC Kak Inno FrontEnd Done QC Kak Ayu FrontEnd Done QC Keano 31 Okt --- .../darmasaba/(pages)/desa/profile/page.tsx | 4 +- .../(pages)/desa/profile/ui/lambangDesa.tsx | 2 +- .../(pages)/desa/profile/ui/maskotDesa.tsx | 2 +- .../(pages)/desa/profile/ui/motoDesa.tsx | 2 +- .../desa/profile/ui/profilPerbekel.tsx | 4 +- .../(pages)/desa/profile/ui/profileDesa.tsx | 2 +- .../(pages)/desa/profile/ui/sejarahDesa.tsx | 2 +- .../(pages)/desa/profile/ui/semuaPerbekel.tsx | 2 +- .../(pages)/desa/profile/ui/visimisiDesa.tsx | 2 +- .../program-lainnya/page.tsx | 19 +- .../pendidikan/data-pendidikan/page.tsx | 2 +- .../[jenjangPendidikan]/lembaga/page.tsx | 2 +- .../[jenjangPendidikan]/pengajar/page.tsx | 2 +- .../[jenjangPendidikan]/siswa/page.tsx | 2 +- .../info-sekolah/_lib/layoutTabs.tsx | 21 +- .../info-sekolah/semua/lembaga/page.tsx | 2 +- .../info-sekolah/semua/pengajar/page.tsx | 2 +- .../info-sekolah/semua/siswa/page.tsx | 2 +- .../program-pendidikan-anak/page.tsx | 10 +- .../ppid/daftar-informasi-publik/page.tsx | 19 +- src/app/darmasaba/(tambahan)/apbdes/page.tsx | 2 +- .../darmasaba/(tambahan)/sdgs-desa/page.tsx | 12 +- .../darmasaba/_com/main-page/apbdes/index.tsx | 11 +- .../_com/main-page/desaantikorupsi/index.tsx | 2 +- .../_com/main-page/kepuasan/index.tsx | 4 +- .../_com/main-page/layanan/index.tsx | 2 +- .../_com/main-page/prestasi/index.tsx | 15 +- .../darmasaba/_com/main-page/sdgs/index.tsx | 181 +++++++++--------- src/app/darmasaba/page.tsx | 2 +- 29 files changed, 165 insertions(+), 171 deletions(-) diff --git a/src/app/darmasaba/(pages)/desa/profile/page.tsx b/src/app/darmasaba/(pages)/desa/profile/page.tsx index e2f08dd5..9103580c 100644 --- a/src/app/darmasaba/(pages)/desa/profile/page.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/page.tsx @@ -26,7 +26,7 @@ function Page() { - + @@ -35,7 +35,7 @@ function Page() { - + {/* Tombol Scroll ke Atas */} diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx b/src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx index cf7ef45b..9ad92167 100644 --- a/src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx @@ -24,7 +24,7 @@ function LambangDesa() { } return ( - +
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx b/src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx index 1d58f079..4f0ad9ea 100644 --- a/src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx @@ -28,7 +28,7 @@ function MaskotDesa() { } return ( - + Ikon Desa diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx b/src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx index baee3347..53e73d55 100644 --- a/src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx @@ -36,7 +36,7 @@ const letters = ["S", "I", "G", "A", "P"]; function MotoDesa() { return ( - + + +
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx b/src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx index 185f4606..1acc52f1 100644 --- a/src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx @@ -24,7 +24,7 @@ function SejarahDesa() { } return ( - +
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx b/src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx index 46f6594b..29bc2809 100644 --- a/src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx @@ -36,7 +36,7 @@ function SemuaPerbekel() { } return ( - + + - - diff --git a/src/app/darmasaba/(pages)/pendidikan/data-pendidikan/page.tsx b/src/app/darmasaba/(pages)/pendidikan/data-pendidikan/page.tsx index 8c696b82..9ac1be46 100644 --- a/src/app/darmasaba/(pages)/pendidikan/data-pendidikan/page.tsx +++ b/src/app/darmasaba/(pages)/pendidikan/data-pendidikan/page.tsx @@ -57,7 +57,7 @@ function Page() { Statistik Data Pendidikan - + Visualisasi jumlah pendidikan berdasarkan kategori yang tersedia diff --git a/src/app/darmasaba/(pages)/pendidikan/info-sekolah/[jenjangPendidikan]/lembaga/page.tsx b/src/app/darmasaba/(pages)/pendidikan/info-sekolah/[jenjangPendidikan]/lembaga/page.tsx index 801854da..1a66e860 100644 --- a/src/app/darmasaba/(pages)/pendidikan/info-sekolah/[jenjangPendidikan]/lembaga/page.tsx +++ b/src/app/darmasaba/(pages)/pendidikan/info-sekolah/[jenjangPendidikan]/lembaga/page.tsx @@ -55,7 +55,7 @@ function Page({ params }: PageProps) { - Daftar Lembaga Pendidikan + Daftar Lembaga Pendidikan - Daftar Pengajar + Daftar Pengajar - Daftar Siswa + Daftar Siswa {/* Back Button */} - window.history.back()} variant="light" radius="md" size="lg"> - - Kembali - + {/* Search & Filter */} @@ -185,8 +180,8 @@ export default function LayoutSekolah({ radius="xl" size="sm" variant={aktif ? 'filled' : 'light'} - bg={colors['blue-button']} - c={aktif ? colors['white-1'] : 'gray'} + bg={aktif? colors['blue-button'] : '#BDCADE'} + c={aktif ? colors['white-1'] : colors['blue-button']} > {k} diff --git a/src/app/darmasaba/(pages)/pendidikan/info-sekolah/semua/lembaga/page.tsx b/src/app/darmasaba/(pages)/pendidikan/info-sekolah/semua/lembaga/page.tsx index d395cfd7..07bd3201 100644 --- a/src/app/darmasaba/(pages)/pendidikan/info-sekolah/semua/lembaga/page.tsx +++ b/src/app/darmasaba/(pages)/pendidikan/info-sekolah/semua/lembaga/page.tsx @@ -47,7 +47,7 @@ function Page() { - Daftar Lembaga Pendidikan + Daftar Lembaga Pendidikan - Daftar Pengajar + Daftar Pengajar - Daftar Siswa + Daftar Siswa - + <Title ta="center" order={1} fw="bold" c={colors['blue-button']}> Program Pendidikan Anak + + + Desa Darmasaba berkomitmen mencetak generasi muda yang cerdas, berkarakter, dan siap bersaing melalui program pendidikan yang inklusif dan berkelanjutan. - - + @@ -87,7 +89,7 @@ function Page() { - + diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx index d1909407..e5c33633 100644 --- a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx +++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx @@ -7,6 +7,7 @@ import { Box, Button, Center, + Group, Image, Pagination, Paper, @@ -178,12 +179,18 @@ function Page() { Kontak PPID - - Email: ppid@desadarmasaba.id - - - WhatsApp: 081-xxx-xxx-xxx - + + + + Email: ppid@desadarmasaba.id + + + + + + WhatsApp: 081-xxx-xxx-xxx + + diff --git a/src/app/darmasaba/(tambahan)/apbdes/page.tsx b/src/app/darmasaba/(tambahan)/apbdes/page.tsx index b3d419d4..4d01ed1a 100644 --- a/src/app/darmasaba/(tambahan)/apbdes/page.tsx +++ b/src/app/darmasaba/(tambahan)/apbdes/page.tsx @@ -63,7 +63,7 @@ function Page() { {data.map((v: any, k: number) => ( - + diff --git a/src/app/darmasaba/(tambahan)/sdgs-desa/page.tsx b/src/app/darmasaba/(tambahan)/sdgs-desa/page.tsx index 65d78318..bfbfba3d 100644 --- a/src/app/darmasaba/(tambahan)/sdgs-desa/page.tsx +++ b/src/app/darmasaba/(tambahan)/sdgs-desa/page.tsx @@ -1,10 +1,10 @@ 'use client' -import { Box, Center, Container, Image, LoadingOverlay, Paper, SimpleGrid, Stack, Text, Title, Tooltip } from '@mantine/core'; -import { Prisma } from '@prisma/client'; -import { useEffect, useState } from 'react'; -import { IconMoodSad } from '@tabler/icons-react'; -import BackButton from '../../(pages)/desa/layanan/_com/BackButto'; import colors from '@/con/colors'; +import { Box, Center, Container, Image, LoadingOverlay, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core'; +import { Prisma } from '@prisma/client'; +import { IconMoodSad } from '@tabler/icons-react'; +import { useEffect, useState } from 'react'; +import BackButton from '../../(pages)/desa/layanan/_com/BackButto'; function Page() { const [sdgsDesa, setSdgsDesa] = useState[]>([]); @@ -114,11 +114,9 @@ function Page() { /> - {item.name} - - + {textHeading.title} @@ -72,12 +72,7 @@ function Apbdes() { pos="relative" style={{ overflow: 'hidden' }} > - + - + diff --git a/src/app/darmasaba/page.tsx b/src/app/darmasaba/page.tsx index e601eb4d..3b37c8df 100644 --- a/src/app/darmasaba/page.tsx +++ b/src/app/darmasaba/page.tsx @@ -19,7 +19,7 @@ export default function Page() { From d128313e713176a51c5c8f13a2d34e049f696acf Mon Sep 17 00:00:00 2001 From: nico Date: Mon, 3 Nov 2025 17:36:00 +0800 Subject: [PATCH 29/56] Fix QC Keano FrontEnd Fix QC Kak Ayu Admin 29 Okt --- bun.lockb | Bin 397574 -> 408119 bytes package.json | 7 +- .../_state/inovasi/program-kreatif.ts | 27 +- .../create/page.tsx | 23 +- .../info-teknologi-tepat-guna/[id]/page.tsx | 6 +- .../program-kreatif-desa/[id]/edit/page.tsx | 82 +++- .../program-kreatif-desa/create/page.tsx | 10 +- .../laporan-publik/[id]/edit/page.tsx | 21 +- .../page.tsx | 13 +- .../_lib/layoutTabs.tsx | 17 +- .../data-perpustakaan/page.tsx | 22 +- .../darmasaba/(pages)/desa/potensi/page.tsx | 80 +++- .../desa-digital-smart-village/[id]/page.tsx | 83 ++++ .../desa-digital-smart-village/page.tsx | 70 ++- .../program-kreatif-desa/[id]/page.tsx | 23 +- .../inovasi/program-kreatif-desa/page.tsx | 2 +- .../gotong-royong/[kategori]/[id]/page.tsx | 182 +++++--- .../darmasaba/(tambahan)/penghargaan/page.tsx | 396 +++++++++++------ .../_com/main-page/layanan/index.tsx | 401 +++++++++++++----- src/types/react-exif-orientation-img.d.ts | 12 + 20 files changed, 1038 insertions(+), 439 deletions(-) create mode 100644 src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/[id]/page.tsx create mode 100644 src/types/react-exif-orientation-img.d.ts diff --git a/bun.lockb b/bun.lockb index e571b0b12cd4ab76738eccfc59b6766bd314c04c..fb4cf5dafeec026a286694bd26bd6a1a043534c1 100755 GIT binary patch delta 87455 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 bY&sa3q>pG;$Y!|sHryst?8Ct}1?K%9qJ~$* delta 84690 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 I&bem&KYis`qyPW_ diff --git a/package.json b/package.json index 472efe96..1f829ad9 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@mantine/dropzone": "^8.1.1", "@mantine/form": "^8.1.0", "@mantine/hooks": "^7.17.4", + "@mantine/modals": "^8.3.6", "@mantine/tiptap": "^7.17.4", "@paljs/types": "^8.1.0", "@prisma/client": "^6.3.1", @@ -55,8 +56,9 @@ "dayjs": "^1.11.13", "dotenv": "^17.2.3", "elysia": "^1.3.5", - "embla-carousel-autoplay": "^8.5.2", - "embla-carousel-react": "^7.1.0", + "embla-carousel": "^8.6.0", + "embla-carousel-autoplay": "^8.6.0", + "embla-carousel-react": "^8.6.0", "extract-zip": "^2.0.1", "form-data": "^4.0.2", "framer-motion": "^12.23.5", @@ -80,6 +82,7 @@ "prisma": "^6.3.1", "react": "^19.0.0", "react-dom": "^19.0.0", + "react-exif-orientation-img": "^0.1.5", "react-international-phone": "^4.6.0", "react-leaflet": "^5.0.0", "react-simple-toasts": "^6.1.0", diff --git a/src/app/admin/(dashboard)/_state/inovasi/program-kreatif.ts b/src/app/admin/(dashboard)/_state/inovasi/program-kreatif.ts index 345910cc..5e1d10ab 100644 --- a/src/app/admin/(dashboard)/_state/inovasi/program-kreatif.ts +++ b/src/app/admin/(dashboard)/_state/inovasi/program-kreatif.ts @@ -6,9 +6,9 @@ import { proxy } from "valtio"; import { z } from "zod"; const templateForm = z.object({ - name: z.string().min(1, "Nama minimal 1 karakter"), - deskripsi: z.string().min(1, "Deskripsi minimal 1 karakter"), - slug: z.string().min(1, "Deskripsi singkat minimal 1 karakter"), + name: z.string().min(5, "Nama minimal 5 karakter"), + deskripsi: z.string().min(5, "Deskripsi minimal 5 karakter"), + slug: z.string().min(5, "Deskripsi singkat minimal 5 karakter"), icon: z.string().min(1, "Icon minimal 1 karakter"), }); @@ -29,26 +29,33 @@ const programKreatifState = proxy({ const err = `[${cek.error.issues .map((v) => `${v.path.join(".")}`) .join("\n")}] required`; - return toast.error(err); + toast.error(err); + return false; // ⬅️ ini penting } - + try { programKreatifState.create.loading = true; const res = await ApiFetch.api.inovasi.programkreatif["create"].post( programKreatifState.create.form ); + if (res.status === 200) { programKreatifState.findMany.load(); - return toast.success("success create"); + toast.success("success create"); + return true; } - console.log(res); - return toast.error("failed create"); + + toast.error("failed create"); + return false; } catch (error) { - console.log((error as Error).message); + console.error((error as Error).message); + toast.error("Terjadi kesalahan saat create"); + return false; } finally { programKreatifState.create.loading = false; } - }, + } + }, findMany: { data: null as any[] | null, diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx index 6a00b669..5d905597 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx @@ -5,7 +5,6 @@ import { Box, Button, Group, - Image, Paper, Stack, Text, @@ -21,6 +20,7 @@ import { useProxy } from 'valtio/utils'; import CreateEditor from '../../../_com/createEditor'; import desaDigitalState from '../../../_state/inovasi/desa-digital'; import { Dropzone } from '@mantine/dropzone'; +import ExifOrientationImg from 'react-exif-orientation-img'; export default function CreateDesaDigital() { const stateDesaDigital = useProxy(desaDigitalState); @@ -173,17 +173,16 @@ export default function CreateDesaDigital() { overflow: 'hidden', }} > - Preview + )} diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx index 8e9d2dab..a75b7207 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx @@ -54,8 +54,8 @@ function DetailInfoTeknologiTepatGuna() { {/* Card Utama */} - + Judul diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx index 5e2a29ff..477e0988 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/edit/page.tsx @@ -1,6 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; +import { IconKey } from '@/app/admin/(dashboard)/_com/iconMap'; import programKreatifState from '@/app/admin/(dashboard)/_state/inovasi/program-kreatif'; import colors from '@/con/colors'; import { @@ -11,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -20,7 +20,6 @@ import { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import SelectIconProgramEdit from '../../../../_com/selectIconEdit'; -import { IconKey } from '@/app/admin/(dashboard)/_com/iconMap'; interface FormProgramKreatif { name: string; @@ -41,6 +40,15 @@ function EditProgramKreatifDesa() { icon: '', }); + const [originalData, setOriginalData] = useState({ + name: '', + deskripsi: '', + slug: '', + icon: '', + }); + + const [isDataChanged, setIsDataChanged] = useState(false); + // Load data hanya sekali berdasarkan params.id useEffect(() => { const loadProgramKreatif = async () => { @@ -51,12 +59,14 @@ function EditProgramKreatifDesa() { const data = await stateProgramKreatif.update.load(id); if (data) { stateProgramKreatif.update.id = id; - setFormData({ + const loadedData = { name: data.name || '', slug: data.slug || '', deskripsi: data.deskripsi || '', icon: data.icon || '', - }); + }; + setFormData(loadedData); + setOriginalData(loadedData); } } catch (error) { console.error('Error loading program kreatif:', error); @@ -67,12 +77,49 @@ function EditProgramKreatifDesa() { loadProgramKreatif(); }, [params?.id]); + // Deteksi perubahan data + useEffect(() => { + const hasChanged = + formData.name !== originalData.name || + formData.slug !== originalData.slug || + formData.deskripsi !== originalData.deskripsi || + formData.icon !== originalData.icon; + + setIsDataChanged(hasChanged); + }, [formData, originalData]); + + // Prevent browser back/refresh jika ada perubahan + useEffect(() => { + const handleBeforeUnload = (e: BeforeUnloadEvent) => { + if (isDataChanged) { + e.preventDefault(); + e.returnValue = ''; + } + }; + + window.addEventListener('beforeunload', handleBeforeUnload); + return () => window.removeEventListener('beforeunload', handleBeforeUnload); + }, [isDataChanged]); + const handleChange = (field: keyof FormProgramKreatif) => (value: string) => { setFormData((prev) => ({ ...prev, [field]: value })); }; + const handleBackClick = () => { + if (isDataChanged) { + const confirmed = window.confirm( + 'Anda memiliki perubahan yang belum disimpan. Apakah Anda yakin ingin keluar dari halaman ini? Semua perubahan akan hilang.' + ); + if (confirmed) { + router.back(); + } + } else { + router.back(); + } + }; + const handleSubmit = async () => { try { stateProgramKreatif.update.form = { @@ -82,6 +129,11 @@ function EditProgramKreatifDesa() { icon: formData.icon.trim(), }; await stateProgramKreatif.update.submit(); + + // Reset isDataChanged agar tidak muncul konfirmasi setelah save + setOriginalData(formData); + setIsDataChanged(false); + router.push('/admin/inovasi/program-kreatif-desa'); } catch (error) { console.error('Error updating program kreatif:', error); @@ -92,16 +144,14 @@ function EditProgramKreatifDesa() { return ( - - - + Edit Program Kreatif Desa @@ -172,4 +222,4 @@ function EditProgramKreatifDesa() { ); } -export default EditProgramKreatifDesa; +export default EditProgramKreatifDesa; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx index b5969bf7..4d318f33 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx @@ -32,10 +32,14 @@ function CreateProgramKreatifDesa() { }; const handleSubmit = async () => { - await stateCreate.create.create(); - resetForm(); - router.push("/admin/inovasi/program-kreatif-desa"); + const success = await stateCreate.create.create(); + + if (success) { + resetForm(); + router.push("/admin/inovasi/program-kreatif-desa"); + } }; + return ( diff --git a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx index f52bd6c1..c01627df 100644 --- a/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/keamanan/laporan-publik/[id]/edit/page.tsx @@ -1,3 +1,4 @@ +/* eslint-disable react-hooks/exhaustive-deps */ 'use client' import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import laporanPublikState from '@/app/admin/(dashboard)/_state/keamanan/laporan-publik'; @@ -52,15 +53,14 @@ function EditLaporanPublik() { try { const data = await stateLaporan.edit.load(id); if (data) { - setFormData((prev) => ({ - ...prev, - judul: data.judul ?? prev.judul, - lokasi: data.lokasi ?? prev.lokasi, - tanggalWaktu: data.tanggalWaktu ?? prev.tanggalWaktu, - status: (data.status as Status) ?? prev.status, - penanganan: data.penanganan?.[0]?.deskripsi ?? prev.penanganan, - kronologi: data.kronologi ?? prev.kronologi, - })); + setFormData({ + judul: data.judul ?? '', + lokasi: data.lokasi ?? '', + tanggalWaktu: data.tanggalWaktu ?? '', + status: (data.status as Status) ?? 'Proses', + penanganan: data.penanganan?.[0]?.deskripsi ?? '', + kronologi: data.kronologi ?? '', + }); } } catch (error) { console.error("Error loading laporan publik:", error); @@ -69,7 +69,8 @@ function EditLaporanPublik() { }; loadLaporanPublik(); - }, [params?.id, stateLaporan.edit]); + }, [params?.id]); + const handleChange = (field: string, value: string | Status) => { diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx index 72b62a5f..e8cd6000 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/page.tsx @@ -1,5 +1,4 @@ 'use client' -import colors from '@/con/colors'; import { Box, Button, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; @@ -26,10 +25,10 @@ function Page() { } return ( - - + + {/* Header */} - + Preview Bentuk Konservasi Berdasarkan Adat @@ -55,8 +54,8 @@ function Page() { {/* Konten */} <Stack gap="md"> - <Paper radius="md" p={{ base: 'md', md: 'xl' }} bg={colors['BG-trans']} shadow="sm"> - <Box mb="md"> + <Paper p={{ base: 'md', md: 'xl' }} bg="#ECEEF8" radius="md"> + <Box mb="md" px={{ base: 0, md: 20 }}> <Text fz={{ base: 'xl', md: '2xl' }} fw={600} @@ -67,7 +66,7 @@ function Page() { style={{ wordBreak: "break-word", whiteSpace: "normal" }} /> </Box> - <Box> + <Box px={{ base: 0, md: 20 }}> <Text fz={{ base: 'md', md: 'lg' }} ta="justify" diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/_lib/layoutTabs.tsx index 5ca918bf..dc178d22 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' +import colors from '@/con/colors'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconRecycle, IconTrash } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; -import { IconTrash, IconRecycle } from '@tabler/icons-react'; -import colors from '@/con/colors'; function LayoutTabsPengelolaanSampahBankSampah({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -16,14 +16,12 @@ function LayoutTabsPengelolaanSampahBankSampah({ children }: { children: React.R value: "listpengelolaansampahbanksampah", href: "/admin/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah", icon: <IconTrash size={18} stroke={1.8} />, - tooltip: "Kelola data pengelolaan sampah bank sampah", }, { label: "Keterangan Bank Sampah Terdekat", value: "keteranganbanksampahterdekat", href: "/admin/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat", icon: <IconRecycle size={18} stroke={1.8} />, - tooltip: "Kelola data bank sampah terdekat", }, ]; @@ -74,14 +72,8 @@ function LayoutTabsPengelolaanSampahBankSampah({ children }: { children: React.R }} > {tabs.map((tab, i) => ( - <Tooltip - key={i} - label={tab.tooltip} - position="bottom" - withArrow - transitionProps={{ transition: 'pop', duration: 200 }} - > <TabsTab + key={i} value={tab.value} leftSection={tab.icon} style={{ @@ -92,7 +84,6 @@ function LayoutTabsPengelolaanSampahBankSampah({ children }: { children: React.R > {tab.label} </TabsTab> - </Tooltip> ))} </TabsList> </ScrollArea> diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx index b6522dc5..90275fbc 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx @@ -65,26 +65,32 @@ function ListDataPerpustakaan({ search }: { search: string }) { <Table striped highlightOnHover withRowBorders style={{ minWidth: '700px' }}> <TableThead> <TableTr> - <TableTh>No</TableTh> - <TableTh>Judul</TableTh> - <TableTh>Kategori</TableTh> - <TableTh>Detail</TableTh> + <TableTh style={{ width: '5%' }}>No</TableTh> + <TableTh style={{ width: '25%' }}>Judul</TableTh> + <TableTh style={{ width: '25%' }}>Kategori</TableTh> + <TableTh style={{ width: '23%' }}>Deskripsi</TableTh> + <TableTh style={{ width: '22%' }}>Detail</TableTh> </TableTr> </TableThead> <TableTbody> {filteredData.length > 0 ? ( filteredData.map((item, index) => ( <TableTr key={item.id}> - <TableTd> + <TableTd style={{ width: '5%' }}> <Text truncate fz="sm">{index + 1}</Text> </TableTd> - <TableTd> + <TableTd style={{ width: '20%' }}> <Text truncate fz="sm">{item.judul}</Text> </TableTd> - <TableTd> + <TableTd style={{ width: '20%' }}> <Text truncate fz="sm">{item.kategori.name}</Text> </TableTd> - <TableTd> + <TableTd style={{ width: '20%' }}> + <Box w={150}> + <Text dangerouslySetInnerHTML={{ __html: item.deskripsi }} lineClamp={1} truncate fz="sm"/> + </Box> + </TableTd> + <TableTd style={{ width: '20%' }}> <Button variant="light" color="blue" diff --git a/src/app/darmasaba/(pages)/desa/potensi/page.tsx b/src/app/darmasaba/(pages)/desa/potensi/page.tsx index 2bcced1d..b6a586b9 100644 --- a/src/app/darmasaba/(pages)/desa/potensi/page.tsx +++ b/src/app/darmasaba/(pages)/desa/potensi/page.tsx @@ -12,6 +12,7 @@ import BackButton from '../layanan/_com/BackButto'; function Page() { const router = useTransitionRouter() const [loading, setLoading] = useState(false) + const [hoveredId, setHoveredId] = useState<string | null>(null) const state = useProxy(potensiDesaState) useEffect(() => { @@ -88,20 +89,55 @@ function Page() { src={v.image?.link || ''} h={360} radius="xl" - style={{ overflow: 'hidden', position: 'relative' }} + onMouseEnter={() => setHoveredId(v.id)} + onMouseLeave={() => setHoveredId(null)} + style={{ + overflow: 'hidden', + position: 'relative', + cursor: 'pointer', + transition: 'transform 0.3s ease' + }} > + {/* Overlay with smooth transition */} <Box pos="absolute" inset={0} - bg="linear-gradient(180deg, rgba(0,0,0,0.25) 0%, rgba(0,0,0,0.7) 100%)" + bg={hoveredId === v.id + ? "linear-gradient(180deg, rgba(0,0,0,0.4) 0%, rgba(0,0,0,0.75) 100%)" + : "linear-gradient(180deg, rgba(0,0,0,0.1) 0%, rgba(0,0,0,0.15) 100%)" + } + style={{ + transition: 'background 0.3s ease' + }} /> + <Stack justify="space-between" h="100%" gap="md" p="lg" pos="relative"> + {/* Kategori badge - always visible */} <Group> - <Paper radius="lg" py={6} px={12} shadow="md" withBorder bg="rgba(255,255,255,0.85)"> + <Paper + radius="lg" + py={6} + px={12} + shadow="md" + withBorder + bg="rgba(255,255,255,0.9)" + style={{ + transition: 'all 0.3s ease' + }} + > <Text fz="sm" fw={600}>{v.kategori?.nama}</Text> </Paper> </Group> - <Box> + + {/* Nama potensi - visible on hover */} + <Box + style={{ + opacity: hoveredId === v.id ? 1 : 0, + transform: hoveredId === v.id ? 'translateY(0)' : 'translateY(10px)', + transition: 'all 0.3s ease', + pointerEvents: hoveredId === v.id ? 'auto' : 'none' + }} + > <Text fw={800} c="white" @@ -113,18 +149,28 @@ function Page() { {v.name} </Text> </Box> - <Group justify="center"> - <Button - radius="xl" - size="md" - leftSection={<IconEye size={18} />} - bg={colors["blue-button"]} - variant="gradient" - gradient={{ from: colors["blue-button"], to: "#4dabf7", deg: 45 }} - onClick={() => router.push(`/darmasaba/desa/potensi/${v.id}`)} - > - Lihat Detail - </Button> + + {/* Button - visible on hover */} + <Group + justify="center" + style={{ + opacity: hoveredId === v.id ? 1 : 0, + transform: hoveredId === v.id ? 'translateY(0)' : 'translateY(10px)', + transition: 'all 0.3s ease', + pointerEvents: hoveredId === v.id ? 'auto' : 'none' + }} + > + <Button + radius="xl" + size="md" + leftSection={<IconEye size={18} />} + bg={colors["blue-button"]} + variant="gradient" + gradient={{ from: colors["blue-button"], to: "#4dabf7", deg: 45 }} + onClick={() => router.push(`/darmasaba/desa/potensi/${v.id}`)} + > + Lihat Detail + </Button> </Group> </Stack> </BackgroundImage> @@ -147,4 +193,4 @@ function Page() { ); } -export default Page; +export default Page; \ No newline at end of file diff --git a/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/[id]/page.tsx b/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/[id]/page.tsx new file mode 100644 index 00000000..46f02a6c --- /dev/null +++ b/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/[id]/page.tsx @@ -0,0 +1,83 @@ +'use client' +import desaDigitalState from '@/app/admin/(dashboard)/_state/inovasi/desa-digital'; +import colors from '@/con/colors'; +import { Box, Center, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { useParams } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import BackButton from '../../../desa/layanan/_com/BackButto'; + +function DetailDesaDigitalUser() { + const stateDesaDigital = useProxy(desaDigitalState); + const params = useParams(); + + useShallowEffect(() => { + stateDesaDigital.findUnique.load(params?.id as string); + }, []); + + if (!stateDesaDigital.findUnique.data) { + return ( + <Stack py={40} align="center"> + <Skeleton height={400} radius="md" w={{ base: "90%", md: "60%" }} /> + <Text fz="lg" c="dimmed">Memuat data...</Text> + </Stack> + ); + } + + const data = stateDesaDigital.findUnique.data; + + return ( + <Stack bg={colors.Bg} py="xl" align="center" px={{ base: "md", md: "lg" }}> + {/* Tombol Back */} + <Box w={{ base: "100%", md: "60%" }}> + <BackButton/> + </Box> + + {/* Card Detail */} + <Paper + w={{ base: "100%", md: "60%" }} + bg={colors["white-1"]} + p="lg" + radius="md" + shadow="sm" + > + <Stack gap="md"> + <Text ta={"center"} fz={{ base: "xl", md: "2xl" }} fw="bold" c={colors["blue-button"]}> + {data?.name || "Desa Digital"} + </Text> + + {/* Gambar */} + {data?.image?.link ? ( + <Center> + <Image + src={data.image.link} + alt={data.name || "Gambar Desa Digital"} + radius="md" + fit="cover" + w={{ base: "100%", md: "80%" }} + h={{ base: 250, md: 350 }} + style={{ objectPosition: "center", borderRadius: 12 }} + /> + </Center> + ) : ( + <Center> + <Text c="dimmed">Tidak ada gambar</Text> + </Center> + )} + + {/* Deskripsi */} + <Box pt="md"> + <Text + fz={{ base: "md", md: "lg" }} + c="dimmed" + style={{ lineHeight: 1.6 }} + dangerouslySetInnerHTML={{ __html: data?.deskripsi || "-" }} + /> + </Box> + </Stack> + </Paper> + </Stack> + ); +} + +export default DetailDesaDigitalUser; diff --git a/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/page.tsx b/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/page.tsx index ef1465f7..c881fce5 100644 --- a/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/page.tsx +++ b/src/app/darmasaba/(pages)/inovasi/desa-digital-smart-village/page.tsx @@ -1,17 +1,19 @@ 'use client' import colors from '@/con/colors'; -import { Stack, Box, Text, Paper, SimpleGrid, Image, Skeleton, Center, Pagination, Grid, GridCol, TextInput } from '@mantine/core'; +import { Stack, Box, Text, Paper, SimpleGrid, Image, Skeleton, Center, Pagination, Grid, GridCol, TextInput, Button } from '@mantine/core'; import React, { useState } from 'react'; import BackButton from '../../desa/layanan/_com/BackButto'; import { useProxy } from 'valtio/utils'; import desaDigitalState from '@/app/admin/(dashboard)/_state/inovasi/desa-digital'; import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconSearch } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; function Page() { const [search, setSearch] = useState("") const [debouncedSearch] = useDebouncedValue(search, 500); // 500ms delay const state = useProxy(desaDigitalState) + const router = useRouter() const { data, page, @@ -39,10 +41,10 @@ function Page() { <BackButton /> </Box> <Box px={{ base: 'md', md: 100 }} > - <Grid align='center'> + <Grid align='center'> <GridCol span={{ base: 12, md: 9 }}> <Text fz={{ base: "h1", md: "2.5rem" }} c={colors["blue-button"]} fw={"bold"}> - Desa Digital / Smart Village + Desa Digital / Smart Village </Text> </GridCol> <GridCol span={{ base: 12, md: 3 }}> @@ -70,12 +72,62 @@ function Page() { > {filteredData.map((v, k) => { return ( - <Paper p={'xl'} key={k}> - <Image src={v.image.link? v.image.link : ''} pb={10} radius={10} alt='' loading="lazy"/> - <Text fz={'h3'} fw={'bold'} c={colors['blue-button']}>{v.name}</Text> - <Box> - <Text fz={"md"} style={{wordBreak: "break-word", whiteSpace: "normal"}} dangerouslySetInnerHTML={{ __html: v.deskripsi }} /> - </Box> + <Paper + key={k} + radius="xl" + shadow="md" + withBorder + p="lg" + bg={colors['white-trans-1']} + style={{ + transition: 'all 200ms ease', + cursor: 'pointer', + display: 'flex', + flexDirection: 'column', + justifyContent: 'space-between', // ✅ biar button selalu di bawah + height: '100%', // ✅ bikin tinggi seragam + }} + > + <Stack gap={"xs"}> + <Box + style={{ + width: '100%', + aspectRatio: '16/9', + borderRadius: '12px', + overflow: 'hidden', + position: 'relative', + }} + > + <Image + src={v.image.link} + alt={v.name} + fit="cover" + loading="lazy" + style={{ + width: '100%', + height: '100%', + transition: 'transform 0.4s ease', + }} + onMouseEnter={(e) => (e.currentTarget.style.transform = 'scale(1.05)')} + onMouseLeave={(e) => (e.currentTarget.style.transform = 'scale(1)')} + /> + </Box> + <Text fz={'h3'} fw={'bold'} c={colors['blue-button']}>{v.name}</Text> + <Box> + <Text lineClamp={3} truncate="end" fz={"md"} style={{ wordBreak: "break-word", whiteSpace: "normal" }} dangerouslySetInnerHTML={{ __html: v.deskripsi }} /> + </Box> + </Stack> + + <Center mt="md"> + <Button + bg={colors['blue-button']} + radius="lg" + w="100%" + onClick={() => router.push(`/darmasaba/inovasi/desa-digital-smart-village/${v.id}`)} + > + Detail + </Button> + </Center> </Paper> ) })} diff --git a/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/[id]/page.tsx b/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/[id]/page.tsx index 3d97e426..667495d8 100644 --- a/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/[id]/page.tsx @@ -1,16 +1,16 @@ 'use client' -import colors from '@/con/colors'; -import { Box, Paper, Stack, Text, Skeleton } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; -import { useParams, useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; import programKreatifState from '@/app/admin/(dashboard)/_state/inovasi/program-kreatif'; +import colors from '@/con/colors'; +import { Box, Paper, Skeleton, Stack, Text } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { useParams } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; -import { IconMapper, IconKey } from '@/app/admin/(dashboard)/_com/iconMap'; +import { IconKey, IconMapper } from '@/app/admin/(dashboard)/_com/iconMap'; +import BackButton from '../../../desa/layanan/_com/BackButto'; function Page() { const stateProgramKreatif = useProxy(programKreatifState); - const router = useRouter(); const params = useParams(); useShallowEffect(() => { @@ -31,14 +31,7 @@ function Page() { <Box px={{ base: 'md', md: 100 }} py="md"> {/* Tombol Kembali */} <Box mb="md"> - <Text - c={colors['blue-button']} - fw="bold" - style={{ cursor: 'pointer' }} - onClick={() => router.back()} - > - ← Kembali - </Text> + <BackButton/> </Box> {/* Konten Utama */} diff --git a/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/page.tsx b/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/page.tsx index b8af8a7a..7cc283cd 100644 --- a/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/page.tsx +++ b/src/app/darmasaba/(pages)/inovasi/program-kreatif-desa/page.tsx @@ -117,7 +117,7 @@ function Page() { )} </Center> <Text ta={'center'} fz={'h3'} fw={'bold'} c={colors['blue-button']}>{v.name}</Text> - <Text py={10} ta={'center'} fz={'lg'} c={'black'}>{v.slug}</Text> + <Text lineClamp={2} lh={"1.9"} py={10} ta={'center'} fz={'lg'} c={'black'}>{v.slug}</Text> <Center> <Button onClick={() => router.push(`/darmasaba/inovasi/program-kreatif-desa/${v.id}`)} bg={colors['blue-button']}>Selengkapnya</Button> </Center> diff --git a/src/app/darmasaba/(pages)/lingkungan/gotong-royong/[kategori]/[id]/page.tsx b/src/app/darmasaba/(pages)/lingkungan/gotong-royong/[kategori]/[id]/page.tsx index d267fcee..fc930270 100644 --- a/src/app/darmasaba/(pages)/lingkungan/gotong-royong/[kategori]/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/lingkungan/gotong-royong/[kategori]/[id]/page.tsx @@ -1,80 +1,132 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -'use client' +'use client'; -import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; -import BackButton from '@/app/darmasaba/(pages)/desa/layanan/_com/BackButto'; -import colors from '@/con/colors'; -import { Box, Center, Container, Image, Skeleton, Stack, Text } from '@mantine/core'; -import { useParams } from 'next/navigation'; -import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; +import { Box, Image, Paper, Skeleton, Stack, Text, Title, Group } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconCalendar, IconMapPin, IconUsers } from '@tabler/icons-react'; +import { useParams } from 'next/navigation'; +import colors from '@/con/colors'; +import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; +function DetailKegiatanDesaUser() { + const kegiatanDesaState = useProxy(gotongRoyongState.kegiatanDesa); + const params = useParams(); + useShallowEffect(() => { + kegiatanDesaState.findUnique.load(params?.id as string); + }, []); + const data = kegiatanDesaState.findUnique.data; -function Page() { - const params = useParams<{ id: string }>(); - const id = Array.isArray(params.id) ? params.id[0] : params.id; - const state = useProxy(gotongRoyongState.kegiatanDesa) - const [loading, setLoading] = useState(true) - - useEffect(() => { - const loadData = async () => { - if (!id) return; - try { - setLoading(true); - await state.findUnique.load(id); - } catch (error) { - console.error('Error loading data:', error); - } finally { - setLoading(false); - } - } - loadData() - }, [id]) - - if (loading) { + if (!data) { return ( - <Center> - <Skeleton height={500} /> - </Center> + <Stack py={20}> + <Skeleton height={400} radius="md" /> + <Skeleton height={20} width="70%" /> + <Skeleton height={15} width="50%" /> + <Skeleton height={300} radius="md" /> + </Stack> ); } - if (!state.findUnique.data) { - return ( - <Center> - <Text>Data tidak ditemukan</Text> - </Center> - ); - } - - return ( - <Stack pos={"relative"} bg={colors.Bg} py={"xl"} gap={"22"} px={{ base: "md", md: 0 }}> - <Box px={{ base: "md", md: 100 }}><BackButton /></Box> - <Container w={{ base: "100%", md: "50%" }} > - <Box pb={20}> - <Text ta={"center"} fz={"2.4rem"} c={colors["blue-button"]} fw={"bold"}> - {state.findUnique.data?.judul} - </Text> - <Text - ta={"center"} - fw={"bold"} - fz={"1.5rem"} - > - Informasi Kegiatan Gotong Royong - </Text> - </Box> - <Image src={state.findUnique.data?.image?.link || ''} alt='' w={"100%"} loading="lazy"/> - </Container> - <Box px={{ base: "md", md: 100 }}> - <Stack gap={"xs"}> - <Text py={20} style={{wordBreak: "break-word", whiteSpace: "normal"}} fz={{ base: "sm", md: "lg" }} ta={"justify"} dangerouslySetInnerHTML={{ __html: state.findUnique.data?.deskripsiLengkap || '' }} /> + <Box py={30}> + {/* Header Gambar */} + + {/* Konten */} + <Paper + bg={colors['white-1']} + p="lg" + radius="md" + shadow="sm" + maw={900} + mx="auto" + > + <Stack gap="md"> + {data.image?.link && ( + <Image + src={data.image.link} + alt={data.judul || 'Kegiatan Desa'} + radius="md" + fit="cover" + h={300} + mb="xl" + style={{ objectPosition: 'center', width: '100%' }} + /> + )} + {/* Judul */} + <Title order={2} c={colors['blue-button']}> + {data.judul || 'Kegiatan Desa'} + + + {/* Meta Info */} + + + + + {data.tanggal ? new Date(data.tanggal).toLocaleDateString('id-ID', { day: 'numeric', month: 'long', year: 'numeric' }) : '-'} + + + + {data.lokasi && ( + + + {data.lokasi} + + )} + + {data.partisipan && ( + + + {data.partisipan} + + )} + + + {/* Deskripsi Singkat */} + {data.deskripsiSingkat && ( + + + Ringkasan + + + + )} + + {/* Deskripsi Lengkap */} + {data.deskripsiLengkap && ( + + + Detail Kegiatan + + + + )} + + {/* Kategori */} + {data.kategoriKegiatan?.nama && ( + + + Kategori + + + {data.kategoriKegiatan.nama} + + + )} - - + + ); } -export default Page; +export default DetailKegiatanDesaUser; diff --git a/src/app/darmasaba/(tambahan)/penghargaan/page.tsx b/src/app/darmasaba/(tambahan)/penghargaan/page.tsx index 7111c9ac..04846408 100644 --- a/src/app/darmasaba/(tambahan)/penghargaan/page.tsx +++ b/src/app/darmasaba/(tambahan)/penghargaan/page.tsx @@ -2,11 +2,9 @@ 'use client'; import penghargaanState from "@/app/admin/(dashboard)/_state/desa/penghargaan"; import colors from "@/con/colors"; -import { Carousel } from "@mantine/carousel"; -import { Box, Button, Container, Group, Paper, Skeleton, Stack, Text, useMantineTheme } from "@mantine/core"; +import { Box, Button, Container, Group, Paper, Skeleton, Stack, Text } from "@mantine/core"; import { useMediaQuery } from "@mantine/hooks"; import { IconArrowRight, IconAward } from "@tabler/icons-react"; -import Autoplay from "embla-carousel-autoplay"; import { useTransitionRouter } from "next-view-transitions"; import { useEffect, useRef } from "react"; import { useProxy } from "valtio/utils"; @@ -19,7 +17,6 @@ export default function Page() { - @@ -30,21 +27,35 @@ export default function Page() { Desa Darmasaba berhasil meraih beragam penghargaan bergengsi yang mencerminkan dedikasi dan kerja keras masyarakat dalam membangun desa yang maju dan berkelanjutan. - + ); } function Slider() { - const theme = useMantineTheme(); - const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`); - const tablet = useMediaQuery(`(max-width: ${theme.breakpoints.md})`); - const autoplay = useRef(Autoplay({ delay: 3000, stopOnInteraction: false })); + const mobile = useMediaQuery("(max-width: 768px)", false); const state = useProxy(penghargaanState); const router = useTransitionRouter(); + // Refs for smooth animation + const containerRef = useRef(null); + const scrollPositionRef = useRef(0); + const animationFrameRef = useRef(0); + const isHoveredRef = useRef(false); + + // Refs for drag functionality + const isDraggingRef = useRef(false); + const startXRef = useRef(0); + const scrollLeftRef = useRef(0); + const velocityRef = useRef(0); + const lastScrollTimeRef = useRef(0); + + // Speed configuration + const normalSpeed = 1.0; // pixels per frame + const hoverSpeed = 0.5; // slower speed on hover + useEffect(() => { state.findMany.load(); }, []); @@ -52,12 +63,128 @@ function Slider() { const data = state.findMany.data || []; const loading = state.findMany.loading; + // Duplicate slides for seamless infinite loop + const slidesData = [...data, ...data, ...data]; + + useEffect(() => { + if (loading || !containerRef.current || slidesData.length === 0) return; + + const container = containerRef.current; + const slideWidth = container.scrollWidth / slidesData.length; + const originalDataLength = data.length; + + // Start from the middle set of slides + scrollPositionRef.current = slideWidth * originalDataLength; + container.scrollLeft = scrollPositionRef.current; + + const animate = () => { + if (!containerRef.current) return; + + const container = containerRef.current; + const slideWidth = container.scrollWidth / slidesData.length; + + // Check if user recently scrolled manually + const timeSinceLastScroll = Date.now() - lastScrollTimeRef.current; + const isUserScrolling = timeSinceLastScroll < 100; + + // Only auto-scroll if user is not actively scrolling or dragging + if (!isDraggingRef.current && !isUserScrolling) { + const currentSpeed = isHoveredRef.current ? hoverSpeed : normalSpeed; + scrollPositionRef.current += currentSpeed; + + // Reset position for infinite loop + if (scrollPositionRef.current >= slideWidth * (originalDataLength * 2)) { + scrollPositionRef.current -= slideWidth * originalDataLength; + } + + if (scrollPositionRef.current <= 0) { + scrollPositionRef.current += slideWidth * originalDataLength; + } + + container.scrollLeft = scrollPositionRef.current; + } else { + // Sync scroll position when user is scrolling + scrollPositionRef.current = container.scrollLeft; + + // Apply momentum/velocity for smooth drag release + if (!isDraggingRef.current && Math.abs(velocityRef.current) > 0.1) { + scrollPositionRef.current += velocityRef.current; + velocityRef.current *= 0.95; // Decay velocity + container.scrollLeft = scrollPositionRef.current; + } + } + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animationFrameRef.current = requestAnimationFrame(animate); + + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + }, [loading, slidesData.length, data.length, mobile]); + + const handleMouseEnter = () => { + isHoveredRef.current = true; + }; + + const handleMouseLeave = () => { + isHoveredRef.current = false; + isDraggingRef.current = false; + }; + + // Mouse drag handlers + const handleMouseDown = (e: React.MouseEvent) => { + if (!containerRef.current) return; + + isDraggingRef.current = true; + startXRef.current = e.pageX - containerRef.current.offsetLeft; + scrollLeftRef.current = containerRef.current.scrollLeft; + velocityRef.current = 0; + + containerRef.current.style.cursor = 'grabbing'; + }; + + const handleMouseMove = (e: React.MouseEvent) => { + if (!isDraggingRef.current || !containerRef.current) return; + + e.preventDefault(); + const x = e.pageX - containerRef.current.offsetLeft; + const walk = (x - startXRef.current) * 2; + const newScrollLeft = scrollLeftRef.current - walk; + + velocityRef.current = containerRef.current.scrollLeft - newScrollLeft; + + containerRef.current.scrollLeft = newScrollLeft; + scrollPositionRef.current = newScrollLeft; + lastScrollTimeRef.current = Date.now(); + }; + + const handleMouseUp = () => { + if (!containerRef.current) return; + + isDraggingRef.current = false; + containerRef.current.style.cursor = 'grab'; + }; + + // Wheel scroll handler + const handleWheel = (e: React.WheelEvent) => { + if (!containerRef.current) return; + + e.preventDefault(); + containerRef.current.scrollLeft += e.deltaY; + scrollPositionRef.current = containerRef.current.scrollLeft; + lastScrollTimeRef.current = Date.now(); + }; + if (loading) { return ( - - - + + + ); } @@ -73,138 +200,129 @@ function Slider() { ); } - const slides = data.map((item) => ( - - { - e.currentTarget.style.transform = "translateY(-4px)"; - e.currentTarget.style.boxShadow = "0 8px 20px rgba(0,0,0,0.2)"; - }} - onMouseLeave={(e) => { - e.currentTarget.style.transform = "translateY(0)"; - e.currentTarget.style.boxShadow = "none"; - }} - > - - - - {item.name} - - - - - - - - )); - return ( - - + + + 3} - draggable={data.length > 1} - styles={{ - root: { - position: "relative", - }, - viewport: { - overflow: "hidden", - }, - container: { - alignItems: "stretch", - }, - control: { - zIndex: 20, - backgroundColor: "rgba(255,255,255,0.95)", - color: colors["blue-button"], - border: `2px solid ${colors["blue-button"]}`, - width: 46, - height: 46, - borderRadius: "50%", - boxShadow: "0 4px 12px rgba(0,0,0,0.15)", - transition: "all 0.2s ease", - '&:hover': { - backgroundColor: colors["blue-button"], - color: "white", - transform: "scale(1.1)", - }, - '&[data-inactive]': { - opacity: 0, - cursor: 'default', - }, - }, - controls: { - position: "absolute", - top: mobile ? "70%" : tablet ? "65%" : "60%", - transform: "translateY(-50%)", - width: mobile ? "100%" : tablet ? "calc(100% + 60px)" : "calc(100% + 100px)", - left: mobile ? "0" : tablet ? "-30px" : "-50px", - right: mobile ? "0" : tablet ? "-30px" : "-50px", - padding: "0", - justifyContent: "space-between", - zIndex: 30, - }, - }} > - {slides} - + {slidesData.map((item, index) => ( + + { + e.currentTarget.style.transform = "translateY(-8px) scale(1.02)"; + e.currentTarget.style.boxShadow = "0 12px 28px rgba(0,0,0,0.25)"; + }} + onMouseLeave={(e) => { + e.currentTarget.style.transform = "translateY(0) scale(1)"; + e.currentTarget.style.boxShadow = "0 4px 12px rgba(0,0,0,0.15)"; + }} + > + + + + {item.name} + + + + + + + + ))} + ); } \ No newline at end of file diff --git a/src/app/darmasaba/_com/main-page/layanan/index.tsx b/src/app/darmasaba/_com/main-page/layanan/index.tsx index c7b43dcf..d7ba11f6 100644 --- a/src/app/darmasaba/_com/main-page/layanan/index.tsx +++ b/src/app/darmasaba/_com/main-page/layanan/index.tsx @@ -2,7 +2,6 @@ "use client"; import stateLayananDesa from "@/app/admin/(dashboard)/_state/desa/layananDesa"; import colors from "@/con/colors"; -import { Carousel } from "@mantine/carousel"; import { Box, Button, @@ -13,10 +12,8 @@ import { Skeleton, Stack, Text, - useMantineTheme } from "@mantine/core"; import { useMediaQuery } from "@mantine/hooks"; -import Autoplay from "embla-carousel-autoplay"; import _ from "lodash"; import { useTransitionRouter } from "next-view-transitions"; import Link from "next/link"; @@ -24,123 +21,309 @@ import { useEffect, useRef, useState } from "react"; import { useProxy } from "valtio/utils"; const textHeading = { - title: "Layanan", - des: "Layanan adalah fitur yang membantu warga desa mengakses berbagai kebutuhan administrasi, informasi, dan bantuan secara cepat, mudah, dan transparan. Dengan fitur ini, semua layanan desa ada dalam genggaman Anda!", + title: "Layanan", + des: "Layanan adalah fitur yang membantu warga desa mengakses berbagai kebutuhan administrasi, informasi, dan bantuan secara cepat, mudah, dan transparan. Dengan fitur ini, semua layanan desa ada dalam genggaman Anda!", }; -function Layanan() { - return ( - - - - - {textHeading.title} - - - {textHeading.des} - - - - - - - - - - ); +function Layanan() { + return ( + + + + + {textHeading.title} + + + {textHeading.des} + + + + + + + + + + ); } const height = 720; + function Slider() { - const state = useProxy(stateLayananDesa) - const [loading, setLoading] = useState(false); - const theme = useMantineTheme(); - const mobile = useMediaQuery(`(max-width: ${theme.breakpoints.sm})`); - const autoplay = useRef(Autoplay({ delay: 2000 })); - const router = useTransitionRouter() + const state = useProxy(stateLayananDesa); + const [loading, setLoading] = useState(false); + const mobile = useMediaQuery("(max-width: 768px)", false); + const router = useTransitionRouter(); - useEffect(()=> { - const loadData = async () => { - try { - setLoading(true); - await state.suratKeterangan.findMany.load() - } catch (error) { - console.error('Error loading data:', error); - } finally { - setLoading(false); - } - } - loadData() - }, []) + // Refs for smooth animation + const containerRef = useRef(null); + const scrollPositionRef = useRef(0); + const animationFrameRef = useRef(0); + const isHoveredRef = useRef(false); + + // Refs for drag functionality + const isDraggingRef = useRef(false); + const startXRef = useRef(0); + const scrollLeftRef = useRef(0); + const velocityRef = useRef(0); + const lastScrollTimeRef = useRef(0); + + // Speed configuration + const normalSpeed = 1.0; // pixels per frame + const hoverSpeed = 0.3; // slower speed on hover - const data = (state.suratKeterangan.findMany.data || []).slice(0, 8); + useEffect(() => { + const loadData = async () => { + try { + setLoading(true); + await state.suratKeterangan.findMany.load(); + } catch (error) { + console.error("Error loading data:", error); + } finally { + setLoading(false); + } + }; + loadData(); + }, []); - const slides = data.map((item) => ( - - - - - - - {_.startCase(item.name)} - - - - - - - - - )); + // Duplicate slides for seamless infinite loop + // We need at least 3x the data for smooth infinite scrolling + const slidesData = [...data, ...data, ...data]; - return ( - - {loading ? ( - - ) : ( - { + if (loading || !containerRef.current || slidesData.length === 0) return; + + const container = containerRef.current; + const slideWidth = container.scrollWidth / slidesData.length; + const originalDataLength = data.length; + + // Start from the middle set of slides + scrollPositionRef.current = slideWidth * originalDataLength; + container.scrollLeft = scrollPositionRef.current; + + const animate = () => { + if (!containerRef.current) return; + + const container = containerRef.current; + const slideWidth = container.scrollWidth / slidesData.length; + + // Check if user recently scrolled manually + const timeSinceLastScroll = Date.now() - lastScrollTimeRef.current; + const isUserScrolling = timeSinceLastScroll < 100; + + // Only auto-scroll if user is not actively scrolling or dragging + if (!isDraggingRef.current && !isUserScrolling) { + const currentSpeed = isHoveredRef.current ? hoverSpeed : normalSpeed; + scrollPositionRef.current += currentSpeed; + + // Reset position for infinite loop + if (scrollPositionRef.current >= slideWidth * (originalDataLength * 2)) { + scrollPositionRef.current -= slideWidth * originalDataLength; + } + + if (scrollPositionRef.current <= 0) { + scrollPositionRef.current += slideWidth * originalDataLength; + } + + container.scrollLeft = scrollPositionRef.current; + } else { + // Sync scroll position when user is scrolling + scrollPositionRef.current = container.scrollLeft; + + // Apply momentum/velocity for smooth drag release + if (!isDraggingRef.current && Math.abs(velocityRef.current) > 0.1) { + scrollPositionRef.current += velocityRef.current; + velocityRef.current *= 0.95; // Decay velocity + container.scrollLeft = scrollPositionRef.current; + } + } + + animationFrameRef.current = requestAnimationFrame(animate); + }; + + animationFrameRef.current = requestAnimationFrame(animate); + + return () => { + if (animationFrameRef.current) { + cancelAnimationFrame(animationFrameRef.current); + } + }; + }, [loading, slidesData.length, data.length, mobile]); + + const handleMouseEnter = () => { + isHoveredRef.current = true; + }; + + const handleMouseLeave = () => { + isHoveredRef.current = false; + isDraggingRef.current = false; + }; + + // Mouse drag handlers + const handleMouseDown = (e: React.MouseEvent) => { + if (!containerRef.current) return; + + isDraggingRef.current = true; + startXRef.current = e.pageX - containerRef.current.offsetLeft; + scrollLeftRef.current = containerRef.current.scrollLeft; + velocityRef.current = 0; + + containerRef.current.style.cursor = 'grabbing'; + }; + + const handleMouseMove = (e: React.MouseEvent) => { + if (!isDraggingRef.current || !containerRef.current) return; + + e.preventDefault(); + const x = e.pageX - containerRef.current.offsetLeft; + const walk = (x - startXRef.current) * 2; // Multiply for faster scroll + const newScrollLeft = scrollLeftRef.current - walk; + + // Calculate velocity for momentum + velocityRef.current = containerRef.current.scrollLeft - newScrollLeft; + + containerRef.current.scrollLeft = newScrollLeft; + scrollPositionRef.current = newScrollLeft; + lastScrollTimeRef.current = Date.now(); + }; + + const handleMouseUp = () => { + if (!containerRef.current) return; + + isDraggingRef.current = false; + containerRef.current.style.cursor = 'grab'; + }; + + // Wheel scroll handler + const handleWheel = (e: React.WheelEvent) => { + if (!containerRef.current) return; + + e.preventDefault(); + containerRef.current.scrollLeft += e.deltaY; + scrollPositionRef.current = containerRef.current.scrollLeft; + lastScrollTimeRef.current = Date.now(); + }; + + if (loading) { + return ; + } + + if (data.length === 0) { + return ( + + + Tidak ada layanan tersedia + + + ); + } + + return ( + - {slides} - - )} - - ); + + {slidesData.map((item, index) => ( + + + + + + + {_.startCase(item.name)} + + + + + + + + + ))} + + + ); } -export default Layanan; - +export default Layanan; \ No newline at end of file diff --git a/src/types/react-exif-orientation-img.d.ts b/src/types/react-exif-orientation-img.d.ts new file mode 100644 index 00000000..9b2214e0 --- /dev/null +++ b/src/types/react-exif-orientation-img.d.ts @@ -0,0 +1,12 @@ +declare module 'react-exif-orientation-img' { + import { ImgHTMLAttributes } from 'react'; + + interface ExifOrientationImgProps extends ImgHTMLAttributes { + src: string; + className?: string; + style?: React.CSSProperties; + } + + const ExifOrientationImg: React.FC; + export default ExifOrientationImg; +} From fb57698dc9dbe1fb0b2a1d1c2f9005cbffb66994 Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 4 Nov 2025 15:08:48 +0800 Subject: [PATCH 30/56] Add Menu Musik Add News Reader for Difable Add Running text news / announcement --- bun.lockb | Bin 408119 -> 422871 bytes package.json | 1 + .../profile/media-sosial/[id]/edit/page.tsx | 11 +- .../profile/media-sosial/create/page.tsx | 11 +- .../profile/media-sosial/page.tsx | 4 +- .../profile/pejabat-desa/[id]/page.tsx | 10 +- .../program-inovasi/[id]/edit/page.tsx | 11 +- .../profile/program-inovasi/create/page.tsx | 11 +- .../profile/program-inovasi/page.tsx | 4 +- .../desa/berita/[kategori]/[id]/page.tsx | 7 +- .../desa/pengumuman/[name]/[id]/page.tsx | 6 +- .../darmasaba/(pages)/desa/profile/page.tsx | 2 + .../struktur-perangkat-desa/[id]/page.tsx | 143 ++++++ .../profile/struktur-perangkat-desa/page.tsx | 469 ++++++++++++++++++ .../struktur-perangkat-desa/struktur.css | 68 +++ .../(pages)/musik/musik-desa/page.tsx | 248 +++++++++ src/app/darmasaba/_com/NewsReader.tsx | 96 ++++ src/app/darmasaba/_com/RunningText.tsx | 185 +++++++ .../_com/main-page/landing-page/index.tsx | 2 +- src/app/darmasaba/page.tsx | 73 ++- src/con/navbar-list-menu.ts | 14 +- 21 files changed, 1328 insertions(+), 48 deletions(-) create mode 100644 src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx create mode 100644 src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx create mode 100644 src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css create mode 100644 src/app/darmasaba/(pages)/musik/musik-desa/page.tsx create mode 100644 src/app/darmasaba/_com/NewsReader.tsx create mode 100644 src/app/darmasaba/_com/RunningText.tsx diff --git a/bun.lockb b/bun.lockb index fb4cf5dafeec026a286694bd26bd6a1a043534c1..f6b34ff19617143e64048dcb6b3223b944790b4e 100755 GIT binary patch delta 76082 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�=K3PkxYTmit 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 - - - + Edit Media Sosial diff --git a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx index ae615815..b42fb69a 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/create/page.tsx @@ -11,8 +11,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -69,11 +68,9 @@ export default function CreateMediaSosial() { return ( - - - + Tambah Media Sosial diff --git a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx index b5232fb9..587590b3 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/media-sosial/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Image, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -56,11 +56,9 @@ function ListMediaSosial({ search }: { search: string }) { Daftar Media Sosial - - diff --git a/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx index 9b7c4a70..25599d5b 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/pejabat-desa/[id]/page.tsx @@ -3,7 +3,7 @@ import colors from '@/con/colors'; import { Alert, Box, Button, Center, Group, Image, - Paper, Stack, Text, TextInput, Title, Tooltip + Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -177,11 +177,9 @@ function EditPejabatDesa() { - - - + Edit Pejabat Desa diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx index d4b44eb3..b3892f26 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/[id]/edit/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -104,11 +103,9 @@ function EditProgramInovasi() { return ( - - - + Edit Program Inovasi diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx index de402dd6..2954b30a 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/create/page.tsx @@ -12,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -70,11 +69,9 @@ function CreateProgramInovasi() { return ( - - - + Tambah Program Inovasi diff --git a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx index b34a5887..ba77436b 100644 --- a/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profile/program-inovasi/page.tsx @@ -51,8 +51,7 @@ function ListProgramInovasi({ search }: { search: string }) { Daftar Program Inovasi - - -
diff --git a/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx index 031608aa..c78246d6 100644 --- a/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx @@ -1,8 +1,9 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import stateDashboardBerita from '@/app/admin/(dashboard)/_state/desa/berita'; +import NewsReader from '@/app/darmasaba/_com/NewsReader'; import colors from '@/con/colors'; -import { Box, Center, Container, Image, Skeleton, Stack, Text } from '@mantine/core'; +import { Box, Center, Container, Group, Image, Skeleton, Stack, Text } from '@mantine/core'; import { useParams } from 'next/navigation'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -49,6 +50,9 @@ function Page() { return ( + + + @@ -67,6 +71,7 @@ function Page() { + + + @@ -42,7 +46,7 @@ function Page() { - + {new Date(detail.data?.createdAt).toLocaleDateString('id-ID', { weekday: 'long', diff --git a/src/app/darmasaba/(pages)/desa/profile/page.tsx b/src/app/darmasaba/(pages)/desa/profile/page.tsx index 9103580c..bb26f571 100644 --- a/src/app/darmasaba/(pages)/desa/profile/page.tsx +++ b/src/app/darmasaba/(pages)/desa/profile/page.tsx @@ -11,6 +11,7 @@ import ProfilPerbekel from './ui/profilPerbekel'; import MotoDesa from './ui/motoDesa'; import SemuaPerbekel from './ui/semuaPerbekel'; import ScrollToTopButton from '@/app/darmasaba/_com/scrollToTopButton'; +import StrukturPerangkatDesa from './struktur-perangkat-desa/page'; function Page() { return ( @@ -33,6 +34,7 @@ function Page() { + diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx new file mode 100644 index 00000000..5e9f9159 --- /dev/null +++ b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx @@ -0,0 +1,143 @@ +'use client'; +import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID'; +import colors from '@/con/colors'; +import { + Box, + Divider, + Group, + Image, + Paper, + Skeleton, + Stack, + Text, + Title, +} from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { useParams } from 'next/navigation'; +import { useProxy } from 'valtio/utils'; +import BackButton from '../../_com/BackButto'; + +function DetailPegawaiUser() { + const statePegawai = useProxy(stateStrukturPPID.pegawai); + const params = useParams(); + + useShallowEffect(() => { + stateStrukturPPID.posisiOrganisasi.findMany.load(); + statePegawai.findUnique.load(params?.id as string); + }, []); + + + if (!statePegawai.findUnique.data) { + return ( + + + + ); + } + + const data = statePegawai.findUnique.data; + + return ( + + {/* Back button */} + + + + + + + {/* Foto Profil */} + + + {/* Nama & Jabatan */} + + + {data.namaLengkap || '-'} {data.gelarAkademik || ''} + + + {data.posisi?.nama || 'Posisi tidak tersedia'} + + + + + + + {/* Informasi Detail */} + + + + + + + + + + ); +} + +/* Komponen kecil untuk menampilkan baris informasi */ +function InfoRow({ + label, + value, + valueColor, + multiline = false, +}: { + label: string; + value?: string | null; + valueColor?: string; + multiline?: boolean; +}) { + return ( + + + {label} + + + {value || '-'} + + + ); +} + +export default DetailPegawaiUser; diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx new file mode 100644 index 00000000..5ac50922 --- /dev/null +++ b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx @@ -0,0 +1,469 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +/* eslint-disable @typescript-eslint/no-explicit-any */ +'use client' +import stateStrukturPPID from '@/app/admin/(dashboard)/_state/ppid/struktur_ppid/struktur_PPID' +import ScrollToTopButton from '@/app/darmasaba/_com/scrollToTopButton' +import colors from '@/con/colors' +import { + Box, + Button, + Card, + Center, + Group, + Image, + Loader, + Paper, + Stack, + Text, + TextInput, + Title, + Transition +} from '@mantine/core' +import { + IconArrowsMaximize, + IconArrowsMinimize, + IconRefresh, + IconSearch, + IconUsers, + IconZoomIn, + IconZoomOut, +} from '@tabler/icons-react' +import { debounce } from 'lodash' +import { useTransitionRouter } from 'next-view-transitions' +import { OrganizationChart } from 'primereact/organizationchart' +import { useEffect, useRef, useState } from 'react' +import { useProxy } from 'valtio/utils' +import './struktur.css' +import BackButton from '../_com/BackButto' + +export default function StrukturPerangkatDesa() { + return ( + + + + + + + Struktur Perangkat Desa + + + Gambaran visual peran dan pegawai yang ditugaskan. Arahkan kursor + untuk melihat detail atau klik node untuk fokus tampilan. + + + + + + + + + + + ) +} + +function StrukturPerangkatDesaNode() { + const stateOrganisasi: any = useProxy(stateStrukturPPID.pegawai) + const router = useTransitionRouter() + const chartContainerRef = useRef(null) + const [scale, setScale] = useState(1) + const [isFullscreen, setFullscreen] = useState(false) + const [searchQuery, setSearchQuery] = useState('') + + // debounce pencarian + const debouncedSearch = useRef( + debounce((value: string) => { + setSearchQuery(value) + }, 400) + ).current + + useEffect(() => { + void stateOrganisasi.findMany.load() + }, []) + + const isLoading = + !stateOrganisasi.findMany.data && stateOrganisasi.findMany.loading !== false + + if (isLoading) { + return ( +
+ + + Memuat struktur organisasi… + + Mengambil data pegawai dan posisi. Mohon tunggu sebentar. + + +
+ ) + } + + const data = stateOrganisasi.findMany.data || [] + if (data.length === 0) { + return ( +
+ + +
+ +
+ + Data pegawai belum tersedia + + + Belum ada data pegawai yang tercatat untuk PPID. + + + + +
+
+
+ ) + } + + // 🧩 buat struktur organisasi + const posisiMap = new Map() + const aktifPegawai = data.filter((p: any) => p.isActive) + + for (const pegawai of aktifPegawai) { + const posisiId = pegawai.posisi.id + if (!posisiMap.has(posisiId)) { + posisiMap.set(posisiId, { + ...pegawai.posisi, + pegawaiList: [], + children: [], + }) + } + posisiMap.get(posisiId)!.pegawaiList.push(pegawai) + } + + const root: any[] = [] + posisiMap.forEach((posisi) => { + if (posisi.parentId) { + const parent = posisiMap.get(posisi.parentId) + if (parent) parent.children.push(posisi) + else root.push(posisi) + } else root.push(posisi) + }) + + const toOrgChartFormat = (node: any): any => { + const pegawai = node.pegawaiList?.[0] + return { + expanded: true, + data: { + id: pegawai?.id, + name: pegawai?.namaLengkap || 'Belum Ditugaskan', + title: node.nama || 'Tanpa Jabatan', + image: pegawai?.image?.link || '/img/default.png', + }, + children: node.children?.map(toOrgChartFormat) || [], + } + } + + let chartData = root.map(toOrgChartFormat) + + // 🔍 filter by search + if (searchQuery) { + const filterNodes = (nodes: any[]): any[] => + nodes + .map((n) => ({ + ...n, + children: filterNodes(n.children || []), + })) + .filter( + (n) => + n.data.name.toLowerCase().includes(searchQuery.toLowerCase()) || + n.data.title.toLowerCase().includes(searchQuery.toLowerCase()) || + n.children.length > 0 + ) + chartData = filterNodes(chartData) + } + + // 🎬 fullscreen & zoom control + const toggleFullscreen = () => { + if (!document.fullscreenElement) { + chartContainerRef.current?.requestFullscreen() + setFullscreen(true) + } else { + document.exitFullscreen() + setFullscreen(false) + } + } + + const handleZoomIn = () => setScale((s) => Math.min(s + 0.1, 2)) + const handleZoomOut = () => setScale((s) => Math.max(s - 0.1, 0.5)) + const resetZoom = () => setScale(1) + + return ( + + {/* 🔍 Controls */} + + + } + onChange={(e) => debouncedSearch(e.target.value)} + styles={{ + input: { + minWidth: 250, + }, + }} + /> + + + + + + {Math.round(scale * 100)}% + + + + + + + + + + + + {/* 🧩 Chart Container */} +
+ + } + className="p-organizationchart p-organizationchart-horizontal" + /> + +
+
+ ) +} + +function NodeCard({ node, router }: any) { + const imageSrc = node?.data?.image || '/img/default.png' + const name = node?.data?.name || 'Tanpa Nama' + const title = node?.data?.title || 'Tanpa Jabatan' + const hasId = Boolean(node?.data?.id) + + return ( + + {(styles) => ( + { + if (hasId) { + e.currentTarget.style.transform = 'translateY(-4px)' + e.currentTarget.style.boxShadow = '0 8px 24px rgba(28, 110, 164, 0.25)' + } + }} + onMouseLeave={(e) => { + if (hasId) { + e.currentTarget.style.transform = 'translateY(0)' + e.currentTarget.style.boxShadow = '' + } + }} + > + + {/* Photo */} + + + + + {/* Name */} + + {name} + + + {/* Title/Position */} + + {title} + + + {/* Detail Button */} + {hasId && ( + + )} + + + )} + + ) +} diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css new file mode 100644 index 00000000..0f9f4fdb --- /dev/null +++ b/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css @@ -0,0 +1,68 @@ +/* ============================================ + STRUKTUR ORGANISASI PPID - STYLING + ============================================ */ + +/* Tabel chart selalu center */ +.p-organizationchart-table { + margin: 0 auto !important; + } + + /* Jarak vertikal antar level - lebih lega */ + .p-organizationchart-line-down { + height: 32px !important; + } + + /* Padding di dalam node - lebih rapi */ + .p-organizationchart-node-content { + padding: 0 !important; + background: transparent !important; + border: none !important; + } + + /* Garis connector antar node - lebih tebal dan jelas */ + .p-organizationchart-line-down, + .p-organizationchart-line-left, + .p-organizationchart-line-right, + .p-organizationchart-line-top { + border-color: rgba(28, 110, 164, 0.4) !important; + border-width: 2px !important; + } + + /* Garis horizontal */ + .p-organizationchart-line-left, + .p-organizationchart-line-right { + border-top-width: 2px !important; + } + + /* Jarak horizontal antar node - lebih proporsional */ + .p-organizationchart-table > tbody > tr > td { + padding: 0 24px !important; + vertical-align: top !important; + } + + /* Node container spacing */ + .p-organizationchart-node { + padding: 8px !important; + } + + /* Responsive adjustments */ + @media (max-width: 768px) { + .p-organizationchart-table > tbody > tr > td { + padding: 0 12px !important; + } + + .p-organizationchart-line-down { + height: 24px !important; + } + } + + /* Smooth transitions untuk zoom */ + .p-organizationchart { + transition: transform 0.2s ease; + } + + /* Fullscreen mode adjustments */ + .p-organizationchart-table:fullscreen { + background: rgba(230, 240, 255, 0.98); + padding: 40px; + } \ No newline at end of file diff --git a/src/app/darmasaba/(pages)/musik/musik-desa/page.tsx b/src/app/darmasaba/(pages)/musik/musik-desa/page.tsx new file mode 100644 index 00000000..7c8ee6e8 --- /dev/null +++ b/src/app/darmasaba/(pages)/musik/musik-desa/page.tsx @@ -0,0 +1,248 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +'use client' +import { ActionIcon, Avatar, Badge, Box, Card, Flex, Grid, Group, Paper, Slider, Stack, Text, TextInput } from '@mantine/core'; +import { IconArrowsShuffle, IconPlayerPauseFilled, IconPlayerPlayFilled, IconPlayerSkipBackFilled, IconPlayerSkipForwardFilled, IconRepeat, IconRepeatOff, IconSearch, IconVolume, IconVolumeOff, IconX } from '@tabler/icons-react'; +import { useEffect, useState } from 'react'; +import BackButton from '../../desa/layanan/_com/BackButto'; + +const MusicPlayer = () => { + const [isPlaying, setIsPlaying] = useState(false); + const [currentTime, setCurrentTime] = useState(0); + const [duration, setDuration] = useState(245); + const [volume, setVolume] = useState(70); + const [isMuted, setIsMuted] = useState(false); + const [isRepeat, setIsRepeat] = useState(false); + const [isShuffle, setIsShuffle] = useState(false); + + const songs = [ + { id: 1, title: 'Midnight Dreams', artist: 'The Wanderers', duration: '4:05', cover: 'https://images.unsplash.com/photo-1470225620780-dba8ba36b745?w=400&h=400&fit=crop' }, + { id: 2, title: 'Summer Breeze', artist: 'Coastal Vibes', duration: '3:42', cover: 'https://images.unsplash.com/photo-1493225457124-a3eb161ffa5f?w=400&h=400&fit=crop' }, + { id: 3, title: 'City Lights', artist: 'Urban Echo', duration: '4:18', cover: 'https://images.unsplash.com/photo-1514320291840-2e0a9bf2a9ae?w=400&h=400&fit=crop' }, + { id: 4, title: 'Ocean Waves', artist: 'Serenity Sound', duration: '5:20', cover: 'https://images.unsplash.com/photo-1459749411175-04bf5292ceea?w=400&h=400&fit=crop' }, + { id: 5, title: 'Neon Nights', artist: 'Electric Dreams', duration: '3:55', cover: 'https://images.unsplash.com/photo-1487180144351-b8472da7d491?w=400&h=400&fit=crop' }, + { id: 6, title: 'Mountain High', artist: 'Peak Performers', duration: '4:32', cover: 'https://images.unsplash.com/photo-1511671782779-c97d3d27a1d4?w=400&h=400&fit=crop' } + ]; + + const [currentSong, setCurrentSong] = useState(songs[0]); + + useEffect(() => { + let interval: any; + if (isPlaying) { + interval = setInterval(() => { + setCurrentTime(prev => { + if (prev >= duration) { + setIsPlaying(false); + return 0; + } + return prev + 1; + }); + }, 1000); + } + return () => clearInterval(interval); + }, [isPlaying, duration]); + + const formatTime = (seconds: number) => { + const mins = Math.floor(seconds / 60); + const secs = Math.floor(seconds % 60); + return `${mins}:${secs.toString().padStart(2, '0')}`; + }; + + const playSong = (song: any) => { + setCurrentSong(song); + setCurrentTime(0); + setIsPlaying(true); + const durationInSeconds = parseInt(song.duration.split(':')[0]) * 60 + parseInt(song.duration.split(':')[1]); + setDuration(durationInSeconds); + }; + + const toggleMute = () => { + setIsMuted(!isMuted); + }; + + return ( + + + + + +
+ Selamat Datang Kembali + Temukan musik favorit Anda hari ini +
+ + } + radius="xl" + w={280} + styles={{ input: { backgroundColor: '#fff' } }} + /> + +
+ +
+ Sedang Diputar + + + + +
+ {currentSong.title} + {currentSong.artist} +
+ + {formatTime(currentTime)} + + {formatTime(duration)} + +
+
+
+
+ +
+ Daftar Putar + + {songs.map(song => ( + + playSong(song)} + > + + + + {song.title} + {song.artist} + {song.duration} + + {currentSong.id === song.id && isPlaying && ( + Memutar + )} + + + + ))} + +
+
+ +
+ +
+ + + + + +
+ {currentSong.title} + {currentSong.artist} +
+
+ + + + setIsShuffle(!isShuffle)} + radius="xl" + > + {isShuffle ? : } + + + + + setIsPlaying(!isPlaying)} + > + {isPlaying ? : } + + + + + setIsRepeat(!isRepeat)} + radius="xl" + > + {isRepeat ? : } + + + + {formatTime(currentTime)} + + {formatTime(duration)} + + + + + + {isMuted || volume === 0 ? : } + + { + setVolume(val); + if (val > 0) setIsMuted(false); + }} + color="#0B4F78" + size="xs" + w={100} + /> + {isMuted ? 0 : volume}% + +
+
+
+ ); +}; + +export default MusicPlayer; \ No newline at end of file diff --git a/src/app/darmasaba/_com/NewsReader.tsx b/src/app/darmasaba/_com/NewsReader.tsx new file mode 100644 index 00000000..3973a3d8 --- /dev/null +++ b/src/app/darmasaba/_com/NewsReader.tsx @@ -0,0 +1,96 @@ +'use client'; +import { Button } from '@mantine/core'; +import { useEffect, useRef, useState } from 'react'; + +const NewsReader = () => { + const [isSpeaking, setIsSpeaking] = useState(false); + const [isAllowed, setIsAllowed] = useState(false); + const utteranceRef = useRef(null); + + // Fungsi untuk membaca teks + const speakText = () => { + if (typeof window === 'undefined' || !window.speechSynthesis) { + console.warn('Browser tidak mendukung SpeechSynthesis.'); + return; + } + + const contentElement = document.getElementById('news-content'); + const rawText = contentElement?.innerText || ''; + if (!rawText.trim()) return; + + // Hentikan semua suara sebelumnya + window.speechSynthesis.cancel(); + + const utterance = new SpeechSynthesisUtterance(rawText); + utterance.lang = 'id-ID'; + utterance.rate = 1; + utterance.pitch = 1; + + utterance.onstart = () => setIsSpeaking(true); + utterance.onend = () => setIsSpeaking(false); + + utteranceRef.current = utterance; + + try { + window.speechSynthesis.speak(utterance); + } catch (err) { + console.warn('Autoplay gagal karena kebijakan browser:', err); + } + }; + + // Auto play jika sudah pernah diizinkan + useEffect(() => { + const hasPermission = localStorage.getItem('ttsAllowed') === 'true'; + setIsAllowed(hasPermission); + + if (hasPermission) { + const trySpeak = setInterval(() => { + const contentElement = document.getElementById('news-content'); + if (contentElement && contentElement.innerText.trim()) { + speakText(); + clearInterval(trySpeak); + } + }, 1000); + return () => clearInterval(trySpeak); + } + }, []); + + // Hentikan suara saat user keluar halaman / komponen unmount + useEffect(() => { + return () => { + if (typeof window !== 'undefined' && window.speechSynthesis) { + window.speechSynthesis.cancel(); + setIsSpeaking(false); + } + }; + }, []); + + // Handle tombol manual + const handleToggle = () => { + if (isSpeaking) { + window.speechSynthesis.cancel(); + setIsSpeaking(false); + } else { + if (!isAllowed) { + localStorage.setItem('ttsAllowed', 'true'); + setIsAllowed(true); + } + speakText(); + } + }; + + return ( + + ); +}; + +export default NewsReader; diff --git a/src/app/darmasaba/_com/RunningText.tsx b/src/app/darmasaba/_com/RunningText.tsx new file mode 100644 index 00000000..c670818e --- /dev/null +++ b/src/app/darmasaba/_com/RunningText.tsx @@ -0,0 +1,185 @@ +"use client"; + +import { Box } from "@mantine/core"; +import { IconBell } from "@tabler/icons-react"; +import { useMemo, useState, useEffect } from "react"; + +interface RunningTextProps { + news?: string[]; + speed?: number; // dalam detik (jika mau manual) + autoSpeed?: boolean; // otomatis sesuaikan speed dengan panjang text + bgColor?: string; + textColor?: string; + maxLength?: number; // max karakter per item +} + +// Utility function untuk strip HTML (works on both server and client) +function stripHtmlTags(html: string): string { + const text = html + .replace(/]*>.*?<\/style>/gi, '') + .replace(/]*>.*?<\/script>/gi, '') + .replace(/<[^>]+>/g, '') + .replace(/ /gi, ' ') + .replace(/&/gi, '&') + .replace(/</gi, '<') + .replace(/>/gi, '>') + .replace(/"/gi, '"') + .replace(/'/gi, "'") + .replace(/’/gi, "'") + .replace(/—/gi, '—') + .replace(/–/gi, '–') + .replace(/\s+/g, ' ') + .trim(); + + return text; +} + +export default function RunningText({ + news = [ + "Selamat datang di Portal Desa Darmasaba", + "Jam operasional kantor: Senin - Jumat 08:00 - 17:00", + ], + speed = 20, + autoSpeed = true, + bgColor = "#1e5a7e", + textColor = "white", + maxLength = 200 // default max 200 karakter per item +}: RunningTextProps) { + + const [isMounted, setIsMounted] = useState(false); + + useEffect(() => { + setIsMounted(true); + }, []); + + // Process news data + const processedNews = useMemo(() => { + return news + .filter(item => item && item.trim() !== "") + .map(item => { + let text = stripHtmlTags(item); + // Limit panjang per item + if (text.length > maxLength) { + text = text.substring(0, maxLength) + "..."; + } + return text; + }) + .filter(item => item.length > 0); + }, [news, maxLength]); + + const allNews = processedNews.length > 0 + ? processedNews.join(" • ") + : "Tidak ada pengumuman"; + + // Hitung speed berdasarkan mode + const calculatedSpeed = useMemo(() => { + if (!autoSpeed) { + return speed; // Gunakan speed manual + } + + // Auto speed: berdasarkan panjang text + const textLength = allNews.length; + + // Formula yang lebih natural: + // - Text pendek (< 100 char): 15 detik + // - Text sedang (100-300 char): 20-30 detik + // - Text panjang (> 300 char): 30-45 detik + let calculatedTime; + + if (textLength < 100) { + calculatedTime = 15; + } else if (textLength < 300) { + calculatedTime = 15 + ((textLength - 100) / 200) * 15; // 15-30 detik + } else { + calculatedTime = 30 + Math.min(((textLength - 300) / 500) * 15, 15); // 30-45 detik max + } + + return Math.round(calculatedTime); + }, [allNews, speed, autoSpeed]); + + // Prevent hydration mismatch + if (!isMounted) { + return ( + +
+ + + Memuat pengumuman... + +
+
+ ); + } + + return ( + + + + + + + {currentNews?.type === "berita" ? "Berita Terbaru" : "Pengumuman"} + + setToastVisible(false)} + size="sm" + /> + + + + {currentNews?.title || "Informasi Terbaru"} + + + + {stripHtml(currentNews?.content || "")} + + + + + {news.length > 1 ? `${news.length} berita tersedia` : '1 berita'} + + + Lihat Semua → + + + + + )} + + + ); +} \ No newline at end of file diff --git a/src/app/darmasaba/page.tsx b/src/app/darmasaba/page.tsx index 9997978d..eab9320c 100644 --- a/src/app/darmasaba/page.tsx +++ b/src/app/darmasaba/page.tsx @@ -12,11 +12,12 @@ import { Box, Stack } from "@mantine/core"; import Apbdes from "./_com/main-page/apbdes"; import Prestasi from "./_com/main-page/prestasi"; import ScrollToTopButton from "./_com/scrollToTopButton"; -import RunningText from "./_com/RunningText"; + import { useProxy } from "valtio/utils"; import stateDashboardBerita from "../admin/(dashboard)/_state/desa/berita"; import { useEffect, useMemo } from "react"; import stateDesaPengumuman from "../admin/(dashboard)/_state/desa/pengumuman"; +import ModernNewsNotification from "./_com/ModernNeewsNotification"; export default function Page() { @@ -37,36 +38,36 @@ export default function Page() { } }, [pengumuman.data, loadingPengumuman]); - // Memoize news data untuk performa lebih baik + // Transform data untuk notification system const newsData = useMemo(() => { const items = []; - // Tambahkan judul berita jika ada - if (featured.data?.judul) { - items.push(`📰 BERITA: ${featured.data.judul}`); + if (featured.data) { + items.push({ + id: String(featured.data.id || "berita-1"), + type: "berita" as const, + title: String(featured.data.judul || "Berita Terbaru"), + content: String(featured.data.content || ""), + timestamp: featured.data.createdAt + ? (typeof featured.data.createdAt === 'string' + ? featured.data.createdAt + : new Date(featured.data.createdAt).toISOString()) + : new Date().toISOString(), + }); } - // Tambahkan content berita (akan di-strip HTML di component) - if (featured.data?.content) { - items.push(featured.data.content); - } - - // Tambahkan judul pengumuman jika ada - if (pengumuman.data?.judul) { - items.push(`📢 PENGUMUMAN: ${pengumuman.data.judul}`); - } - - // Tambahkan content pengumuman - if (pengumuman.data?.content) { - items.push(pengumuman.data.content); - } - - // Jika tidak ada data, return default message - if (items.length === 0) { - return [ - "Selamat datang di Portal Desa Darmasaba", - "Jam operasional kantor: Senin - Jumat 08:00 - 17:00" - ]; + if (pengumuman.data) { + items.push({ + id: String(pengumuman.data.id || "pengumuman-1"), + type: "pengumuman" as const, + title: String(pengumuman.data.judul || "Pengumuman Penting"), + content: String(pengumuman.data.content || ""), + timestamp: pengumuman.data.createdAt + ? (typeof pengumuman.data.createdAt === 'string' + ? pengumuman.data.createdAt + : new Date(pengumuman.data.createdAt).toISOString()) + : new Date().toISOString(), + }); } return items; @@ -78,14 +79,7 @@ export default function Page() { bg={colors.grey[1]} gap={0} > - + {/* HAPUS RUNNING TEXT, GANTI DENGAN MODERN NOTIFICATION */} @@ -96,8 +90,15 @@ export default function Page() {
+ {/* Tombol Scroll ke Atas */} + + {/* Modern Notification System */} + ); } \ No newline at end of file From db8909b9ed6ee7ab412c9d84eb13f576248a82d0 Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 6 Nov 2025 11:35:04 +0800 Subject: [PATCH 32/56] Fix Text to Speech Menu Landing Page && Add barchart Landing Page APBDes --- .../ekonomi/demografi-pekerjaan/page.tsx | 3 +- src/app/api/tts/route.ts | 35 ++++ .../desa/berita/[kategori]/[id]/page.tsx | 2 +- .../_com/ModernNeewsNotification.tsx | 4 +- src/app/darmasaba/_com/NewsReader.tsx | 153 +++++++++++------- src/app/darmasaba/_com/NewsReaderalanding.tsx | 110 +++++++++++++ .../darmasaba/_com/main-page/apbdes/index.tsx | 77 ++++++++- .../_com/main-page/apbdes/lib/convert.tsx | 13 ++ .../_com/main-page/layanan/index.tsx | 20 +-- .../_com/main-page/potensi/index.tsx | 4 +- src/app/darmasaba/page.tsx | 8 +- 11 files changed, 352 insertions(+), 77 deletions(-) create mode 100644 src/app/api/tts/route.ts create mode 100644 src/app/darmasaba/_com/NewsReaderalanding.tsx create mode 100644 src/app/darmasaba/_com/main-page/apbdes/lib/convert.tsx diff --git a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx index 0b2d4a92..1b41b2ae 100644 --- a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; import { BarChart } from '@mantine/charts'; @@ -85,7 +86,7 @@ function ListDemografiPekerjaan({ search }: { search: string }) { useEffect(() => { if (data) { setChartData( - data.map((item) => ({ + data.map((item: any) => ({ id: item.id, pekerjaan: item.pekerjaan, lakiLaki: Number(item.lakiLaki), diff --git a/src/app/api/tts/route.ts b/src/app/api/tts/route.ts new file mode 100644 index 00000000..31106e6c --- /dev/null +++ b/src/app/api/tts/route.ts @@ -0,0 +1,35 @@ +// app/api/tts/route.ts +import { NextRequest } from 'next/server'; + +export async function POST(req: NextRequest) { + const { text } = await req.json(); + + if (!text || text.length > 500) { + return new Response('Teks terlalu panjang atau kosong', { status: 400 }); + } + + const res = await fetch('https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'xi-api-key': process.env.ELEVENLABS_API_KEY!, // Simpan di .env.local + }, + body: JSON.stringify({ + text, + model_id: 'eleven_multilingual_v2', + voice_settings: { + stability: 0.7, + similarity_boost: 0.8, + }, + }), + }); + + if (!res.ok) { + return new Response('Gagal generate suara', { status: 500 }); + } + + const audioBuffer = await res.arrayBuffer(); + return new Response(audioBuffer, { + headers: { 'Content-Type': 'audio/mpeg' }, + }); +} \ No newline at end of file diff --git a/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx index c78246d6..858f739a 100644 --- a/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx +++ b/src/app/darmasaba/(pages)/desa/berita/[kategori]/[id]/page.tsx @@ -55,7 +55,7 @@ function Page() { - + {state.findUnique.data?.judul} { - const [isSpeaking, setIsSpeaking] = useState(false); - const [isAllowed, setIsAllowed] = useState(false); + const [isPointerMode, setIsPointerMode] = useState(false); const utteranceRef = useRef(null); - // Fungsi untuk membaca teks - const speakText = () => { - if (typeof window === 'undefined' || !window.speechSynthesis) { - console.warn('Browser tidak mendukung SpeechSynthesis.'); - return; - } + const speakText = (text: string) => { + if (!window.speechSynthesis || !text.trim()) return; - const contentElement = document.getElementById('news-content'); - const rawText = contentElement?.innerText || ''; - if (!rawText.trim()) return; - - // Hentikan semua suara sebelumnya - window.speechSynthesis.cancel(); - - const utterance = new SpeechSynthesisUtterance(rawText); + window.speechSynthesis.cancel(); // hentikan sebelumnya + const utterance = new SpeechSynthesisUtterance(text); utterance.lang = 'id-ID'; utterance.rate = 1; utterance.pitch = 1; - - utterance.onstart = () => setIsSpeaking(true); - utterance.onend = () => setIsSpeaking(false); - utteranceRef.current = utterance; - - try { - window.speechSynthesis.speak(utterance); - } catch (err) { - console.warn('Autoplay gagal karena kebijakan browser:', err); - } + window.speechSynthesis.speak(utterance); }; - // Auto play jika sudah pernah diizinkan + // Tambahkan listener hover ke semua elemen teks useEffect(() => { - const hasPermission = localStorage.getItem('ttsAllowed') === 'true'; - setIsAllowed(hasPermission); + const content = document.getElementById('news-title'); + if (!content) return; - if (hasPermission) { - const trySpeak = setInterval(() => { - const contentElement = document.getElementById('news-content'); - if (contentElement && contentElement.innerText.trim()) { - speakText(); - clearInterval(trySpeak); - } - }, 1000); - return () => clearInterval(trySpeak); + // Atur cursor saat mode aktif/nonaktif + if (isPointerMode) { + content.style.cursor = 'pointer'; + } else { + content.style.cursor = 'auto'; } - }, []); - // Hentikan suara saat user keluar halaman / komponen unmount - useEffect(() => { - return () => { - if (typeof window !== 'undefined' && window.speechSynthesis) { - window.speechSynthesis.cancel(); - setIsSpeaking(false); + if (!isPointerMode) return; + + const handleMouseOver = (e: MouseEvent) => { + const target = e.target as HTMLElement; + // opsional: hanya baca teks dari elemen tertentu + if (target && target.innerText) { + speakText(target.innerText); + target.style.backgroundColor = '#eef6ff'; // highlight biar keliatan } }; - }, []); - // Handle tombol manual - const handleToggle = () => { - if (isSpeaking) { + const handleMouseOut = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if (target) target.style.backgroundColor = ''; // hilangkan highlight window.speechSynthesis.cancel(); - setIsSpeaking(false); + }; + + content.addEventListener('mouseover', handleMouseOver); + content.addEventListener('mouseout', handleMouseOut); + + return () => { + content.removeEventListener('mouseover', handleMouseOver); + content.removeEventListener('mouseout', handleMouseOut); + content.style.cursor = 'auto'; // reset cursor saat mode dimatikan + window.speechSynthesis.cancel(); + }; + }, [isPointerMode]); + + useEffect(() => { + const content = document.getElementById('news-content'); + if (!content) return; + + // Atur cursor saat mode aktif/nonaktif + if (isPointerMode) { + content.style.cursor = 'pointer'; } else { - if (!isAllowed) { - localStorage.setItem('ttsAllowed', 'true'); - setIsAllowed(true); - } - speakText(); + content.style.cursor = 'auto'; } + + if (!isPointerMode) return; + + const handleMouseOver = (e: MouseEvent) => { + const target = e.target as HTMLElement; + // opsional: hanya baca teks dari elemen tertentu + if (target && target.innerText) { + speakText(target.innerText); + target.style.backgroundColor = '#eef6ff'; // highlight biar keliatan + } + }; + + const handleMouseOut = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if (target) target.style.backgroundColor = ''; // hilangkan highlight + window.speechSynthesis.cancel(); + }; + + content.addEventListener('mouseover', handleMouseOver); + content.addEventListener('mouseout', handleMouseOut); + + return () => { + content.removeEventListener('mouseover', handleMouseOver); + content.removeEventListener('mouseout', handleMouseOut); + content.style.cursor = 'auto'; // reset cursor saat mode dimatikan + window.speechSynthesis.cancel(); + }; + }, [isPointerMode]); + + + + const handleToggle = () => { + setIsPointerMode((prev) => { + if (prev) { + window.speechSynthesis.cancel(); + } + return !prev; + }); }; return ( @@ -84,11 +114,20 @@ const NewsReader = () => { onClick={handleToggle} color="#0B4F78" variant="filled" - radius="xl" size="md" mt="md" + style={{ + zIndex: 500, + position: 'fixed', + bottom: '350px', + left: '0px', + borderBottomRightRadius: '20px', + borderTopRightRadius: '20px', + borderBottomLeftRadius: '0px', + borderTopLeftRadius: '0px', + }} > - {isSpeaking ? '🔇 Hentikan Suara' : '🔊 Dengarkan Berita'} + {isPointerMode ? : } ); }; diff --git a/src/app/darmasaba/_com/NewsReaderalanding.tsx b/src/app/darmasaba/_com/NewsReaderalanding.tsx new file mode 100644 index 00000000..53f21935 --- /dev/null +++ b/src/app/darmasaba/_com/NewsReaderalanding.tsx @@ -0,0 +1,110 @@ +'use client'; +import { Button } from '@mantine/core'; +import { IconMusic, IconMusicOff } from '@tabler/icons-react'; +import { useEffect, useRef, useState } from 'react'; + +const NewsReaderLanding = () => { + const [isPointerMode, setIsPointerMode] = useState(false); + const utteranceRef = useRef(null); + const timeoutRef = useRef | null>(null); + const lastTextRef = useRef(''); + + const speakText = (text: string) => { + if (!window.speechSynthesis || !text.trim()) return; + + // Jangan baca ulang kalau teksnya sama + if (lastTextRef.current === text) return; + lastTextRef.current = text; + + window.speechSynthesis.cancel(); + + const utterance = new SpeechSynthesisUtterance(text); + utterance.lang = 'id-ID'; + utterance.rate = 1; + utterance.pitch = 1; + + utteranceRef.current = utterance; + window.speechSynthesis.speak(utterance); + }; + + useEffect(() => { + const root = document.getElementById('page-root'); + if (!root) return; + + root.style.cursor = isPointerMode ? 'pointer' : 'auto'; + if (!isPointerMode) return; + + const handleMouseOver = (e: MouseEvent) => { + const target = e.target as HTMLElement; + if ( + !target || + !target.innerText || + target.tagName === 'BUTTON' || + target.tagName === 'SVG' || + target.closest('button') + ) + return; + + // Hapus timeout sebelumnya biar gak spam + if (timeoutRef.current) clearTimeout(timeoutRef.current); + + // Delay dikit biar smooth (hindari brebet) + timeoutRef.current = setTimeout(() => { + speakText(target.innerText); + }, 250); // 250ms delay kasih waktu pindah cursor + }; + + const handleMouseOut = () => { + // Delay kecil sebelum cancel supaya gak motong kasar + if (timeoutRef.current) clearTimeout(timeoutRef.current); + timeoutRef.current = setTimeout(() => { + window.speechSynthesis.cancel(); + lastTextRef.current = ''; + }, 150); + }; + + root.addEventListener('mouseover', handleMouseOver); + root.addEventListener('mouseout', handleMouseOut); + + return () => { + root.removeEventListener('mouseover', handleMouseOver); + root.removeEventListener('mouseout', handleMouseOut); + root.style.cursor = 'auto'; + if (timeoutRef.current) clearTimeout(timeoutRef.current); + window.speechSynthesis.cancel(); + lastTextRef.current = ''; + }; + }, [isPointerMode]); + + const handleToggle = () => { + setIsPointerMode((prev) => { + if (prev) { + window.speechSynthesis.cancel(); + lastTextRef.current = ''; + } + return !prev; + }); + }; + + return ( + + ); +}; + +export default NewsReaderLanding; diff --git a/src/app/darmasaba/_com/main-page/apbdes/index.tsx b/src/app/darmasaba/_com/main-page/apbdes/index.tsx index 0c77e8c7..803065b4 100644 --- a/src/app/darmasaba/_com/main-page/apbdes/index.tsx +++ b/src/app/darmasaba/_com/main-page/apbdes/index.tsx @@ -1,14 +1,25 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import apbdes from '@/app/admin/(dashboard)/_state/landing-page/apbdes' import colors from '@/con/colors' -import { ActionIcon, BackgroundImage, Box, Button, Center, Flex, Group, Loader, SimpleGrid, Stack, Text } from '@mantine/core' +import { BarChart } from '@mantine/charts' +import { ActionIcon, BackgroundImage, Box, Button, Center, Flex, Group, Loader, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core' import { IconDownload } from '@tabler/icons-react' import Link from 'next/link' import { useEffect, useState } from 'react' import { useProxy } from 'valtio/utils' +import parseJumlah from './lib/convert' function Apbdes() { + type APBDes = { + id: string + name: string + jumlah: number + }; + + const [chartData, setChartData] = useState([]) + const [mounted, setMounted] = useState(false); const state = useProxy(apbdes) const [loading, setLoading] = useState(false) @@ -17,9 +28,22 @@ function Apbdes() { des: 'Transparansi APBDes Darmasaba adalah langkah nyata menuju tata kelola desa yang bersih, terbuka, dan bertanggung jawab.' } + useEffect(() => { + if (state.findMany.data) { + setChartData( + state.findMany.data.map((item: any) => ({ + id: item.id, + name: item.name, + jumlah: parseJumlah(item.jumlah), + })) + ); + } + }, [state.findMany.data]); + useEffect(() => { const loadData = async () => { try { + setMounted(true); setLoading(true) await state.findMany.load() } catch (error) { @@ -46,6 +70,55 @@ function Apbdes() { + {/* Chart */} + + + + + Grafik APBDes + + {mounted && chartData.length > 0 ? ( + { + if (value >= 1_000_000_000_000) + return `Rp ${(value / 1_000_000_000_000).toFixed(1)} T`; + if (value >= 1_000_000_000) + return `Rp ${(value / 1_000_000_000).toFixed(1)} M`; + if (value >= 1_000_000) + return `Rp ${(value / 1_000_000).toFixed(1)} Jt`; + if (value >= 1_000) + return `Rp ${(value / 1_000).toFixed(1)} Rb`; + return `Rp ${value}`; + }} + series={[ + { + name: 'jumlah', + color: colors['blue-button'], + label: 'Jumlah', + }, + ]} + /> + ) : ( + Belum ada data untuk ditampilkan dalam grafik + )} + + + + + Jumlah + + + + + + + {loading ? (
@@ -72,7 +145,7 @@ function Apbdes() { pos="relative" style={{ overflow: 'hidden' }} > - + (0); const isHoveredRef = useRef(false); - + // Refs for drag functionality const isDraggingRef = useRef(false); const startXRef = useRef(0); const scrollLeftRef = useRef(0); const velocityRef = useRef(0); const lastScrollTimeRef = useRef(0); - + // Speed configuration const normalSpeed = 1.0; // pixels per frame const hoverSpeed = 0.3; // slower speed on hover @@ -143,7 +143,7 @@ function Slider() { } else { // Sync scroll position when user is scrolling scrollPositionRef.current = container.scrollLeft; - + // Apply momentum/velocity for smooth drag release if (!isDraggingRef.current && Math.abs(velocityRef.current) > 0.1) { scrollPositionRef.current += velocityRef.current; @@ -176,26 +176,26 @@ function Slider() { // Mouse drag handlers const handleMouseDown = (e: React.MouseEvent) => { if (!containerRef.current) return; - + isDraggingRef.current = true; startXRef.current = e.pageX - containerRef.current.offsetLeft; scrollLeftRef.current = containerRef.current.scrollLeft; velocityRef.current = 0; - + containerRef.current.style.cursor = 'grabbing'; }; const handleMouseMove = (e: React.MouseEvent) => { if (!isDraggingRef.current || !containerRef.current) return; - + e.preventDefault(); const x = e.pageX - containerRef.current.offsetLeft; const walk = (x - startXRef.current) * 2; // Multiply for faster scroll const newScrollLeft = scrollLeftRef.current - walk; - + // Calculate velocity for momentum velocityRef.current = containerRef.current.scrollLeft - newScrollLeft; - + containerRef.current.scrollLeft = newScrollLeft; scrollPositionRef.current = newScrollLeft; lastScrollTimeRef.current = Date.now(); @@ -203,7 +203,7 @@ function Slider() { const handleMouseUp = () => { if (!containerRef.current) return; - + isDraggingRef.current = false; containerRef.current.style.cursor = 'grab'; }; @@ -211,7 +211,7 @@ function Slider() { // Wheel scroll handler const handleWheel = (e: React.WheelEvent) => { if (!containerRef.current) return; - + e.preventDefault(); containerRef.current.scrollLeft += e.deltaY; scrollPositionRef.current = containerRef.current.scrollLeft; diff --git a/src/app/darmasaba/_com/main-page/potensi/index.tsx b/src/app/darmasaba/_com/main-page/potensi/index.tsx index ff2bf284..7fc00670 100644 --- a/src/app/darmasaba/_com/main-page/potensi/index.tsx +++ b/src/app/darmasaba/_com/main-page/potensi/index.tsx @@ -51,10 +51,10 @@ function Potensi() { return ( - + {textHeading.title} - + {textHeading.des} diff --git a/src/app/darmasaba/page.tsx b/src/app/darmasaba/page.tsx index eab9320c..ba50fad1 100644 --- a/src/app/darmasaba/page.tsx +++ b/src/app/darmasaba/page.tsx @@ -13,11 +13,12 @@ import Apbdes from "./_com/main-page/apbdes"; import Prestasi from "./_com/main-page/prestasi"; import ScrollToTopButton from "./_com/scrollToTopButton"; +import { useEffect, useMemo } from "react"; import { useProxy } from "valtio/utils"; import stateDashboardBerita from "../admin/(dashboard)/_state/desa/berita"; -import { useEffect, useMemo } from "react"; import stateDesaPengumuman from "../admin/(dashboard)/_state/desa/pengumuman"; import ModernNewsNotification from "./_com/ModernNeewsNotification"; +import NewsReaderLanding from "./_com/NewsReaderalanding"; export default function Page() { @@ -74,7 +75,7 @@ export default function Page() { }, [featured.data, pengumuman.data]); return ( - + + + + ); } \ No newline at end of file From 417a8937f5a97841aa1f9fa6191aa6e71cce6c61 Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 7 Nov 2025 14:38:32 +0800 Subject: [PATCH 33/56] Semua tooltips di admin sudah dihilangkan --- package.json | 6 +- .../_state/landing-page/sdgs-desa.ts | 28 +++ .../_lib/layoutTabs.tsx | 46 ++--- .../apbdesa/[id]/edit/page.tsx | 23 +-- .../apbdesa/[id]/page.tsx | 57 +++--- .../apbdesa/create/page.tsx | 11 +- .../apbdesa/page.tsx | 57 +++--- .../belanja/[id]/page.tsx | 21 +- .../belanja/create/page.tsx | 23 +-- .../belanja/page.tsx | 77 ++++---- .../pembiayaan/[id]/page.tsx | 21 +- .../pembiayaan/create/page.tsx | 28 ++- .../pembiayaan/page.tsx | 41 ++-- .../pendapatan/[id]/page.tsx | 21 +- .../pendapatan/create/page.tsx | 21 +- .../pendapatan/page.tsx | 25 ++- .../ekonomi/demografi-pekerjaan/[id]/page.tsx | 23 +-- .../demografi-pekerjaan/create/page.tsx | 21 +- .../ekonomi/demografi-pekerjaan/page.tsx | 25 ++- .../jumlah-penduduk-miskin/[id]/page.tsx | 25 ++- .../jumlah-penduduk-miskin/create/page.tsx | 12 +- .../ekonomi/jumlah-penduduk-miskin/page.tsx | 27 ++- .../_lib/layoutTabs.tsx | 42 ++-- .../[id]/page.tsx | 22 +-- .../create/page.tsx | 17 +- .../page.tsx | 79 ++++---- .../[id]/page.tsx | 25 ++- .../create/page.tsx | 16 +- .../ekonomi/jumlah-pengangguran/[id]/page.tsx | 48 +++-- .../jumlah-pengangguran/create/page.tsx | 25 ++- .../ekonomi/jumlah-pengangguran/page.tsx | 22 +-- .../lowongan-kerja-lokal/[id]/edit/page.tsx | 12 +- .../lowongan-kerja-lokal/[id]/page.tsx | 48 +++-- .../lowongan-kerja-lokal/create/page.tsx | 22 +-- .../ekonomi/lowongan-kerja-lokal/page.tsx | 5 +- .../ekonomi/pasar-desa/_lib/layoutTabs.tsx | 39 ++-- .../pasar-desa/kategori-produk/[id]/page.tsx | 31 ++- .../kategori-produk/create/page.tsx | 5 +- .../pasar-desa/kategori-produk/page.tsx | 10 +- .../produk-pasar-desa/[id]/edit/page.tsx | 11 +- .../produk-pasar-desa/[id]/page.tsx | 58 +++--- .../produk-pasar-desa/create/page.tsx | 11 +- .../pasar-desa/produk-pasar-desa/page.tsx | 25 ++- .../program-kemiskinan/[id]/edit/page.tsx | 25 ++- .../ekonomi/program-kemiskinan/[id]/page.tsx | 53 +++-- .../program-kemiskinan/create/page.tsx | 29 ++- .../ekonomi/program-kemiskinan/page.tsx | 10 +- .../sektor-unggulan-desa/[id]/edit/page.tsx | 33 ++-- .../sektor-unggulan-desa/[id]/page.tsx | 57 +++--- .../sektor-unggulan-desa/create/page.tsx | 23 +-- .../ekonomi/sektor-unggulan-desa/page.tsx | 29 ++- .../_lib/layoutTabs.tsx | 43 ++-- .../pegawai/[id]/edit/page.tsx | 11 +- .../pegawai/[id]/page.tsx | 48 +++-- .../pegawai/create/page.tsx | 10 +- .../pegawai/page.tsx | 38 ++-- .../posisi-organisasi/[id]/page.tsx | 10 +- .../posisi-organisasi/create/page.tsx | 20 +- .../posisi-organisasi/page.tsx | 40 ++-- .../struktur-organisasi/page.tsx | 28 ++- .../inovasi/ajukan-ide-inovatif/[id]/page.tsx | 32 ++- .../[id]/edit/page.tsx | 11 +- .../desa-digital-smart-village/[id]/page.tsx | 49 +++-- .../create/page.tsx | 45 ++--- .../desa-digital-smart-village/page.tsx | 25 ++- .../[id]/edit/page.tsx | 11 +- .../info-teknologi-tepat-guna/[id]/page.tsx | 54 +++-- .../info-teknologi-tepat-guna/create/page.tsx | 13 +- .../info-teknologi-tepat-guna/page.tsx | 27 ++- .../kolaborasi-inovasi/_lib/layoutTabs.tsx | 33 ++-- .../[id]/edit/page.tsx | 11 +- .../list-kolaborasi-inovasi/[id]/page.tsx | 50 +++-- .../list-kolaborasi-inovasi/create/page.tsx | 10 +- .../list-kolaborasi-inovasi/page.tsx | 25 ++- .../mitra-kolaborasi/[id]/page.tsx | 11 +- .../mitra-kolaborasi/create/page.tsx | 11 +- .../mitra-kolaborasi/page.tsx | 91 ++++----- .../layanan-online-desa/_lib/layoutTabs.tsx | 50 ++--- .../administrasi-online/[id]/page.tsx | 28 ++- .../jenis-layanan/[id]/edit/page.tsx | 21 +- .../jenis-layanan/[id]/page.tsx | 50 +++-- .../jenis-layanan/create/page.tsx | 21 +- .../jenis-layanan/page.tsx | 29 ++- .../jenis-pengaduan/[id]/page.tsx | 21 +- .../jenis-pengaduan/create/page.tsx | 11 +- .../jenis-pengaduan/page.tsx | 29 ++- .../pengaduan-masyarakat/[id]/page.tsx | 32 ++- .../pengaduan-masyarakat/page.tsx | 25 ++- .../program-kreatif-desa/[id]/page.tsx | 64 +++--- .../program-kreatif-desa/create/page.tsx | 17 +- .../inovasi/program-kreatif-desa/page.tsx | 55 +++--- .../landing-page/apbdes/create/page.tsx | 2 +- .../(dashboard)/landing-page/apbdes/page.tsx | 70 +++---- .../data-lingkungan-desa/[id]/edit/page.tsx | 11 +- .../data-lingkungan-desa/[id]/page.tsx | 48 +++-- .../data-lingkungan-desa/create/page.tsx | 21 +- .../lingkungan/data-lingkungan-desa/page.tsx | 19 +- .../edukasi-lingkungan/_lib/layouTabs.tsx | 48 +++-- .../gotong-royong/_lib/layoutTabs.tsx | 35 ++-- .../kategori-kegiatan/[id]/page.tsx | 10 +- .../kategori-kegiatan/create/page.tsx | 10 +- .../gotong-royong/kategori-kegiatan/page.tsx | 21 +- .../kegiatan-desa/[id]/edit/page.tsx | 11 +- .../gotong-royong/kegiatan-desa/[id]/page.tsx | 54 +++-- .../kegiatan-desa/create/page.tsx | 23 +-- .../konservasi-adat-bali/_lib/layoutTabs.tsx | 46 ++--- .../[id]/edit/page.tsx | 10 +- .../create/page.tsx | 16 +- .../keterangan-bank-sampah-terdekat/page.tsx | 28 ++- .../[id]/page.tsx | 12 +- .../create/page.tsx | 6 +- .../page.tsx | 79 ++++---- .../program-penghijauan/[id]/edit/page.tsx | 21 +- .../program-penghijauan/[id]/page.tsx | 50 +++-- .../program-penghijauan/create/page.tsx | 21 +- .../lingkungan/program-penghijauan/page.tsx | 23 +-- .../beasiswa-desa/_lib/layoutTabs.tsx | 39 ++-- .../beasiswa-pendaftar/[id]/page.tsx | 28 ++- .../keunggulan-program/[id]/page.tsx | 22 +-- .../keunggulan-program/create/page.tsx | 20 +- .../beasiswa-desa/keunggulan-program/page.tsx | 89 ++++----- .../_lib/layoutTabs.tsx | 40 ++-- .../fasilitas-yang-disediakan/edit/page.tsx | 23 +-- .../fasilitas-yang-disediakan/page.tsx | 30 ++- .../lokasi-dan-jadwal/edit/page.tsx | 19 +- .../lokasi-dan-jadwal/page.tsx | 30 ++- .../tujuan-program/edit/page.tsx | 13 +- .../tujuan-program/page.tsx | 31 ++- .../pendidikan/data-pendidikan/[id]/page.tsx | 10 +- .../data-pendidikan/create/page.tsx | 10 +- .../pendidikan/data-pendidikan/page.tsx | 56 +++--- .../info-sekolah/_lib/layoutTabs.tsx | 35 ++-- .../jenjang-pendidikan/[id]/page.tsx | 11 +- .../jenjang-pendidikan/create/page.tsx | 21 +- .../info-sekolah/jenjang-pendidikan/page.tsx | 20 +- .../info-sekolah/lembaga/[id]/edit/page.tsx | 31 ++- .../info-sekolah/lembaga/[id]/page.tsx | 56 +++--- .../info-sekolah/lembaga/create/page.tsx | 11 +- .../pendidikan/info-sekolah/lembaga/page.tsx | 21 +- .../info-sekolah/pengajar/[id]/edit/page.tsx | 11 +- .../info-sekolah/pengajar/[id]/page.tsx | 52 +++-- .../info-sekolah/pengajar/create/page.tsx | 13 +- .../pendidikan/info-sekolah/pengajar/page.tsx | 24 ++- .../info-sekolah/siswa/[id]/edit/page.tsx | 11 +- .../info-sekolah/siswa/[id]/page.tsx | 52 +++-- .../info-sekolah/siswa/create/page.tsx | 11 +- .../pendidikan/info-sekolah/siswa/page.tsx | 23 +-- .../pendidikan-non-formal/_lib/layoutTabs.tsx | 42 ++-- .../edit/page.tsx | 13 +- .../page.tsx | 31 ++- .../tempat-kegiatan/edit/page.tsx | 13 +- .../tempat-kegiatan/page.tsx | 30 ++- .../tujuan-program/edit/page.tsx | 13 +- .../tujuan-program/page.tsx | 31 ++- .../perpustakaan-digital/_lib/layoutTabs.tsx | 42 ++-- .../data-perpustakaan/[id]/edit/page.tsx | 18 +- .../data-perpustakaan/[id]/page.tsx | 48 +++-- .../data-perpustakaan/create/page.tsx | 10 +- .../data-perpustakaan/page.tsx | 24 ++- .../kategori-buku/[id]/page.tsx | 10 +- .../kategori-buku/create/page.tsx | 10 +- .../kategori-buku/page.tsx | 22 +-- .../peminjam/[id]/edit/page.tsx | 11 +- .../peminjam/[id]/page.tsx | 85 ++++---- .../_lib/layoutTabs.tsx | 39 ++-- .../program-unggulan/edit/page.tsx | 13 +- .../program-unggulan/page.tsx | 30 ++- .../tujuan-program/edit/page.tsx | 13 +- .../tujuan-program/page.tsx | 30 ++- .../[id]/edit/page.tsx | 2 +- .../[id]/page.tsx | 4 +- .../create/page.tsx | 2 +- .../page.tsx | 8 +- .../_lib/layoutTabs.tsx | 12 +- .../grafik-kepuasan-masyarakat}/page.tsx | 0 .../layout.tsx | 0 .../responden/[id]/edit/page.tsx | 0 .../responden/[id]/page.tsx | 0 .../responden/create/page.tsx | 0 .../responden/page.tsx | 0 .../(dashboard)/ppid/visi-misi-ppid/page.tsx | 2 +- .../admin/(dashboard)/user&role/layout.tsx | 29 ++- .../(dashboard)/user&role/role/[id]/page.tsx | 12 +- .../user&role/role/create/page.tsx | 17 +- .../admin/(dashboard)/user&role/role/page.tsx | 80 ++++---- src/app/admin/_com/list_PageAdmin.tsx | 8 +- .../landing_page/sdgs-desa/findManyAll.ts | 29 +++ .../_lib/landing_page/sdgs-desa/index.ts | 4 + .../darmasaba/(tambahan)/sdgs-desa/page.tsx | 181 ++++++++++++++--- .../_com/ModernNeewsNotification.tsx | 39 ++-- src/app/darmasaba/_com/RunningText.tsx | 185 ------------------ .../darmasaba/_com/main-page/apbdes/index.tsx | 4 +- .../_com/main-page/apbdes/lib/convert.tsx | 2 +- .../_com/main-page/landing-page/index.tsx | 64 +++++- src/app/darmasaba/page.tsx | 61 ------ 195 files changed, 2479 insertions(+), 3083 deletions(-) rename src/app/admin/(dashboard)/ppid/{daftar-informasi-publik-desa-darmasaba => daftar-informasi-publik}/[id]/edit/page.tsx (98%) rename src/app/admin/(dashboard)/ppid/{daftar-informasi-publik-desa-darmasaba => daftar-informasi-publik}/[id]/page.tsx (97%) rename src/app/admin/(dashboard)/ppid/{daftar-informasi-publik-desa-darmasaba => daftar-informasi-publik}/create/page.tsx (98%) rename src/app/admin/(dashboard)/ppid/{daftar-informasi-publik-desa-darmasaba => daftar-informasi-publik}/page.tsx (95%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/_lib/layoutTabs.tsx (91%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba/indeks-kepuasan-masyarakat => indeks-kepuasan-masyarakat/grafik-kepuasan-masyarakat}/page.tsx (100%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/layout.tsx (100%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/responden/[id]/edit/page.tsx (100%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/responden/[id]/page.tsx (100%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/responden/create/page.tsx (100%) rename src/app/admin/(dashboard)/ppid/{ikm-desa-darmasaba => indeks-kepuasan-masyarakat}/responden/page.tsx (100%) create mode 100644 src/app/api/[[...slugs]]/_lib/landing_page/sdgs-desa/findManyAll.ts delete mode 100644 src/app/darmasaba/_com/RunningText.tsx diff --git a/package.json b/package.json index c25cb87d..c32725d5 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.5", "private": true, "scripts": { - "dev": "bun --bun next dev", - "build": "bun --bun next build", - "start": "bun --bun next start" + "dev": "next dev", + "build": "next build", + "start": "next start" }, "prisma": { "seed": "bun run prisma/seed.ts" diff --git a/src/app/admin/(dashboard)/_state/landing-page/sdgs-desa.ts b/src/app/admin/(dashboard)/_state/landing-page/sdgs-desa.ts index 51686ee5..832d6457 100644 --- a/src/app/admin/(dashboard)/_state/landing-page/sdgs-desa.ts +++ b/src/app/admin/(dashboard)/_state/landing-page/sdgs-desa.ts @@ -93,6 +93,34 @@ const sdgsDesa = proxy({ } }, }, + findManyAll: { + data: null as any[] | null, + loading: false, + load: async () => { // Change to arrow function + sdgsDesa.findManyAll.loading = true; // Use the full path to access the property + try { + const query: any = {}; + + const res = await ApiFetch.api.landingpage.sdgsdesa[ + "findManyAll" + ].get({ + query, + }); + + if (res.status === 200 && res.data?.success) { + sdgsDesa.findManyAll.data = res.data.data || []; + } else { + console.error("Failed to load media sosial:", res.data?.message); + sdgsDesa.findManyAll.data = []; + } + } catch (error) { + console.error("Error loading media sosial:", error); + sdgsDesa.findManyAll.data = []; + } finally { + sdgsDesa.findManyAll.loading = false; + } + }, + }, findUnique: { data: null as Prisma.SdgsDesaGetPayload<{ include: { diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/_lib/layoutTabs.tsx index dca2dfe2..ff6d98fc 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/_lib/layoutTabs.tsx @@ -2,23 +2,22 @@ 'use client' import colors from '@/con/colors'; import { + ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, - Title, - Tooltip, - ScrollArea, + Title } from '@mantine/core'; -import { usePathname, useRouter } from 'next/navigation'; -import React, { useEffect, useState } from 'react'; import { - IconFileAnalytics, IconCoins, + IconFileAnalytics, IconShoppingCart, IconWallet, } from '@tabler/icons-react'; +import { usePathname, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -29,29 +28,25 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "APB Desa", value: "apbdesa", href: "/admin/ekonomi/PADesa-pendapatan-asli-desa/apbdesa", - icon: , - tooltip: "Lihat ringkasan Anggaran Pendapatan dan Belanja Desa", + icon: }, { label: "Pendapatan", value: "pendapatan", href: "/admin/ekonomi/PADesa-pendapatan-asli-desa/pendapatan", icon: , - tooltip: "Kelola data pendapatan desa", }, { label: "Belanja", value: "belanja", href: "/admin/ekonomi/PADesa-pendapatan-asli-desa/belanja", icon: , - tooltip: "Atur data belanja desa", }, { label: "Pembiayaan", value: "pembiayaan", href: "/admin/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan", icon: , - tooltip: "Kelola data pembiayaan desa", }, ]; @@ -104,26 +99,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx index 956f84e1..4e266661 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/edit/page.tsx @@ -6,15 +6,14 @@ import colors from '@/con/colors'; import { Box, Button, + Group, MultiSelect, Paper, Skeleton, Stack, Text, TextInput, - Title, - Tooltip, - Group, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; @@ -88,16 +87,14 @@ function EditAPBDesa() { {/* Header */} - - - + Edit APB Desa diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/page.tsx index ee57dc50..54f43121 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/[id]/page.tsx @@ -9,8 +9,7 @@ import { Paper, Skeleton, Stack, - Text, - Tooltip + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; @@ -159,36 +158,32 @@ function DetailAPBDesa() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/create/page.tsx index 797cc92f..db01743c 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/create/page.tsx @@ -12,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; @@ -43,11 +42,9 @@ function CreateAPBDesa() { {/* Header */} - - - + Tambah APB Desa diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/page.tsx index ff0c6464..e87b21f1 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/apbdesa/page.tsx @@ -5,8 +5,8 @@ import { Button, Center, Group, - Paper, Pagination, + Paper, Skeleton, Stack, Table, @@ -15,8 +15,7 @@ import { TableTh, TableThead, TableTr, - Text, - Tooltip, + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -82,20 +81,18 @@ function ListAPBDesa({ search }: { search: string }) { List APB Desa - - - +
@@ -138,20 +135,18 @@ function ListAPBDesa({ search }: { search: string }) { )} - - - + )) diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx index 7c03d4a8..b4b21fdd 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/[id]/page.tsx @@ -10,8 +10,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -90,16 +89,14 @@ function EditBelanja() { {/* Header */} - - - + Edit Jenis Belanja diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/create/page.tsx index 7cc80cf9..50b6f1cd 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/create/page.tsx @@ -10,13 +10,12 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; function CreateBelanja() { const belanjaState = useProxy(PendapatanAsliDesa.belanja); @@ -57,16 +56,14 @@ function CreateBelanja() { {/* Header dengan back button */} - - - + Tambah Jenis Belanja diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/page.tsx index 467c8142..1a09d875 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/belanja/page.tsx @@ -17,8 +17,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; @@ -96,18 +95,16 @@ function ListBelanja({ search }: { search: string }) { Daftar Belanja - - - + @@ -138,34 +135,30 @@ function ListBelanja({ search }: { search: string }) { - - - - - - + + diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx index 25df9c5b..6a4ad0cf 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/[id]/page.tsx @@ -9,8 +9,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -87,16 +86,14 @@ function EditPembiayaan() { {/* Header */} - - - + Edit Jenis Pembiayaan diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/create/page.tsx index a432a431..549ad7e6 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/create/page.tsx @@ -1,8 +1,5 @@ 'use client'; -import React from 'react'; -import { useProxy } from 'valtio/utils'; import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa'; -import { useRouter } from 'next/navigation'; import colors from '@/con/colors'; import { Box, @@ -10,13 +7,14 @@ import { Group, Paper, Stack, - Title, - TextInput, Text, - Tooltip, + TextInput, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; function CreatePembiayaan() { const pembiayaanState = useProxy(PendapatanAsliDesa.pembiayaan); @@ -57,16 +55,14 @@ function CreatePembiayaan() { {/* Header */} - - - + Tambah Jenis Pembiayaan diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/page.tsx index 627f5894..f9c265a6 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pembiayaan/page.tsx @@ -1,9 +1,11 @@ 'use client' +import colors from '@/con/colors'; import { Box, Button, Center, Group, + Pagination, Paper, Skeleton, Stack, @@ -14,19 +16,16 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, - Pagination, + Title } from '@mantine/core'; -import React, { useState } from 'react'; -import HeaderSearch from '../../../_com/header'; -import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; -import PendapatanAsliDesa from '../../../_state/ekonomi/PADesa'; -import { useProxy } from 'valtio/utils'; -import { useRouter } from 'next/navigation'; import { useShallowEffect } from '@mantine/hooks'; -import colors from '@/con/colors'; +import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; +import HeaderSearch from '../../../_com/header'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import PendapatanAsliDesa from '../../../_state/ekonomi/PADesa'; function Pembiayaan() { const [search, setSearch] = useState(""); @@ -95,18 +94,16 @@ function ListPembiayaan({ search }: { search: string }) { Daftar Pembiayaan - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/[id]/page.tsx index cf8e65f0..265f8386 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/[id]/page.tsx @@ -9,8 +9,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -94,16 +93,14 @@ function EditPendapatan() { {/* Header with Back Button */} - - - + Edit Jenis Pendapatan diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/create/page.tsx index 663ae35b..2fa43d74 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/create/page.tsx @@ -8,8 +8,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -49,16 +48,14 @@ function CreatePendapatan() { {/* Header dengan tombol back + judul */} - - - + Tambah Jenis Pendapatan diff --git a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/page.tsx b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/page.tsx index 47ba7b86..9c0fe175 100644 --- a/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/PADesa-pendapatan-asli-desa/pendapatan/page.tsx @@ -17,8 +17,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; @@ -96,18 +95,16 @@ function ListPendapatan({ search }: { search: string }) { Daftar Pendapatan - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/[id]/page.tsx index 016cb96b..4a1b672b 100644 --- a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/[id]/page.tsx @@ -9,12 +9,11 @@ import { Paper, Stack, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect, useState, useCallback } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import demografiPekerjaan from '../../../_state/ekonomi/demografi-pekerjaan'; @@ -96,16 +95,14 @@ export default function EditDemografiPekerjaan() { {/* Header */} - - - + Edit Demografi Pekerjaan diff --git a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/create/page.tsx index d590b347..fec578be 100644 --- a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/create/page.tsx @@ -10,8 +10,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -49,16 +48,14 @@ function CreateDemografiPekerjaan() { {/* Header */} - - - + Tambah Demografi Pekerjaan diff --git a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx index 1b41b2ae..ea4af5a2 100644 --- a/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/demografi-pekerjaan/page.tsx @@ -6,7 +6,9 @@ import { Box, Button, Center, + Flex, Group, + Pagination, Paper, Skeleton, Stack, @@ -17,10 +19,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, - Pagination, - Flex, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; @@ -111,16 +110,14 @@ function ListDemografiPekerjaan({ search }: { search: string }) { List Demografi Pekerjaan - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/[id]/page.tsx index b7a217a4..a49738c5 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/[id]/page.tsx @@ -6,18 +6,17 @@ import colors from '@/con/colors'; import { Box, Button, + Group, Paper, Stack, TextInput, - Title, - Group, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; function EditJumlahPendudukMiskin() { const router = useRouter(); @@ -82,16 +81,14 @@ function EditJumlahPendudukMiskin() { return ( - - - + Edit Jumlah Penduduk Miskin diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/create/page.tsx index fdebedfd..4bad22be 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/create/page.tsx @@ -1,12 +1,12 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; -import { Box, Button, Group, Paper, Stack, TextInput, Title, Tooltip } from '@mantine/core'; +import colors from '@/con/colors'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; -import colors from '@/con/colors'; import jumlahPendudukMiskin from '../../../_state/ekonomi/jumlah-penduduk-miskin'; export default function CreateJumlahPendudukMiskin() { @@ -38,11 +38,9 @@ export default function CreateJumlahPendudukMiskin() { {/* Header */} - - - + Tambah Jumlah Penduduk Miskin diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/page.tsx index 57fde078..c588820c 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-miskin/page.tsx @@ -16,11 +16,10 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; -import { IconEdit, IconSearch, IconTrash, IconPlus } from '@tabler/icons-react'; +import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -101,18 +100,16 @@ function ListJumlahPendudukMiskin({ search }: { search: string }) { Daftar Jumlah Penduduk Miskin - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx index 8b884c50..ee70c101 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/_lib/layoutTabs.tsx @@ -2,18 +2,17 @@ 'use client' import colors from '@/con/colors'; import { + ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, - Title, - Tooltip, - ScrollArea, + Title } from '@mantine/core'; +import { IconSchool, IconUsers } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconUsers, IconSchool } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -24,15 +23,13 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Pengangguran Berdasarkan Usia", value: "pengangguranberdasarkanusia", href: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia", - icon: , - tooltip: "Data pengangguran menurut kelompok usia", + icon: }, { label: "Pengangguran Berdasarkan Pendidikan", value: "pengangguranberdasarkanpendidikan", href: "/admin/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan", - icon: , - tooltip: "Data pengangguran menurut tingkat pendidikan", + icon: }, ]; @@ -78,26 +75,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx index 7e069310..7677e027 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/[id]/page.tsx @@ -2,7 +2,7 @@ 'use client'; import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -40,7 +40,7 @@ function EditGrafikBerdasarkanPendidikan() { } }, [id]); - const handleChange = (field: keyof typeof formData) => + const handleChange = (field: keyof typeof formData) => (e: React.ChangeEvent) => { setFormData((prev) => ({ ...prev, @@ -60,16 +60,14 @@ function EditGrafikBerdasarkanPendidikan() { return ( - - - + Edit Grafik Pengangguran Berdasarkan Pendidikan diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx index e57a797a..5c890bc0 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/create/page.tsx @@ -1,14 +1,13 @@ 'use client'; /* eslint-disable @typescript-eslint/no-unused-vars */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import React from 'react'; -import { useRouter } from 'next/navigation'; import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; -import { useProxy } from 'valtio/utils'; -import { useState } from 'react'; import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Title, TextInput, Group, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; function CreateGrafikBerdasarkanPendidikan() { const router = useRouter(); @@ -44,11 +43,9 @@ function CreateGrafikBerdasarkanPendidikan() { return ( - - - + Tambah Data Pengangguran Berdasarkan Pendidikan diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx index 74137342..5ef9d16a 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_pendidikan/page.tsx @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; +import { DonutChart } from '@mantine/charts'; import { Box, Button, @@ -17,15 +18,13 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; -import { DonutChart } from '@mantine/charts'; import HeaderSearch from '../../../_com/header'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import grafikNganggur from '../../../_state/ekonomi/usia-kerja-nganggur'; @@ -116,20 +115,18 @@ function ListGrafikBerdasarkanPendidikan({ search }: { search: string }) { List Pengangguran Berdasarkan Pendidikan - - - + @@ -165,34 +162,30 @@ function ListGrafikBerdasarkanPendidikan({ search }: { search: string }) { {item.D3} {item.S1} - - - + - - - + )) diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx index f5e77711..ab99accc 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/[id]/page.tsx @@ -5,18 +5,17 @@ import colors from '@/con/colors'; import { Box, Button, + Group, Paper, Stack, TextInput, - Title, - Group, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { const router = useRouter(); @@ -79,16 +78,14 @@ function EditGrafikBerdasarkanUsiaKerjaYangMenganggur() { return ( - - - + Edit Grafik Pengangguran Berdasarkan Usia Kerja diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx index 77c362fd..3051f3f1 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-penduduk-usia-kerja-yang-menganggur/pengangguran_berdasarkan_usia/create/page.tsx @@ -2,13 +2,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client'; -import React, { useState } from 'react'; -import { useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; import grafikNganggur from '@/app/admin/(dashboard)/_state/ekonomi/usia-kerja-nganggur'; import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Title, TextInput, Group, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; function CreateGrafikBerdasarkanUsiaKerjaYangMenganggur() { const router = useRouter(); @@ -42,11 +42,9 @@ function CreateGrafikBerdasarkanUsiaKerjaYangMenganggur() { {/* Header */} - - - + Tambah Data Pengangguran Berdasarkan Usia diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx index a4043b22..3138479b 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/[id]/page.tsx @@ -2,7 +2,7 @@ import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import jumlahPengangguranState from '@/app/admin/(dashboard)/_state/ekonomi/jumlah-pengangguran'; import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -103,32 +103,28 @@ function DetailJumlahPengangguran() { {/* Tombol Edit & Hapus */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx index df0cb26a..c16fce6d 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/create/page.tsx @@ -7,13 +7,12 @@ import { Box, Button, Group, + NumberInput, Paper, + Select, Stack, Text, - NumberInput, - Title, - Select, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -89,16 +88,14 @@ function CreateJumlahPengangguran() { {/* Header */} - - - + Tambah Data Pengangguran diff --git a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx index ff3a8209..698ba948 100644 --- a/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/jumlah-pengangguran/page.tsx @@ -1,17 +1,17 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; +import { BarChart } from '@mantine/charts'; import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, - Text, Title, Tooltip + Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; -import { BarChart } from '@mantine/charts'; import HeaderSearch from '../../_com/header'; import jumlahPengangguranState from '../../_state/ekonomi/jumlah-pengangguran'; @@ -85,16 +85,14 @@ function ListDetailDataPengangguran({ search }: { search: string }) { Daftar Detail Data Pengangguran - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/edit/page.tsx index ec501ee0..cc7371db 100644 --- a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/edit/page.tsx @@ -11,8 +11,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -88,13 +87,10 @@ function EditLowonganKerja() { return ( - {/* Header dengan tombol back */} - - - + Edit Lowongan Kerja Lokal diff --git a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/page.tsx index 980529aa..c9776908 100644 --- a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -108,32 +108,28 @@ function DetailLowonganKerjaLokal() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/create/page.tsx index 606100e8..aac19f6d 100644 --- a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/create/page.tsx @@ -8,8 +8,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -42,18 +41,15 @@ function CreateLowonganKerja() { return ( - {/* Header dengan tombol kembali */} - - - + Tambah Lowongan Kerja Lokal diff --git a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/page.tsx b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/page.tsx index 2c4452ac..149bed60 100644 --- a/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/lowongan-kerja-lokal/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -69,7 +68,6 @@ function ListLowonganKerjaLokal({ search }: { search: string }) { Daftar Lowongan Kerja Lokal - - diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/_lib/layoutTabs.tsx index 98809ce9..a4edbe61 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/_lib/layoutTabs.tsx @@ -2,18 +2,17 @@ 'use client' import colors from '@/con/colors'; import { + ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, - Title, - Tooltip, - ScrollArea, + Title } from '@mantine/core'; +import { IconCategory, IconShoppingBag } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconShoppingBag, IconCategory } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -30,8 +29,7 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Kategori Produk", value: "kategoriproduk", href: "/admin/ekonomi/pasar-desa/kategori-produk", - icon: , - tooltip: "Atur kategori produk pasar desa", + icon: }, ]; @@ -84,26 +82,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/[id]/page.tsx index 451a4a71..e62f85a4 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/[id]/page.tsx @@ -1,9 +1,5 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' -import React, { useEffect, useState } from 'react'; -import { useParams, useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; -import pasarDesaState from '../../../../_state/ekonomi/pasar-desa/pasar-desa'; import colors from '@/con/colors'; import { Box, @@ -11,13 +7,16 @@ import { Group, Paper, Stack, - Title, - TextInput, - Tooltip, Text, + TextInput, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; +import pasarDesaState from '../../../../_state/ekonomi/pasar-desa/pasar-desa'; function EditKategoriProduk() { const router = useRouter(); @@ -93,16 +92,14 @@ function EditKategoriProduk() { {/* Header dengan tombol back */} - - - + Edit Kategori Produk diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/create/page.tsx index 93598be7..e0e6caa1 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/create/page.tsx @@ -8,8 +8,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -46,7 +45,6 @@ function CreateKategoriProduk() { {/* Header dengan tombol kembali */} - - Tambah Kategori Produk diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/page.tsx index 0115aefd..9c83d9b9 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/kategori-produk/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -68,7 +68,6 @@ function ListKategoriProduk({ search2 }: { search2: string }) { Daftar Kategori Produk - - @@ -99,7 +97,6 @@ function ListKategoriProduk({ search2 }: { search2: string }) { - - - - - + )) ) : ( diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/edit/page.tsx index 17ebd925..b87e474b 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/edit/page.tsx @@ -14,8 +14,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -117,11 +116,9 @@ function EditPasarDesa() { return ( - - - + Edit Pasar Desa diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/page.tsx index 96f52523..a36b7d9d 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/[id]/page.tsx @@ -1,13 +1,13 @@ 'use client' +import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, Text, Image, Skeleton, Group, Tooltip } from '@mantine/core'; -import { IconArrowBack, IconTrash, IconEdit } from '@tabler/icons-react'; -import { useRouter, useParams } from 'next/navigation'; -import React, { useState } from 'react'; +import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; +import { useShallowEffect } from '@mantine/hooks'; +import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import pasarDesaState from '../../../../_state/ekonomi/pasar-desa/pasar-desa'; -import { useShallowEffect } from '@mantine/hooks'; -import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; function DetailPasarDesa() { const statePasar = useProxy(pasarDesaState); @@ -123,32 +123,28 @@ function DetailPasarDesa() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/create/page.tsx index 72265081..b611f44a 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/create/page.tsx @@ -12,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -73,11 +72,9 @@ export default function CreatePasarDesa() { {/* Header dengan tombol kembali */} - - - + Tambah Produk Pasar Desa diff --git a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/page.tsx b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/page.tsx index fc14e3f3..e7e1b444 100644 --- a/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/pasar-desa/produk-pasar-desa/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -68,18 +67,16 @@ function ListPasarDesa({ search }: { search: string }) { Daftar Produk Pasar Desa - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx index 6dbb6b03..b6c0324e 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/edit/page.tsx @@ -13,14 +13,13 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect, useState, useCallback } from 'react'; -import { useProxy } from 'valtio/utils'; +import { useCallback, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; type Statistik = { tahun: string; @@ -118,16 +117,14 @@ function EditProgramKemiskinan() { {/* Header */} - - - + Edit Program Kemiskinan diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx index 5e4acf64..25f58c09 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/[id]/page.tsx @@ -8,17 +8,16 @@ import { Paper, Skeleton, Stack, - Text, - Tooltip, + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; +import { IconKey, IconMapper } from '../../../_com/iconMap'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import programKemiskinanState from '../../../_state/ekonomi/program-kemiskinan'; -import { IconKey, IconMapper } from '../../../_com/iconMap'; function DetailProgramKemiskinan() { const programState = useProxy(programKemiskinanState); @@ -123,33 +122,29 @@ function DetailProgramKemiskinan() { {/* Action Buttons */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx index cf4c0696..d82b3ace 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/create/page.tsx @@ -11,17 +11,16 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; -import programKemiskinanState from '../../../_state/ekonomi/program-kemiskinan'; -import CreateEditor from '../../../_com/createEditor'; -import SelectIconProgram from '../../../_com/selectIcon'; import { useState } from 'react'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; +import CreateEditor from '../../../_com/createEditor'; +import SelectIconProgram from '../../../_com/selectIcon'; +import programKemiskinanState from '../../../_state/ekonomi/program-kemiskinan'; function CreateProgramKemiskinan() { const programState = useProxy(programKemiskinanState); @@ -65,16 +64,14 @@ function CreateProgramKemiskinan() { {/* Header dengan tombol back */} - - - + Tambah Program Kemiskinan diff --git a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx index def7ec5e..36935bee 100644 --- a/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/program-kemiskinan/page.tsx @@ -1,7 +1,7 @@ 'use client' /* eslint-disable @typescript-eslint/no-explicit-any */ import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -69,11 +69,9 @@ function ListProgramKemiskinan({ search }: { search: string }) { Daftar Program Kemiskinan - - - +
diff --git a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/edit/page.tsx index f746afeb..b7525bf3 100644 --- a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/edit/page.tsx @@ -1,6 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' +import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import grafikSektorUnggulan from '@/app/admin/(dashboard)/_state/ekonomi/sektor-unggulan-desa'; import colors from '@/con/colors'; import { @@ -11,15 +12,13 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; -import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; +import { useProxy } from 'valtio/utils'; function EditSektorUnggulanDesa() { const router = useRouter(); @@ -59,10 +58,10 @@ function EditSektorUnggulanDesa() { const handleChange = (field: keyof typeof formData) => - (e: React.ChangeEvent) => { - const value = field === 'value' ? Number(e.currentTarget.value) : e.currentTarget.value; - setFormData((prev) => ({ ...prev, [field]: value })); - }; + (e: React.ChangeEvent) => { + const value = field === 'value' ? Number(e.currentTarget.value) : e.currentTarget.value; + setFormData((prev) => ({ ...prev, [field]: value })); + }; const handleSubmit = async () => { try { @@ -80,16 +79,14 @@ function EditSektorUnggulanDesa() { return ( - - - + Edit Sektor Unggulan Desa diff --git a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/page.tsx index 631a4f52..ee8c1561 100644 --- a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/[id]/page.tsx @@ -8,8 +8,7 @@ import { Paper, Skeleton, Stack, - Text, - Tooltip, + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; @@ -92,36 +91,32 @@ function DetailSektorUnggulanDesa() { {/* Tombol Aksi */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/create/page.tsx index 4761de26..db72d661 100644 --- a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/create/page.tsx @@ -10,15 +10,14 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; -import grafikSektorUnggulan from '../../../_state/ekonomi/sektor-unggulan-desa'; import CreateEditor from '../../../_com/createEditor'; +import grafikSektorUnggulan from '../../../_state/ekonomi/sektor-unggulan-desa'; function CreateSektorUnggulanDesa() { const stateGrafik = useProxy(grafikSektorUnggulan); @@ -50,16 +49,14 @@ function CreateSektorUnggulanDesa() { {/* Header dengan back button */} - - - + Tambah Sektor Unggulan Desa diff --git a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/page.tsx b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/page.tsx index 3a7cc1e8..74d1153d 100644 --- a/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/sektor-unggulan-desa/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -92,11 +91,9 @@ function ListSektorUnggulanDesa({ search }: { search: string }) { List Sektor Unggulan Desa - - - + {loading ? ( @@ -127,16 +124,14 @@ function ListSektorUnggulanDesa({ search }: { search: string }) { - - - + )) diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/_lib/layoutTabs.tsx index 4425aa88..c85ac68f 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/_lib/layoutTabs.tsx @@ -8,8 +8,7 @@ import { TabsList, TabsPanel, TabsTab, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconBuildingCommunity, @@ -28,22 +27,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Pegawai", value: "pegawai", href: "/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai", - icon: , - tooltip: "Kelola data pegawai BUMDesa", + icon: }, { label: "Posisi Organisasi", value: "posisiorganisasi", href: "/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi", - icon: , - tooltip: "Kelola daftar posisi organisasi", + icon: }, { label: "Struktur Organisasi", value: "strukturorganisasi", href: "/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/struktur-organisasi", - icon: , - tooltip: "Kelola struktur organisasi BUMDesa" + icon: } ]; @@ -96,26 +92,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} @@ -135,7 +124,7 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { ))} - + ); } diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx index c1a8eef5..d125418d 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/edit/page.tsx @@ -14,8 +14,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -110,11 +109,9 @@ export default function EditPegawaiBumDes() { return ( - - - + Edit Data Pegawai PPID diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/page.tsx index 7a0626e4..0e0f0dd7 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/[id]/page.tsx @@ -3,7 +3,7 @@ import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirma import stateStrukturBumDes from '@/app/admin/(dashboard)/_state/ekonomi/struktur-organisasi/struktur-organisasi'; import colors from '@/con/colors'; -import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -150,32 +150,28 @@ function DetailPegawai() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/create/page.tsx index dbf697ee..137fb7fc 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/create/page.tsx @@ -4,7 +4,7 @@ import stateStrukturBumDes from '@/app/admin/(dashboard)/_state/ekonomi/struktur-organisasi/struktur-organisasi'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; -import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -75,11 +75,9 @@ function CreatePegawaiBumDes() { return ( - - - + Tambah Pegawai BUMDesa diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx index d56609de..fd17d099 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/pegawai/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Badge, Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, ThemeIcon, Title, Tooltip } from '@mantine/core'; +import { Badge, Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, ThemeIcon, Title } from '@mantine/core'; import { IconCheck, IconDeviceImacCog, IconPlus, IconSearch, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -59,16 +59,14 @@ function ListPegawaiBumdes({ search }: { search: string }) { Daftar Pegawai BUMDesa - - - +
Tidak ada data pegawai yang ditemukan @@ -82,16 +80,14 @@ function ListPegawaiBumdes({ search }: { search: string }) { Daftar Pegawai BUMDesa - - - +
diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx index 0d8f7ed7..972a710c 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/[id]/page.tsx @@ -5,7 +5,7 @@ import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import stateStrukturBumDes from '@/app/admin/(dashboard)/_state/ekonomi/struktur-organisasi/struktur-organisasi'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -84,11 +84,9 @@ function EditPosisiOrganisasiBumDes() { return ( - - - + Edit Posisi Organisasi BUMDes diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx index 2045244c..1241e1c2 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi/create/page.tsx @@ -3,7 +3,7 @@ import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; import stateStrukturBumDes from '@/app/admin/(dashboard)/_state/ekonomi/struktur-organisasi/struktur-organisasi'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; @@ -13,7 +13,7 @@ import { useProxy } from 'valtio/utils'; function CreatePosisiOrganisasiBumDes() { const router = useRouter(); const stateOrganisasi = useProxy(stateStrukturBumDes.posisiOrganisasi); - + useEffect(() => { stateOrganisasi.findMany.load(); // Initialize form with default values @@ -22,7 +22,7 @@ function CreatePosisiOrganisasiBumDes() { deskripsi: "", hierarki: 0, }; - + return () => { // Clean up form on unmount stateOrganisasi.create.form = { @@ -38,7 +38,7 @@ function CreatePosisiOrganisasiBumDes() { if (!stateOrganisasi.create.form.nama.trim()) { return toast.error('Nama posisi tidak boleh kosong'); } - + await stateOrganisasi.create.submit(); toast.success('Posisi organisasi berhasil ditambahkan'); router.push('/admin/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/posisi-organisasi'); @@ -51,11 +51,9 @@ function CreatePosisiOrganisasiBumDes() { return ( - - - + Tambah Posisi Organisasi BUMDes @@ -77,7 +75,7 @@ function CreatePosisiOrganisasiBumDes() { onChange={(e) => (stateOrganisasi.create.form.nama = e.target.value)} required /> - + Deskripsi @@ -89,7 +87,7 @@ function CreatePosisiOrganisasiBumDes() { }} /> - + Daftar Posisi Organisasi BumDes - - - +
@@ -106,19 +104,16 @@ function ListPosisiOrganisasiBumDes({ search }: { search: string }) { {item.hierarki || '-'} - - - + - - )) diff --git a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/struktur-organisasi/page.tsx b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/struktur-organisasi/page.tsx index be24d78b..89ab5a7e 100644 --- a/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/struktur-organisasi/page.tsx +++ b/src/app/admin/(dashboard)/ekonomi/struktur-organisasi-dan-sk-pengurus-bumdesa/struktur-organisasi/page.tsx @@ -2,7 +2,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' -import { Box, Center, Image, Loader, Paper, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Center, Image, Loader, Paper, Stack, Text } from '@mantine/core'; import { IconUsers } from '@tabler/icons-react'; import { OrganizationChart } from 'primereact/organizationchart'; import { useEffect } from 'react'; @@ -110,20 +110,18 @@ function nodeTemplate(node: any) { return ( - - - + {name} {status} diff --git a/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx index f1857aec..51a1ab7f 100644 --- a/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/ajukan-ide-inovatif/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -67,21 +67,19 @@ function DetailAjukanIdeInofativDesa() { Detail Ajukan Ide Inovatif Desa - - - + {/* Detail Data */} @@ -104,7 +102,7 @@ function DetailAjukanIdeInofativDesa() { Deskripsi - + diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx index 05c93b59..ad7f2184 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/edit/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -87,11 +86,9 @@ function EditDigitalSmartVillage() { {/* Header */} - - - + Edit Desa Digital Smart Village diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx index c82485e0..236f2b17 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/[id]/page.tsx @@ -8,8 +8,7 @@ import { Paper, Skeleton, Stack, - Text, - Tooltip, + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; @@ -112,32 +111,28 @@ function DetailDesaDigital() { {/* Tombol Aksi */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx index 5d905597..cb0f810f 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/create/page.tsx @@ -9,18 +9,17 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; +import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; +import ExifOrientationImg from 'react-exif-orientation-img'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import CreateEditor from '../../../_com/createEditor'; import desaDigitalState from '../../../_state/inovasi/desa-digital'; -import { Dropzone } from '@mantine/dropzone'; -import ExifOrientationImg from 'react-exif-orientation-img'; export default function CreateDesaDigital() { const stateDesaDigital = useProxy(desaDigitalState); @@ -71,17 +70,15 @@ export default function CreateDesaDigital() { {/* Header dengan tombol kembali */} - - - + Tambah Desa Digital Smart Village @@ -174,15 +171,15 @@ export default function CreateDesaDigital() { }} > + src={previewImage} + alt="Preview" + style={{ + maxHeight: 220, + objectFit: 'cover', + border: '1px solid #e0e0e0', + borderRadius: 12, + }} + /> )} diff --git a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx index 84cb3baf..72d12073 100644 --- a/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/desa-digital-smart-village/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -68,18 +67,16 @@ function ListDesaDigitalSmartVillage({ search }: { search: string }) { List Desa Digital Smart Village - - - +
diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx index e7d83362..248c8a72 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/edit/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -100,11 +99,9 @@ function EditInfoTeknologiTepatGuna() { {/* Tombol back + title */} - - - + Edit Info Teknologi Tepat Guna diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx index a75b7207..1ddee92a 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -101,35 +101,31 @@ function DetailInfoTeknologiTepatGuna() { {/* Action Buttons */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx index be8b23b7..2021d79b 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/create/page.tsx @@ -10,9 +10,9 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; +import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -20,7 +20,6 @@ import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import CreateEditor from '../../../_com/createEditor'; import infoTeknoState from '../../../_state/inovasi/info-tekno'; -import { Dropzone } from '@mantine/dropzone'; function CreateInfoTeknologiTepatGuna() { const stateInfoTekno = useProxy(infoTeknoState); @@ -72,11 +71,9 @@ function CreateInfoTeknologiTepatGuna() { {/* Header */} - - - + Tambah Info Teknologi Tepat Guna diff --git a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/page.tsx b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/page.tsx index 3fcb8f8a..fe766900 100644 --- a/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/info-teknologi-tepat-guna/page.tsx @@ -4,6 +4,7 @@ import { Box, Button, Center, + Group, Pagination, Paper, Skeleton, @@ -15,9 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Group, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -68,18 +67,16 @@ function ListInfoTeknologiTepatGuna({ search }: { search: string }) { Daftar Info Teknologi Tepat Guna - - - + diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/_lib/layoutTabs.tsx index 781f1ec5..c208cdac 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconListDetails, IconUsers } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconListDetails, IconUsers } from '@tabler/icons-react'; function LayoutTabsKolaborasi({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,14 +15,12 @@ function LayoutTabsKolaborasi({ children }: { children: React.ReactNode }) { label: "List Kolaborasi Inovasi", value: "listkolaborasiinovasi", href: "/admin/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi", - tooltip: "Lihat daftar kolaborasi inovasi", icon: , }, { label: "Mitra Kolaborasi", value: "mitarakolaborasi", href: "/admin/inovasi/kolaborasi-inovasi/mitra-kolaborasi", - tooltip: "Kelola mitra kolaborasi", icon: , } ]; @@ -73,25 +71,18 @@ function LayoutTabsKolaborasi({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx index cce425a1..ffe7c536 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/edit/page.tsx @@ -12,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from "@mantine/core"; import { IconArrowBack } from "@tabler/icons-react"; import { useParams, useRouter } from "next/navigation"; @@ -89,11 +88,9 @@ function EditKolaborasiInovasi() { return ( - - - + Edit Kolaborasi Inovasi diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx index 0d3b0f9a..577f963f 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/[id]/page.tsx @@ -1,5 +1,5 @@ 'use client' -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -96,33 +96,29 @@ function DetailKolaborasiInovasi() { {/* Tombol aksi */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx index 8ed78d71..0b63e248 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/create/page.tsx @@ -3,7 +3,7 @@ import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; import kolaborasiInovasiState from '@/app/admin/(dashboard)/_state/inovasi/kolaborasi-inovasi'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { YearPickerInput } from '@mantine/dates'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -54,11 +54,9 @@ function CreateProgramKreatifDesa() { {/* Back Button */} - - - + Tambah Kolaborasi Inovasi diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/page.tsx index f0899d36..576ea0c4 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/list-kolaborasi-inovasi/page.tsx @@ -17,15 +17,14 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; -import HeaderSearch from '../../../_com/header'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import kolaborasiInovasiState from '../../../_state/inovasi/kolaborasi-inovasi'; import { useProxy } from 'valtio/utils'; +import HeaderSearch from '../../../_com/header'; +import kolaborasiInovasiState from '../../../_state/inovasi/kolaborasi-inovasi'; function KolaborasiInovasi() { const [search, setSearch] = useState(''); @@ -68,16 +67,14 @@ function ListKolaborasiInovasi({ search }: { search: string }) { Daftar Kolaborasi Inovasi - - - +
diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx index a1762db1..74c361e1 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/[id]/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { @@ -113,11 +112,9 @@ function EditMitraKolaborasi() { {/* Header */} - - - + Edit Mitra diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx index d7da8e8b..aa5ac040 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/create/page.tsx @@ -11,8 +11,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -61,11 +60,9 @@ function CreateMitraKolaborasi() { {/* Back Button + Title */} - - - + Tambah Mitra Kolaborasi diff --git a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/page.tsx b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/page.tsx index a2d6cbbb..9fde4fb1 100644 --- a/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/kolaborasi-inovasi/mitra-kolaborasi/page.tsx @@ -18,16 +18,15 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; -import { IconEdit, IconSearch, IconX, IconPlus } from '@tabler/icons-react'; +import { IconEdit, IconPlus, IconSearch, 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 mitraKolaborasi from '../../../_state/inovasi/mitra-kolaborasi'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import mitraKolaborasi from '../../../_state/inovasi/mitra-kolaborasi'; function MitraKolaborasi() { const [search, setSearch] = useState(''); @@ -81,20 +80,18 @@ function ListMitraKolaborasi({ search }: { search: string }) { Daftar Mitra Kolaborasi - - - +
@@ -135,39 +132,35 @@ function ListMitraKolaborasi({ search }: { search: string }) { - - - + - - - + )) diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/_lib/layoutTabs.tsx index 55a8cdb2..b12c50be 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/_lib/layoutTabs.tsx @@ -8,17 +8,16 @@ import { TabsList, TabsPanel, TabsTab, - Title, - Tooltip + Title } from '@mantine/core'; -import { usePathname, useRouter } from 'next/navigation'; -import React, { useEffect, useState } from 'react'; import { + IconAlertCircle, IconFileText, IconListDetails, - IconMessage, - IconAlertCircle + IconMessage } from '@tabler/icons-react'; +import { usePathname, useRouter } from 'next/navigation'; +import React, { useEffect, useState } from 'react'; function LayoutTabsLayananOnlineDesa({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -30,29 +29,25 @@ function LayoutTabsLayananOnlineDesa({ children }: { children: React.ReactNode } label: "Administrasi Online", value: "administrasionline", href: "/admin/inovasi/layanan-online-desa/administrasi-online", - icon: , - tooltip: "Kelola administrasi online desa" + icon: }, { label: "Jenis Layanan", value: "jenislayanan", href: "/admin/inovasi/layanan-online-desa/jenis-layanan", - icon: , - tooltip: "Daftar jenis layanan desa" + icon: }, { label: "Pengaduan Masyarakat", value: "pengaduanmasyarakat", href: "/admin/inovasi/layanan-online-desa/pengaduan-masyarakat", - icon: , - tooltip: "Laporan pengaduan masyarakat" + icon: }, { label: "Jenis Pengaduan", value: "jenispengaduan", href: "/admin/inovasi/layanan-online-desa/jenis-pengaduan", - icon: , - tooltip: "Kategori/jenis pengaduan masyarakat" + icon: } ]; @@ -103,25 +98,18 @@ function LayoutTabsLayananOnlineDesa({ children }: { children: React.ReactNode } }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/administrasi-online/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/administrasi-online/[id]/page.tsx index b08d0582..72f2ddd8 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/administrasi-online/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/administrasi-online/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client' -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -53,20 +53,18 @@ function DetailAdministrasiOnline() { Kembali - - - + {/* Konten Detail */} {/* Header */} - - - + Edit Jenis Layanan diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx index 41990ab2..babc24f3 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/[id]/page.tsx @@ -2,7 +2,7 @@ import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import layananonlineDesa from '@/app/admin/(dashboard)/_state/inovasi/layanan-online-desa'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -85,33 +85,29 @@ function DetailJenisLayanan() { {/* Tombol aksi */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx index b1b5a107..30aae0e6 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/create/page.tsx @@ -10,8 +10,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -43,16 +42,14 @@ function CreateJenisLayanan() { {/* Header dengan tombol back */} - - - + Tambah Jenis Layanan diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/page.tsx index ba176cd6..a1ea1da1 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-layanan/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -68,20 +67,18 @@ function ListJenisLayanan({ search }: { search: string }) { Daftar Jenis Layanan - - - +
diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx index c64bb102..de4c6c24 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/[id]/page.tsx @@ -9,8 +9,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -90,16 +89,14 @@ function EditJenisPengaduan() { {/* Header */} - - - + Edit Jenis Pengaduan diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx index bb0ae5b9..31999381 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/create/page.tsx @@ -9,8 +9,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -41,11 +40,9 @@ function CreateJenisPengaduan() { {/* Header */} - - - + Tambah Jenis Pengaduan diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/page.tsx index 4bbee3b6..ecab5a98 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/jenis-pengaduan/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; @@ -79,20 +78,18 @@ function ListJenisPengaduan({ search }: { search: string }) { Daftar Jenis Pengaduan - - - + diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx index a9a9ad3e..9ab1109e 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/[id]/page.tsx @@ -1,10 +1,10 @@ 'use client' -import { useProxy } from 'valtio/utils'; -import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import layananonlineDesa from '@/app/admin/(dashboard)/_state/inovasi/layanan-online-desa'; @@ -129,21 +129,19 @@ function DetailPengaduanMasyarakat() { {/* Action Button */} - - - + diff --git a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/page.tsx b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/page.tsx index 11140fff..429bc44f 100644 --- a/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/layanan-online-desa/pengaduan-masyarakat/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconDeviceImac, IconSearch } from '@tabler/icons-react'; @@ -99,18 +98,16 @@ function ListPengaduanMasyarakat({ search }: { search: string }) { {item.nomorTelepon} - - - + )) diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx index e402bf15..f681a429 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/[id]/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Flex, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -95,40 +95,36 @@ function DetailProgramKreatifDesa() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx index 4d318f33..2609b036 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/create/page.tsx @@ -8,15 +8,14 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; import CreateEditor from '../../../_com/createEditor'; -import programKreatifState from '../../../_state/inovasi/program-kreatif'; import SelectIconProgram from '../../../_com/selectIcon'; +import programKreatifState from '../../../_state/inovasi/program-kreatif'; function CreateProgramKreatifDesa() { const stateCreate = useProxy(programKreatifState); @@ -33,23 +32,21 @@ function CreateProgramKreatifDesa() { const handleSubmit = async () => { const success = await stateCreate.create.create(); - + if (success) { resetForm(); router.push("/admin/inovasi/program-kreatif-desa"); } }; - + return ( {/* Tombol kembali */} - - - + Tambah Program Kreatif Desa diff --git a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/page.tsx b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/page.tsx index 5ead6694..7b7a647b 100644 --- a/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/page.tsx +++ b/src/app/admin/(dashboard)/inovasi/program-kreatif-desa/page.tsx @@ -18,8 +18,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { IconCash, @@ -117,20 +116,18 @@ function ListProgramKreatifDesa({ search }: { search: string }) { Daftar Program Kreatif Desa - - - +
@@ -164,20 +161,18 @@ function ListProgramKreatifDesa({ search }: { search: string }) { > Daftar Program Kreatif Desa - - - +
diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx index ec13e669..581ffa9c 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/create/page.tsx @@ -221,7 +221,7 @@ function CreateAPBDes() { /> (stateAPBDes.create.form.jumlah = e.target.value)} required diff --git a/src/app/admin/(dashboard)/landing-page/apbdes/page.tsx b/src/app/admin/(dashboard)/landing-page/apbdes/page.tsx index e0fd60e5..6c72569e 100644 --- a/src/app/admin/(dashboard)/landing-page/apbdes/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/apbdes/page.tsx @@ -57,57 +57,60 @@ function ListAPBDes({ search }: { search: string }) { Daftar APBDes - + - +
- Nama APBDes - Jumlah + Nama APBDes + Jumlah Dokumen - Aksi + Aksi {filteredData.length > 0 ? ( filteredData.map((item) => ( - + {item.name} - + Rp. {item.jumlah} - - {item.file?.link ? ( - - ) : ( - Tidak ada dokumen - )} + + + {item.file?.link ? ( + + ) : ( + Tidak ada dokumen + )} + - - + )) @@ -134,7 +138,7 @@ function ListAPBDes({ search }: { search: string }) {
- +
- - - + Edit Data Lingkungan Desa diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/page.tsx index 4e985dce..cab104f6 100644 --- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, @@ -136,32 +136,28 @@ function DetailDataLingkunganDesa() { {/* Action Buttons */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx index c2bff29e..4fb19016 100644 --- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/create/page.tsx @@ -8,8 +8,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -41,16 +40,14 @@ function CreateDataLingkunganDesa() { {/* Header */} - - - + Tambah Data Lingkungan Desa diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx index b7addeaf..e87e10ca 100644 --- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/page.tsx @@ -5,8 +5,7 @@ import colors from '@/con/colors'; import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { IconChartLine, IconChristmasTreeFilled, IconClipboardTextFilled, @@ -83,11 +82,9 @@ function ListDataLingkunganDesa({ search }: { search: string }) { Daftar Data Lingkungan Desa - - - + @@ -114,11 +111,9 @@ function ListDataLingkunganDesa({ search }: { search: string }) { Daftar Data Lingkungan Desa - - - +
diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx index 53d91f8c..db1dcba1 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconBook, IconLeaf, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -15,21 +15,18 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Tujuan Edukasi Lingkungan", value: "tujuanedukasilingkungan", href: "/admin/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan", - tooltip: "Lihat tujuan edukasi lingkungan", icon: }, { label: "Materi Edukasi Yang Diberikan", value: "materiedukasiyangdiberikan", href: "/admin/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan", - tooltip: "Kelola materi edukasi yang diberikan", icon: }, { label: "Contoh Kegiatan Di Desa Darmasaba", value: "contohkegiatan", href: "/admin/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba", - tooltip: "Lihat contoh kegiatan desa Darmasaba", icon: }, ]; @@ -76,27 +73,26 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - - {tab.label} - - - + + + {tab.label} + + ))} @@ -109,7 +105,7 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { ))} - + ) } diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/_lib/layoutTabs.tsx index d9aec0eb..0eb63690 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconClipboardList, IconTags } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconClipboardList, IconTags } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -16,14 +16,12 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { value: "kegiatanDesa", href: "/admin/lingkungan/gotong-royong/kegiatan-desa", icon: , - tooltip: "Lihat dan kelola kegiatan desa", }, { label: "Kategori Kegiatan", value: "kategoriKegiatan", href: "/admin/lingkungan/gotong-royong/kategori-kegiatan", icon: , - tooltip: "Kelola kategori kegiatan desa", }, ]; @@ -75,25 +73,18 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/[id]/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/[id]/page.tsx index dd2e34a7..e5b6d2f6 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/[id]/page.tsx @@ -3,7 +3,7 @@ import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -72,11 +72,9 @@ function EditKategoriKegiatan() { return ( - - - + Edit Kategori Kegiatan diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/create/page.tsx index 46d44b95..d74cf703 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/create/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; @@ -32,11 +32,9 @@ function CreateKategoriKegiatan() { {/* Header */} - - - + Tambah Kategori Kegiatan diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/page.tsx index ff03a0e5..2086850e 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kategori-kegiatan/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; @@ -85,16 +84,14 @@ function ListKategoriKegiatan({ search }: { search: string }) { Daftar Kategori Kegiatan - - - + diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/edit/page.tsx index 15b5c48a..f46191cc 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/edit/page.tsx @@ -14,8 +14,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -124,11 +123,9 @@ export default function EditKegiatanDesa() { return ( - - - + Edit Kegiatan Desa diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/page.tsx index 11090d90..a73c1f32 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/[id]/page.tsx @@ -1,14 +1,14 @@ 'use client' -import { useProxy } from 'valtio/utils'; -import { Box, Button, Flex, Image, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Flex, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; -import colors from '@/con/colors'; -import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; +import gotongRoyongState from '@/app/admin/(dashboard)/_state/lingkungan/gotong-royong'; +import colors from '@/con/colors'; function DetailKegiatanDesa() { const kegiatanDesaState = useProxy(gotongRoyongState.kegiatanDesa); @@ -132,32 +132,28 @@ function DetailKegiatanDesa() { {/* Tombol Hapus & Edit */} - - - + - - - + diff --git a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/create/page.tsx index 2c4fbc49..2644fb76 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/kegiatan-desa/create/page.tsx @@ -14,8 +14,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; @@ -78,16 +77,14 @@ function CreateKegiatanDesa() { {/* Header */} - - - + Tambah Kegiatan Desa @@ -159,7 +156,7 @@ function CreateKegiatanDesa() { onChange={(e) => (stateKegiatanDesa.create.form.judul = e.target.value)} required /> - + Deskripsi Singkat diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.tsx index f391660c..badcf110 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/_lib/layoutTabs.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconBook, IconLeaf, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -15,21 +15,18 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Filosofi Tri Hita", value: "filosofi-tri-hita", href: "/admin/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana", - tooltip: "Lihat filosofi Tri Hita Karana", icon: }, { label: "Nilai Konservasi Adat", value: "nilai-konservasi-adat", href: "/admin/lingkungan/konservasi-adat-bali/nilai-konservasi-adat", - tooltip: "Kelola nilai konservasi adat", icon: }, { label: "Bentuk Konservasi Berdasarkan Adat", value: "bentuk-konservasi-berdasarkan-adat", href: "/admin/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat", - tooltip: "Lihat bentuk konservasi berdasarkan adat", icon: }, ]; @@ -76,27 +73,26 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - - {tab.label} - - - + + + {tab.label} + + ))} diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/[id]/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/[id]/edit/page.tsx index 56c9035d..72555ecf 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/[id]/edit/page.tsx @@ -3,7 +3,7 @@ import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useParams, useRouter } from 'next/navigation'; @@ -90,11 +90,9 @@ function EditKeteranganBankSampahTerdekat() { return ( - - - + Edit Bank Sampah Terdekat diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/create/page.tsx index ad8ae867..3bf71f3d 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/create/page.tsx @@ -2,12 +2,12 @@ import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; -import { toast } from 'react-toastify'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; +import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; const LeafletMap = dynamic(() => import('@/app/admin/(dashboard)/_com/leafletMapCreate'), { ssr: false }); @@ -33,14 +33,14 @@ function CreateKeteranganBankSampahTerdekat() { if (!keteranganState.create.form.name) { return toast.error('Nama bank sampah harus diisi'); } - + if (markerPosition) { keteranganState.create.form.lat = markerPosition.lat; keteranganState.create.form.lng = markerPosition.lng; } else { return toast.error('Silakan pilih lokasi di peta'); } - + await keteranganState.create.create(); toast.success('Data bank sampah berhasil ditambahkan'); resetForm(); @@ -54,11 +54,9 @@ function CreateKeteranganBankSampahTerdekat() { return ( - - - + Tambah Bank Sampah Terdekat diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/page.tsx index 318b297e..4be0d401 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/page.tsx @@ -1,11 +1,11 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import pengelolaanSampahState from '../../../_state/lingkungan/pengelolaan-sampah'; @@ -56,16 +56,14 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) { Daftar Bank Sampah Terdekat - - - @@ -98,15 +96,13 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) { - - - )) diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/[id]/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/[id]/page.tsx index 683c410a..f07cfb6d 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/[id]/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/[id]/page.tsx @@ -1,9 +1,9 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' -import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import SelectIconProgramEdit from '@/app/admin/(dashboard)/_com/selectIconEdit'; +import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -71,11 +71,9 @@ function EditProgramKreatifDesa() { return ( - - - + Edit Pengelolaan Sampah Bank Sampah diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/create/page.tsx index a413905b..365c97bd 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/create/page.tsx @@ -1,8 +1,8 @@ 'use client'; -import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import SelectIconProgram from '@/app/admin/(dashboard)/_com/selectIcon'; +import pengelolaanSampahState from '@/app/admin/(dashboard)/_state/lingkungan/pengelolaan-sampah'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; @@ -34,7 +34,6 @@ function CreatePengelolaanSampahBankSampah() { return ( - - Tambah Pengelolaan Sampah Bank Sampah diff --git a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/page.tsx b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/page.tsx index cfba2c11..1b64d087 100644 --- a/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/page.tsx @@ -1,15 +1,14 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconChartLine, IconClipboardTextFilled, IconEdit, IconLeaf, IconPlus, IconRecycle, IconScale, IconSearch, IconTent, IconTrashFilled, IconTrophy, IconTruckFilled } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; -import { useState } from 'react'; +import React, { useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; import pengelolaanSampahState from '../../../_state/lingkungan/pengelolaan-sampah'; -import React from 'react'; function PengelolaanSampahBankSampah() { @@ -82,16 +81,14 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { Daftar Pengelolaan Sampah Bank Sampah - - - + @@ -113,44 +110,38 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { {iconMap[item.icon] ? ( - - - {React.createElement(iconMap[item.icon], { - size: 24, - style: { color: colors['blue-button'] } - })} - - + + {React.createElement(iconMap[item.icon], { + size: 24, + style: { color: colors['blue-button'] } + })} + ) : ( - )} - - - + - - - + )) diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/edit/page.tsx index 141f920f..161aef97 100644 --- a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/edit/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -105,16 +104,14 @@ function EditProgramPenghijauan() { {/* Header */} - - - + Edit Program Penghijauan diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/page.tsx index a2857cfc..ff29a6ba 100644 --- a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/[id]/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconChartLine, IconChristmasTreeFilled, IconClipboard, @@ -117,32 +117,28 @@ function DetailProgramPenghijauan() { {/* Tombol aksi */} - - - + - - - + @@ -155,7 +151,7 @@ function DetailProgramPenghijauan() { onClose={() => setModalHapus(false)} onConfirm={handleHapus} text="Apakah Anda yakin ingin menghapus program penghijauan ini?" - /> + /> ); } diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx index 5b8e1ce5..3031d35d 100644 --- a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/create/page.tsx @@ -8,8 +8,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -41,16 +40,14 @@ function CreateProgramPenghijauan() { {/* Tombol back + title */} - - - + Tambah Program Penghijauan diff --git a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx index daa3a543..da424701 100644 --- a/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/program-penghijauan/page.tsx @@ -17,8 +17,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { IconChartLine, @@ -27,6 +26,7 @@ import { IconDeviceImac, IconHomeEco, IconLeaf, + IconPlus, IconRecycle, IconScale, IconSearch, @@ -36,7 +36,6 @@ import { IconTrendingUp, IconTrophy, IconTruckFilled, - IconPlus, } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -101,16 +100,14 @@ function ListProgramPenghijauan({ search }: { search: string }) { {/* Header Section */} Daftar Program Penghijauan - - - + {/* Table Section */} diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_lib/layoutTabs.tsx index 2f2d3997..b4fa8877 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconSchool, IconStar } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconSchool, IconStar } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,15 +15,13 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Beasiswa Pendaftar", value: "beasiswa-pendaftar", href: "/admin/pendidikan/beasiswa-desa/beasiswa-pendaftar", - icon: , - tooltip: "Kelola data pendaftar beasiswa desa", + icon: }, { label: "Keunggulan Program", value: "keunggulan-program", href: "/admin/pendidikan/beasiswa-desa/keunggulan-program", - icon: , - tooltip: "Lihat keunggulan dan detail program beasiswa", + icon: }, ]; @@ -69,28 +67,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/beasiswa-pendaftar/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/beasiswa-pendaftar/[id]/page.tsx index f72394f9..3ee48259 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/beasiswa-pendaftar/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/beasiswa-pendaftar/[id]/page.tsx @@ -2,7 +2,7 @@ import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import beasiswaDesaState from '@/app/admin/(dashboard)/_state/pendidikan/beasiswa-desa'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -121,20 +121,18 @@ function DetailBeasiswaPendaftar() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/[id]/page.tsx index 3a745c50..9fac6d28 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/[id]/page.tsx @@ -3,7 +3,7 @@ import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import beasiswaDesaState from '@/app/admin/(dashboard)/_state/pendidikan/beasiswa-desa'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -58,7 +58,7 @@ function EditProgramKreatifDesa() { judul: formData.judul.trim(), deskripsi: formData.deskripsi.trim(), }; - + await state.update.update(); toast.success('Data keunggulan program berhasil diperbarui!'); router.push("/admin/pendidikan/beasiswa-desa/keunggulan-program"); @@ -70,16 +70,14 @@ function EditProgramKreatifDesa() { return ( - - - + Edit Keunggulan Program diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/create/page.tsx index f7fb5f93..2206cef2 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/create/page.tsx @@ -2,7 +2,7 @@ import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; import beasiswaDesaState from '@/app/admin/(dashboard)/_state/pendidikan/beasiswa-desa'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; @@ -34,16 +34,14 @@ function CreateKeunggulanProgram() { return ( - - - + Tambah Keunggulan Program diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/page.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/page.tsx index f2f18216..1aed7859 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/keunggulan-program/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconSearch, IconTrashFilled } from '@tabler/icons-react'; @@ -25,8 +24,8 @@ import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; import HeaderSearch from '../../../_com/header'; -import beasiswaDesaState from '../../../_state/pendidikan/beasiswa-desa'; import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus'; +import beasiswaDesaState from '../../../_state/pendidikan/beasiswa-desa'; function KeunggulanProgram() { const [search, setSearch] = useState(""); @@ -79,30 +78,28 @@ function ListKeunggulanProgram({ search }: { search: string }) { Daftar Keunggulan Program - - - +
- Nama Keunggulan Program - Deskripsi - Edit - Delete + Nama Keunggulan Program + Deskripsi + Edit + Delete @@ -123,35 +120,31 @@ function ListKeunggulanProgram({ search }: { search: string }) { /> - - - + - - - + )) diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/_lib/layoutTabs.tsx index 83e7d239..179de0fb 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconBuildingCommunity, IconCalendar, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconSchool, IconCalendar, IconBuildingCommunity } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,22 +15,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Tujuan Program", value: "tujuan-program", href: "/admin/pendidikan/bimbingan-belajar-desa/tujuan-program", - icon: , - tooltip: "Lihat tujuan utama program bimbingan belajar", + icon: }, { label: "Lokasi dan Jadwal", value: "lokasi-dan-jadwal", href: "/admin/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal", icon: , - tooltip: "Atur lokasi pelaksanaan dan jadwal bimbingan", }, { label: "Fasilitas yang Disediakan", value: "fasilitas-yang-disediakan", href: "/admin/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan", - icon: , - tooltip: "Kelola fasilitas yang tersedia untuk peserta", + icon: }, ]; @@ -76,28 +73,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/edit/page.tsx index 3e446e1e..09a00b71 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/edit/page.tsx @@ -11,16 +11,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const BimbinganBelajarDesaTextEditor = dynamic( () => @@ -103,16 +102,14 @@ function EditFasilitasYangDisediakan() { - - - + Edit Fasilitas Yang Disediakan diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/page.tsx index b568cefa..05fa285e 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/fasilitas-yang-disediakan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -36,21 +36,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/edit/page.tsx index 5e871dea..31ac6352 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/edit/page.tsx @@ -11,16 +11,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const BimbinganBelajarDesaTextEditor = dynamic( () => @@ -102,13 +101,15 @@ function EditLokasiDanJadwal() { return ( - {/* Header */} - - - + Edit Lokasi & Jadwal diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/page.tsx index f9de4d6a..c2a83d5d 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/lokasi-dan-jadwal/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -36,21 +36,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/edit/page.tsx index 55a0d1c6..3ddddbd1 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/edit/page.tsx @@ -11,16 +11,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const BimbinganBelajarDesaTextEditor = dynamic( () => @@ -99,11 +98,9 @@ function EditTujuanProgram() { - - - + Edit Tujuan Program diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/page.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/page.tsx index 45b1c4db..a7429917 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/tujuan-program/page.tsx @@ -10,8 +10,7 @@ import { Skeleton, Stack, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; @@ -48,21 +47,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx index 114d6c66..ff3d1e37 100644 --- a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx @@ -2,7 +2,7 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -51,11 +51,9 @@ export default function EditDataPendidikan() { return ( - - - + Edit Data Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/create/page.tsx index 52f8e1f7..6cd346a8 100644 --- a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/create/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -31,11 +31,9 @@ export default function CreateDataPendidikan() { return ( - - - + Tambah Data Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/page.tsx b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/page.tsx index 0f3e9285..8485cc9d 100644 --- a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDatabase, IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -80,13 +80,11 @@ function ListDataPendidikan({ search }: { search: string }) { - + Daftar Data Pendidikan - - - + {filteredData.length === 0 ? ( @@ -111,32 +109,28 @@ function ListDataPendidikan({ search }: { search: string }) { {item.name} {item.jumlah} - - - + - - - + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/_lib/layoutTabs.tsx index e7991d96..e8de7280 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/_lib/layoutTabs.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconBuilding, IconChalkboard, IconMicroscope, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -15,29 +15,25 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Jenjang Pendidikan", value: "jenjangPendidikan", href: "/admin/pendidikan/info-sekolah/jenjang-pendidikan", - icon: , - tooltip: "Lihat dan kelola jenjang pendidikan", + icon: }, { label: "Lembaga", value: "lembaga", href: "/admin/pendidikan/info-sekolah/lembaga", icon: , - tooltip: "Lihat dan kelola lembaga", }, { label: "Siswa", value: "siswa", href: "/admin/pendidikan/info-sekolah/siswa", icon: , - tooltip: "Lihat dan kelola siswa", }, { label: "Pengajar", value: "pengajar", href: "/admin/pendidikan/info-sekolah/pengajar", icon: , - tooltip: "Lihat dan kelola pengajar", } ]; @@ -83,22 +79,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/[id]/page.tsx index 02b1003b..5e9395c6 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/[id]/page.tsx @@ -10,8 +10,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -80,11 +79,9 @@ function EditJenjangPendidikan() { {/* Header */} - - - + Edit Jenjang Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/create/page.tsx index fe8b30d5..e66fa92f 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/create/page.tsx @@ -8,8 +8,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -46,16 +45,14 @@ function CreateJenjangPendidikan() { {/* Back button + Title */} - - - + Tambah Jenjang Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/page.tsx index 24fd0d1f..d48b0a4a 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/jenjang-pendidikan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit, IconPlus, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -68,16 +68,14 @@ function ListJenjangPendidikan() { Daftar Jenjang Pendidikan - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/edit/page.tsx index e644a878..d5b322a1 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/edit/page.tsx @@ -1,8 +1,8 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client'; -import { useEffect, useState } from 'react'; -import { useParams, useRouter } from 'next/navigation'; +import infoSekolahPaud from '@/app/admin/(dashboard)/_state/pendidikan/info-sekolah-paud'; +import colors from '@/con/colors'; import { Box, Button, @@ -11,14 +11,13 @@ import { Select, Stack, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; +import { IconArrowBack } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; -import infoSekolahPaud from '@/app/admin/(dashboard)/_state/pendidikan/info-sekolah-paud'; -import colors from '@/con/colors'; -import { IconArrowBack } from '@tabler/icons-react'; export default function EditLembaga() { const router = useRouter(); @@ -73,16 +72,14 @@ export default function EditLembaga() { {/* Header */} - - - + Edit Lembaga Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/page.tsx index 3a70dbe5..8861f852 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/[id]/page.tsx @@ -1,14 +1,14 @@ 'use client' -import { useProxy } from 'valtio/utils'; -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useState } from 'react'; +import { useProxy } from 'valtio/utils'; -import colors from '@/con/colors'; import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import infoSekolahPaud from '@/app/admin/(dashboard)/_state/pendidikan/info-sekolah-paud'; +import colors from '@/con/colors'; function DetailLembaga() { const detailState = useProxy(infoSekolahPaud.lembagaPendidikan); @@ -87,34 +87,30 @@ function DetailLembaga() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/create/page.tsx index cbf52bca..bfbd79fc 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/create/page.tsx @@ -10,8 +10,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -45,11 +44,9 @@ function CreateLembaga() { {/* Header */} - - - + Tambah Lembaga Pendidikan diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/page.tsx index a4c24f38..eadabed2 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/lembaga/page.tsx @@ -16,8 +16,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImac, IconPlus, IconSearch } from '@tabler/icons-react'; @@ -74,16 +73,14 @@ function ListLembaga({ search }: { search: string }) { Daftar Lembaga - - - +
diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/edit/page.tsx index 2cf22993..6d2a91bb 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/edit/page.tsx @@ -11,8 +11,7 @@ import { Select, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -83,11 +82,9 @@ function EditPengajar() { {/* Header Back + Title */} - - - + Edit Pengajar diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/page.tsx index f97d19c4..b78a3edc 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/[id]/page.tsx @@ -1,5 +1,5 @@ 'use client' -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -77,34 +77,30 @@ function DetailPengajar() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/create/page.tsx index 22e683e7..3049368b 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/create/page.tsx @@ -11,14 +11,13 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; function CreatePengajar() { const router = useRouter(); @@ -51,11 +50,9 @@ function CreatePengajar() { {/* Header Back + Title */} - - - + Tambah Pengajar diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/page.tsx index 20342fea..7ea5a217 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/pengajar/page.tsx @@ -1,9 +1,9 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { - Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, - Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip +import { + Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, + Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -59,16 +59,14 @@ function ListPengajar({ search }: { search: string }) { Daftar Pengajar - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/edit/page.tsx index 96818201..c22b8792 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/edit/page.tsx @@ -12,8 +12,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -89,11 +88,9 @@ function EditSiswa() { {/* Header */} - - - + Edit Siswa diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/page.tsx index 519d2590..0f29a36f 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/[id]/page.tsx @@ -1,5 +1,5 @@ 'use client' -import { Box, Button, Group, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core' +import { Box, Button, Group, Paper, Skeleton, Stack, Text } from '@mantine/core' import { useShallowEffect } from '@mantine/hooks' import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react' import { useParams, useRouter } from 'next/navigation' @@ -79,34 +79,30 @@ function DetailSiswa() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/create/page.tsx index 9ebe3f57..34ef5442 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/create/page.tsx @@ -11,8 +11,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -46,11 +45,9 @@ function CreateSiswa() { {/* Header + Back Button */} - - - + Tambah Siswa diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/page.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/page.tsx index 0e336ba6..7d1c28da 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/siswa/page.tsx @@ -6,8 +6,8 @@ import { Button, Center, Group, - Paper, Pagination, + Paper, Skeleton, Stack, Table, @@ -17,8 +17,7 @@ import { TableThead, TableTr, Text, - Title, - Tooltip + Title } from '@mantine/core'; import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -68,16 +67,14 @@ function ListSiswa({ search }: { search: string }) { Daftar Siswa - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/_lib/layoutTabs.tsx index e83af8ac..57da173d 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconBook2, IconMapPin, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconSchool, IconMapPin, IconBook2 } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,22 +15,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Tujuan Program", value: "tujuan-program", href: "/admin/pendidikan/pendidikan-non-formal/tujuan-program", - icon: , - tooltip: "Atur tujuan program pendidikan non formal", + icon: }, { label: "Tempat Kegiatan", value: "tempat-kegiatan", href: "/admin/pendidikan/pendidikan-non-formal/tempat-kegiatan", - icon: , - tooltip: "Kelola daftar tempat kegiatan", + icon: }, { label: "Jenis Program yang Diselenggarakan", value: "jenis-program-yang-diselenggarakan", href: "/admin/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan", - icon: , - tooltip: "Lihat & atur jenis program yang tersedia", + icon: }, ]; @@ -77,28 +74,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/edit/page.tsx index 0fb6dd5f..5c459e6e 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/edit/page.tsx @@ -10,16 +10,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const JenisProgramYangDiselenggarakanTextEditor = dynamic( () => @@ -104,11 +103,9 @@ function EditJenisProgramYangDiselenggarakan() { {/* Back Button + Title */} - - - + Edit Jenis Program Yang Diselenggarakan diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/page.tsx index d7afd755..1a7b12bc 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/jenis-program-yang-diselenggarakan/page.tsx @@ -10,8 +10,7 @@ import { Skeleton, Stack, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; @@ -48,21 +47,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/edit/page.tsx index 7fe96497..f4a46c19 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/edit/page.tsx @@ -11,16 +11,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const TempatKegiatanTextEditor = dynamic( () => @@ -108,11 +107,9 @@ function EditTempatKegiatan() { {/* Back Button + Title */} - - - + Edit Tempat Kegiatan diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/page.tsx index d56908cf..a377409e 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tempat-kegiatan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -36,21 +36,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/edit/page.tsx index fe91defd..48d3d1db 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/edit/page.tsx @@ -11,16 +11,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const PendidikanNonFormalTextEditor = dynamic( () => import('../../_lib/pendidikanNonFormalTextEditor').then(mod => mod.PendidikanNonFormalTextEditor), @@ -98,11 +97,9 @@ function EditTujuanProgram() { - - - + Edit Tujuan Program diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/page.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/page.tsx index dcc6470e..00b36c7a 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/tujuan-program/page.tsx @@ -10,8 +10,7 @@ import { Skeleton, Stack, Text, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; @@ -50,21 +49,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_lib/layoutTabs.tsx index 3954de64..3c89d5ea 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconBook2, IconCategory, IconUser } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconBook2, IconCategory, IconUser } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,22 +15,19 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Data Perpustakaan", value: "data-perpustakaan", href: "/admin/pendidikan/perpustakaan-digital/data-perpustakaan", - icon: , - tooltip: "Kelola data koleksi perpustakaan digital", + icon: }, { label: "Kategori Buku", value: "kategori-buku", href: "/admin/pendidikan/perpustakaan-digital/kategori-buku", - icon: , - tooltip: "Atur kategori untuk buku digital", + icon: }, { label: "Peminjam", value: "peminjam", href: "/admin/pendidikan/perpustakaan-digital/peminjam", - icon: , - tooltip: "Data Peminjam Buku", + icon: }, ]; @@ -76,28 +73,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/edit/page.tsx index a77b956e..1f14cc05 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/edit/page.tsx @@ -1,13 +1,13 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' -import { useEffect, useState } from 'react'; -import { useParams, useRouter } from 'next/navigation'; -import { useProxy } from 'valtio/utils'; -import { toast } from 'react-toastify'; -import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; +import { useParams, useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; +import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; import perpustakaanDigitalState from '@/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital'; @@ -88,11 +88,9 @@ function EditPerpustakaanDigital() { {/* Header */} - - - + Edit Data Perpustakaan Digital diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/page.tsx index 437c2da4..469211c1 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/[id]/page.tsx @@ -2,7 +2,7 @@ import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; import perpustakaanDigitalState from '@/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital'; import colors from '@/con/colors'; -import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Skeleton, Stack, Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; @@ -98,32 +98,28 @@ function DetailDataPerpustakaan() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/create/page.tsx index 00cfed3d..e5eec0d7 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/create/page.tsx @@ -3,7 +3,7 @@ import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; import perpustakaanDigitalState from '@/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital'; import colors from '@/con/colors'; import ApiFetch from '@/lib/api-fetch'; -import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Image, Paper, Select, Stack, Text, TextInput, Title } from '@mantine/core'; import { Dropzone } from '@mantine/dropzone'; import { IconArrowBack, IconPhoto, IconUpload, IconX } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -57,11 +57,9 @@ function CreateDataPerpustakaan() { {/* Tombol Kembali */} - - - + Tambah Data Perpustakaan diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx index 90275fbc..c28486ee 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/data-perpustakaan/page.tsx @@ -1,11 +1,11 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip, Pagination } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; +import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { useProxy } from 'valtio/utils'; -import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react'; import HeaderSearch from '../../../_com/header'; import perpustakaanDigitalState from '../../../_state/pendidikan/perpustakaan-digital'; @@ -50,16 +50,14 @@ function ListDataPerpustakaan({ search }: { search: string }) { List Data Perpustakaan - - - +
@@ -87,7 +85,7 @@ function ListDataPerpustakaan({ search }: { search: string }) { - + diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/[id]/page.tsx index 627e023d..b29b3156 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/[id]/page.tsx @@ -3,7 +3,7 @@ import perpustakaanDigitalState from '@/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -59,11 +59,9 @@ function EditKategoriBuku() { return ( - - - + Edit Kategori Buku diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/create/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/create/page.tsx index 73ce3608..c82b184c 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/create/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/create/page.tsx @@ -1,7 +1,7 @@ 'use client' import perpustakaanDigitalState from '@/app/admin/(dashboard)/_state/pendidikan/perpustakaan-digital'; import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; @@ -26,11 +26,9 @@ function CreateKategoriBuku() { {/* Header */} - - - + Tambah Kategori Buku diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/page.tsx index 8d22b0b3..a5ff8cac 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/kategori-buku/page.tsx @@ -1,8 +1,8 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; -import { IconEdit, IconPlus, IconTrash, IconSearch } from '@tabler/icons-react'; +import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -68,16 +68,14 @@ function ListKategoriBuku({ search }: { search: string }) { Daftar Kategori Buku - - - +
diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/edit/page.tsx index d0ce3fb8..48463e0a 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/edit/page.tsx @@ -13,8 +13,7 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { DateInput } from '@mantine/dates'; import { useShallowEffect } from '@mantine/hooks'; @@ -120,11 +119,9 @@ function EditPeminjam() { {/* Header */} - - - + Edit Peminjam Buku diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/page.tsx index ed599d33..bfb5c458 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/[id]/page.tsx @@ -10,8 +10,7 @@ import { Paper, Skeleton, Stack, - Text, - Tooltip + Text } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack, IconEdit, IconTrash } from '@tabler/icons-react'; @@ -43,21 +42,21 @@ function DetailDataPeminjaman() { }; const renderStatusBadge = (status: string) => { - const normalized = status?.toUpperCase(); - - switch (normalized) { - case 'DIPINJAM': - return Dipinjam; - case 'DIKEMBALIKAN': - return Dikembalikan; - case 'TERLAMBAT': - return Terlambat; - case 'DIBATALKAN': - return Dibatalkan; - default: - return Tidak diketahui; - } - }; + const normalized = status?.toUpperCase(); + + switch (normalized) { + case 'DIPINJAM': + return Dipinjam; + case 'DIKEMBALIKAN': + return Dikembalikan; + case 'TERLAMBAT': + return Terlambat; + case 'DIBATALKAN': + return Dibatalkan; + default: + return Tidak diketahui; + } + }; if (!data) { return ( @@ -189,35 +188,31 @@ function DetailDataPeminjaman() { - - - + - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/_lib/layoutTabs.tsx index 9c76abe1..9b5b10b7 100644 --- a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/_lib/layoutTabs.tsx @@ -1,10 +1,10 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; +import { IconSchool, IconTarget } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; -import { IconSchool, IconTarget } from '@tabler/icons-react'; function LayoutTabs({ children }: { children: React.ReactNode }) { const router = useRouter(); @@ -15,15 +15,13 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { label: "Tujuan Program", value: "tujuan-program", href: "/admin/pendidikan/program-pendidikan-anak/tujuan-program", - icon: , - tooltip: "Atur tujuan program pendidikan anak", + icon: }, { label: "Program Unggulan", value: "program-unggulan", href: "/admin/pendidikan/program-pendidikan-anak/program-unggulan", - icon: , - tooltip: "Lihat dan kelola program unggulan pendidikan anak", + icon: } ]; @@ -70,28 +68,21 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { flexWrap: "nowrap", gap: "0.5rem", paddingInline: "0.5rem", // ✅ biar nggak nempel ke tepi - }} + }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/edit/page.tsx index 22d4cba7..7e7e0d9d 100644 --- a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/edit/page.tsx @@ -11,14 +11,13 @@ import { Stack, Text, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; -import { useEffect, useState, useCallback } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; @@ -112,11 +111,9 @@ function EditTujuanProgram() { - - - + Edit Program Unggulan diff --git a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/page.tsx b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/page.tsx index 57a19af4..e264957e 100644 --- a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/program-unggulan/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -36,21 +36,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/edit/page.tsx b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/edit/page.tsx index 6929f9f2..5d3c2e87 100644 --- a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/edit/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/edit/page.tsx @@ -10,16 +10,15 @@ import { Stack, Text, TextInput, - Title, - Tooltip, + Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconArrowBack } from '@tabler/icons-react'; import dynamic from 'next/dynamic'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; -import { useProxy } from 'valtio/utils'; import { toast } from 'react-toastify'; +import { useProxy } from 'valtio/utils'; const ProgramPendidikanAnakTextEditor = dynamic( () => import('../../_lib/programPendidikanAnakTextEditor').then(mod => mod.ProgramPendidikanAnakTextEditor), @@ -99,11 +98,9 @@ function EditTujuanProgram() { {/* Back Button + Title */} - - - + Edit Tujuan Program diff --git a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/page.tsx b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/page.tsx index d003433d..c8ab9b53 100644 --- a/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/program-pendidikan-anak/tujuan-program/page.tsx @@ -1,6 +1,6 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Divider, Grid, GridCol, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -36,21 +36,19 @@ function Page() { - - - + diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/edit/page.tsx similarity index 98% rename from src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx rename to src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/edit/page.tsx index 86196775..3f0a0c06 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/edit/page.tsx @@ -71,7 +71,7 @@ function EditDaftarInformasiPublik() { tanggal: formData.tanggal.trim(), }; await daftarInformasi.edit.update(); - router.push('/admin/ppid/daftar-informasi-publik-desa-darmasaba'); + router.push('/admin/ppid/daftar-informasi-publik'); } catch (error) { console.error('Error updating berita:', error); toast.error('Terjadi kesalahan saat memperbarui berita'); diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/page.tsx similarity index 97% rename from src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx rename to src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/page.tsx index 69f1da44..55f9878a 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/[id]/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/[id]/page.tsx @@ -25,7 +25,7 @@ function DetailDaftarInformasiPublik() { stateDaftarInformasi.delete.byId(selectedId) setModalHapus(false) setSelectedId(null) - router.push("/admin/ppid/daftar-informasi-publik-desa-darmasaba") + router.push("/admin/ppid/daftar-informasi-publik") } } @@ -97,7 +97,7 @@ function DetailDaftarInformasiPublik() { variant="light" color="green" leftSection={} - onClick={() => router.push(`/admin/ppid/daftar-informasi-publik-desa-darmasaba/${data.id}/edit`)} + onClick={() => router.push(`/admin/ppid/daftar-informasi-publik/${data.id}/edit`)} disabled={!data} > Edit diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/create/page.tsx similarity index 98% rename from src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx rename to src/app/admin/(dashboard)/ppid/daftar-informasi-publik/create/page.tsx index 45495a93..7f8918bb 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/create/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/create/page.tsx @@ -33,7 +33,7 @@ export default function CreateDaftarInformasi() { try { await daftarInformasi.create.create(); resetForm(); - router.push("/admin/ppid/daftar-informasi-publik-desa-darmasaba"); + router.push("/admin/ppid/daftar-informasi-publik"); } catch (error) { console.error('Error creating informasi publik:', error); alert('Terjadi kesalahan saat menyimpan data'); diff --git a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/page.tsx similarity index 95% rename from src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx rename to src/app/admin/(dashboard)/ppid/daftar-informasi-publik/page.tsx index 8562b7c8..89076806 100644 --- a/src/app/admin/(dashboard)/ppid/daftar-informasi-publik-desa-darmasaba/page.tsx +++ b/src/app/admin/(dashboard)/ppid/daftar-informasi-publik/page.tsx @@ -14,7 +14,7 @@ function DaftarInformasiPublik() { return ( } value={search} @@ -51,12 +51,12 @@ function ListDaftarInformasi({ search }: { search: string }) { - Daftar Informasi Publik + List Daftar Informasi Publik @@ -109,7 +109,7 @@ function ListDaftarInformasi({ search }: { search: string }) { variant="light" color="blue" leftSection={} - onClick={() => router.push(`/admin/ppid/daftar-informasi-publik-desa-darmasaba/${item.id}`)} + onClick={() => router.push(`/admin/ppid/daftar-informasi-publik/${item.id}`)} > Detail diff --git a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_lib/layoutTabs.tsx b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx similarity index 91% rename from src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_lib/layoutTabs.tsx rename to src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx index 1cd27336..9b6604dd 100644 --- a/src/app/admin/(dashboard)/ppid/ikm-desa-darmasaba/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/_lib/layoutTabs.tsx @@ -11,17 +11,17 @@ function LayoutTabsIKM({ children }: { children: React.ReactNode }) { const pathname = usePathname() const tabs = [ { - label: "Indeks Kepuasan Masyarakat", - description: "Lihat dan kelola indeks kepuasan masyarakat", - value: "indekskepuasannamasyarakat", - href: "/admin/ppid/ikm-desa-darmasaba/indeks-kepuasan-masyarakat", + label: "Grafik Kepuasan Masyarakat", + description: "Lihat dan kelola Grafik Kepuasan Masyarakat", + value: "grafikkepuasannamasyarakat", + href: "/admin/ppid/indeks-kepuasan-masyarakat/grafik-kepuasan-masyarakat", icon: }, { label: "Responden", description: "Kelola dan tinjau data responden", value: "responden", - href: "/admin/ppid/ikm-desa-darmasaba/responden", + href: "/admin/ppid/indeks-kepuasan-masyarakat/responden", icon: }, ]; @@ -46,7 +46,7 @@ function LayoutTabsIKM({ children }: { children: React.ReactNode }) { return ( - IKM Desa Darmasaba + Indeks Kepuasan Masyarakat MOTO PPID DESA DARMASABA - + MEMBERIKAN INFORMASI YANG CEPAT, MUDAH, TEPAT DAN TRANSPARAN diff --git a/src/app/admin/(dashboard)/user&role/layout.tsx b/src/app/admin/(dashboard)/user&role/layout.tsx index 5e662e33..c8e9802a 100644 --- a/src/app/admin/(dashboard)/user&role/layout.tsx +++ b/src/app/admin/(dashboard)/user&role/layout.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title, Tooltip } from '@mantine/core'; +import { Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconForms, IconUser } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -16,14 +16,12 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { value: "user", href: "/admin/user&role/user", icon: , - tooltip: "Lihat dan kelola user", }, { label: "Role", value: "role", href: "/admin/user&role/role", icon: , - tooltip: "Kelola data role", }, ]; @@ -67,19 +65,18 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { }} > {tabs.map((tab, i) => ( - - - {tab.label} - - + + {tab.label} + ))} diff --git a/src/app/admin/(dashboard)/user&role/role/[id]/page.tsx b/src/app/admin/(dashboard)/user&role/role/[id]/page.tsx index 35bfc56c..b31a0ff3 100644 --- a/src/app/admin/(dashboard)/user&role/role/[id]/page.tsx +++ b/src/app/admin/(dashboard)/user&role/role/[id]/page.tsx @@ -1,10 +1,10 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, MultiSelect, Paper, Stack, Text, TextInput, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, MultiSelect, Paper, Stack, Text, TextInput, Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useParams, useRouter } from 'next/navigation'; -import { useEffect, useState, useCallback } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import { useProxy } from 'valtio/utils'; import user from '../../../_state/user/user-state'; @@ -72,11 +72,9 @@ function EditRole() { return ( - - - + Edit Role diff --git a/src/app/admin/(dashboard)/user&role/role/create/page.tsx b/src/app/admin/(dashboard)/user&role/role/create/page.tsx index 7b342f2c..40644b2a 100644 --- a/src/app/admin/(dashboard)/user&role/role/create/page.tsx +++ b/src/app/admin/(dashboard)/user&role/role/create/page.tsx @@ -9,8 +9,7 @@ import { Paper, Stack, TextInput, - Title, - Tooltip + Title } from '@mantine/core'; import { IconArrowBack } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -29,7 +28,7 @@ export default function CreateRole() { const resetForm = () => { stateRole.create.form = { name: '', - permissions: [] , + permissions: [], }; }; @@ -43,11 +42,9 @@ export default function CreateRole() { return ( - - - + Tambah Role @@ -83,8 +80,8 @@ export default function CreateRole() { .flat() ) ) - .filter((p): p is string => typeof p === 'string') - .map((p) => ({ label: p, value: p })) + .filter((p): p is string => typeof p === 'string') + .map((p) => ({ label: p, value: p })) } value={stateRole.create.form.permissions} onChange={(value) => (stateRole.create.form.permissions = value)} diff --git a/src/app/admin/(dashboard)/user&role/role/page.tsx b/src/app/admin/(dashboard)/user&role/role/page.tsx index c71d9343..d57ab4e7 100644 --- a/src/app/admin/(dashboard)/user&role/role/page.tsx +++ b/src/app/admin/(dashboard)/user&role/role/page.tsx @@ -1,7 +1,7 @@ /* eslint-disable react-hooks/exhaustive-deps */ 'use client' import colors from '@/con/colors'; -import { Box, Button, Group, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title, Tooltip } from '@mantine/core'; +import { Box, Button, Group, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Title } from '@mantine/core'; import { IconEdit, IconPlus, IconSearch, IconTrash } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; @@ -68,48 +68,46 @@ function ListRole({ search }: { search: string }) { Daftar Role - - - + - -
- - - Role - Edit - Hapus + +
+ + + Role + Edit + Hapus + + + + {filteredData.map((item) => ( + + {item.name} + + + + + + - - - {filteredData.map((item) => ( - - {item.name} - - - - - - - - ))} - -
-
- + ))} + + + + {/* Modal Konfirmasi Hapus */} []>([]); + type SdgsDesa = { + id: string + name: string + jumlah: number + }; + const [chartData, setChartData] = useState([]) + const [mounted, setMounted] = useState(false); + const state = useProxy(sdgsDesa.findManyAll) const [loading, setLoading] = useState(true); + // Definisikan urutan goal SDGs Desa (sesuai nomor 1-18) + const sdgsOrder = [ + "Desa Tanpa Kemiskinan", + "Desa Tanpa Kelaparan", + "Desa Sehat dan Sejahtera", + "Pendidikan Desa Berkualitas", + "Keterlibatan Perempuan Desa", + "Desa Layak Air Bersih dan Sanitasi", + "Desa Berenergi Bersih dan Terbarukan", + "Pertumbuhan Ekonomi Desa Merata", + "Infrastruktur dan Inovasi Desa Sesuai Kebutuhan", + "Desa Tanpa Kesenjangan", + "Kawasan Permukiman Desa Aman dan Nyaman", + "Konsumsi dan Produksi Desa Sadar Lingkungan", + "Desa Tanggap Perubahan Iklim", + "Desa Peduli Lingkungan Laut", + "Desa Peduli Lingkungan Darat", + "Desa Damai Berkeadilan", + "Kemitraan untuk Pembangunan Desa", + "Kelembagaan Desa Dinamis dan Budaya Desa Adaptif" + ]; + + useEffect(() => { - const fetchSdgsDesa = async () => { + if (state.data) { + // Urutkan data sesuai urutan goal 1-18 + const sortedData = [...state.data].sort((a, b) => { + const indexA = sdgsOrder.indexOf(a.name); + const indexB = sdgsOrder.indexOf(b.name); + return indexA - indexB; + }); + + setChartData(sortedData.map((item: any) => ({ + id: item.id, + name: item.name, + jumlah: item.jumlah, + }))); + } + }, [state.data]); + + useEffect(() => { + const loadData = async () => { try { - const response = await fetch('/api/landingpage/sdgsdesa/findMany?limit=50&page=1'); - if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); - const result = await response.json(); - let data = []; - if (Array.isArray(result.data)) { - data = result.data; - } else if (Array.isArray(result)) { - data = result; - } else { - console.error('Format data tidak valid:', result); - } - setSdgsDesa(data); + setMounted(true); + setLoading(true) + await state.load() } catch (error) { - console.error('Gagal mengambil data sdgs desa:', error); + console.error('Error loading data:', error) } finally { - setLoading(false); + setLoading(false) } - }; - fetchSdgsDesa(); - }, []); + } + loadData() + }, []) + + const averageScore = useMemo(() => { + if (!state.data?.length) return 0; + const total = state.data.reduce((sum: number, item: any) => { + const val = typeof item.jumlah === 'string' + ? parseFloat(item.jumlah.replace(',', '.')) + : Number(item.jumlah); + return isNaN(val) ? sum : sum + val; + }, 0); + return parseFloat((total / state.data.length).toFixed(2)); + }, [state.data]); return ( @@ -53,13 +106,13 @@ function Page() { - SDGs Desa adalah upaya terpadu pemerintah dalam percepatan pencapaian tujuan pembangunan berkelanjutan di tingkat desa. - Ini merupakan adaptasi dari SDGs global dalam konteks pembangunan desa di Indonesia, yang bertujuan menciptakan desa + SDGs Desa adalah upaya terpadu pemerintah dalam percepatan pencapaian tujuan pembangunan berkelanjutan di tingkat desa. + Ini merupakan adaptasi dari SDGs global dalam konteks pembangunan desa di Indonesia, yang bertujuan menciptakan desa inklusif, berkelanjutan, dan tangguh menghadapi tantangan masa depan. - Berdasarkan Permendesa Nomor 21 Tahun 2020, SDGs Desa mencakup 18 tujuan yang harus dicapai pada tahun 2030. - Tujuan-tujuan tersebut meliputi pengentasan kemiskinan, peningkatan kesehatan dan pendidikan, kesetaraan gender, + Berdasarkan Permendesa Nomor 21 Tahun 2020, SDGs Desa mencakup 18 tujuan yang harus dicapai pada tahun 2030. + Tujuan-tujuan tersebut meliputi pengentasan kemiskinan, peningkatan kesehatan dan pendidikan, kesetaraan gender, pertumbuhan ekonomi, pembangunan infrastruktur, hingga pelestarian lingkungan. @@ -67,9 +120,24 @@ function Page() { - {!loading && sdgsDesa.length > 0 ? ( + + {!loading && state.data && state.data.length > 0 && ( +
+ + Rata-Rata SDGs Desa : + + {averageScore} % + + + Diambil dari rata-rata 18 Goals SDGs Desa dari Desa Darmasaba + + +
+ )} + + {!loading && state.data && state.data.length > 0 ? ( - {sdgsDesa.map((item) => ( + {state.data?.map((item) => (
- - {item.name} - + + {item.name} +
) : null} + + {/* Chart */} + + + + + Grafik APBDes + + {mounted && chartData.length > 0 ? ( + {/* Tambahkan padding horizontal agar label tidak keluar */} + value, + formatter: (value) => `${value}%`, + }} + xAxisProps={{ + angle: -45, + textAnchor: 'end', + interval: 0, + fontSize: 12, + dy: 10, + }} + yAxisProps={{ + domain: [0, 100], + tickCount: 6, + }} + style={{ + overflowX: 'visible', + paddingBottom: 40, // Tambahkan ruang di bawah untuk label + }} + // Hilangkan legend secara eksplisit + withLegend={false} // ⭐ Ini yang menghilangkan kotak biru + teks "Jumlah" + /> + + ) : ( + Belum ada data untuk ditampilkan dalam grafik + )} + + +
diff --git a/src/app/darmasaba/_com/ModernNeewsNotification.tsx b/src/app/darmasaba/_com/ModernNeewsNotification.tsx index c03e9ec1..2741289c 100644 --- a/src/app/darmasaba/_com/ModernNeewsNotification.tsx +++ b/src/app/darmasaba/_com/ModernNeewsNotification.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from "react"; import { Box, Paper, Text, Group, CloseButton, Badge, ActionIcon, Stack, Transition } from "@mantine/core"; import { IconBell, IconChevronRight } from "@tabler/icons-react"; -import { useRouter } from "next/navigation"; // 👉 tambahkan ini +import { usePathname, useRouter } from "next/navigation"; // 👉 tambahkan ini interface NewsItem { id: string | number; @@ -27,9 +27,9 @@ function stripHtml(html: string): string { .trim(); } -export default function ModernNewsNotification({ +export default function ModernNewsNotification({ news = [], - autoShowDelay = 2000 + autoShowDelay = 2000 }: ModernNewsNotificationProps) { const router = useRouter(); // 👉 router Next.js const [toastVisible, setToastVisible] = useState(false); @@ -37,6 +37,9 @@ export default function ModernNewsNotification({ const [hasNewNotifications, setHasNewNotifications] = useState(true); const [hasShownToast, setHasShownToast] = useState(false); const [iconVisible, setIconVisible] = useState(true); + const pathname = usePathname(); + + useEffect(() => { if (news.length > 0 && !toastVisible && !hasShownToast) { @@ -57,25 +60,32 @@ export default function ModernNewsNotification({ } }, [toastVisible]); + // Ganti useEffect scroll yang lama dengan versi berikut: + useEffect(() => { let lastScrollY = window.scrollY; const handleScroll = () => { const currentScrollY = window.scrollY; - + + // Kontrol ikon lonceng if (currentScrollY > lastScrollY && currentScrollY > 100) { setIconVisible(false); - } - else if (currentScrollY < lastScrollY) { + } else if (currentScrollY < lastScrollY) { setIconVisible(true); } - + + // 🔴 BARU: Sembunyikan toast saat scroll ke bawah melewati 150px + if (currentScrollY > 150 && toastVisible) { + setToastVisible(false); + } + lastScrollY = currentScrollY; }; window.addEventListener('scroll', handleScroll, { passive: true }); return () => window.removeEventListener('scroll', handleScroll); - }, []); + }, [toastVisible]); // 👈 tambahkan toastVisible sebagai dependency const currentNews = news[0]; @@ -95,6 +105,11 @@ export default function ModernNewsNotification({ setHasNewNotifications(false); }; + // Ganti dengan path landing page Anda + if (pathname !== '/darmasaba') { + return null; + } + return ( <> @@ -174,7 +189,7 @@ export default function ModernNewsNotification({ Berita & Pengumuman - setWidgetOpen(false)} variant="transparent" c="white" @@ -283,16 +298,16 @@ export default function ModernNewsNotification({ > {currentNews?.type === "berita" ? "Berita Terbaru" : "Pengumuman"} - setToastVisible(false)} size="sm" /> - + {currentNews?.title || "Informasi Terbaru"} - + {stripHtml(currentNews?.content || "")} diff --git a/src/app/darmasaba/_com/RunningText.tsx b/src/app/darmasaba/_com/RunningText.tsx deleted file mode 100644 index c670818e..00000000 --- a/src/app/darmasaba/_com/RunningText.tsx +++ /dev/null @@ -1,185 +0,0 @@ -"use client"; - -import { Box } from "@mantine/core"; -import { IconBell } from "@tabler/icons-react"; -import { useMemo, useState, useEffect } from "react"; - -interface RunningTextProps { - news?: string[]; - speed?: number; // dalam detik (jika mau manual) - autoSpeed?: boolean; // otomatis sesuaikan speed dengan panjang text - bgColor?: string; - textColor?: string; - maxLength?: number; // max karakter per item -} - -// Utility function untuk strip HTML (works on both server and client) -function stripHtmlTags(html: string): string { - const text = html - .replace(/]*>.*?<\/style>/gi, '') - .replace(/]*>.*?<\/script>/gi, '') - .replace(/<[^>]+>/g, '') - .replace(/ /gi, ' ') - .replace(/&/gi, '&') - .replace(/</gi, '<') - .replace(/>/gi, '>') - .replace(/"/gi, '"') - .replace(/'/gi, "'") - .replace(/’/gi, "'") - .replace(/—/gi, '—') - .replace(/–/gi, '–') - .replace(/\s+/g, ' ') - .trim(); - - return text; -} - -export default function RunningText({ - news = [ - "Selamat datang di Portal Desa Darmasaba", - "Jam operasional kantor: Senin - Jumat 08:00 - 17:00", - ], - speed = 20, - autoSpeed = true, - bgColor = "#1e5a7e", - textColor = "white", - maxLength = 200 // default max 200 karakter per item -}: RunningTextProps) { - - const [isMounted, setIsMounted] = useState(false); - - useEffect(() => { - setIsMounted(true); - }, []); - - // Process news data - const processedNews = useMemo(() => { - return news - .filter(item => item && item.trim() !== "") - .map(item => { - let text = stripHtmlTags(item); - // Limit panjang per item - if (text.length > maxLength) { - text = text.substring(0, maxLength) + "..."; - } - return text; - }) - .filter(item => item.length > 0); - }, [news, maxLength]); - - const allNews = processedNews.length > 0 - ? processedNews.join(" • ") - : "Tidak ada pengumuman"; - - // Hitung speed berdasarkan mode - const calculatedSpeed = useMemo(() => { - if (!autoSpeed) { - return speed; // Gunakan speed manual - } - - // Auto speed: berdasarkan panjang text - const textLength = allNews.length; - - // Formula yang lebih natural: - // - Text pendek (< 100 char): 15 detik - // - Text sedang (100-300 char): 20-30 detik - // - Text panjang (> 300 char): 30-45 detik - let calculatedTime; - - if (textLength < 100) { - calculatedTime = 15; - } else if (textLength < 300) { - calculatedTime = 15 + ((textLength - 100) / 200) * 15; // 15-30 detik - } else { - calculatedTime = 30 + Math.min(((textLength - 300) / 500) * 15, 15); // 30-45 detik max - } - - return Math.round(calculatedTime); - }, [allNews, speed, autoSpeed]); - - // Prevent hydration mismatch - if (!isMounted) { - return ( - -
- - - Memuat pengumuman... - -
-
- ); - } - - return ( - -