diff --git a/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx b/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx
index 9d44874b..56029f20 100644
--- a/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.tsx
+++ b/src/app/admin/(dashboard)/desa/_com/layoutTabLayanan.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 } from '@mantine/core';
+import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core';
import { IconBuildingStore, IconFileText, IconSparkles, IconUsers, IconUsersPlus } from '@tabler/icons-react';
import { usePathname, useRouter } from 'next/navigation';
import React, { useEffect, useState } from 'react';
@@ -72,35 +72,76 @@ function LayoutTabsLayanan({ children }: { children: React.ReactNode }) {
keepMounted={false}
>
{/* ✅ Scroll horizontal wrapper */}
-
-
- {tabs.map((tab, i) => (
+
+
+
+ {tabs.map((tab, i) => (
{tab.label}
- ))}
-
-
+ ))}
+
+
+
+
+
+
+
+
+ {tabs.map((tab, i) => (
+
+ {tab.label}
+
+ ))}
+
+
+
{tabs.map((tab, i) => (
+
{/* Back Button + Title */}
+
{/* Header dengan back button */}
(null);
+ const [debouncedSearch] = useDebouncedValue(search, 1000);
const {
data,
@@ -58,8 +60,8 @@ function ListKategoriBerita({ search }: { search: string }) {
} = listDataState.findMany;
useEffect(() => {
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
const handleDelete = () => {
if (selectedId) {
@@ -81,77 +83,84 @@ function ListKategoriBerita({ search }: { search: string }) {
}
return (
-
-
-
- Daftar Kategori Berita
- }
- color="blue"
- variant="light"
- onClick={() =>
- router.push('/admin/desa/berita/kategori-berita/create')
- }
- >
- Tambah Baru
-
+
+
+
+
+ Daftar Kategori Berita
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() =>
+ router.push('/admin/desa/berita/kategori-berita/create')
+ }
+ >
+ Tambah Baru
+
-
-
+ {/* Desktop Table */}
+
+
- No
- Nama
- Edit
- Hapus
+
+ Kategori
+
+
+ Edit
+
+
+ Hapus
+
{filteredData.length > 0 ? (
- filteredData.map((item, index) => (
+ filteredData.map((item) => (
- {index + 1}
-
-
-
+
{item.name}
-
-
- router.push(
- `/admin/desa/berita/kategori-berita/${item.id}`
- )
- }
- >
-
-
+
+
+ router.push(
+ `/admin/desa/berita/kategori-berita/${item.id}`
+ )
+ }
+ size="compact-sm"
+ >
+
+
-
- {
- setSelectedId(item.id);
- setModalHapus(true);
- }}
- >
-
-
+
+ {
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ size="compact-sm"
+ >
+
+
))
) : (
-
-
+
+
Tidak ada data kategori berita yang cocok
@@ -161,22 +170,70 @@ function ListKategoriBerita({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+ Kategori
+
+ {item.name}
+
+
+
+
+ router.push(
+ `/admin/desa/berita/kategori-berita/${item.id}`
+ )
+ }
+ >
+
+
+ {
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ >
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data kategori berita yang cocok
+
+
+ )}
+
-
- {
- load(newPage, 10, search);
- window.scrollTo({ top: 0, behavior: 'smooth' });
- }}
- total={totalPages}
- mt="md"
- mb="md"
- color="blue"
- radius="md"
- />
-
+ {totalPages > 1 && (
+
+ {
+ load(newPage, 10, search);
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ }}
+ total={totalPages}
+ color="blue"
+ radius="md"
+ />
+
+ )}
{/* Modal Konfirmasi Hapus */}
+
{/* Header */}
+
{/* Tombol Back */}
+
{/* Header dengan tombol kembali */}
{
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
if (loading || !data) {
return (
-
+
);
@@ -63,64 +64,67 @@ function ListBerita({ search }: { search: string }) {
const filteredData = data || [];
return (
-
+
- Daftar Berita
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/berita/list-berita/create')}
- >
- Tambah Baru
-
+ Daftar Berita
+ Daftar Berita
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/berita/list-berita/create')}
+ >
+ Tambah Baru
+
-
-
+ {/* Desktop Table */}
+
+
- Judul
- Kategori
- Aksi
+ Judul
+ Kategori
+ Aksi
{filteredData.length > 0 ? (
filteredData.map((item) => (
-
-
-
- {item.judul}
-
-
+
+
+ {item.judul}
+
-
-
+
+
{item.kategoriBerita?.name || '-'}
-
+
router.push(`/admin/desa/berita/list-berita/${item.id}`)
}
+ fz="sm"
+ px="sm"
+ h={36}
>
-
- Detail
+
+ Detail
))
) : (
-
-
-
+
+
+
Tidak ada data berita yang cocok
@@ -130,6 +134,52 @@ function ListBerita({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+ Judul
+
+
+ {item.judul}
+
+
+
+ Kategori
+
+
+ {item.kategoriBerita?.name || '-'}
+
+
+
+ router.push(`/admin/desa/berita/list-berita/${item.id}`)
+ }
+ fz="sm"
+ h={36}
+ >
+
+ Detail
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data berita yang cocok
+
+
+ )}
+
@@ -150,4 +200,4 @@ function ListBerita({ search }: { search: string }) {
);
}
-export default Berita;
+export default Berita;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/gallery/foto/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/gallery/foto/[id]/edit/page.tsx
index df492b39..21dd4231 100644
--- a/src/app/admin/(dashboard)/desa/gallery/foto/[id]/edit/page.tsx
+++ b/src/app/admin/(dashboard)/desa/gallery/foto/[id]/edit/page.tsx
@@ -139,7 +139,7 @@ function EditFoto() {
};
return (
-
+
{/* Header */}
+
router.back()}
@@ -59,7 +59,7 @@ function DetailFoto() {
withBorder
// Gunakan max-width agar tidak terlalu lebar di desktop
maw={800}
- w="100%"
+ w={{ base: "100%", md: "70%" }}
bg={colors['white-1']}
p="lg"
radius="md"
diff --git a/src/app/admin/(dashboard)/desa/gallery/foto/create/page.tsx b/src/app/admin/(dashboard)/desa/gallery/foto/create/page.tsx
index 82cd87ef..72193ec5 100644
--- a/src/app/admin/(dashboard)/desa/gallery/foto/create/page.tsx
+++ b/src/app/admin/(dashboard)/desa/gallery/foto/create/page.tsx
@@ -72,7 +72,7 @@ function CreateFoto() {
};
return (
-
+
{/* Header Back Button + Title */}
{
- load(page, 10, search)
- }, [page, search])
+ load(page, 10, debouncedSearch)
+ }, [page, debouncedSearch])
const filteredData = data || []
if (loading || !data) {
return (
-
+
)
}
return (
-
-
-
- Daftar Foto
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/gallery/foto/create')}
- >
- Tambah Baru
-
+
+
+
+ Daftar Foto
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/gallery/foto/create')}
+ >
+ Tambah Baru
+
-
+
+ {/* Desktop Table */}
+
- Judul Foto
- Tanggal
- Deskripsi
- Aksi
+ Judul Foto
+ Tanggal
+ Deskripsi
+ Aksi
{filteredData.length > 0 ? (
filteredData.map((item) => (
-
-
- {item.name}
-
+
+
+ {item.name}
+
-
-
-
+
+
{new Date(item.createdAt).toLocaleDateString('id-ID', {
day: 'numeric',
month: 'long',
year: 'numeric',
})}
-
-
-
-
-
+
+
-
+
router.push(`/admin/desa/gallery/foto/${item.id}`)}
>
-
- Detail
+
+ Detail
@@ -133,7 +139,7 @@ function ListFoto({ search }: { search: string }) {
- Tidak ada foto yang cocok
+ Tidak ada foto yang cocok
@@ -141,7 +147,54 @@ function ListFoto({ search }: { search: string }) {
+
+ {/* Mobile Card View */}
+
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+ Judul Foto
+ {item.name}
+
+
+ Tanggal
+
+ {new Date(item.createdAt).toLocaleDateString('id-ID', {
+ day: 'numeric',
+ month: 'long',
+ year: 'numeric',
+ })}
+
+
+
+ Deskripsi
+
+
+ router.push(`/admin/desa/gallery/foto/${item.id}`)}
+ >
+
+ Detail
+
+
+
+ ))
+ ) : (
+
+ Tidak ada foto yang cocok
+
+ )}
+
+
+
+
+
{/* Tombol Kembali */}
+
{/* Header Back Button + Title */}
{
- load(page, 10, search)
- }, [page, search])
+ load(page, 10, debouncedSearch)
+ }, [page, debouncedSearch])
const filteredData = data || []
if (loading || !data) {
return (
-
+
)
}
return (
-
-
-
- Daftar Video
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/gallery/video/create')}
- >
- Tambah Baru
-
+
+
+
+
+ Daftar Video
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/gallery/video/create')}
+ >
+ Tambah Baru
+
-
-
+
+ {/* Desktop Table */}
+
+
- Judul Video
- Tanggal
- Deskripsi
- Aksi
+ Judul Video
+ Tanggal
+ Deskripsi
+ Aksi
{filteredData.length > 0 ? (
filteredData.map((item) => (
-
-
- {item.name}
-
+
+
+ {item.name}
+
-
-
-
+
+
{new Date(item.createdAt).toLocaleDateString('id-ID', {
day: 'numeric',
month: 'long',
year: 'numeric',
})}
-
-
-
-
-
+
+
-
+
router.push(`/admin/desa/gallery/video/${item.id}`)}
+ fz="sm"
+ px="xs"
>
-
+
Detail
@@ -132,8 +135,10 @@ function ListVideo({ search }: { search: string }) {
) : (
-
- Tidak ada video yang cocok
+
+
+ Tidak ada video yang cocok
+
@@ -141,23 +146,74 @@ function ListVideo({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+ Judul Video
+
+ {item.name}
+
+
+
+ Tanggal
+
+ {new Date(item.createdAt).toLocaleDateString('id-ID', {
+ day: 'numeric',
+ month: 'long',
+ year: 'numeric',
+ })}
+
+
+
+ Deskripsi
+
+
+
+ router.push(`/admin/desa/gallery/video/${item.id}`)}
+ fz="sm"
+ >
+
+ Detail
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada video yang cocok
+
+
+ )}
+
-
- {
- load(newPage, 10)
- window.scrollTo({ top: 0, behavior: 'smooth' })
- }}
- total={totalPages}
- mt="md"
- mb="md"
- color="blue"
- radius="md"
- />
-
+
+ {totalPages > 1 && (
+
+ {
+ load(newPage, 10)
+ window.scrollTo({ top: 0, behavior: 'smooth' })
+ }}
+ total={totalPages}
+ color="blue"
+ radius="md"
+ />
+
+ )}
);
}
-export default Video;
+export default Video;
\ No newline at end of file
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 0ee0d2e2..14f2605f 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
@@ -115,7 +115,7 @@ function EditAjukanPermohonan() {
};
return (
-
+
{/* Back Button */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/page.tsx b/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/page.tsx
index c53534c0..9636c485 100644
--- a/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/ajukan_permohonan/[id]/page.tsx
@@ -48,7 +48,7 @@ function DetailAjukanPermohonan() {
const data = ajukanPermohonanState.findUnique.data;
return (
-
+
{/* Tombol Kembali */}
{
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
// Loading state
if (loading || !data) {
return (
-
+
);
}
return (
-
-
- List Ajukan Permohonan
-
-
+
+
+
+ List Ajukan Permohonan
+
+
+ {/* Desktop Table */}
+
+
- Nama
- Alamat
- NIK
- Aksi
+ Nama
+ Alamat
+ NIK
+ Aksi
{data.length > 0 ? (
data.map((item) => (
-
-
-
- {item.nama}
-
-
+
+
+ {item.nama}
+
-
-
-
- {item.alamat}
-
-
+
+
+ {item.alamat}
+
-
-
-
- {item.nik}
-
-
+
+
+ {item.nik}
+
-
+
-
-
- Tidak ada data ajukan permohonan yang cocok
+
+
+
+ Tidak ada data ajukan permohonan yang cocok
+
@@ -133,23 +135,71 @@ function ListAjukanPermohonan({ search }: { search: string }) {
+
+ {/* Mobile Card View */}
+
+
+ {data.length > 0 ? (
+ data.map((item) => (
+
+
+
+ Nama
+ {item.nama}
+
+
+ Alamat
+ {item.alamat}
+
+
+ NIK
+ {item.nik}
+
+
+ }
+ onClick={() =>
+ router.push(`/admin/desa/layanan/ajukan_permohonan/${item.id}`)
+ }
+ fullWidth
+ >
+ Detail
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data ajukan permohonan yang cocok
+
+
+ )}
+
+
-
- {
- load(newPage, 10, search);
- window.scrollTo({ top: 0, behavior: 'smooth' });
- }}
- total={totalPages}
- mt="md"
- mb="md"
- color="blue"
- radius="md"
- />
-
+
+ {totalPages > 1 && (
+
+ {
+ load(newPage, 10, search);
+ window.scrollTo({ top: 0, behavior: 'smooth' });
+ }}
+ total={totalPages}
+ color="blue"
+ radius="md"
+ />
+
+ )}
);
}
-export default AjukanPermohonan;
+export default AjukanPermohonan;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/[id]/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/[id]/page.tsx
index a425a358..6ebb654a 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_penduduk_non_permanent/[id]/page.tsx
@@ -108,7 +108,7 @@ function EditPelayananPendudukNonPermanent() {
};
return (
-
+
-
+
Preview Pelayanan Penduduk Non Permanen
- }
- radius="md"
- onClick={() =>
- router.push(
- `/admin/desa/layanan/pelayanan_penduduk_non_permanent/${data.id}`
- )
- }
- >
- Edit
-
+ }
+ radius="md"
+ onClick={() =>
+ router.push(
+ `/admin/desa/layanan/pelayanan_penduduk_non_permanent/${data.id}`
+ )
+ }
+ >
+ Edit
+
@@ -70,14 +74,14 @@ function PelayananPendudukNonPermanent() {
-
{data.name}
-
+
@@ -86,9 +90,11 @@ function PelayananPendudukNonPermanent() {
@@ -98,4 +104,4 @@ function PelayananPendudukNonPermanent() {
);
}
-export default PelayananPendudukNonPermanent;
+export default PelayananPendudukNonPermanent;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/[id]/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/[id]/page.tsx
index 9fdc6c56..d354e203 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/[id]/page.tsx
@@ -123,7 +123,7 @@ function EditPelayananPerizinanBerusaha() {
}
return (
-
+
{/* Header */}
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/page.tsx
index a1cac551..43854e4c 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_perizinan_berusaha/page.tsx
@@ -41,8 +41,7 @@ function PerizinanBerusaha() {
const loadData = async () => {
try {
setLoading(true);
- // You should get the ID from your router query or params
- const id = 'edit'; // Replace with actual ID or get from URL params
+ const id = 'edit';
await pelayananPerizinanBerusaha.findById.load(id);
} catch (err) {
setError('Gagal memuat data');
@@ -66,7 +65,7 @@ function PerizinanBerusaha() {
if (error || !pelayananPerizinanBerusaha.findById.data) {
return (
- {error || 'Data tidak ditemukan'}
+ {error || 'Data tidak ditemukan'}
);
}
@@ -79,24 +78,24 @@ function PerizinanBerusaha() {
{/* Header */}
-
+
Preview Pelayanan Perizinan Berusaha
- }
- radius="md"
- onClick={() =>
- router.push(
- `/admin/desa/layanan/pelayanan_perizinan_berusaha/${data.id}`
- )
- }
- >
- Edit
-
+ }
+ radius="md"
+ onClick={() =>
+ router.push(
+ `/admin/desa/layanan/pelayanan_perizinan_berusaha/${data.id}`
+ )
+ }
+ >
+ Edit
+
@@ -104,38 +103,40 @@ function PerizinanBerusaha() {
-
{data.name}
-
+
Proses pendaftaran NIB melalui OSS mencakup beberapa langkah
umum:
-
+
- Pendaftaran akun pada portal OSS
+
+ Pendaftaran akun pada portal OSS
+
- Mengisi informasi perusahaan, termasuk data pemegang saham, alamat perusahaan, dan lainnya
+
+ Mengisi informasi perusahaan, termasuk data pemegang saham, alamat perusahaan, dan lainnya
+
- Memilih KBLI dengan jenis usaha yang akan didaftarkan
+
+ Memilih KBLI dengan jenis usaha yang akan didaftarkan
+
- Mengunggah dokumen-dokumen yang diperlukan, seperti akta pendirian perusahaan, surat izin usaha, dan dokumen lainnya sesuai dengan ketentuan yang berlaku
+
+ Mengunggah dokumen-dokumen yang diperlukan, seperti akta pendirian perusahaan, surat izin usaha, dan dokumen lainnya sesuai dengan ketentuan yang berlaku
+
- Proses verifikasi dan persetujuan oleh instansi terkait
+
+ Proses verifikasi dan persetujuan oleh instansi terkait
+
- Jika proses sebelumnya berhasil, perusahaan akan menerima NIB sebagai identitas resmi usaha anda
+
+ Jika proses sebelumnya berhasil, perusahaan akan menerima NIB sebagai identitas resmi usaha anda
+
- Selesai, anda telah mengikuti proses pendaftaran NIB melalui OSS
+
+ Selesai, anda telah mengikuti proses pendaftaran NIB melalui OSS
+
+
+
+
+
+
+ Back
+
+ Next step
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -177,9 +265,10 @@ function PerizinanBerusaha() {
Penting untuk diingat bahwa prosedur dan persyaratan dapat
berubah seiring waktu. Untuk informasi yang lebih akurat dan
@@ -203,5 +292,4 @@ function PerizinanBerusaha() {
);
}
-export default PerizinanBerusaha;
-
+export default PerizinanBerusaha;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/edit/page.tsx
index f91b84b8..3e1adf6a 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/edit/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/edit/page.tsx
@@ -64,7 +64,7 @@ const FileUploader: React.FC = ({
};
return (
-
+
{title}
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/page.tsx
index 4c911ca3..04ab79b6 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/[id]/page.tsx
@@ -49,7 +49,7 @@ function DetailSuratKeterangan() {
const data = suratKeteranganState.findUnique.data;
return (
-
+
{/* Tombol Kembali */}
+
{/* Header */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx
index 2b90ada8..9de1132c 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_surat_keterangan/page.tsx
@@ -17,7 +17,7 @@ import {
TableThead,
TableTr,
Text,
- Title
+ Title,
} from '@mantine/core';
import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
@@ -25,9 +25,10 @@ import { useEffect, useMemo, useState } from 'react';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header';
import stateLayananDesa from '../../../_state/desa/layananDesa';
+import { useDebouncedValue } from '@mantine/hooks';
function SuratKeterangan() {
- const [search, setSearch] = useState("");
+ const [search, setSearch] = useState('');
return (
{
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
const filteredData = useMemo(() => {
if (!data) return [];
- const keyword = search.toLowerCase();
- return data.filter(item =>
- item.name?.toLowerCase().includes(keyword) ||
- item.deskripsi?.toLowerCase().includes(keyword)
+ const keyword = debouncedSearch.toLowerCase();
+ return data.filter(
+ (item) =>
+ item.name?.toLowerCase().includes(keyword) ||
+ item.deskripsi?.toLowerCase().includes(keyword)
);
- }, [data, search]);
+ }, [data, debouncedSearch]);
- // Loading state
if (loading || !data) {
return (
-
+
);
}
return (
-
-
-
- List Surat Keterangan
- }
- color="blue"
- variant="light"
- onClick={() =>
- router.push('/admin/desa/layanan/pelayanan_surat_keterangan/create')
- }
- >
- Tambah Baru
-
+
+
+
+
+ List Surat Keterangan
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() =>
+ router.push('/admin/desa/layanan/pelayanan_surat_keterangan/create')
+ }
+ >
+ Tambah Baru
+
-
+
+ {/* Desktop Table */}
+
- Nama
- Deskripsi
- Aksi
+
+ Nama
+
+
+ Deskripsi
+
+
+ Aksi
+
{filteredData.length > 0 ? (
filteredData.map((item) => (
-
-
-
- {item.name}
-
-
+
+
+ {item.name}
+
-
-
-
-
+
+
-
+
}
onClick={() =>
- router.push(`/admin/desa/layanan/pelayanan_surat_keterangan/${item.id}`)
+ router.push(
+ `/admin/desa/layanan/pelayanan_surat_keterangan/${item.id}`
+ )
}
>
Detail
@@ -139,8 +151,10 @@ function ListSuratKeterangan({ search }: { search: string }) {
) : (
-
- Tidak ada data surat keterangan yang cocok
+
+
+ Tidak ada data surat keterangan yang cocok
+
@@ -148,7 +162,67 @@ function ListSuratKeterangan({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+
+ Nama
+
+
+ {item.name}
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+ }
+ onClick={() =>
+ router.push(
+ `/admin/desa/layanan/pelayanan_surat_keterangan/${item.id}`
+ )
+ }
+ >
+ Detail
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data surat keterangan yang cocok
+
+
+ )}
+
+
+
{
- setFormData({
- name: originalData.name,
- deskripsi: originalData.deskripsi,
- link: originalData.link,
- });
- toast.info("Form dikembalikan ke data awal");
- };
+ setFormData({
+ name: originalData.name,
+ deskripsi: originalData.deskripsi,
+ link: originalData.link,
+ });
+ toast.info("Form dikembalikan ke data awal");
+ };
// Submit: update global state hanya saat simpan
const handleSubmit = async () => {
@@ -102,12 +102,12 @@ function EditPelayananTelunjukSakti() {
};
return (
-
+
{/* Back Button + Title */}
- router.back()} p="xs" radius="md">
-
-
+ router.back()} p="xs" radius="md">
+
+
Edit Pelayanan Telunjuk Sakti Desa
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/[id]/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/[id]/page.tsx
index 180534c2..c45e9e33 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/[id]/page.tsx
@@ -50,7 +50,7 @@ function DetailPelayananTelunjukSakti() {
const data = telunjukSaktiState.findUnique.data;
return (
-
+
{/* Tombol Kembali */}
+
{/* Header */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx
index b553773f..545120bf 100644
--- a/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/layanan/pelayanan_telunjuk_sakti_desa/page.tsx
@@ -1,5 +1,5 @@
/* eslint-disable react-hooks/exhaustive-deps */
-'use client'
+'use client';
import colors from '@/con/colors';
import {
@@ -18,7 +18,7 @@ import {
TableThead,
TableTr,
Text,
- Title
+ Title,
} from '@mantine/core';
import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
@@ -26,9 +26,10 @@ import { useEffect, useState } from 'react';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header';
import stateLayananDesa from '../../../_state/desa/layananDesa';
+import { useDebouncedValue } from '@mantine/hooks';
function PelayananTelunjukSakti() {
- const [search, setSearch] = useState("");
+ const [search, setSearch] = useState('');
return (
{
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
const filteredData = data || [];
if (loading || !data) {
return (
-
+
);
}
return (
-
-
+
+
- Daftar Pelayanan Telunjuk Sakti
- }
- color="blue"
- variant="light"
- onClick={() =>
- router.push('/admin/desa/layanan/pelayanan_telunjuk_sakti_desa/create')
- }
- >
- Tambah Baru
-
+
+ Daftar Pelayanan Telunjuk Sakti
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() =>
+ router.push('/admin/desa/layanan/pelayanan_telunjuk_sakti_desa/create')
+ }
+ >
+ Tambah Baru
+
-
-
+
+ {/* Desktop Table */}
+
+
- Nama
- Link
- Detail
+
+ Nama
+
+
+ Link
+
+
+ Detail
+
@@ -93,18 +105,19 @@ function ListPelayananTelunjukSakti({ search }: { search: string }) {
filteredData.map((item) => (
-
-
- {item.name}
-
-
+
+ {item.name}
+
-
-
-
-
-
+
+
+
- Detail
+
+ Detail
+
@@ -125,8 +140,8 @@ function ListPelayananTelunjukSakti({ search }: { search: string }) {
) : (
-
-
+
+
Tidak ada data layanan yang cocok
@@ -136,17 +151,68 @@ function ListPelayananTelunjukSakti({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+
+ {filteredData.map((item) => (
+
+
+
+ Nama
+
+
+ {item.name}
+
+
+
+
+ Link
+
+
+ {item.deskripsi}
+
+
+
+ router.push(
+ `/admin/desa/layanan/pelayanan_telunjuk_sakti_desa/${item.id}`
+ )
+ }
+ >
+
+
+ Detail
+
+
+
+ ))}
+
+ ) : (
+
+
+ Tidak ada data layanan yang cocok
+
+
+ )}
+
+
{
load(newPage, 10, search);
window.scrollTo({ top: 0, behavior: 'smooth' });
- }}
+ }
+ }
total={totalPages}
mt="md"
- mb="md"
color="blue"
radius="md"
/>
@@ -155,5 +221,4 @@ function ListPelayananTelunjukSakti({ search }: { search: string }) {
);
}
-export default PelayananTelunjukSakti;
-
+export default PelayananTelunjukSakti;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/penghargaan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/penghargaan/[id]/edit/page.tsx
index 53ec0c12..08084881 100644
--- a/src/app/admin/(dashboard)/desa/penghargaan/[id]/edit/page.tsx
+++ b/src/app/admin/(dashboard)/desa/penghargaan/[id]/edit/page.tsx
@@ -133,7 +133,7 @@ function EditPenghargaan() {
};
return (
-
+
{/* Tombol Back + Title */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/penghargaan/[id]/page.tsx b/src/app/admin/(dashboard)/desa/penghargaan/[id]/page.tsx
index fb8fb55e..ab55c5db 100644
--- a/src/app/admin/(dashboard)/desa/penghargaan/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/penghargaan/[id]/page.tsx
@@ -49,7 +49,7 @@ function DetailPenghargaan() {
const data = statePenghargaan.findUnique.data;
return (
-
+
router.back()}
diff --git a/src/app/admin/(dashboard)/desa/penghargaan/create/page.tsx b/src/app/admin/(dashboard)/desa/penghargaan/create/page.tsx
index a76063c9..d0d9bd7b 100644
--- a/src/app/admin/(dashboard)/desa/penghargaan/create/page.tsx
+++ b/src/app/admin/(dashboard)/desa/penghargaan/create/page.tsx
@@ -73,7 +73,7 @@ function CreatePenghargaan() {
};
return (
-
+
{/* Header */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/penghargaan/page.tsx b/src/app/admin/(dashboard)/desa/penghargaan/page.tsx
index 40e2420b..ddfa1a5b 100644
--- a/src/app/admin/(dashboard)/desa/penghargaan/page.tsx
+++ b/src/app/admin/(dashboard)/desa/penghargaan/page.tsx
@@ -25,6 +25,7 @@ import { useRouter } from 'next/navigation';
import { useEffect, useState } from 'react';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../_com/header';
+import { useDebouncedValue } from '@mantine/hooks';
function Penghargaan() {
const [search, setSearch] = useState("");
@@ -45,45 +46,49 @@ function Penghargaan() {
function ListPenghargaan({ search }: { search: string }) {
const state = useProxy(penghargaanState);
const router = useRouter();
+ const [debouncedSearch] = useDebouncedValue(search, 1000);
const { data, page, totalPages, loading, load } = state.findMany;
useEffect(() => {
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
- const filteredData = data || []
+ const filteredData = data || [];
// Loading state
if (loading || !data) {
return (
-
-
+
+
);
}
return (
-
+
-
- List Penghargaan
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/penghargaan/create')}
- >
- Tambah Baru
-
+
+ List Penghargaan
+ List Penghargaan
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/penghargaan/create')}
+ >
+ Tambah Baru
+
-
+
+ {/* Desktop Table */}
+
- Nama
- Deskripsi
- Aksi
+ Nama
+ Deskripsi
+ Aksi
@@ -91,31 +96,27 @@ function ListPenghargaan({ search }: { search: string }) {
filteredData.map((item) => (
-
-
- {item.name}
-
-
+
+ {item.name}
+
-
-
-
+
}
+ size="xs"
+ radius="md"
+ variant="light"
+ color="blue"
+ leftSection={ }
onClick={() =>
router.push(`/admin/desa/penghargaan/${item.id}`)
}
@@ -127,9 +128,9 @@ function ListPenghargaan({ search }: { search: string }) {
))
) : (
-
-
-
+
+
+
Tidak ada data penghargaan yang cocok
@@ -139,7 +140,54 @@ function ListPenghargaan({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+ Nama
+
+
+ {item.name}
+
+
+
+
+ Deskripsi
+
+
+
+
+
+
+ }
+ onClick={() =>
+ router.push(`/admin/desa/penghargaan/${item.id}`)
+ }
+ >
+ Detail
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data penghargaan yang cocok
+
+
+ )}
+
+
{/* ✅ Scroll horizontal wrapper */}
-
-
+
+
+ {tabs.map((tab, i) => (
+
+ {tab.label}
+
+ ))}
+
+
+
+
+
+
- {tabs.map((tab, i) => (
-
- {tab.label}
-
- ))}
-
-
+
+
+ {tabs.map((tab, i) => (
+
+ {tab.label}
+
+ ))}
+
+
+
{tabs.map((tab, i) => (
+
{/* Header */}
+
{/* Header dengan back button */}
(null)
+ const [modalHapus, setModalHapus] = useState(false);
+ const [selectedId, setSelectedId] = useState(null);
+ const [debouncedSearch] = useDebouncedValue(search, 500);
const { data, page, totalPages, loading, load } = listDataState.findMany;
useEffect(() => {
- load(1, 10, search)
- }, [search])
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
const handleDelete = () => {
if (selectedId) {
- listDataState.delete.delete(selectedId)
- setModalHapus(false)
- setSelectedId(null)
- load(page, 10, search)
+ listDataState.delete.delete(selectedId);
+ setModalHapus(false);
+ setSelectedId(null);
+ load(page, 10, search);
}
- }
+ };
- const filteredData = data || []
+ const filteredData = data || [];
if (loading || !data) {
return (
-
+
- )
+ );
}
return (
-
-
-
-
- List Kategori Pengumuman
+
+
+
+
+
+ List Kategori Pengumuman
+
}
color="blue"
variant="light"
- onClick={() => router.push('/admin/desa/pengumuman/kategori-pengumuman/create')}
+ onClick={() =>
+ router.push('/admin/desa/pengumuman/kategori-pengumuman/create')
+ }
>
Tambah Baru
-
-
+
+
+
+ List Kategori Pengumuman
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() =>
+ router.push('/admin/desa/pengumuman/kategori-pengumuman/create')
+ }
+ fullWidth
+ >
+ Tambah Baru
+
+
+
+
+
+
- No
- Nama
- Edit
- Hapus
+
+
+ Nama
+
+
+
+
+ Edit
+
+
+
+
+ Hapus
+
+
{filteredData.length > 0 ? (
- filteredData.map((item, index) => (
+ filteredData.map((item) => (
- {(page - 1) * 10 + index + 1}
-
-
- {item.name}
+
+ {item.name}
+
router.push(`/admin/desa/pengumuman/kategori-pengumuman/${item.id}`)}
+ variant="light"
+ color="green"
+ onClick={() =>
+ router.push(
+ `/admin/desa/pengumuman/kategori-pengumuman/${item.id}`
+ )
+ }
+ size="compact-sm"
>
-
+
{
- setSelectedId(item.id)
- setModalHapus(true)
- }}>
-
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ size="compact-sm"
+ >
+
@@ -124,8 +179,10 @@ function ListKategoriPengumuman({ search }: { search: string }) {
) : (
-
- Tidak ada data kategori pengumuman yang cocok
+
+
+ Tidak ada data kategori pengumuman yang cocok
+
@@ -133,6 +190,71 @@ function ListKategoriPengumuman({ search }: { search: string }) {
+
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+
+ Nama
+
+
+ {item.name}
+
+
+
+
+ router.push(
+ `/admin/desa/pengumuman/kategori-pengumuman/${item.id}`
+ )
+ }
+ size="compact-xs"
+ >
+
+
+ {
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ size="compact-xs"
+ >
+
+
+
+
+
+ ))
+ ) : (
+
+
+
+ Tidak ada data kategori pengumuman yang cocok
+
+
+
+ )}
+
@@ -153,7 +275,7 @@ function ListKategoriPengumuman({ search }: { search: string }) {
text='Apakah anda yakin ingin menghapus kategori Pengumuman ini?'
/>
- )
+ );
}
-export default KategoriPengumuman;
+export default KategoriPengumuman;
\ No newline at end of file
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 cbeeceef..511fcaeb 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
@@ -111,7 +111,7 @@ function EditPengumuman() {
};
return (
-
+
+
router.back()}
@@ -61,7 +61,7 @@ export default function DetailPengumuman() {
-
-
- Kategori
-
-
- {data?.CategoryPengumuman?.name || '-'}
-
-
@@ -92,6 +84,15 @@ export default function DetailPengumuman() {
+
+
+ Kategori
+
+
+ {data?.CategoryPengumuman?.name || '-'}
+
+
+
Deskripsi
diff --git a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/create/page.tsx b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/create/page.tsx
index 44a40fb0..45b400a3 100644
--- a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/create/page.tsx
+++ b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/create/page.tsx
@@ -55,7 +55,7 @@ function CreatePengumuman() {
};
return (
-
+
{/* Header */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/page.tsx b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/page.tsx
index 358fc1c5..fb7cfd87 100644
--- a/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/page.tsx
+++ b/src/app/admin/(dashboard)/desa/pengumuman/list-pengumuman/page.tsx
@@ -19,7 +19,7 @@ import {
Text,
Title
} from '@mantine/core';
-import { useShallowEffect } from '@mantine/hooks';
+import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { IconCircleDashedPlus, IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { useState } from 'react';
@@ -46,44 +46,56 @@ function Pengumuman() {
function ListPengumuman({ search }: { search: string }) {
const pengumumanState = useProxy(stateDesaPengumuman);
const router = useRouter();
+ const [debouncedSearch] = useDebouncedValue(search, 1000);
const { data, page, totalPages, loading, load } = pengumumanState.pengumuman.findMany;
useShallowEffect(() => {
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
const filteredData = data || [];
if (loading || !data) {
return (
-
+
);
}
return (
-
-
-
- Daftar Pengumuman
+
+
+
+
+ Daftar Pengumuman
+
}
color="blue"
variant="light"
onClick={() => router.push('/admin/desa/pengumuman/list-pengumuman/create')}
+ fz={{ base: 'sm', md: 'md' }}
>
Tambah Baru
-
-
+
+ {/* Desktop Table */}
+
+
- Judul
- Kategori
- Detail
+
+ Judul
+
+
+ Kategori
+
+
+ Detail
+
@@ -91,14 +103,12 @@ function ListPengumuman({ search }: { search: string }) {
filteredData.map((item) => (
-
-
- {item.judul}
-
-
+
+ {item.judul}
+
-
+
{item.CategoryPengumuman?.name || '-'}
@@ -109,9 +119,12 @@ function ListPengumuman({ search }: { search: string }) {
onClick={() =>
router.push(`/admin/desa/pengumuman/list-pengumuman/${item.id}`)
}
+ fz="sm"
+ px="sm"
+ py="xs"
>
-
- Detail
+
+ Detail
@@ -119,8 +132,10 @@ function ListPengumuman({ search }: { search: string }) {
) : (
-
- Tidak ada pengumuman yang cocok
+
+
+ Tidak ada pengumuman yang cocok
+
@@ -128,7 +143,59 @@ function ListPengumuman({ search }: { search: string }) {
+
+ {/* Mobile Card List */}
+
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+
+ Judul
+
+
+ {item.judul}
+
+
+
+
+ Kategori
+
+
+ {item.CategoryPengumuman?.name || '-'}
+
+
+
+
+ router.push(`/admin/desa/pengumuman/list-pengumuman/${item.id}`)
+ }
+ fullWidth
+ fz="sm"
+ mt="xs"
+ >
+
+ Detail
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada pengumuman yang cocok
+
+
+ )}
+
+
+
+
+
{/* Header dengan back button */}
(null)
+ const [modalHapus, setModalHapus] = useState(false);
+ const [selectedId, setSelectedId] = useState(null);
const { data, page, totalPages, loading, load } = listDataState.findMany;
+ const [debouncedSearch] = useDebouncedValue(search, 1000);
useEffect(() => {
- load(1, 10, search)
- }, [search])
+ load(1, 10, debouncedSearch);
+ }, [debouncedSearch]);
const handleDelete = () => {
if (selectedId) {
- listDataState.delete.delete(selectedId)
- setModalHapus(false)
- setSelectedId(null)
- load(page, 10, search)
+ listDataState.delete.delete(selectedId);
+ setModalHapus(false);
+ setSelectedId(null);
+ load(page, 10, search);
}
- }
+ };
- const filteredData = data || []
+ const filteredData = data || [];
if (loading || !data) {
return (
-
+
- )
+ );
}
return (
-
+
-
-
- List Kategori Potensi
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/potensi/kategori-potensi/create')}
- >
- Tambah Baru
-
+
+
+
+ List Kategori Potensi
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() =>
+ router.push('/admin/desa/potensi/kategori-potensi/create')
+ }
+ >
+ Tambah Baru
+
-
-
+ {/* Desktop Table */}
+
+
- No
- Nama
- Edit
- Hapus
+
+
+ Nama
+
+
+
+
+ Edit
+
+
+
+
+ Hapus
+
+
{filteredData.length > 0 ? (
- filteredData.map((item, index) => (
+ filteredData.map((item) => (
- {(page - 1) * 10 + index + 1}
+
+ {item.nama}
+
- {item.nama}
-
-
- router.push(`/admin/desa/potensi/kategori-potensi/${item.id}`)}>
+
+ router.push(
+ `/admin/desa/potensi/kategori-potensi/${item.id}`
+ )
+ }
+ >
{
- setSelectedId(item.id)
- setModalHapus(true)
- }}>
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ >
@@ -114,8 +157,10 @@ function ListKategoriPotensi({ search }: { search: string }) {
) : (
-
- Tidak ada data kategori potensi yang cocok
+
+
+ Tidak ada data kategori potensi yang cocok
+
@@ -123,10 +168,70 @@ function ListKategoriPotensi({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item, index) => (
+
+
+
+
+ No
+
+
+ {(page - 1) * 10 + index + 1}
+
+
+
+
+ Nama
+
+
+ {item.nama}
+
+
+
+
+ router.push(
+ `/admin/desa/potensi/kategori-potensi/${item.id}`
+ )
+ }
+ >
+
+
+ {
+ setSelectedId(item.id);
+ setModalHapus(true);
+ }}
+ >
+
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data kategori potensi yang cocok
+
+
+ )}
+
-
+
load(newPage, 10, search)}
@@ -143,7 +248,7 @@ function ListKategoriPotensi({ search }: { search: string }) {
text='Apakah anda yakin ingin menghapus kategori Potensi ini?'
/>
- )
+ );
}
-export default KategoriPotensi;
+export default KategoriPotensi;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/potensi/list-potensi/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/potensi/list-potensi/[id]/edit/page.tsx
index bf2197e6..2bf0a23c 100644
--- a/src/app/admin/(dashboard)/desa/potensi/list-potensi/[id]/edit/page.tsx
+++ b/src/app/admin/(dashboard)/desa/potensi/list-potensi/[id]/edit/page.tsx
@@ -143,7 +143,7 @@ function EditPotensi() {
};
return (
-
+
+
router.back()}
@@ -52,7 +52,7 @@ export default function DetailPotensi() {
+
{/* Header */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/potensi/list-potensi/page.tsx b/src/app/admin/(dashboard)/desa/potensi/list-potensi/page.tsx
index 9ee2259b..f896e5b4 100644
--- a/src/app/admin/(dashboard)/desa/potensi/list-potensi/page.tsx
+++ b/src/app/admin/(dashboard)/desa/potensi/list-potensi/page.tsx
@@ -26,6 +26,7 @@ import { useEffect, useState } from 'react';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header';
import potensiDesaState from '../../../_state/desa/potensi';
+import { useDebouncedValue } from '@mantine/hooks';
function Potensi() {
const [search, setSearch] = useState("");
@@ -46,6 +47,7 @@ function Potensi() {
function ListPotensi({ search }: { search: string }) {
const potensiState = useProxy(potensiDesaState);
const router = useRouter();
+ const [debouncedSearch] = useDebouncedValue(search, 1000);
const {
data,
@@ -57,41 +59,61 @@ function ListPotensi({ search }: { search: string }) {
useEffect(() => {
potensiState.kategoriPotensi.findMany.load();
- load(page, 10, search);
- }, [page, search]);
+ load(page, 10, debouncedSearch);
+ }, [page, debouncedSearch]);
- const filteredData = data || []
+ const filteredData = data || [];
if (loading || !data) {
return (
-
+
);
}
return (
-
-
-
- Daftar Potensi Desa
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/potensi/list-potensi/create')}
- >
- Tambah Baru
-
+
+
+
+
+ Daftar Potensi Desa
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/potensi/list-potensi/create')}
+ >
+ Tambah Baru
+
-
-
+
+ {/* Desktop Table */}
+
+
- Judul
- Kategori
- Deskripsi
- Detail
+
+
+ Judul
+
+
+
+
+ Kategori
+
+
+
+
+ Deskripsi
+
+
+
+
+ Detail
+
+
@@ -99,27 +121,23 @@ function ListPotensi({ search }: { search: string }) {
filteredData.map((item) => (
-
-
- {item.name}
-
-
+
+ {item.name}
+
-
- {item.kategori?.nama || '-'}
-
+
+ {item.kategori?.nama || '-'}
+
-
-
-
+
-
- Tidak ada data potensi yang cocok
+
+
+ Tidak ada data potensi yang cocok
+
@@ -147,7 +167,64 @@ function ListPotensi({ search }: { search: string }) {
+
+ {/* Mobile Cards */}
+
+ {filteredData.length > 0 ? (
+
+ {filteredData.map((item) => (
+
+
+
+ Judul
+
+
+ {item.name}
+
+
+
+
+ Kategori
+
+
+ {item.kategori?.nama || '-'}
+
+
+
+
+ Deskripsi
+
+
+
+ }
+ onClick={() => router.push(`/admin/desa/potensi/list-potensi/${item.id}`)}
+ w="100%"
+ >
+ Detail
+
+
+ ))}
+
+ ) : (
+
+
+ Tidak ada data potensi yang cocok
+
+
+ )}
+
+
{/* ✅ Scroll horizontal wrapper */}
-
-
+
+
+ {tabs.map((tab, i) => (
+
+ {tab.label}
+
+ ))}
+
+
+
+
+
+
- {tabs.map((tab, i) => (
-
- {tab.label}
-
- ))}
-
-
+
+
+ {tabs.map((tab, i) => (
+
+ {tab.label}
+
+ ))}
+
+
+
{tabs.map((tab, i) => (
+
@@ -166,7 +166,7 @@ function Page() {
// 🧱 UI utama
return (
-
+
{/* Header */}
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/maskot_desa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/maskot_desa/page.tsx
index 16bd9fda..82d56817 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/maskot_desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/maskot_desa/page.tsx
@@ -170,7 +170,7 @@ function Page() {
// Loading state
if (maskotState.findUnique.loading || maskotState.update.loading) {
return (
-
+
Memuat data...
@@ -181,7 +181,7 @@ function Page() {
// Error state
if (maskotState.findUnique.error) {
return (
-
+
@@ -196,7 +196,7 @@ function Page() {
}
return (
-
+
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/sejarah_desa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/sejarah_desa/page.tsx
index 72ab0b41..f0b084eb 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/sejarah_desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/sejarah_desa/page.tsx
@@ -91,7 +91,7 @@ function Page() {
}, [params?.id, router]);
// 🔄 Check if form has changes
-
+
// 🔁 Reset Form to Original Data
const handleResetForm = () => {
@@ -149,7 +149,7 @@ function Page() {
// 🔄 Loading State
if (isLoading) {
return (
-
+
@@ -165,7 +165,7 @@ function Page() {
// ❌ Error State
if (loadError) {
return (
-
+
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/visi_misi_desa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/visi_misi_desa/page.tsx
index 98cac0c9..62a45c04 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/visi_misi_desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/visi_misi_desa/page.tsx
@@ -126,7 +126,7 @@ function Page() {
// ⏳ Loading
if (isLoading) {
return (
-
+
@@ -142,7 +142,7 @@ function Page() {
// ❌ Error
if (loadError) {
return (
-
+
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-desa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-desa/page.tsx
index bdee883c..e40dbcce 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-desa/page.tsx
@@ -1,7 +1,7 @@
'use client'
import colors from '@/con/colors';
-import { Box, Button, Card, Center, Divider, Grid, GridCol, Image, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
+import { Box, Button, Card, Center, Divider, Group, Image, Paper, SimpleGrid, Stack, Text, Title } from '@mantine/core';
import { IconEdit } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { useEffect } from 'react';
@@ -30,208 +30,558 @@ function Page() {
Preview Profil Desa
{/* Sejarah Desa */}
- {sejarah && (
-
-
-
- Preview Sejarah Desa
-
-
- }
- radius="md"
- onClick={() => router.push(`/admin/desa/profil/profil-desa/${sejarah.id}/sejarah_desa`)}
- >
- Edit
-
-
-
-
-
-
-
-
-
-
-
- {sejarah.judul}
-
-
-
-
-
-
-
-
- )}
+
+ {sejarah && (
+
+
+ Preview Sejarah Desa
+ }
+ radius="md"
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${sejarah.id}/sejarah_desa`)}
+ >
+ Edit
+
+
+
+
+
+
+
+
+
+
+
+ {sejarah.judul}
+
+
+
+
+
+
+
+
+
+
+ )}
+
+
+
+ {sejarah && (
+
+ {/* Header */}
+
+
+ Preview Sejarah Desa
+
+
+ }
+ onClick={() =>
+ router.push(`/admin/desa/profil/profil-desa/${sejarah.id}/sejarah_desa`)
+ }
+ >
+ Edit
+
+
+
+ {/* Content Wrapper */}
+
+
+ {/* Logo + Title */}
+
+
+
+
+
+ {sejarah.judul}
+
+
+
+
+
+
+ {/* Deskripsi */}
+
+
+
+
+
+
+ )}
+
{/* Visi Misi Desa */}
- {visiMisi && (
-
-
-
+
+ {visiMisi && (
+
+
Preview Visi Misi Desa
-
-
- }
- radius="md"
- onClick={() => router.push(`/admin/desa/profil/profil-desa/${visiMisi.id}/visi_misi_desa`)}
- >
- Edit
-
-
-
+ }
+ radius="md"
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${visiMisi.id}/visi_misi_desa`)}
+ >
+ Edit
+
+
-
-
-
-
-
-
-
-
- Visi Misi Desa
-
-
-
-
- Visi Desa
-
- Misi Desa
-
-
-
-
- )}
+
+
+
+
+
+
+
+
+
+ Visi Misi Desa
+
+
+
+
+
+ Visi Desa
+
+
+
+ Misi Desa
+
+
+
+
+
+ )}
+
+
+
+ {visiMisi && (
+
+ {/* Header */}
+
+
+ Preview Visi Misi Desa
+
+
+ }
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${visiMisi.id}/visi_misi_desa`)}
+ >
+ Edit
+
+
+
+ {/* Content Wrapper */}
+
+
+ {/* Logo + Title */}
+
+
+
+
+
+ Visi Misi Desa
+
+
+
+
+
+
+
+ Visi Desa
+
+
+
+
+ Misi Desa
+
+
+
+
+
+ )}
+
{/* Lambang Desa */}
- {lambang && (
-
-
-
+
+ {lambang && (
+
+
Preview Lambang Desa
-
-
- }
- radius="md"
- onClick={() => router.push(`/admin/desa/profil/profil-desa/${lambang.id}/lambang_desa`)}
- >
- Edit
-
-
-
+ }
+ radius="md"
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${lambang.id}/lambang_desa`)}
+ >
+ Edit
+
+
-
-
-
-
-
-
-
-
- {lambang.judul}
-
-
-
-
-
-
-
-
- )}
+
+
+
+
+
+
+
+
+ {lambang.judul}
+
+
+
+
+
+
+
+
+
+
+ )}
+
+
+
+ {lambang && (
+
+ {/* Header */}
+
+
+ Preview Lambang Desa
+
+
+ }
+ onClick={() =>
+ router.push(`/admin/desa/profil/profil-desa/${lambang.id}/lambang_desa`)
+ }
+ >
+ Edit
+
+
+
+ {/* Content Wrapper */}
+
+
+ {/* Logo + Title */}
+
+
+
+
+
+ {lambang.judul}
+
+
+
+
+
+
+ {/* Deskripsi */}
+
+
+
+
+
+
+ )}
+
{/* Maskot Desa */}
- {maskot && (
-
-
-
+
+ {maskot && (
+
+
Preview Maskot Desa
-
-
- }
- radius="md"
- onClick={() => router.push(`/admin/desa/profil/profil-desa/${maskot.id}/maskot_desa`)}
- >
- Edit
-
-
-
+ }
+ radius="md"
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${maskot.id}/maskot_desa`)}
+ >
+ Edit
+
+
-
-
-
-
-
-
-
-
- Maskot Desa
-
-
-
-
-
-
-
- {maskot.images.map((img, idx) => (
-
-
-
-
- {img.label}
-
- ))}
-
-
-
-
-
- )}
+
+
+
+
+
+
+
+
+ Maskot Desa
+
+
+
+
+
+
+
+
+
+ {maskot.images.map((img, idx) => (
+
+
+
+
+ {img.label}
+
+ ))}
+
+
+
+
+
+ )}
+
+
+
+ {maskot && (
+
+ {/* Header */}
+
+
+ Preview Maskot Desa
+
+
+ }
+ onClick={() =>
+ router.push(`/admin/desa/profil/profil-desa/${maskot.id}/maskot_desa`)
+ }
+ >
+ Edit
+
+
+
+ {/* Content Wrapper */}
+
+
+ {/* Logo + Title */}
+
+
+
+
+
+ Maskot Desa
+
+
+
+
+
+
+ {/* Deskripsi */}
+
+
+
+
+
+ {maskot.images.map((img, idx) => (
+
+
+
+
+ {img.label}
+
+ ))}
+
+
+
+
+
+ )}
+
);
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
index 8cf2e438..c83faf16 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
@@ -127,7 +127,7 @@ function EditPerbekelDariMasaKeMasa() {
};
return (
-
+
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
index bb0e2eea..95653279 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
@@ -40,7 +40,7 @@ function DetailPerbekelDariMasa() {
const data = state.findUnique.data;
return (
-
+
router.back()}
@@ -52,7 +52,7 @@ function DetailPerbekelDariMasa() {
+
{/* Back button + Title */}
router.back()} p="xs" radius="md">
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
index 63982af1..20a1dd0b 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
@@ -1,7 +1,24 @@
'use client'
import colors from '@/con/colors';
-import { Box, Button, Center, Group, Pagination, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core';
-import { useShallowEffect } from '@mantine/hooks';
+import {
+ Box,
+ Button,
+ Center,
+ Group,
+ Pagination,
+ Paper,
+ Skeleton,
+ Stack,
+ Table,
+ TableTbody,
+ TableTd,
+ TableTh,
+ TableThead,
+ TableTr,
+ Text,
+ Title,
+} from '@mantine/core';
+import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { IconDeviceImacCog, IconPlus, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { useState } from 'react';
@@ -29,43 +46,47 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
const state = useProxy(stateProfileDesa.mantanPerbekel)
const router = useRouter();
const { data, page, totalPages, loading, load } = state.findMany;
+ const [debouncedSearch] = useDebouncedValue(search, 1000); // 500ms delay
useShallowEffect(() => {
- load(page, 10, search)
- }, [page, search]);
+ load(page, 10, debouncedSearch)
+ }, [page, debouncedSearch]);
const filteredData = data || [];
if (loading || !data) {
return (
-
+
);
}
return (
-
-
-
- List Perbekel Dari Masa Ke Masa
- }
- color="blue"
- variant="light"
- onClick={() => router.push('/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/create')}
- >
- Tambah Baru
-
+
+
+
+
+ List Perbekel Dari Masa Ke Masa
+
+ }
+ color="blue"
+ variant="light"
+ onClick={() => router.push('/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/create')}
+ >
+ Tambah Baru
+
-
-
+ {/* Desktop Table */}
+
+
- Nama Perbekel
- Periode
- Aksi
+ Nama Perbekel
+ Periode
+ Aksi
@@ -73,36 +94,32 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
filteredData.map((item) => (
-
- {item.nama}
-
+ {item.nama}
-
- {item.periode}
-
+ {item.periode}
-
- }
- onClick={() => router.push(`/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/${item.id}`)}
- >
- Detail
-
-
+ }
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/${item.id}`)}
+ >
+ Detail
+
))
) : (
-
- Tidak ada data perbekel yang cocok
+
+
+ Tidak ada data perbekel yang cocok
+
@@ -110,6 +127,47 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
+
+ {/* Mobile Card View */}
+
+
+ {filteredData.length > 0 ? (
+ filteredData.map((item) => (
+
+
+
+ Nama Perbekel
+ {item.nama}
+
+
+ Periode
+ {item.periode}
+
+
+ }
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/${item.id}`)}
+ fullWidth
+ >
+ Detail
+
+
+
+
+ ))
+ ) : (
+
+
+ Tidak ada data perbekel yang cocok
+
+
+ )}
+
+
@@ -120,8 +178,8 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
window.scrollTo({ top: 0, behavior: 'smooth' });
}}
total={totalPages}
- mt="md"
- mb="md"
+ mt={{ base: 'sm', md: 'md' }}
+ mb={{ base: 'sm', md: 'md' }}
color="blue"
radius="md"
/>
@@ -130,4 +188,4 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
);
}
-export default PerbekelDariMasaKeMasa;
+export default PerbekelDariMasaKeMasa;
\ No newline at end of file
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
index bd26f5c1..a135b37e 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
@@ -97,7 +97,7 @@ function ProfilePerbekel() {
}
return (
-
+
{/* Header */}
diff --git a/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
index 53ad1d8c..d06dcb40 100644
--- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
@@ -33,18 +33,18 @@ function Page() {
{/* Header + tombol edit */}
- Preview Profil PPID
+
- }
- radius="md"
- onClick={() => router.push(`/admin/desa/profil/profil-perbekel/${perbekel.id}`)}
- >
- Edit
-
+ }
+ radius="md"
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel/${perbekel.id}`)}
+ >
+ Edit
+
@@ -58,7 +58,13 @@ function Page() {
-
+
Profil Pimpinan Badan Publik Desa Darmasaba
@@ -86,25 +92,55 @@ function Page() {
className="glass3"
style={{ mt: -30, boxShadow: '0 4px 20px rgba(0,0,0,0.15)' }}
>
-
- I.B. Surya Prabhawa Manuaba, S.H., M.H.
+
+ I.B. Surya Prabhawa Manuaba, S.H., M.H.
{/* Biodata & Info */}
- Biodata
-
+
+
- Pengalaman
-
+
+
- Pengalaman Organisasi
-
+
+
- Program Kerja Unggulan
-
+
+
@@ -112,4 +148,4 @@ function Page() {
);
}
-export default Page;
+export default Page;
\ No newline at end of file