From f436aa2ef06ad07631827a22766d68ac1646a921 Mon Sep 17 00:00:00 2001 From: nico Date: Fri, 2 Jan 2026 16:33:15 +0800 Subject: [PATCH] Fix QC Kak Inno Mobile Done FIx QC Kak Ayu Mobile Admin Done Fix Tampilan Admin Mobile Device All Menu Done --- .../(dashboard)/_state/desa/pengumuman.ts | 2 +- .../admin/(dashboard)/_state/desa/potensi.ts | 2 +- .../desa/profil/profil-perbekel/page.tsx | 32 +- .../info-teknologi-tepat-guna/page.tsx | 4 +- .../kategori-desa-anti-korupsi/page.tsx | 10 +- .../list-desa-anti-korupsi/page.tsx | 7 +- .../responden/page.tsx | 2 +- .../landing-page/profil/media-sosial/page.tsx | 62 ++-- .../landing-page/profil/pejabat-desa/page.tsx | 30 +- .../data-lingkungan-desa/[id]/edit/page.tsx | 2 +- .../data-lingkungan-desa/[id]/page.tsx | 8 +- .../data-lingkungan-desa/create/page.tsx | 2 +- .../lingkungan/data-lingkungan-desa/page.tsx | 226 ++++++++++--- .../edukasi-lingkungan/_lib/layouTabs.tsx | 105 +++--- .../edit/page.tsx | 2 +- .../contoh-kegiatan-desa-darmasaba/page.tsx | 10 +- .../lingkungan/edukasi-lingkungan/layout.tsx | 21 ++ .../edit/page.tsx | 2 +- .../materi-edukasi-yang-diberikan/page.tsx | 10 +- .../tujuan-edukasi-lingkungan/edit/page.tsx | 2 +- .../tujuan-edukasi-lingkungan/page.tsx | 36 +-- .../gotong-royong/_lib/layoutTabs.tsx | 101 ++++-- .../kategori-kegiatan/[id]/page.tsx | 2 +- .../kategori-kegiatan/create/page.tsx | 2 +- .../gotong-royong/kategori-kegiatan/page.tsx | 158 +++++++-- .../kegiatan-desa/[id]/edit/page.tsx | 2 +- .../gotong-royong/kegiatan-desa/[id]/page.tsx | 12 +- .../kegiatan-desa/create/page.tsx | 2 +- .../gotong-royong/kegiatan-desa/page.tsx | 145 +++++++-- .../lingkungan/gotong-royong/layout.tsx | 22 ++ .../konservasi-adat-bali/_lib/layoutTabs.tsx | 105 +++--- .../edit/page.tsx | 2 +- .../page.tsx | 44 ++- .../filosofi-tri-hita-karana/edit/page.tsx | 2 +- .../filosofi-tri-hita-karana/page.tsx | 44 ++- .../konservasi-adat-bali/layout.tsx | 21 ++ .../nilai-konservasi-adat/edit/page.tsx | 2 +- .../nilai-konservasi-adat/page.tsx | 40 ++- .../[id]/edit/page.tsx | 2 +- .../[id]/page.tsx | 4 +- .../create/page.tsx | 2 +- .../keterangan-bank-sampah-terdekat/page.tsx | 129 ++++++-- .../[id]/page.tsx | 2 +- .../create/page.tsx | 2 +- .../page.tsx | 176 ++++++++-- .../program-penghijauan/[id]/edit/page.tsx | 2 +- .../program-penghijauan/[id]/page.tsx | 8 +- .../program-penghijauan/create/page.tsx | 2 +- .../lingkungan/program-penghijauan/page.tsx | 305 ++++++++++++++---- .../beasiswa-desa/_lib/layoutTabs.tsx | 101 ++++-- .../beasiswa-pendaftar/[id]/page.tsx | 2 +- .../beasiswa-desa/beasiswa-pendaftar/page.tsx | 181 ++++++++--- .../keunggulan-program/[id]/page.tsx | 2 +- .../keunggulan-program/create/page.tsx | 2 +- .../beasiswa-desa/keunggulan-program/page.tsx | 114 +++++-- .../pendidikan/beasiswa-desa/layout.tsx | 21 ++ .../_lib/layoutTabs.tsx | 101 ++++-- .../fasilitas-yang-disediakan/edit/page.tsx | 2 +- .../fasilitas-yang-disediakan/page.tsx | 84 +++-- .../bimbingan-belajar-desa/layout.tsx | 22 ++ .../lokasi-dan-jadwal/edit/page.tsx | 2 +- .../lokasi-dan-jadwal/page.tsx | 85 +++-- .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 85 +++-- .../pendidikan/data-pendidikan/[id]/page.tsx | 2 +- .../data-pendidikan/create/page.tsx | 2 +- .../info-sekolah/_lib/layoutTabs.tsx | 101 ++++-- .../jenjang-pendidikan/[id]/page.tsx | 2 +- .../jenjang-pendidikan/create/page.tsx | 2 +- .../info-sekolah/jenjang-pendidikan/page.tsx | 163 +++++++--- .../pendidikan/info-sekolah/layout.tsx | 22 ++ .../info-sekolah/lembaga/[id]/edit/page.tsx | 2 +- .../info-sekolah/lembaga/[id]/page.tsx | 4 +- .../info-sekolah/lembaga/create/page.tsx | 2 +- .../pendidikan/info-sekolah/lembaga/page.tsx | 143 ++++++-- .../info-sekolah/pengajar/[id]/edit/page.tsx | 2 +- .../info-sekolah/pengajar/[id]/page.tsx | 4 +- .../info-sekolah/pengajar/create/page.tsx | 2 +- .../pendidikan/info-sekolah/pengajar/page.tsx | 129 ++++++-- .../info-sekolah/siswa/[id]/edit/page.tsx | 2 +- .../info-sekolah/siswa/[id]/page.tsx | 4 +- .../info-sekolah/siswa/create/page.tsx | 2 +- .../pendidikan/info-sekolah/siswa/page.tsx | 166 +++++++--- .../pendidikan-non-formal/_lib/layoutTabs.tsx | 99 ++++-- .../edit/page.tsx | 2 +- .../page.tsx | 57 ++-- .../pendidikan-non-formal/layout.tsx | 22 ++ .../tempat-kegiatan/edit/page.tsx | 2 +- .../tempat-kegiatan/page.tsx | 56 ++-- .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 57 ++-- .../perpustakaan-digital/_lib/layoutTabs.tsx | 101 ++++-- .../data-perpustakaan/[id]/edit/page.tsx | 2 +- .../data-perpustakaan/[id]/page.tsx | 4 +- .../data-perpustakaan/create/page.tsx | 2 +- .../data-perpustakaan/page.tsx | 213 ++++++++++-- .../kategori-buku/[id]/page.tsx | 2 +- .../kategori-buku/create/page.tsx | 2 +- .../kategori-buku/page.tsx | 152 ++++++--- .../perpustakaan-digital/layout.tsx | 21 ++ .../perpustakaan-digital/peminjam/page.tsx | 144 +++++++-- .../_lib/layoutTabs.tsx | 101 ++++-- .../program-pendidikan-anak/layout.tsx | 21 ++ .../program-unggulan/edit/page.tsx | 2 +- .../program-unggulan/page.tsx | 57 ++-- .../tujuan-program/edit/page.tsx | 2 +- .../tujuan-program/page.tsx | 61 +++- .../responden/page.tsx | 5 - .../ppid/permohonan-informasi-publik/page.tsx | 4 +- .../page.tsx | 4 +- .../admin/(dashboard)/user&role/layout.tsx | 95 ++++-- .../(dashboard)/user&role/role/[id]/page.tsx | 2 +- .../user&role/role/create/page.tsx | 2 +- .../admin/(dashboard)/user&role/role/page.tsx | 168 +++++++--- .../admin/(dashboard)/user&role/user/page.tsx | 204 +++++++++--- .../_lib/landing_page/apbdes/findMany.ts | 23 +- .../info-sekolah-paud/pengajar/findMany.ts | 3 - 117 files changed, 3812 insertions(+), 1361 deletions(-) diff --git a/src/app/admin/(dashboard)/_state/desa/pengumuman.ts b/src/app/admin/(dashboard)/_state/desa/pengumuman.ts index dd289918..702b006d 100644 --- a/src/app/admin/(dashboard)/_state/desa/pengumuman.ts +++ b/src/app/admin/(dashboard)/_state/desa/pengumuman.ts @@ -68,7 +68,7 @@ const category = proxy({ const res = await ApiFetch.api.desa.kategoripengumuman[ "findMany" ].get({ - query: { page, limit }, + query: { page, limit, search }, }); if (res.status === 200 && res.data?.success) { diff --git a/src/app/admin/(dashboard)/_state/desa/potensi.ts b/src/app/admin/(dashboard)/_state/desa/potensi.ts index 0c158b38..3eb55c54 100644 --- a/src/app/admin/(dashboard)/_state/desa/potensi.ts +++ b/src/app/admin/(dashboard)/_state/desa/potensi.ts @@ -65,7 +65,7 @@ const potensiDesa = proxy({ const res = await ApiFetch.api.desa.potensi[ "find-many" ].get({ - query: { page, limit }, + query: { page, limit, search }, }); if (res.status === 200 && res.data?.success) { 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 d06dcb40..d3b1cb21 100644 --- a/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx +++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx @@ -1,7 +1,7 @@ 'use client' import colors from '@/con/colors'; -import { Box, Button, Center, Divider, Grid, GridCol, Image, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { Box, Button, Center, Divider, Grid, GridCol, Group, Image, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; @@ -31,22 +31,18 @@ function Page() { {/* Header + tombol edit */} - - - - </GridCol> - <GridCol span={{ base: 12, md: 1 }}> - <Button - c="green" - variant="light" - leftSection={<IconEdit size={18} stroke={2} />} - radius="md" - onClick={() => router.push(`/admin/desa/profil/profil-perbekel/${perbekel.id}`)} - > - Edit - </Button> - </GridCol> - </Grid> + <Group justify="space-between"> + <Title order={2} c={colors['blue-button']} lh={1.2}>Profil Perbekel + + {/* Card Profil */} @@ -60,7 +56,7 @@ function Page() { Deskripsi Singkat - + + - + + {item.iconUrl || item.noTelp || '-'} + + + + + + + )) ) : ( diff --git a/src/app/admin/(dashboard)/landing-page/profil/pejabat-desa/page.tsx b/src/app/admin/(dashboard)/landing-page/profil/pejabat-desa/page.tsx index 9c54faab..6655dd19 100644 --- a/src/app/admin/(dashboard)/landing-page/profil/pejabat-desa/page.tsx +++ b/src/app/admin/(dashboard)/landing-page/profil/pejabat-desa/page.tsx @@ -1,7 +1,7 @@ 'use client' import profileLandingPageState from '@/app/admin/(dashboard)/_state/landing-page/profile'; import colors from '@/con/colors'; -import { Box, Button, Center, Divider, Grid, GridCol, Image, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; +import { Box, Button, Center, Divider, Grid, GridCol, Group, Image, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { useRouter } from 'next/navigation'; import { useProxy } from 'valtio/utils'; @@ -29,22 +29,18 @@ function Page() { return ( - - - Preview Pejabat Desa - - - - - + + Preview Pejabat Desa + + {dataArray.map((item) => ( diff --git a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/edit/page.tsx index 78b5771d..c04f6acb 100644 --- a/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/data-lingkungan-desa/[id]/edit/page.tsx @@ -132,7 +132,7 @@ export default function EditDataLingkunganDesa() { }; return ( - + - - - - No - Nama Data Lingkungan Desa - Jumlah - Ikon - Detail - - -
-
- Tidak ada data lingkungan desa yang tersedia + + + + + No + Nama Data Lingkungan Desa + Jumlah + Ikon + Detail + + +
+
+
+ + Tidak ada data lingkungan desa yang tersedia +
- + ); } return ( - - + + - Daftar Data Lingkungan Desa - - - + + {/* Desktop Table */} + +
No @@ -129,21 +195,21 @@ function ListDataLingkunganDesa({ search }: { search: string }) { {filteredData.map((item, index) => ( - {index + 1} + {index + 1} - {item.name} + + {item.name} + - ± {item.jumlah} + + ± {item.jumlah} + - {iconMap[item.icon] && ( - - {React.createElement(iconMap[item.icon], { size: 22 })} - - )} + {iconMap[item.icon] && {React.createElement(iconMap[item.icon], { size: 22 })}} - +
+ + {/* Mobile Cards */} + + + {filteredData.map((item, index) => ( + + + + + No + + + {index + 1} + + + + + Nama Data + + + {item.name} + + + + + Jumlah + + + ± {item.jumlah} + + + + + Ikon + + {iconMap[item.icon] && {React.createElement(iconMap[item.icon], { size: 22 })}} + +
+ +
+
+
+ ))} +
+
+
); } -export default DataLingkunganDesa; + +export default DataLingkunganDesa; \ No newline at end of file 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 db1dcba1..4e44c404 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/_lib/layouTabs.tsx @@ -59,43 +59,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - + + + + {tabs.map((tab, i) => ( + {tab.label} - - - ))} - - + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx index ef782f70..1dbf993d 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/contoh-kegiatan-desa-darmasaba/edit/page.tsx @@ -96,7 +96,7 @@ export default function EditContohKegiatanDesaDarmasaba() { }; return ( - + {/* Header */} - - + diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx index 9554a428..6ec4734e 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/layout.tsx @@ -1,7 +1,28 @@ 'use client' +import { usePathname } from "next/navigation"; import LayoutTabs from "./_lib/layouTabs"; +import { Box } from "@mantine/core"; export default function Layout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx index 0eb0c956..5614e6bf 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/materi-edukasi-yang-diberikan/edit/page.tsx @@ -81,7 +81,7 @@ export default function EditMateriEdukasiYangDiberikan() { }; return ( - + - - + diff --git a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx index 527358ea..a1e5952a 100644 --- a/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/edukasi-lingkungan/tujuan-edukasi-lingkungan/edit/page.tsx @@ -84,7 +84,7 @@ export default function EditTujuanEdukasiLingkungan() { }; return ( - + - - + + Preview Tujuan Edukasi Lingkungan + + 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 0eb63690..7365d723 100644 --- a/src/app/admin/(dashboard)/lingkungan/gotong-royong/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/lingkungan/gotong-royong/_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 } from '@mantine/core'; +import { Box, 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'; @@ -59,35 +59,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { keepMounted={false} > {/* ✅ Scroll horizontal */} - - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {/* ✅ Panel dengan gaya kartu */} {tabs.map((tab, i) => ( 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 5dcce580..aa1b6a11 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 @@ -83,7 +83,7 @@ function EditKategoriKegiatan() { if (loading) return Loading...; return ( - + - - + {/* Desktop Table */} + +
- Nama Kategori - Edit - Delete + + + Nama Kategori + + + + + Edit + + + + + Delete + + @@ -108,21 +133,27 @@ function ListKategoriKegiatan({ search }: { search: string }) { filteredData.map((item) => ( - {item.nama} + + {item.nama} + - + - +
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Kategori + + + {item.nama} + + + + + + + + + )) + ) : ( +
+ + Tidak ada kategori kegiatan yang cocok + +
+ )} +
+
@@ -179,4 +269,4 @@ function ListKategoriKegiatan({ search }: { search: string }) { ); } -export default KategoriKegiatan; +export default KategoriKegiatan; \ No newline at end of file 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 2aad0154..870d7f3b 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 @@ -162,7 +162,7 @@ export default function EditKegiatanDesa() { }; return ( - + - - + + {/* Desktop: Table */} + +
- Judul - Kategori - Lokasi - Aksi + + + Judul + + + + + Kategori + + + + + Lokasi + + + + + Aksi + + @@ -99,17 +127,36 @@ function ListKegiatanDesa({ search }: { search: string }) { filteredData.map((item) => ( - + {item.judul} - + {item.kategoriKegiatan?.nama || '-'} - {item.lokasi} + + {item.lokasi} +
+ + {/* Mobile: Card List */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Judul + + + {item.judul} + + + + + Kategori + + + {item.kategoriKegiatan?.nama || '-'} + + + + + Lokasi + + + {item.lokasi} + + + + + + + + )) + ) : ( +
+ + Tidak ada kegiatan desa yang cocok dengan pencarian + +
+ )} +
= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} 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 badcf110..ea86ad13 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 @@ -59,43 +59,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - + + + + {tabs.map((tab, i) => ( + {tab.label} - - - ))} - - + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx index e6694a8c..9a1821c5 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/bentuk-konservasi-berdasarkan-adat/edit/page.tsx @@ -77,7 +77,7 @@ function EditBentukKonservasiBerdasarkanAdat() { }; return ( - + {/* Header */} - - + + + Preview Bentuk Konservasi Berdasarkan Adat + + + {/* Konten */} diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx index 14a4e88c..df288ba9 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/filosofi-tri-hita-karana/edit/page.tsx @@ -82,7 +82,7 @@ function EditFilosofiTriHitaKarana() { }; return ( - + {/* Header */} - - + + + Preview Filosofi Tri Hita Karana + + + diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx index 1fa8572a..1cd7f2db 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/layout.tsx @@ -1,8 +1,29 @@ 'use client' +import { usePathname } from "next/navigation"; import LayoutTabs from "./_lib/layoutTabs" +import { Box } from "@mantine/core"; export default function Layout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} diff --git a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx index ed32c9fa..25545db1 100644 --- a/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx +++ b/src/app/admin/(dashboard)/lingkungan/konservasi-adat-bali/nilai-konservasi-adat/edit/page.tsx @@ -76,7 +76,7 @@ function EditNilaiKonservasiAdat() { }; return ( - + {/* Header */} - - + + + Preview Nilai Konservasi Adat + + + 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 ef0cb555..1db48752 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 @@ -120,7 +120,7 @@ function EditKeteranganBankSampahTerdekat() { }; return ( - + + > + Tambah Baru + - - + {/* Desktop Table */} + +
- Nama Bank Sampah - Alamat - Nama Tempat di Maps - Aksi + Nama Bank Sampah + Alamat + Nama Tempat di Maps + Aksi @@ -81,17 +92,17 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) { filteredData.map((item) => ( - {item.name} + + {item.name} + - - - {item.alamat || '-'} - - + + {item.alamat || '-'} + - + {item.namaTempatMaps || '-'} @@ -100,16 +111,19 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) { variant="light" color="blue" onClick={() => router.push(`/admin/lingkungan/pengelolaan-sampah-bank-sampah/keterangan-bank-sampah-terdekat/${item.id}`)} + p="xs" > - - + + )) ) : ( - - Tidak ada data bank sampah terdekat + + + Tidak ada data bank sampah terdekat + )} @@ -117,8 +131,60 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) {
- {totalPages > 1 && ( -
+ {/* Mobile Card */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Bank Sampah + + + {item.name} + + + + + Alamat + + + {item.alamat || '-'} + + + + + Nama Tempat di Maps + + + {item.namaTempatMaps || '-'} + + + + + + + + )) + ) : ( +
+ + Tidak ada data bank sampah terdekat + +
+ )} +
+
+
load(newPage)} @@ -128,10 +194,9 @@ function ListKeteranganBankSampahTerdekat({ search }: { search: string }) { withEdges />
- )} ); } -export default KeteranganBankSampahTerdekat; +export default KeteranganBankSampahTerdekat; \ No newline at end of file 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 c1c20352..5cd5ac57 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 @@ -90,7 +90,7 @@ function EditProgramKreatifDesa() { }; return ( - + - - + {/* Desktop Table */} + +
- Nama Pengelolaan Sampah - Icon - Edit - Delete + Nama Pengelolaan Sampah + Icon + Edit + Delete @@ -106,18 +141,22 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { filteredData.map((item) => ( - {item.name} + + {item.name} + {iconMap[item.icon] ? ( {React.createElement(iconMap[item.icon], { size: 24, - style: { color: colors['blue-button'] } + style: { color: colors['blue-button'] }, })} ) : ( - - + + - + )} @@ -125,7 +164,11 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { variant="light" color="green" size="sm" - onClick={() => router.push(`/admin/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/${item.id}`)} + onClick={() => + router.push( + `/admin/lingkungan/pengelolaan-sampah-bank-sampah/list-pengelolaan-sampah-bank-sampah/${item.id}` + ) + } > @@ -147,8 +190,10 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { )) ) : ( - - Tidak ada data pengelolaan sampah + + + Tidak ada data pengelolaan sampah + )} @@ -156,19 +201,82 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) {
- {totalPages > 1 && ( -
- load(newPage)} - total={totalPages} - siblings={1} - boundaries={1} - withEdges - /> -
- )} + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + + {filteredData.map((item) => ( + + + + Nama Pengelolaan Sampah + + + {item.name} + + {iconMap[item.icon] ? ( + React.createElement(iconMap[item.icon], { + size: 20, + style: { color: colors['blue-button'] }, + }) + ) : ( + + - + + )} + + + + + + + ))} + + ) : ( +
+ + Tidak ada data pengelolaan sampah + +
+ )} +
+ +
+ load(newPage)} + total={totalPages} + siblings={1} + boundaries={1} + withEdges + /> +
{/* Modal Konfirmasi Hapus */} @@ -182,4 +290,4 @@ function ListPengelolaanSampahBankSampah({ search }: { search: string }) { ); } -export default PengelolaanSampahBankSampah; +export default PengelolaanSampahBankSampah; \ No newline at end of file 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 3ebf74e0..b8c2b6bb 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 @@ -129,7 +129,7 @@ function EditProgramPenghijauan() { }; return ( - + {/* Header */} + + + {/* Desktop Table */} + + + + + + + No + + + + + Nama Program + + + + + Judul / Deskripsi + + + + + Ikon + + + + + Aksi + + + + + + {filteredData.length > 0 ? ( + filteredData.map((item, index) => ( + + + + {index + 1} + + + + + {item.name} + + + + + + + {iconMap[item.icon] && ( + + {React.createElement(iconMap[item.icon], { + size: 22, + })} + + )} + + + + + + )) + ) : ( + + +
+ + Tidak ada data program penghijauan yang cocok + +
+
+
+ )} +
+
+
+
+ + {/* Mobile View – Card Layout */} + + + + Daftar Program Penghijauan + + + - - {/* Table Section */} - - - - - No - Nama Program - Judul / Deskripsi - Ikon - Aksi - - - - {filteredData.length > 0 ? ( - filteredData.map((item, index) => ( - - {index + 1} - - {item.name} - - - - - + {filteredData.length > 0 ? ( + filteredData.map((item, index) => ( + + + + + No + + + {index + 1} + + + + + Nama Program + + + {item.name} + + + + + Judul / Deskripsi + + + + + + Ikon + + {iconMap[item.icon] && ( - - {React.createElement(iconMap[item.icon], { size: 22 })} - + React.createElement(iconMap[item.icon], { size: 24 }) )} - - - - - - )) - ) : ( - - -
- Tidak ada data program penghijauan yang cocok -
-
-
- )} -
-
+
+
+ + + + + + )) + ) : ( +
+ + Tidak ada data program penghijauan yang cocok + +
+ )}
@@ -187,4 +358,4 @@ function ListProgramPenghijauan({ search }: { search: string }) { ); } -export default ProgramPenghijauan; +export default ProgramPenghijauan; \ No newline at end of file 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 b4fa8877..7bae982f 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/_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 } from '@mantine/core'; +import { Box, 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'; @@ -56,35 +56,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( + + + + + )) + ) : ( +
+ + Tidak ada data pendaftar yang cocok + +
+ )} + +
@@ -146,4 +249,4 @@ function ListBeasiswaPendaftar({ search }: { search: string }) { ); } -export default BeasiswaPendaftar; +export default BeasiswaPendaftar; \ No newline at end of file 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 18728c2c..91c42c6a 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 @@ -93,7 +93,7 @@ function EditProgramKreatifDesa() { } } return ( - + - - + {/* Desktop Table */} + +
- Nama Keunggulan Program - Deskripsi - Edit - Delete + Nama Keunggulan Program + Deskripsi + Edit + Delete {filteredData.length > 0 ? ( filteredData.map((item) => ( - - + + {item.judul} - + - + - +
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama Keunggulan Program + + {item.judul} + + + + Deskripsi + + + + + + + + + )) + ) : ( +
+ + Tidak ada data keunggulan program yang cocok + +
+ )} +
+
- {totalPages > 1 && ( +
- )} - {/* Modal Konfirmasi Hapus */} setModalHapus(false)} @@ -192,4 +262,4 @@ function ListKeunggulanProgram({ search }: { search: string }) { ); } -export default KeunggulanProgram; +export default KeunggulanProgram; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/layout.tsx b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/layout.tsx index 4f25d331..e50ab83a 100644 --- a/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/layout.tsx +++ b/src/app/admin/(dashboard)/pendidikan/beasiswa-desa/layout.tsx @@ -1,8 +1,29 @@ 'use client' import React from 'react'; import LayoutTabs from './_lib/layoutTabs'; +import { usePathname } from 'next/navigation'; +import { Box } from '@mantine/core'; function Layout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} 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 179de0fb..2c4be590 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,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 { IconBuildingCommunity, IconCalendar, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -62,35 +62,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( + - - + + + Pratinjau Fasilitas Yang Disediakan + + + {/* Konten Preview */} @@ -84,6 +81,47 @@ function Page() { + + + + + {/* Judul */} + + + + {/* Deskripsi */} + + + + ); diff --git a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/layout.tsx b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/layout.tsx index 3a414c77..e50ab83a 100644 --- a/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/layout.tsx +++ b/src/app/admin/(dashboard)/pendidikan/bimbingan-belajar-desa/layout.tsx @@ -1,7 +1,29 @@ +'use client' import React from 'react'; import LayoutTabs from './_lib/layoutTabs'; +import { usePathname } from 'next/navigation'; +import { Box } from '@mantine/core'; function Layout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} 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 4b2a8156..51b9185e 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 @@ -113,7 +113,7 @@ function EditLokasiDanJadwal() { } return ( - + - - + + + Pratinjau Lokasi & Jadwal + + + {/* Konten Preview */} @@ -85,6 +82,48 @@ function Page() { + + + + + {/* Judul */} + + + + {/* Deskripsi */} + + + + ); 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 be02e0d6..9697085a 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 @@ -109,7 +109,7 @@ function EditTujuanProgram() { } return ( - + - - + + + Pratinjau Tujuan Program + + + {/* Konten Preview */} @@ -95,6 +91,47 @@ function Page() { + + + + + {/* Judul */} + + + + {/* Deskripsi */} + + + + ); 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 731b4f22..15e2fd1f 100644 --- a/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/data-pendidikan/[id]/page.tsx @@ -76,7 +76,7 @@ export default function EditDataPendidikan() { }; return ( - + - - + {/* Desktop Table */} + +
- Nama Jenjang Pendidikan + Nama Jenjang Pendidikan Edit Delete @@ -92,13 +120,19 @@ function ListJenjangPendidikan() { filteredData.map((item) => ( - {item.nama} + + {item.nama} + @@ -108,8 +142,8 @@ function ListJenjangPendidikan() { color="red" variant="light" onClick={() => { - setSelectedId(item.id) - setModalHapus(true) + setSelectedId(item.id); + setModalHapus(true); }} > @@ -120,8 +154,10 @@ function ListJenjangPendidikan() { ) : ( -
- Tidak ada data jenjang pendidikan +
+ + Tidak ada data jenjang pendidikan +
@@ -129,6 +165,55 @@ function ListJenjangPendidikan() {
+ + {/* Mobile Cards */} + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama Jenjang Pendidikan + + + {item.nama} + + + + + + + + )) + ) : ( +
+ + Tidak ada data jenjang pendidikan + +
+ )} +
@@ -151,10 +236,10 @@ function ListJenjangPendidikan() { opened={modalHapus} onClose={() => setModalHapus(false)} onConfirm={handleHapus} - text='Apakah anda yakin ingin menghapus jenjang pendidikan ini?' + text="Apakah anda yakin ingin menghapus jenjang pendidikan ini?" /> ); } -export default JenjangPendidikan; +export default JenjangPendidikan; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/pendidikan/info-sekolah/layout.tsx b/src/app/admin/(dashboard)/pendidikan/info-sekolah/layout.tsx index 3a414c77..e50ab83a 100644 --- a/src/app/admin/(dashboard)/pendidikan/info-sekolah/layout.tsx +++ b/src/app/admin/(dashboard)/pendidikan/info-sekolah/layout.tsx @@ -1,7 +1,29 @@ +'use client' import React from 'react'; import LayoutTabs from './_lib/layoutTabs'; +import { usePathname } from 'next/navigation'; +import { Box } from '@mantine/core'; function Layout({ children }: { children: React.ReactNode }) { + const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} 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 3b5107f8..bd1d769e 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 @@ -96,7 +96,7 @@ export default function EditLembaga() { }; return ( - + {/* Header */} - - + + {/* Desktop Table */} + +
- Nama Lembaga - Jenjang Pendidikan - Aksi + + + Nama Lembaga + + + + + Jenjang Pendidikan + + + + + Aksi + + @@ -96,19 +122,29 @@ function ListLembaga({ search }: { search: string }) { filteredData.map((item) => ( - {item.nama} + + {item.nama} + - {item.jenjangPendidikan?.nama || '-'} + + {item.jenjangPendidikan?.nama || '-'} + @@ -116,8 +152,10 @@ function ListLembaga({ search }: { search: string }) { ) : ( -
- Tidak ada data lembaga yang cocok +
+ + Tidak ada data lembaga yang cocok +
@@ -125,6 +163,59 @@ function ListLembaga({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Lembaga + + + {item.nama} + + + + + Jenjang Pendidikan + + + {item.jenjangPendidikan?.nama || '-'} + + + + + + + + )) + ) : ( +
+ + Tidak ada data lembaga yang cocok + +
+ )} +
+
@@ -145,4 +236,4 @@ function ListLembaga({ search }: { search: string }) { ); } -export default Lembaga; +export default Lembaga; \ No newline at end of file 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 4df0541d..0b0922ab 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 @@ -100,7 +100,7 @@ function EditPengajar() { }; return ( - + {/* Header Back + Title */} - - + {/* Desktop Table */} + +
- Nama Pengajar - Lembaga - Aksi + + + Nama Pengajar + + + + + Lembaga + + + + + Aksi + + @@ -83,10 +107,14 @@ function ListPengajar({ search }: { search: string }) { filteredData.map((item) => ( - {item.nama} + + {item.nama} + - {item.lembaga.nama} + + {item.lembaga.nama} + @@ -103,8 +133,10 @@ function ListPengajar({ search }: { search: string }) { ) : ( -
- Tidak ada data pengajar yang cocok +
+ + Tidak ada data pengajar yang cocok +
@@ -112,14 +144,63 @@ function ListPengajar({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Pengajar + + + {item.nama} + + + + + Lembaga + + + {item.lembaga.nama} + + + + + + + + )) + ) : ( +
+ + Tidak ada data pengajar yang cocok + +
+ )} +
+
{ - load(newPage, 10, search) - window.scrollTo({ top: 0, behavior: 'smooth' }) + load(newPage, 10, search); + window.scrollTo({ top: 0, behavior: 'smooth' }); }} total={totalPages} mt="md" @@ -129,7 +210,7 @@ function ListPengajar({ search }: { search: string }) { />
- ) + ); } -export default Pengajar; +export default Pengajar; \ No newline at end of file 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 6d283d2e..e2b8d002 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 @@ -107,7 +107,7 @@ function EditSiswa() { }; return ( - + {/* Header */} - - + {/* Desktop Table */} + +
- Nama Siswa - Lembaga - Aksi + + + Nama Siswa + + + + + Lembaga + + + + + Aksi + + @@ -91,19 +117,27 @@ function ListSiswa({ search }: { search: string }) { filteredData.map((item) => ( - {item.nama} + + {item.nama} + - {item.lembaga.nama} + + {item.lembaga.nama} + @@ -111,8 +145,10 @@ function ListSiswa({ search }: { search: string }) { ) : ( -
- Tidak ada data siswa yang cocok +
+ + Tidak ada data siswa yang cocok +
@@ -120,24 +156,76 @@ function ListSiswa({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + + Nama Siswa + + + {item.nama} + + + + + Lembaga + + + {item.lembaga.nama} + + + + + + + + )) + ) : ( +
+ + Tidak ada data siswa yang cocok + +
+ )} +
+
-
- { - load(newPage, 10); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }} - total={totalPages} - mt="md" - mb="md" - color="blue" - radius="md" - /> -
+ +
+ { + load(newPage, 10); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }} + total={totalPages} + mt={{ base: 'sm', md: 'md' }} + mb={{ base: 'sm', md: 'md' }} + color="blue" + radius="md" + /> +
- ) + ); } -export default Siswa; +export default Siswa; \ No newline at end of file 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 57da173d..e47ac810 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,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 { IconBook2, IconMapPin, IconSchool } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -63,35 +63,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + +
+ + + - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( + {/* Back Button + Title */} 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 1a7b12bc..88ad47b0 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 @@ -4,8 +4,7 @@ import { Box, Button, Divider, - Grid, - GridCol, + Group, Paper, Skeleton, Stack, @@ -40,28 +39,24 @@ function Page() { {/* Header */} - - - - Preview Jenis Program Yang Diselenggarakan - - - - - - + + + Preview Jenis Program Yang Diselenggarakan + + + {/* Konten Preview */} diff --git a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/layout.tsx b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/layout.tsx index 4f25d331..34fe9efa 100644 --- a/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/layout.tsx +++ b/src/app/admin/(dashboard)/pendidikan/pendidikan-non-formal/layout.tsx @@ -1,8 +1,30 @@ 'use client' import React from 'react'; import LayoutTabs from './_lib/layoutTabs'; +import { usePathname } from 'next/navigation'; +import { Box } from '@mantine/core'; function Layout({ children }: { children: React.ReactNode }) { +const pathname = usePathname(); + + // Contoh path: + // - /darmasaba/desa/berita/semua → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan → panjang 5 → list + // - /darmasaba/desa/berita/Pemerintahan/123 → panjang 6 → detail + + const segments = pathname.split('/').filter(Boolean); + const isDetailPage = segments.length >= 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + + return ( {children} 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 699e9839..c0670869 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 @@ -120,7 +120,7 @@ function EditTempatKegiatan() { } return ( - + {/* Back Button + Title */} 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 a377409e..80e037ac 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 } from '@mantine/core'; +import { Box, Button, Divider, Group, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -29,28 +29,24 @@ function Page() { {/* Header */} - - - - Preview Tempat Kegiatan - - - - - - + + + Preview Tempat Kegiatan + + + {/* Konten Preview */} 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 111cd506..881e88d4 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 @@ -111,7 +111,7 @@ function EditTujuanProgram() { } return ( - + - - + + + Pratinjau Pendidikan Non Formal + + + {/* Konten Preview */} 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 3c89d5ea..29b2f3f9 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_lib/layoutTabs.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/_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 } from '@mantine/core'; +import { Box, 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'; @@ -62,35 +62,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( + {/* Header */} - - + + {/* Desktop Table */} + +
- No - Judul - Kategori - Deskripsi - Detail + + + No + + + + + Judul + + + + + Kategori + + + + + Deskripsi + + + + + Detail + + {filteredData.length > 0 ? ( filteredData.map((item, index) => ( - - {index + 1} + + + {index + 1} + - - {item.judul} + + + {item.judul} + - - {item.kategori.name} + + + {item.kategori.name} + - - - - + + - + )) ) : ( - -
- Tidak ada data perpustakaan yang cocok + +
+ + Tidak ada data perpustakaan yang cocok +
@@ -112,6 +183,80 @@ function ListDataPerpustakaan({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item, index) => ( + + + + + No + + + {index + 1} + + + + + Judul + + + {item.judul} + + + + + Kategori + + + {item.kategori.name} + + + + + Deskripsi + + + + + + + + + )) + ) : ( +
+ + Tidak ada data perpustakaan yang cocok + +
+ )} +
+
+
- ) + ); } -export default DataPerpustakaan; +export default DataPerpustakaan; \ No newline at end of file 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 67a51242..fcaeae24 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 @@ -75,7 +75,7 @@ function EditKategoriBuku() { }; return ( - + - - + + {/* Desktop Table */} + +
- No - Nama Kategori - Edit - Hapus + + No + + + Nama Kategori + + + Edit + + + Hapus + {filteredData.length > 0 ? ( filteredData.map((item, index) => ( - {index + 1} - - {item.name} + + {index + 1} - - + @@ -119,7 +144,9 @@ function ListKategoriBuku({ search }: { search: string }) {
- Tidak ada data kategori buku yang cocok + + Tidak ada data kategori buku yang cocok +
@@ -127,21 +154,74 @@ function ListKategoriBuku({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item, index) => ( + + + + No + {index + 1} + + + Nama Kategori + {item.name} + + + + + + + + )) + ) : ( +
+ + Tidak ada data kategori buku yang cocok + +
+ )} +
+
-
- { - load(newPage, 10); - window.scrollTo({ top: 0, behavior: 'smooth' }); - }} - total={totalPages} - mt="md" - mb="md" - color="blue" - radius="md" - /> -
+ + +
+ { + load(newPage, 10); + window.scrollTo({ top: 0, behavior: 'smooth' }); + }} + total={totalPages} + mt={{ base: 'sm', md: 'md' }} + mb={{ base: 'sm', md: 'md' }} + color="blue" + radius="md" + /> +
+ {/* Modal Konfirmasi Hapus */} = 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} diff --git a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/page.tsx b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/page.tsx index 16ebda74..f62201ec 100644 --- a/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/page.tsx +++ b/src/app/admin/(dashboard)/pendidikan/perpustakaan-digital/peminjam/page.tsx @@ -18,7 +18,7 @@ import { Text, Title, } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -47,10 +47,11 @@ function ListPeminjamBuku({ search }: { search: string }) { const router = useRouter(); const { data, page, totalPages, loading, load } = statePeminjam.findMany; + const [debouncedSearch] = useDebouncedValue(search, 1000); useShallowEffect(() => { - load(page, 10, search); - }, [page, search]); + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); const filteredData = data || []; @@ -81,41 +82,61 @@ function ListPeminjamBuku({ search }: { search: string }) { } return ( - - - Daftar Peminjam Buku - - + + + + Daftar Peminjam Buku + + + {/* Desktop Table */} + +
- No - Nama Peminjam - Status - Alamat - Detail + No + Nama Peminjam + Status + Alamat + Detail {filteredData.length > 0 ? ( filteredData.map((item, index) => ( - {index + 1} - {item.nama} + + {index + 1} + - {renderStatusBadge(item.status)} + + {item.nama} + + {renderStatusBadge(item.status)} - {item.alamat} + + {item.alamat} + @@ -124,9 +145,9 @@ function ListPeminjamBuku({ search }: { search: string }) { )) ) : ( - -
- + +
+ Tidak ada data Peminjam buku yang cocok
@@ -136,10 +157,84 @@ function ListPeminjamBuku({ search }: { search: string }) {
+ + {/* Mobile Cards */} + + + {filteredData.length > 0 ? ( + filteredData.map((item, index) => ( + + + + + No + + + {index + 1} + + + + + Nama Peminjam + + + {item.nama} + + + + + Status + + {renderStatusBadge(item.status)} + + + + Alamat + + + {item.alamat} + + + + + Detail + + + + + + )) + ) : ( +
+ + Tidak ada data Peminjam buku yang cocok + +
+ )} +
+
- {totalPages > 1 && ( -
+
{ @@ -153,9 +248,8 @@ function ListPeminjamBuku({ search }: { search: string }) { radius="md" />
- )} ); } -export default PeminjamBuku; +export default PeminjamBuku; \ No newline at end of file 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 9b5b10b7..ab63c34a 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,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 { IconSchool, IconTarget } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -57,35 +57,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( = 5; + + if (isDetailPage) { + // Tampilkan tanpa tab menu + return ( + + {children} + + ); + } + return ( {children} 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 383a7f9f..90d73802 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 @@ -125,7 +125,7 @@ function EditTujuanProgram() { } return ( - + - - + + + Pratinjau Program Unggulan + + + {/* Konten Preview */} + 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 e9bef0b8..6bd64c4b 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 @@ -111,7 +111,7 @@ function EditTujuanProgram() { } return ( - + {/* Back Button + Title */} 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 c8ab9b53..fd4f9a82 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 } from '@mantine/core'; +import { Box, Button, Divider, Group, Paper, Skeleton, Stack, Text, Title } from '@mantine/core'; import { useShallowEffect } from '@mantine/hooks'; import { IconEdit } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; @@ -29,14 +29,11 @@ function Page() { {/* Header */} - - - - Pratinjau Tujuan Program - - - - - - + {/* Konten Preview */} @@ -85,6 +82,48 @@ function Page() { + + + + + {/* Judul */} + + + + {/* Deskripsi */} + + + + ); diff --git a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/page.tsx b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/page.tsx index ef969288..5631fe9d 100644 --- a/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/page.tsx +++ b/src/app/admin/(dashboard)/ppid/indeks-kepuasan-masyarakat/responden/page.tsx @@ -16,7 +16,6 @@ import { Text, Title, } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react'; import { useRouter } from 'next/navigation'; import { useState } from 'react'; @@ -49,10 +48,6 @@ function ListResponden({ search }: ListRespondenProps) { const router = useRouter(); const { data, page, totalPages, loading, load } = state.findMany; - useShallowEffect(() => { - load(page, 10); - }, [page]); - const filteredData = (data || []).filter((item) => { const keyword = search.toLowerCase(); return item.name.toLowerCase().includes(keyword); diff --git a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx index c08cca7d..7c16dfb0 100644 --- a/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx +++ b/src/app/admin/(dashboard)/ppid/permohonan-informasi-publik/page.tsx @@ -57,7 +57,7 @@ function Page() { if (!data || data.length === 0) { return ( - + @@ -96,7 +96,7 @@ function Page() { return ( - + diff --git a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx index 1fa70082..09b65e77 100644 --- a/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx +++ b/src/app/admin/(dashboard)/ppid/permohonan-keberatan-informasi-publik/page.tsx @@ -57,7 +57,7 @@ function Page() { if (!data || data.length === 0) { return ( - + @@ -95,7 +95,7 @@ function Page() { return ( - + diff --git a/src/app/admin/(dashboard)/user&role/layout.tsx b/src/app/admin/(dashboard)/user&role/layout.tsx index 929c905b..05048967 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 } from '@mantine/core'; +import { Box, ScrollArea, Stack, Tabs, TabsList, TabsPanel, TabsTab, Title } from '@mantine/core'; import { IconBrush, IconForms, IconUser } from '@tabler/icons-react'; import { usePathname, useRouter } from 'next/navigation'; import React, { useEffect, useState } from 'react'; @@ -62,29 +62,76 @@ function LayoutTabs({ children }: { children: React.ReactNode }) { radius="lg" keepMounted={false} > - - {tabs.map((tab, i) => ( - - {tab.label} - - ))} - + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + + + + + + + {tabs.map((tab, i) => ( + + {tab.label} + + ))} + + + {tabs.map((tab, i) => ( + - - + + {/* Desktop Table */} + +
- Role - Edit - Hapus + Role + Edit + Hapus {filteredData.map((item) => ( - {item.name} + + {item.name} + - @@ -107,6 +151,52 @@ function ListRole({ search }: { search: string }) {
+ + {/* Mobile Card View */} + + + {filteredData.map((item) => ( + + + + + Role + + + {item.name} + + + + + + + + + ))} + +
{/* Modal Konfirmasi Hapus */} @@ -117,7 +207,7 @@ function ListRole({ search }: { search: string }) { text='Apakah anda yakin ingin menghapus kategori Berita ini?' />
- ) + ); } -export default Role; +export default Role; \ No newline at end of file diff --git a/src/app/admin/(dashboard)/user&role/user/page.tsx b/src/app/admin/(dashboard)/user&role/user/page.tsx index 6147337d..0fa1ec94 100644 --- a/src/app/admin/(dashboard)/user&role/user/page.tsx +++ b/src/app/admin/(dashboard)/user&role/user/page.tsx @@ -1,7 +1,7 @@ 'use client' import colors from '@/con/colors'; import { Box, Button, Center, Group, Pagination, Paper, Select, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title, Tooltip } from '@mantine/core'; -import { useShallowEffect } from '@mantine/hooks'; +import { useDebouncedValue, useShallowEffect } from '@mantine/hooks'; import { IconCheck, IconSearch, IconTrash, IconX } from '@tabler/icons-react'; import { useState } from 'react'; import { useProxy } from 'valtio/utils'; @@ -31,6 +31,7 @@ function ListUser({ search }: { search: string }) { const stateRole = useProxy(user.roleState); const [modalHapus, setModalHapus] = useState(false); const [selectedId, setSelectedId] = useState(null); + const [debouncedSearch] = useDebouncedValue(search, 1000); const { data, @@ -51,29 +52,24 @@ function ListUser({ search }: { search: string }) { useShallowEffect(() => { stateRole.findMany.load(); - load(page, 10, search); - }, [page, search]); + load(page, 10, debouncedSearch); + }, [page, debouncedSearch]); - // ✅ Helper function untuk nama role const getRoleName = (roleId: string) => { - // Cari dari data role yang sudah diload const role = stateRole.findMany.data.find((r) => r.id === roleId); return role?.name || "Unknown Role"; }; - // ✅ Handler untuk perubahan role dengan konfirmasi const handleRoleChange = async ( userId: string, username: string, oldRoleId: string, newRoleId: string ) => { - // Skip jika sama if (oldRoleId === newRoleId) { return true; } - // ✅ Konfirmasi perubahan role const confirmed = window.confirm( `⚠️ PERINGATAN\n\n` + `Mengubah role untuk "${username}" akan:\n` + @@ -84,20 +80,16 @@ function ListUser({ search }: { search: string }) { ); if (!confirmed) { - // Reload data untuk reset dropdown ke nilai lama stateUser.findMany.load(page, 10, search); return false; } - // ✅ Submit update const success = await stateUser.update.submit({ id: userId, roleId: newRoleId, - }); if (success) { - // ✅ Logout user jika sedang mengedit diri sendiri const currentUserId = authStore.user?.id; if (currentUserId === userId) { authStore.setUser(null); @@ -107,14 +99,12 @@ function ListUser({ search }: { search: string }) { return; } - // Reload data stateUser.findMany.load(page, 10, search); } return success; }; - // ✅ Handler untuk toggle isActive const handleToggleActive = async (userId: string, currentStatus: boolean) => { const success = await stateUser.update.submit({ id: userId, @@ -122,7 +112,6 @@ function ListUser({ search }: { search: string }) { }); if (success) { - // ✅ Logout user jika sedang mengedit diri sendiri const currentUserId = authStore.user?.id; if (currentUserId === userId) { authStore.setUser(null); @@ -132,7 +121,6 @@ function ListUser({ search }: { search: string }) { return; } - // Reload data stateUser.findMany.load(page, 10, search); } }; @@ -141,51 +129,71 @@ function ListUser({ search }: { search: string }) { return item.roleId !== "0" && item.roleId !== "1"; }); - if (loading || !data) { return ( - + ); } return ( - - + + - Daftar User + + Daftar User + - - + + {/* Desktop Table */} + +
- Nama User - Nomor - Role - Aktif / Nonaktif - Hapus + + Nama User + + + Nomor + + + Role + + + Aktif / Nonaktif + + + Hapus + {filteredData.length > 0 ? ( filteredData.map((item) => ( - - + + {item.username} - - + + {item.nomor} - +
+ + {/* Mobile Card View */} + + + {filteredData.length > 0 ? ( + filteredData.map((item) => ( + + + + Nama User + + {item.username} + + + + Nomor + + {item.nomor} + + + + Role +