diff --git a/src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsDetail.tsx b/src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsDetail.tsx
similarity index 89%
rename from src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsDetail.tsx
rename to src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsDetail.tsx
index 25771ec3..a3dd1255 100644
--- a/src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsDetail.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsDetail.tsx
@@ -11,21 +11,21 @@ function LayoutTabsDetail({ children }: { children: React.ReactNode }) {
const pathname = usePathname()
const tabs = [
{
- label: "Profile Desa",
- value: "profiledesa",
- href: "/admin/desa/profile/profile-desa",
+ label: "Profil Desa",
+ value: "profildesa",
+ href: "/admin/desa/profil/profil-desa",
icon:
},
{
- label: "Profile Perbekel",
- value: "profileperbekel",
- href: "/admin/desa/profile/profile-perbekel",
+ label: "Profil Perbekel",
+ value: "profilperbekel",
+ href: "/admin/desa/profil/profil-perbekel",
icon:
},
{
- label: "Profile Perbekel Dari Masa Ke Masa",
- value: "profile-perbekel-dari-masa-ke-masa",
- href: "/admin/desa/profile/profile-perbekel-dari-masa-ke-masa",
+ label: "Profil Perbekel Dari Masa Ke Masa",
+ value: "profilperbekeldarimasakemasa",
+ href: "/admin/desa/profil/profil-perbekel-dari-masa-ke-masa",
icon:
}
];
diff --git a/src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsEdit.tsx b/src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsEdit.tsx
similarity index 89%
rename from src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsEdit.tsx
rename to src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsEdit.tsx
index 75201d3d..c384b326 100644
--- a/src/app/admin/(dashboard)/desa/profile/_lib/layoutTabsEdit.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/_lib/layoutTabsEdit.tsx
@@ -12,22 +12,22 @@ function LayoutTabsEdit({ children }: { children: React.ReactNode }) {
{
label: "Sejarah Desa",
value: "sejarahdesa",
- href: "/admin/desa/profile/edit/sejarah_desa"
+ href: "/admin/desa/profil/edit/sejarah_desa"
},
{
label: "Visi Misi Desa",
value: "visimisidesa",
- href: "/admin/desa/profile/edit/visi_misi_desa"
+ href: "/admin/desa/profil/edit/visi_misi_desa"
},
{
label: "Lambang Desa",
value: "lambangdesa",
- href: "/admin/desa/profile/edit/lambang_desa"
+ href: "/admin/desa/profil/edit/lambang_desa"
},
{
label: "Maskot Desa",
value: "maskotdesa",
- href: "/admin/desa/profile/edit/maskot_desa"
+ href: "/admin/desa/profil/edit/maskot_desa"
},
];
const curentTab = tabs.find(tab => tab.href === pathname)
diff --git a/src/app/admin/(dashboard)/desa/profile/layout.tsx b/src/app/admin/(dashboard)/desa/profil/layout.tsx
similarity index 100%
rename from src/app/admin/(dashboard)/desa/profile/layout.tsx
rename to src/app/admin/(dashboard)/desa/profil/layout.tsx
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-desa/[id]/lambang_desa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/lambang_desa/page.tsx
similarity index 97%
rename from src/app/admin/(dashboard)/desa/profile/profile-desa/[id]/lambang_desa/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/lambang_desa/page.tsx
index 6d182103..ea9f877b 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-desa/[id]/lambang_desa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-desa/[id]/lambang_desa/page.tsx
@@ -43,7 +43,7 @@ function Page() {
const id = params?.id as string;
if (!id) {
toast.error('ID tidak valid');
- router.push('/admin/desa/profile/profile-desa');
+ router.push('/admin/desa/profil/profil-desa');
return;
}
@@ -106,7 +106,7 @@ function Page() {
if (success) {
toast.success('Data berhasil disimpan');
- router.push('/admin/desa/profile/profile-desa');
+ router.push('/admin/desa/profil/profil-desa');
} else {
toast.error('Gagal menyimpan data');
}
@@ -156,7 +156,7 @@ function Page() {
} color="red" title="Terjadi Kesalahan" radius="md">
{loadError}
-
@@ -180,7 +180,7 @@ function Page() {
variant="light"
leftSection={}
radius="md"
- onClick={() => router.push(`/admin/desa/profile/profile-desa/${maskot.id}/maskot_desa`)}
+ onClick={() => router.push(`/admin/desa/profil/profil-desa/${maskot.id}/maskot_desa`)}
>
Edit
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
similarity index 99%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/edit/page.tsx
index d7c3b632..8cf2e438 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-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
@@ -117,7 +117,7 @@ function EditPerbekelDariMasaKeMasa() {
await state.update.update();
toast.success('Perbekel dari masa ke masa berhasil diperbarui!');
- router.push('/admin/desa/profile/profile-perbekel-dari-masa-ke-masa');
+ router.push('/admin/desa/profil/profil-perbekel-dari-masa-ke-masa');
} catch (error) {
console.error('Error updating perbekel dari masa ke masa:', error);
toast.error('Terjadi kesalahan saat memperbarui perbekel dari masa ke masa');
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
similarity index 96%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
index 8a63f508..c8f9eca9 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/[id]/page.tsx
@@ -25,7 +25,7 @@ function DetailPerbekelDariMasa() {
state.delete.byId(selectedId);
setModalHapus(false);
setSelectedId(null);
- router.push("/admin/desa/profile/profile-perbekel-dari-masa-ke-masa");
+ router.push("/admin/desa/profil/profil-perbekel-dari-masa-ke-masa");
}
};
@@ -113,7 +113,7 @@ function DetailPerbekelDariMasa() {
router.push(`/admin/desa/profile/profile-perbekel-dari-masa-ke-masa/${data.id}/edit`)}
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/${data.id}/edit`)}
variant="light"
radius="md"
size="md"
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/create/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/create/page.tsx
similarity index 98%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/create/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/create/page.tsx
index 4a8f6aaa..21973331 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/create/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/create/page.tsx
@@ -46,7 +46,7 @@ function CreatePerbekelDariMasaKeMasa() {
state.create.form.imageId = uploaded.id;
await state.create.create();
resetForm();
- router.push('/admin/desa/profile/profile-perbekel-dari-masa-ke-masa');
+ router.push('/admin/desa/profil/profil-perbekel-dari-masa-ke-masa');
} catch (error) {
console.error(error);
toast.error('Gagal menambahkan perbekel dari masa ke masa');
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
similarity index 96%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
index aaaac6d3..63982af1 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel-dari-masa-ke-masa/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel-dari-masa-ke-masa/page.tsx
@@ -53,7 +53,7 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
leftSection={}
color="blue"
variant="light"
- onClick={() => router.push('/admin/desa/profile/profile-perbekel-dari-masa-ke-masa/create')}
+ onClick={() => router.push('/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/create')}
>
Tambah Baru
@@ -90,7 +90,7 @@ function ListPerbekelDariMasaKeMasa({ search }: { search: string }) {
variant="light"
color="blue"
leftSection={}
- onClick={() => router.push(`/admin/desa/profile/profile-perbekel-dari-masa-ke-masa/${item.id}`)}
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel-dari-masa-ke-masa/${item.id}`)}
>
Detail
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel/[id]/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
similarity index 98%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel/[id]/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
index 1a916bfe..bd26f5c1 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel/[id]/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/[id]/page.tsx
@@ -25,7 +25,7 @@ function ProfilePerbekel() {
const id = params?.id as string;
if (!id) {
toast.error("ID tidak valid");
- router.push("/admin/desa/profile/profile-perbekel");
+ router.push("/admin/desa/profil/profil-perbekel");
return;
}
@@ -74,7 +74,7 @@ function ProfilePerbekel() {
const success = await perbekelState.edit.submit()
if (success) {
toast.success("Data berhasil disimpan");
- router.push("/admin/desa/profile/profile-perbekel");
+ router.push("/admin/desa/profil/profil-perbekel");
}
} catch (error) {
console.error("Error update sejarah desa:", error);
diff --git a/src/app/admin/(dashboard)/desa/profile/profile-perbekel/page.tsx b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
similarity index 97%
rename from src/app/admin/(dashboard)/desa/profile/profile-perbekel/page.tsx
rename to src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
index 2d2ddf4a..53ad1d8c 100644
--- a/src/app/admin/(dashboard)/desa/profile/profile-perbekel/page.tsx
+++ b/src/app/admin/(dashboard)/desa/profil/profil-perbekel/page.tsx
@@ -41,7 +41,7 @@ function Page() {
variant="light"
leftSection={}
radius="md"
- onClick={() => router.push(`/admin/desa/profile/profile-perbekel/${perbekel.id}`)}
+ onClick={() => router.push(`/admin/desa/profil/profil-perbekel/${perbekel.id}`)}
>
Edit
diff --git a/src/app/admin/_com/list_PageAdmin.tsx b/src/app/admin/_com/list_PageAdmin.tsx
index c6208d81..6574cdb7 100644
--- a/src/app/admin/_com/list_PageAdmin.tsx
+++ b/src/app/admin/_com/list_PageAdmin.tsx
@@ -91,8 +91,8 @@ export const devBar = [
children: [
{
id: "Desa_1",
- name: "Profile",
- path: "/admin/desa/profile/profile-desa"
+ name: "Profil",
+ path: "/admin/desa/profil/profil-desa"
},
{
id: "Desa_2",
@@ -495,8 +495,8 @@ export const navBar = [
children: [
{
id: "Desa_1",
- name: "Profile",
- path: "/admin/desa/profile/profile-desa"
+ name: "Profil",
+ path: "/admin/desa/profil/profil-desa"
},
{
id: "Desa_2",
@@ -899,8 +899,8 @@ export const role1 = [
children: [
{
id: "Desa_1",
- name: "Profile",
- path: "/admin/desa/profile/profile-desa"
+ name: "Profil",
+ path: "/admin/desa/profil/profil-desa"
},
{
id: "Desa_2",
diff --git a/src/app/darmasaba/(pages)/desa/profile/_com/BackButto.tsx b/src/app/darmasaba/(pages)/desa/profil/_com/BackButto.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/_com/BackButto.tsx
rename to src/app/darmasaba/(pages)/desa/profil/_com/BackButto.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/page.tsx b/src/app/darmasaba/(pages)/desa/profil/page.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/page.tsx
rename to src/app/darmasaba/(pages)/desa/profil/page.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx b/src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/[id]/page.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/[id]/page.tsx
rename to src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/[id]/page.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx b/src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/page.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/page.tsx
rename to src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/page.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css b/src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/struktur.css
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/struktur-perangkat-desa/struktur.css
rename to src/app/darmasaba/(pages)/desa/profil/struktur-perangkat-desa/struktur.css
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/lambangDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/lambangDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/lambangDesa.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/maskotDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/maskotDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/maskotDesa.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/motoDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/motoDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/motoDesa.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/profilPerbekel.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/profilPerbekel.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/profilPerbekel.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/profilPerbekel.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/profileDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/profileDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/profileDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/profileDesa.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/sejarahDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/sejarahDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/sejarahDesa.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/semuaPerbekel.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/semuaPerbekel.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/semuaPerbekel.tsx
diff --git a/src/app/darmasaba/(pages)/desa/profile/ui/visimisiDesa.tsx b/src/app/darmasaba/(pages)/desa/profil/ui/visimisiDesa.tsx
similarity index 100%
rename from src/app/darmasaba/(pages)/desa/profile/ui/visimisiDesa.tsx
rename to src/app/darmasaba/(pages)/desa/profil/ui/visimisiDesa.tsx
diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx
index 16981c7e..9a53b209 100644
--- a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/[id]/page.tsx
@@ -12,6 +12,7 @@ import {
Skeleton,
Stack,
Text,
+ Title,
} from '@mantine/core';
import { IconArrowBack } from '@tabler/icons-react';
import { useParams, useRouter } from 'next/navigation';
@@ -41,9 +42,9 @@ export default function DetailInformasiPublikUser() {
return (
-
+
Informasi tidak ditemukan
-
+
router.push('/informasi-publik')}>
Kembali ke Daftar
@@ -75,53 +76,60 @@ export default function DetailInformasiPublikUser() {
shadow="xs"
>
-
Detail Informasi Publik
-
+
+ {/* CONTENT */}
+ {/* Jenis Informasi */}
-
+
Jenis Informasi
-
-
+
+
{data.jenisInformasi || '-'}
+ {/* Tanggal Publikasi */}
-
+
Tanggal Publikasi
-
-
+
+
{data.tanggal
? new Date(data.tanggal).toLocaleDateString('id-ID', {
- day: '2-digit',
- month: 'long',
- year: 'numeric',
- })
+ day: '2-digit',
+ month: 'long',
+ year: 'numeric',
+ })
: '-'}
+ {/* Deskripsi */}
-
+
Deskripsi
-
+
+
@@ -130,4 +138,4 @@ export default function DetailInformasiPublikUser() {
);
-}
\ No newline at end of file
+}
diff --git a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx
index 9b9e12e3..7208dcfa 100644
--- a/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/daftar-informasi-publik/page.tsx
@@ -21,7 +21,8 @@ import {
TableTr,
Text,
TextInput,
- Tooltip
+ Tooltip,
+ Title
} from '@mantine/core';
import { useDebouncedValue, useShallowEffect } from '@mantine/hooks';
import { IconBrandWhatsapp, IconDeviceImacCog, IconFileInfo, IconMail, IconSearch } from '@tabler/icons-react';
@@ -33,7 +34,7 @@ import { useTransitionRouter } from 'next-view-transitions';
function Page() {
const listData = useProxy(daftarInformasiPublik)
const [search, setSearch] = useState('')
- const [debouncedSearch] = useDebouncedValue(search, 1000); // 500ms delay
+ const [debouncedSearch] = useDebouncedValue(search, 1000); // 1000ms delay
const router = useTransitionRouter()
const {
data,
@@ -65,20 +66,49 @@ function Page() {
+
-
+
-
+
+
Daftar Informasi Publik
-
-
+
+
+
-
+
Tentang Informasi Publik
-
-
+
+
+
Daftar Informasi Publik Desa Darmasaba adalah kumpulan data yang dapat diakses oleh masyarakat sesuai dengan ketentuan peraturan yang berlaku.
@@ -97,8 +127,8 @@ function Page() {
{data.length === 0 ? (
-
- Tidak ada informasi publik yang ditemukan.
+
+ Tidak ada informasi publik yang ditemukan.
- Indeks Kepuasan Masyarakat
+ {/* Main page title — converted to Title, use order (don't set fz according to rules) */}
+
+ Indeks Kepuasan Masyarakat
+
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+ {/* Body lead text — responsive fz & lh */}
+
+ Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+
Ajukan Responden
+ >
+ Ajukan Responden
+
-
-
-
-
-
- Pelayanan Terhadap Publik Desa Darmasaba
+
+
+
+
+
+
+ {/* Section heading — use Title order for hierarchy */}
+
+ Pelayanan Terhadap Publik Desa Darmasaba
+
+
- Total Responden
-
- {state.findMany.total.toLocaleString('id-ID')}
+
+ Total Responden
+ {/* Big number — use Title for emphasis */}
+
+ {state.findMany.total.toLocaleString('id-ID')}
+
+
-
-
+
+
+
{/* Chart Jenis Kelamin */}
- Jenis Kelamin
+ Jenis Kelamin
+
{donutDataJenisKelamin.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -218,7 +248,7 @@ const state = useProxy(indeksKepuasanState.responden);
withTooltip
labelsPosition="inside"
labelsType="percent"
- size={250} // Fixed size in pixels
+ size={250}
data={donutDataJenisKelamin}
/>
@@ -227,7 +257,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataJenisKelamin.map((entry) => (
- {entry.name}: {entry.value}
+ {entry.name}: {entry.value}
))}
@@ -240,9 +270,10 @@ const state = useProxy(indeksKepuasanState.responden);
{/* Chart Rating */}
- Ulasan
+ Ulasan
+
{donutDataRating.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -267,7 +298,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataRating.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -283,9 +314,10 @@ const state = useProxy(indeksKepuasanState.responden);
{/* Chart Kelompok Umur */}
- Umur
+ Umur
+
{donutDataKelompokUmur.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -310,7 +342,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataKelompokUmur.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -326,18 +358,21 @@ const state = useProxy(indeksKepuasanState.responden);
+
{/* Modal */}
-
+ {
state.create.form.name = val.currentTarget.value;
}}
+ // label typography
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
{
state.create.form.tanggal = val.currentTarget.value;
}}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
@@ -415,36 +451,47 @@ const state = useProxy(indeksKepuasanState.responden);
);
}
+
return (
-
-
+
+
- Indeks Kepuasan Masyarakat
+ {/* Main page title — Title with order */}
+
+ Indeks Kepuasan Masyarakat
+
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+
+ Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+
- Ajukan Responden
+ Ajukan Responden
-
-
-
-
+
+
+
+
+
-
+
Pelayanan Terhadap Publik Desa Darmasaba
-
+
+
- Total Responden
-
+ Total Responden
+
{state.findMany.total.toLocaleString('id-ID')}
-
+
+
-
+
+
{/* Chart Jenis Kelamin */}
- Jenis Kelamin
+ Jenis Kelamin
+
{donutDataJenisKelamin.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -494,7 +538,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataJenisKelamin.map((entry) => (
- {entry.name}: {entry.value}
+ {entry.name}: {entry.value}
))}
@@ -507,9 +551,10 @@ const state = useProxy(indeksKepuasanState.responden);
{/* Chart Rating */}
- Ulasan
+ Ulasan
+
{donutDataRating.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -534,7 +579,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataRating.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -550,9 +595,10 @@ const state = useProxy(indeksKepuasanState.responden);
{/* Chart Kelompok Umur */}
- Umur
+ Umur
+
{donutDataKelompokUmur.every(item => item.value === 0) ? (
-
+
Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -577,7 +623,7 @@ const state = useProxy(indeksKepuasanState.responden);
{donutDataKelompokUmur.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -593,18 +639,20 @@ const state = useProxy(indeksKepuasanState.responden);
+
{/* Modal */}
-
+ {
state.create.form.name = val.currentTarget.value;
}}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
{
state.create.form.tanggal = val.currentTarget.value;
}}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
{
@@ -625,17 +674,18 @@ const state = useProxy(indeksKepuasanState.responden);
}}
data={
(indeksKepuasanState.jenisKelaminResponden.findMany.data || [])
- .filter(Boolean) // Hapus null, undefined, dll
+ .filter(Boolean)
.map((item) => ({
value: item.id,
label: item.name || 'Tanpa Nama',
}))
}
disabled={indeksKepuasanState.jenisKelaminResponden.findMany.loading}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
{
@@ -643,17 +693,18 @@ const state = useProxy(indeksKepuasanState.responden);
}}
data={
(indeksKepuasanState.pilihanRatingResponden.findMany.data || [])
- .filter(Boolean) // Hapus null, undefined, dll
+ .filter(Boolean)
.map((item) => ({
value: item.id,
label: item.name || 'Tanpa Nama',
}))
}
disabled={indeksKepuasanState.pilihanRatingResponden.findMany.loading}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
{
@@ -661,19 +712,16 @@ const state = useProxy(indeksKepuasanState.responden);
}}
data={
(indeksKepuasanState.kelompokUmurResponden.findMany.data || [])
- .filter(Boolean) // Hapus null, undefined, dll
+ .filter(Boolean)
.map((item) => ({
value: item.id,
label: item.name || 'Tanpa Nama',
}))
}
disabled={indeksKepuasanState.kelompokUmurResponden.findMany.loading}
+ labelProps={{ style: { fontSize: '0.95rem', lineHeight: '1.4' } } as any}
/>
-
+
Submit
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
index 6bd6ebd1..f5d12f86 100644
--- a/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-informasi-publik/page.tsx
@@ -12,7 +12,8 @@ import {
SimpleGrid,
Stack,
Text,
- TextInput
+ TextInput,
+ Title
} from '@mantine/core';
import { IconSend2 } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
@@ -55,7 +56,7 @@ function Page() {
const submitForms = async () => {
const { create } = permohonanInformasiPublikState.statepermohonanInformasiPublik;
- const hasil = await create.create(); // tunggu hasilnya
+ const hasil = await create.create();
if (hasil) {
router.push('/darmasaba/permohonan/berhasil');
}
@@ -67,14 +68,17 @@ function Page() {
-
Permohonan Informasi Publik
-
+
@@ -85,15 +89,18 @@ function Page() {
shadow="sm"
bg={colors['white-trans-1']}
>
-
Tata Cara Permohonan
-
+
{steps.map((v) => (
@@ -116,27 +123,38 @@ function Page() {
c={colors['blue-button']}
ta="center"
fw="bold"
- fz="h3"
+ fz="h2"
+ lh={1}
>
{v.number}
+
+
+ {v.title}
+
+
- {v.title}
-
-
{v.desc}
))}
+
-
Formulir Permohonan Informasi
-
+
+ {/* INPUTS */}
+
+
+
+
+
{
permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.caraMemperolehInformasiId =
val.id;
}}
/>
+
{
permohonanInformasiPublikState.statepermohonanInformasiPublik.create.form.caraMemperolehSalinanInformasiId =
@@ -241,6 +270,7 @@ function Page() {
Kirim Permohonan
+
diff --git a/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx b/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
index 871fd6f5..80de7c2e 100644
--- a/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/permohonan-keberatan-informasi-publik/page.tsx
@@ -12,6 +12,7 @@ import {
Stack,
Text,
TextInput,
+ Title,
Tooltip,
} from '@mantine/core';
import {
@@ -56,13 +57,8 @@ function Page() {
const router = useRouter();
const submit = async () => {
- const { create } = stateKeberatan;
-
- const hasil = await create.create(); // tunggu hasilnya
-
- if (hasil) {
- router.push('/darmasaba/permohonan/berhasil');
- }
+ const hasil = await stateKeberatan.create.create();
+ if (hasil) router.push('/darmasaba/permohonan/berhasil');
};
return (
@@ -72,15 +68,16 @@ function Page() {
-
Permohonan Keberatan Informasi Publik
-
+
+ {/* Tentang */}
-
+
Tentang Permohonan Keberatan
-
-
+
+
+
Jika Anda merasa permohonan informasi tidak ditanggapi dengan
baik atau ditolak, Anda berhak mengajukan keberatan melalui
formulir berikut.
+ {/* Alur */}
-
Alur Pengajuan Keberatan
-
+
{data.map((v) => (
@@ -124,15 +131,23 @@ function Page() {
-
- Pejabat Pengelola Informasi dan Dokumentasi
-
-
-
-
-
-
-
-
-
- e.currentTarget.src = "/perbekel.png"}
- loading="lazy"
- />
-
-
- {item.name}
-
-
-
-
-
-
-
-
-
-
-
- Biografi
-
-
-
-
-
-
-
-
- Riwayat Karir
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Pengalaman Organisasi
-
-
-
-
-
-
-
-
-
-
-
- Program Unggulan
-
-
-
-
-
-
-
-
-
- ))}
-
- {/* Tombol Scroll ke Atas */}
-
-
- )
-}
-
-export default Page
diff --git a/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx b/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx
index 9b0d45cc..3b42bec3 100644
--- a/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/struktur-ppid/[id]/page.tsx
@@ -27,7 +27,6 @@ function DetailPegawaiUser() {
statePegawai.findUnique.load(params?.id as string);
}, []);
-
if (!statePegawai.findUnique.data) {
return (
@@ -52,7 +51,7 @@ function DetailPegawaiUser() {
}}
>
-
+
Kembali
@@ -65,9 +64,7 @@ function DetailPegawaiUser() {
radius="lg"
shadow="sm"
bg="white"
- style={{
- border: '1px solid #eaeaea',
- }}
+ style={{ border: '1px solid #eaeaea' }}
>
{/* Foto Profil */}
@@ -84,10 +81,23 @@ function DetailPegawaiUser() {
{/* Nama & Jabatan */}
-
+
{data.namaLengkap || '-'} {data.gelarAkademik || ''}
-
+
+
{data.posisi?.nama || 'Posisi tidak tersedia'}
@@ -105,10 +115,10 @@ function DetailPegawaiUser() {
value={
data.tanggalMasuk
? new Date(data.tanggalMasuk).toLocaleDateString('id-ID', {
- day: '2-digit',
- month: 'long',
- year: 'numeric',
- })
+ day: '2-digit',
+ month: 'long',
+ year: 'numeric',
+ })
: '-'
}
/>
@@ -123,7 +133,7 @@ function DetailPegawaiUser() {
);
}
-/* Komponen kecil untuk menampilkan baris informasi */
+/* Komponen Baris Informasi */
function InfoRow({
label,
value,
@@ -137,11 +147,18 @@ function InfoRow({
}) {
return (
-
+
{label}
+
Struktur Organisasi PPID
-
+
Gambaran visual peran dan pegawai yang ditugaskan. Arahkan kursor
untuk melihat detail atau klik node untuk fokus tampilan.
@@ -105,8 +106,8 @@ function StrukturOrganisasiPPID() {
- Memuat struktur organisasi…
-
+ Memuat struktur organisasi…
+
Mengambil data pegawai dan posisi. Mohon tunggu sebentar.
@@ -132,10 +133,10 @@ function StrukturOrganisasiPPID() {
-
+
Data pegawai belum tersedia
-
+
Belum ada data pegawai yang tercatat untuk PPID.
@@ -232,11 +233,18 @@ function StrukturOrganisasiPPID() {
{/* 🔍 Controls */}
}
- style={{ flexShrink: 0 }} // 👈 pastikan tidak mengecil
+ style={{ flexShrink: 0 }}
>
- Zoom Out
+ Zoom Out
- {Math.round(scale * 100)}%
+
+ {Math.round(scale * 100)}%
+ }
style={{ flexShrink: 0 }}
>
- Zoom In
+ Zoom In
- Reset
+ Reset
- {isFullscreen ? 'Exit' : 'Fullscreen'}
+
+ {isFullscreen ? 'Exit' : 'Fullscreen'}
+
@@ -451,18 +465,17 @@ function NodeCard({ node, router }: any) {
{/* Name */}
{name}
@@ -470,18 +483,18 @@ function NodeCard({ node, router }: any) {
{/* Title/Position */}
{title}
@@ -504,7 +517,7 @@ function NodeCard({ node, router }: any) {
fontWeight: 600,
}}
>
- Lihat Detail
+ Lihat Detail
)}
diff --git a/src/app/darmasaba/(pages)/ppid/visi-misi-ppid/page.tsx b/src/app/darmasaba/(pages)/ppid/visi-misi-ppid/page.tsx
index 43440556..f3541077 100644
--- a/src/app/darmasaba/(pages)/ppid/visi-misi-ppid/page.tsx
+++ b/src/app/darmasaba/(pages)/ppid/visi-misi-ppid/page.tsx
@@ -1,7 +1,18 @@
'use client'
import stateVisiMisiPPID from '@/app/admin/(dashboard)/_state/ppid/visi_misi_ppid/visimisiPPID';
import colors from '@/con/colors';
-import { Box, Center, Image, Paper, Skeleton, Stack, Text, Divider, Transition } from '@mantine/core';
+import {
+ Box,
+ Center,
+ Image,
+ Paper,
+ Skeleton,
+ Stack,
+ Text,
+ Divider,
+ Transition,
+ Title
+} from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
import { IconSparkles } from '@tabler/icons-react';
@@ -9,6 +20,7 @@ import BackButton from '../../desa/layanan/_com/BackButto';
function Page() {
const allList = useProxy(stateVisiMisiPPID);
+
useShallowEffect(() => {
allList.findById.load("1");
}, []);
@@ -35,7 +47,7 @@ function Page() {
{dataArray.map((item) => (
-
+
{(styles) => (
+
+ {/* ==== MOTTO SECTION ==== */}
-
+
-
Moto PPID Desa Darmasaba
-
-
+
+
+
Memberikan informasi yang cepat, mudah, tepat, dan transparan
- } />
+ }
+ />
+ {/* ==== VISI SECTION ==== */}
-
- Visi PPID
-
-
+ Visi PPID
+
+
+
+ {/* ==== MISI SECTION ==== */}
-
+
Misi PPID
-
+
+
+
)}
diff --git a/src/app/darmasaba/_com/ModernNewsNotification.tsx b/src/app/darmasaba/_com/ModernNewsNotification.tsx
index e2663db0..2fa14f1c 100644
--- a/src/app/darmasaba/_com/ModernNewsNotification.tsx
+++ b/src/app/darmasaba/_com/ModernNewsNotification.tsx
@@ -168,6 +168,7 @@ export default function ModernNewsNotification({
position: "fixed",
bottom: "24px",
right: "24px",
+ zIndex: 1
}}
>
{
borderBottomRightRadius: '20px',
borderTopRightRadius: '20px',
transition: 'all 0.3s ease',
+ zIndex: 1
}}
>
{isPointerMode ? : }
diff --git a/src/app/darmasaba/_com/main-page/apbdes/index.tsx b/src/app/darmasaba/_com/main-page/apbdes/index.tsx
index ad848d55..1e70c8e0 100644
--- a/src/app/darmasaba/_com/main-page/apbdes/index.tsx
+++ b/src/app/darmasaba/_com/main-page/apbdes/index.tsx
@@ -5,7 +5,20 @@ import apbdes from '@/app/admin/(dashboard)/_state/landing-page/apbdes'
import APBDesProgress from '@/app/darmasaba/(tambahan)/apbdes/lib/apbDesaProgress'
import { transformAPBDesData } from '@/app/darmasaba/(tambahan)/apbdes/lib/types'
import colors from '@/con/colors'
-import { ActionIcon, BackgroundImage, Box, Button, Center, Group, Loader, Select, SimpleGrid, Stack, Text } from '@mantine/core'
+import {
+ ActionIcon,
+ BackgroundImage,
+ Box,
+ Button,
+ Center,
+ Group,
+ Loader,
+ Select,
+ SimpleGrid,
+ Stack,
+ Text,
+ Title,
+} from '@mantine/core'
import { IconDownload } from '@tabler/icons-react'
import Link from 'next/link'
import { useEffect, useState } from 'react'
@@ -38,17 +51,15 @@ function Apbdes() {
const dataAPBDes = state.findMany.data || []
const years = Array.from(new Set(dataAPBDes.map((item: any) => item.tahun)))
- .sort((a, b) => b - a) // urutkan descending
+ .sort((a, b) => b - a)
.map(year => ({ value: year.toString(), label: `Tahun ${year}` }))
- // Pilih tahun pertama sebagai default jika belum ada yang dipilih
useEffect(() => {
if (years.length > 0 && !selectedYear) {
setSelectedYear(years[0].value)
}
}, [years, selectedYear])
- // Transform and filter data based on selected year
const currentApbdes = dataAPBDes.length > 0
? transformAPBDesData(dataAPBDes.find(item => item?.tahun?.toString() === selectedYear) || dataAPBDes[0])
: null
@@ -57,17 +68,31 @@ function Apbdes() {
return (
-
+ {/* 📌 HEADING */}
+
-
+
{textHeading.title}
-
-
+
+
+
{textHeading.des}
+ {/* Button Lihat Semua */}
- {/* 🔥 COMBOBOX UNTUK PILIH TAHUN */}
+ {/* COMBOBOX */}
Pilih Tahun APBDes}
placeholder="Pilih tahun"
value={selectedYear}
onChange={setSelectedYear}
data={years}
- w={{ base: '100%', sm: 200 }}
+ w={{ base: '100%', sm: 220 }}
searchable
clearable
nothingFoundMessage="Tidak ada tahun tersedia"
/>
+ {/* Progress */}
{currentApbdes ? (
- <>
-
- >
+
) : (
- Tidak ada data APBDes untuk tahun yang dipilih.
+
+ Tidak ada data APBDes untuk tahun yang dipilih.
+
)}
-
+ {/* GRID */}
+
{loading ? (
-
+
Belum ada data APBDes yang tersedia
-
+
Data akan ditampilkan di sini setelah diunggah
@@ -133,25 +165,30 @@ function Apbdes() {
style={{ overflow: 'hidden' }}
>
-
+
+
{v.name}
+
{v.jumlah}
+
-
- {/*
-
-
-
-
-
- */}
))
)}
-
-
)
}
diff --git a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
index cd8dcff1..de9c6317 100644
--- a/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
+++ b/src/app/darmasaba/_com/main-page/desaantikorupsi/index.tsx
@@ -2,7 +2,16 @@
'use client'
import korupsiState from "@/app/admin/(dashboard)/_state/landing-page/desa-anti-korupsi";
import colors from "@/con/colors";
-import { Button, Center, Container, Flex, Paper, SimpleGrid, Stack, Text } from "@mantine/core";
+import {
+ Button,
+ Center,
+ Container,
+ Flex,
+ Paper,
+ SimpleGrid,
+ Stack,
+ Text
+} from "@mantine/core";
import { IconClipboardText } from "@tabler/icons-react";
import Link from "next/link";
import { useEffect, useState } from "react";
@@ -11,7 +20,6 @@ import { useProxy } from "valtio/utils";
function DesaAntiKorupsi() {
const state = useProxy(korupsiState);
const [loading, setLoading] = useState(false);
-
useEffect(() => {
const loadData = async () => {
@@ -19,30 +27,64 @@ function DesaAntiKorupsi() {
setLoading(true);
await state.desaAntikorupsi.findMany.load();
} catch (error) {
- console.error('Error loading data:', error);
+ console.error("Error loading data:", error);
} finally {
setLoading(false);
}
- }
+ };
loadData();
- }, [])
+ }, []);
const data = (state.desaAntikorupsi.findMany.data || []).slice(0, 6);
+
return (
-
-
+
+ {/* ===================== HEADER ===================== */}
+
- Desa Anti Korupsi
+
+ Desa Anti Korupsi
+
- Desa antikorupsi mendorong pemerintahan jujur dan transparan. Keuangan desa dikelola terbuka dengan melibatkan warga mengawasi anggaran, sehingga digunakan tepat sasaran sesuai kebutuhan.
-
- Selengkapnya
+
+
+ Desa antikorupsi mendorong pemerintahan jujur dan transparan.
+ Keuangan desa dikelola secara terbuka dengan melibatkan warga
+ dalam pengawasan anggaran, sehingga digunakan tepat sasaran dan
+ sesuai kebutuhan masyarakat.
+
+
+
+
+ Selengkapnya
+
+
+ {/* ===================== LIST ===================== */}
{loading ? (
- Indeks Kepuasan Masyarakat
+ >
+ Indeks Kepuasan Masyarakat
+
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
-
+
+
+ Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+
+
-
-
-
-
-
- Pelayanan Terhadap Publik Desa Darmasaba
-
- Total Responden
-
+
+
+
+
+
+
+
+ Pelayanan Terhadap Publik Desa Darmasaba
+
+
+
+
+ Total Responden
+
+
{state.findMany.total.toLocaleString('id-ID')}
-
+
+
+
+
-
-
+
+
+
{/* Chart Jenis Kelamin */}
- Jenis Kelamin
+ Jenis Kelamin
{donutDataJenisKelamin.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -224,19 +273,20 @@ function Kepuasan() {
withTooltip
tooltipAnimationDuration={200}
withLabels
- labelsPosition="inside" // 👈 ini yang penting!
+ labelsPosition="inside"
labelsType="percent"
withLabelsLine
- size={isMobile ? 180 : 250} // 👈 kecilkan ukuran di mobile
+ size={isMobile ? 180 : 250}
data={donutDataJenisKelamin}
/>
+
{donutDataJenisKelamin.map((entry) => (
- {entry.name}: {entry.value}
+ {entry.name}: {entry.value}
))}
@@ -249,11 +299,9 @@ function Kepuasan() {
{/* Chart Rating */}
- Ulasan
+ Ulasan
{donutDataRating.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -263,20 +311,21 @@ function Kepuasan() {
withTooltip
tooltipAnimationDuration={200}
withLabels
- labelsPosition="inside" // 👈 ini yang penting!
+ labelsPosition="inside"
labelsType="percent"
withLabelsLine
- size={isMobile ? 180 : 250} // 👈 kecilkan ukuran di mobile
+ size={isMobile ? 180 : 250}
data={donutDataRating}
/>
+
{donutDataRating.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -292,11 +341,9 @@ function Kepuasan() {
{/* Chart Kelompok Umur */}
- Umur
+ Umur
{donutDataKelompokUmur.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -306,20 +353,21 @@ function Kepuasan() {
withTooltip
tooltipAnimationDuration={200}
withLabels
- labelsPosition="inside"// 👈 ini yang penting!
+ labelsPosition="inside"
labelsType="percent"
withLabelsLine
- size={isMobile ? 180 : 250} // 👈 kecilkan ukuran di mobile
+ size={isMobile ? 180 : 250}
data={donutDataKelompokUmur}
/>
+
{donutDataKelompokUmur.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -331,17 +379,19 @@ function Kepuasan() {
)}
+
+
{/* Modal */}
-
+ {
@@ -415,8 +465,9 @@ function Kepuasan() {
mt={10}
bg={colors['blue-button']}
onClick={handleSubmit}
+ style={{ fontWeight: 700 }}
>
- Submit
+ Submit
@@ -424,72 +475,108 @@ function Kepuasan() {
);
}
+
return (
-
+
- Indeks Kepuasan Masyarakat
+ >
+ Indeks Kepuasan Masyarakat
+
- Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
-
- Ajukan Responden
+
+
+ Ukur kebahagiaan warga, tingkatkan layanan desa! Dengan partisipasi aktif masyarakat, kami berkomitmen untuk terus memperbaiki layanan agar lebih transparan, efektif, dan sesuai dengan kebutuhan warga. Kepuasan Anda adalah prioritas utama kami dalam membangun desa yang lebih baik!
+
+
+
+
+ Ajukan Responden
+
-
-
-
-
+
+
+
+
+
-
+
Pelayanan Terhadap Publik Desa Darmasaba
-
- Total Responden
-
+
+
+
+ Total Responden
+
+
{state.findMany.total.toLocaleString('id-ID')}
-
+
+
+
+
-
-
+
+
+
{/* Chart Jenis Kelamin */}
- Jenis Kelamin
+ Jenis Kelamin
{donutDataJenisKelamin.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -499,18 +586,18 @@ function Kepuasan() {
withLabels
withTooltip
labelsPosition="inside"
-
labelsType="percent"
size={200}
data={donutDataJenisKelamin}
/>
+
{donutDataJenisKelamin.map((entry) => (
- {entry.name}: {entry.value}
+ {entry.name}: {entry.value}
))}
@@ -523,11 +610,9 @@ function Kepuasan() {
{/* Chart Rating */}
- Ulasan
+ Ulasan
{donutDataRating.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -537,7 +622,6 @@ function Kepuasan() {
withTooltip
tooltipAnimationDuration={200}
withLabels
-
labelsPosition="inside"
labelsType="percent"
withLabelsLine
@@ -546,12 +630,13 @@ function Kepuasan() {
/>
+
{donutDataRating.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -567,11 +652,9 @@ function Kepuasan() {
{/* Chart Kelompok Umur */}
- Umur
+ Umur
{donutDataKelompokUmur.every(item => item.value === 0) ? (
-
- Belum ada data untuk ditampilkan dalam grafik
-
+ Belum ada data untuk ditampilkan dalam grafik
) : (
@@ -581,7 +664,6 @@ function Kepuasan() {
withTooltip
tooltipAnimationDuration={200}
withLabels
-
labelsPosition="inside"
labelsType="percent"
withLabelsLine
@@ -590,12 +672,13 @@ function Kepuasan() {
/>
+
{donutDataKelompokUmur.map((entry) => (
-
+
{entry.name}: {entry.value}
@@ -607,13 +690,15 @@ function Kepuasan() {
)}
+
+
{/* Modal */}
-
+
- Submit
+ Submit
@@ -701,4 +787,4 @@ function Kepuasan() {
);
}
-export default Kepuasan;
+export default Kepuasan;
\ No newline at end of file
diff --git a/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx b/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx
index 4d67390f..695f0572 100644
--- a/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx
+++ b/src/app/darmasaba/_com/main-page/landing-page/ModuleView.tsx
@@ -53,14 +53,23 @@ function ModuleItem({ data }: { data: ProgramInovasiItem }) {
) : (
-
+
+ {/* ❗ Caption konsisten */}
+
Belum ada gambar
)}
+
-
+ {/* ❗ Responsive Title */}
+
{data.name}
@@ -91,10 +100,14 @@ function ModuleView() {
-
+
+ {/* ❗ Empty title lebih besar */}
+
Belum ada program inovasi
-
+
+ {/* ❗ Deskripsi kecil & lembut */}
+
Tambahkan program inovasi untuk ditampilkan di sini
@@ -103,11 +116,12 @@ function ModuleView() {
}
return (
-
diff --git a/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx b/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx
index 2003baf2..2f8f5f28 100644
--- a/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx
+++ b/src/app/darmasaba/_com/main-page/landing-page/ProfileView.tsx
@@ -13,10 +13,23 @@ export default function ProfileView({ data }: ProfileViewProps) {
-
+
+ {/* TITLE EMPTY */}
+
Profil belum tersedia
-
+
+ {/* DESCRIPTION EMPTY */}
+
Data pejabat desa akan muncul di sini
@@ -30,12 +43,12 @@ export default function ProfileView({ data }: ProfileViewProps) {
align="end"
pos="relative"
w={{
- base: '100%', // mobile: full width
- xs: '100%', // small mobile
- sm: '85%', // tablet: 85%
- md: '60%', // laptop: 60%
- lg: '55%', // laptop large: 55%
- xl: '50%' // extra large (4K): 50%
+ base: '100%',
+ xs: '100%',
+ sm: '85%',
+ md: '60%',
+ lg: '55%',
+ xl: '50%',
}}
px={{ base: 'md', sm: 'lg', md: 'xl', xl: '2xl' }}
h={{ base: 'auto', sm: '500px', md: '600px', lg: '650px', xl: '700px' }}
@@ -67,13 +80,17 @@ export default function ProfileView({ data }: ProfileViewProps) {
) : (
-
+
Belum ada foto
)}
- {/* Box nama dan jabatan - responsive positioning */}
+ {/* Box nama & jabatan */}
-
- {data.position || 'Tidak ada jabatan'}
-
+
+ {/* POSITION / JABATAN */}
+
+ {data.position || 'Tidak ada jabatan'}
+
+
+ {/* NAME */}
@@ -114,4 +135,4 @@ export default function ProfileView({ data }: ProfileViewProps) {
);
-}
\ No newline at end of file
+}
diff --git a/src/app/darmasaba/_com/main-page/landing-page/SosmedView.tsx b/src/app/darmasaba/_com/main-page/landing-page/SosmedView.tsx
index 773b906f..3e61123a 100644
--- a/src/app/darmasaba/_com/main-page/landing-page/SosmedView.tsx
+++ b/src/app/darmasaba/_com/main-page/landing-page/SosmedView.tsx
@@ -26,7 +26,11 @@ function SosmedView({
data.map((item, k) => (
+ {item.name || "Tautan Sosial"}
+
+ }
withArrow
position="top"
transitionProps={{ transition: "pop", duration: 150 }}
@@ -57,7 +61,7 @@ function SosmedView({
);
}
- return ;
+ return ;
})()}
@@ -72,7 +76,12 @@ function SosmedView({
background: "linear-gradient(135deg, #1C6EA4 0%, #000 100%)",
}}
>
-
+
Belum ada media sosial yang terhubung
diff --git a/src/app/darmasaba/_com/main-page/landing-page/index.tsx b/src/app/darmasaba/_com/main-page/landing-page/index.tsx
index 8204b784..8164dbc8 100644
--- a/src/app/darmasaba/_com/main-page/landing-page/index.tsx
+++ b/src/app/darmasaba/_com/main-page/landing-page/index.tsx
@@ -59,7 +59,7 @@ const getWorkStatus = (day: string, currentTime: string): { status: string; mess
: { status: "Tutup", message: "08:00 - 17:00" };
};
-// Skeleton component untuk Social Media
+// 🟦 Skeleton component untuk Social Media
const SosmedSkeleton = () => (
{[1, 2, 3, 4].map((i) => (
@@ -68,7 +68,7 @@ const SosmedSkeleton = () => (
);
-// Skeleton component untuk Profile
+// 🟦 Skeleton component untuk Profile
const ProfileSkeleton = () => (
+
+ {/* Header Logo */}
@@ -167,6 +169,8 @@ function LandingPage() {
+
+ {/* Jam Operasional */}
+
+ {/* Kolom 1 */}
- Jam Operasional
+
+ Jam Operasional
+
+
{workStatus.status}
- {workStatus.message}
+
+
+ {workStatus.message}
+
+
+ {/* Kolom 2 */}
- Hari Ini
+
+ Hari Ini
+
+
- Status Kantor
-
- {workStatus.status === "Buka" ? "Sedang Beroperasi" : "Tidak Beroperasi"}
+
+ Status Kantor
+
+
+ {workStatus.status === "Buka"
+ ? "Sedang Beroperasi"
+ : "Tidak Beroperasi"}
@@ -217,19 +243,29 @@ function LandingPage() {
+ {/* MODULE VIEW */}
+ {/* Sosmed */}
{isLoadingSosmed ? (
) : socialMedia.length > 0 ? (
) : (
- Belum ada tautan media sosial yang tersedia
+
+ Belum ada tautan media sosial yang tersedia
+
)}
-
+ {/* CTA Text */}
+
Bagikan ide, kritik, atau saran Anda untuk mendukung pembangunan desa.
Semua lebih mudah dengan fitur interaktif yang kami sediakan.
@@ -237,6 +273,7 @@ function LandingPage() {
+ {/* PROFIL */}
{isLoadingProfile ? (
) : profile ? (
@@ -251,7 +288,9 @@ function LandingPage() {
style={{ height: "fit-content" }}
>
- Informasi profil belum tersedia
+
+ Informasi profil belum tersedia
+
)}
@@ -260,4 +299,4 @@ function LandingPage() {
);
}
-export default LandingPage;
\ No newline at end of file
+export default LandingPage;
diff --git a/src/app/darmasaba/_com/main-page/layanan/index.tsx b/src/app/darmasaba/_com/main-page/layanan/index.tsx
index c5a79653..e5a9db9b 100644
--- a/src/app/darmasaba/_com/main-page/layanan/index.tsx
+++ b/src/app/darmasaba/_com/main-page/layanan/index.tsx
@@ -28,20 +28,41 @@ const textHeading = {
const HEIGHT = 720;
function Layanan() {
+ // responsive breakpoints: base = mobile, md = desktop/tablet landscape
return (
+ {/* Main title - semantic h1 */}
{textHeading.title}
-
+
+ {/* Description - readable line-height and constrained width on desktop */}
+
{textHeading.des}
+
Detail
@@ -175,7 +204,7 @@ function Slider() {
startXRef.current = e.pageX - containerRef.current.offsetLeft;
scrollLeftRef.current = containerRef.current.scrollLeft;
velocityRef.current = 0;
- containerRef.current.style.cursor = 'grabbing';
+ containerRef.current.style.cursor = "grabbing";
};
const handleMouseMove = (e: React.MouseEvent) => {
@@ -196,7 +225,7 @@ function Slider() {
if (!containerRef.current || mobile) return;
isDraggingRef.current = false;
- containerRef.current.style.cursor = 'grab';
+ containerRef.current.style.cursor = "grab";
};
const handleWheel = (e: React.WheelEvent) => {
@@ -215,7 +244,7 @@ function Slider() {
if (data.length === 0) {
return (
-
+
Tidak ada layanan tersedia
@@ -240,6 +269,8 @@ function Slider() {
scrollbarWidth: "none",
msOverflowStyle: "none",
}}
+ // ensure keyboard accessibility: allow focus outline when focused
+ tabIndex={0}
>
+ {/* slide title - semantic h2 */}
{_.startCase(item.name)}
+
+ {/* optional short description - rendered if exists */}
+ {item.description ? (
+
+ {item.description}
+
+ ) : null}
-
+
+
router.push(`/darmasaba/desa/layanan/${item.id}`)
}
- px={46}
+ px={mobile ? 20 : 46}
radius="100"
- size="md"
+ size={mobile ? "sm" : "md"}
bg={colors["blue-button"]}
+ // ensure button text readable on all sizes
+ style={{
+ fontSize: mobile ? "0.95rem" : "1rem",
+ whiteSpace: "nowrap",
+ }}
+ aria-label={`Detail layanan ${_.startCase(item.name)}`}
>
Detail
@@ -320,4 +381,4 @@ function Slider() {
);
}
-export default Layanan;
\ No newline at end of file
+export default Layanan;
diff --git a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
index 0c487411..7ff3cf67 100644
--- a/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
+++ b/src/app/darmasaba/_com/main-page/penghargaan/index.tsx
@@ -1,9 +1,21 @@
/* eslint-disable react-hooks/exhaustive-deps */
'use client';
+
import penghargaanState from "@/app/admin/(dashboard)/_state/desa/penghargaan";
-import { Stack, Box, Container, Button, Text, Loader, Paper, Center, ActionIcon } from "@mantine/core";
+import {
+ Stack,
+ Box,
+ Container,
+ Button,
+ Text,
+ Loader,
+ Paper,
+ Center,
+ ActionIcon,
+ Title,
+} from "@mantine/core";
import { IconAward, IconArrowRight, IconPlayerPlay } from "@tabler/icons-react";
-import { useTransitionRouter } from 'next-view-transitions';
+import { useTransitionRouter } from "next-view-transitions";
import { useEffect, useState, useRef } from "react";
import { useProxy } from "valtio/utils";
import { useMediaQuery } from "@mantine/hooks";
@@ -12,43 +24,33 @@ function Penghargaan() {
const router = useTransitionRouter();
const state = useProxy(penghargaanState);
const [loading, setLoading] = useState(false);
- const isMobile = useMediaQuery('(max-width: 768px)');
+ const isMobile = useMediaQuery("(max-width: 768px)");
const [isVideoLoaded, setIsVideoLoaded] = useState(false);
- const [showVideo, setShowVideo] = useState(true);
const [videoError, setVideoError] = useState(false);
+ const [showPlayButton, setShowPlayButton] = useState(false);
const videoRef = useRef(null);
+ const hasTriedAutoplay = useRef(false);
- // Deteksi iOS dengan lebih akurat
- const isIOS = typeof window !== 'undefined' && (
- /iPad|iPhone|iPod/.test(navigator.userAgent) ||
- (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1) // iPad dengan iPadOS 13+
- );
-
- useEffect(() => {
- // Di iOS, coba autoplay dulu, kalau gagal tampilkan fallback
- if (isIOS && videoRef.current) {
- const playPromise = videoRef.current.play();
-
- if (playPromise !== undefined) {
- playPromise
- .then(() => {
- // Autoplay berhasil
- setShowVideo(true);
- setIsVideoLoaded(true);
- })
- .catch(() => {
- // Autoplay gagal, tampilkan fallback
- setShowVideo(false);
- setVideoError(true);
- });
- }
- }
- }, [isIOS]);
+ // ---- TYPOGRAPHY SCALE (RESPONSIVE) ----
+ // ukuran dalam px, lh = line-height
+ const TYPO = {
+ // utama / hero title
+ title: { base: 22, md: 36, lh: 1.08 }, // lebih menonjol di desktop
+ // subheading / loader / tagline
+ subtitle: { base: 14, md: 16, lh: 1.35 },
+ // teks body / deskripsi umum
+ body: { base: 14, md: 16, lh: 1.6 },
+ // caption / small notes
+ small: { base: 12, md: 13, lh: 1.4 },
+ // judul dalam kartu (card title)
+ paperTitle: { base: 15, md: 18, lh: 1.25 },
+ };
+ // Load data
useEffect(() => {
const loadData = async () => {
+ setLoading(true);
try {
- setLoading(true);
await state.findMany.load();
} finally {
setLoading(false);
@@ -57,99 +59,134 @@ function Penghargaan() {
loadData();
}, []);
- const handlePlayVideo = () => {
- setShowVideo(true);
- setVideoError(false);
-
- // Paksa play video setelah user interaction
- setTimeout(() => {
- if (videoRef.current) {
- videoRef.current.play().catch(err => {
- console.error("Video play error:", err);
- setVideoError(true);
- });
+ // Attempt autoplay setelah video loaded
+ useEffect(() => {
+ if (isVideoLoaded && videoRef.current && !hasTriedAutoplay.current) {
+ hasTriedAutoplay.current = true;
+
+ const attemptAutoplay = async () => {
+ try {
+ // Pastikan video muted sebelum play
+ videoRef.current!.muted = true;
+ await videoRef.current!.play();
+ setShowPlayButton(false);
+ console.log("✅ Autoplay berhasil");
+ } catch (err) {
+ console.warn("⚠️ Autoplay diblokir browser:", err);
+ // Tampilkan tombol play jika autoplay gagal
+ setShowPlayButton(true);
+ }
+ };
+
+ // Delay sedikit untuk memastikan video siap
+ setTimeout(attemptAutoplay, 100);
+ }
+ }, [isVideoLoaded]);
+
+ // Handle manual play
+ const handlePlayVideo = async () => {
+ if (videoRef.current) {
+ try {
+ videoRef.current.muted = true;
+ await videoRef.current.play();
+ setShowPlayButton(false);
+ setVideoError(false);
+ } catch (err) {
+ console.error("❌ Gagal memutar video:", err);
+ setVideoError(true);
}
- }, 100);
+ }
};
- // kalau mobile ambil 1 data aja, kalau desktop ambil 3
+ // Ambil data terbatas berdasarkan perangkat
const data = state.findMany.data?.slice(0, isMobile ? 1 : 3);
return (
-
- {/* Video Layer */}
- {showVideo && !videoError && (
+
+ {/* Video background */}
+ {!videoError && (
)}
- {/* Fallback Image + Play Button */}
- {(!showVideo || videoError) && (
+ {/* Fallback background image */}
+ {(videoError || !isVideoLoaded) && (
-
-
-
-
-
-
+ />
)}
- {/* Overlay Gradient + Content */}
+ {/* Tombol Play (muncul jika autoplay gagal atau video error) */}
+ {(showPlayButton || videoError) && (
+
+
+
+
+
+ )}
+
+ {/* Overlay konten */}
-
+
-
Penghargaan Desa
-
+
+ {/* Content area */}
{loading ? (
-
- Sedang memuat data penghargaan...
+
+
+ Sedang memuat data penghargaan...
+
) : data && data.length > 0 ? (
@@ -185,47 +239,98 @@ function Penghargaan() {
key={k}
withBorder
radius="xl"
- p="lg"
+ p={isMobile ? "md" : "lg"}
shadow="xl"
style={{
background: "rgba(255,255,255,0.07)",
backdropFilter: "blur(12px)",
transition: "all 0.3s ease",
}}
+ aria-label={`Penghargaan ${v.name}`}
>
-
-
+
+
{v.name}
+
+ {/* Jika ingin menambahkan deskripsi ringkas di card, gunakan body scale */}
+ {v.description && (
+
+ {v.description}
+
+ )}
))}
) : (
-
-
+
+
Belum ada penghargaan yang tercatat
)}
}
+ rightSection={}
onClick={() => router.push("/darmasaba/penghargaan")}
+ aria-label="Lihat semua penghargaan"
>
- Lihat Semua Penghargaan
+
+ Lihat Semua Penghargaan
+
+
+ {/* CSS untuk animasi tombol play */}
+
);
}
-export default Penghargaan;
\ No newline at end of file
+export default Penghargaan;
diff --git a/src/app/darmasaba/_com/main-page/potensi/index.tsx b/src/app/darmasaba/_com/main-page/potensi/index.tsx
index 7fc00670..33d42aac 100644
--- a/src/app/darmasaba/_com/main-page/potensi/index.tsx
+++ b/src/app/darmasaba/_com/main-page/potensi/index.tsx
@@ -50,31 +50,52 @@ function Potensi() {
return (
-
-
+ {/* HEADER */}
+
+
{textHeading.title}
-
+
+
{textHeading.des}
+ {/* LOADING STATE */}
{loading ? (
- Sedang memuat potensi desa...
+
+ Sedang memuat potensi desa...
+
) : data.length === 0 ? (
-
+
Belum ada potensi tersedia
-
+
Silakan cek kembali nanti untuk pembaruan terbaru.
) : (
+ /* CARD LIST */
{_.take(data, 4).map((v, k) => (
router.push(`/darmasaba/desa/potensi/${v.id}`)}
style={{ cursor: "pointer" }}
>
-
+
+
+ {/* CARD CONTENT */}
-
+
{v.name}
-
+
+
@@ -113,16 +154,18 @@ function Potensi() {
)}
+ {/* BUTTON */}
router.push("/darmasaba/desa/potensi")}
color={colors["blue-button"]}
variant="gradient"
- gradient={{ from: "#26667F", to: "#124170", }}
+ gradient={{ from: "#26667F", to: "#124170" }}
radius="xl"
size="md"
rightSection={}
+ style={{ fontWeight: 600 }}
>
Lihat Semua Potensi
diff --git a/src/app/darmasaba/_com/main-page/prestasi/index.tsx b/src/app/darmasaba/_com/main-page/prestasi/index.tsx
index f5d62650..8038a3b4 100644
--- a/src/app/darmasaba/_com/main-page/prestasi/index.tsx
+++ b/src/app/darmasaba/_com/main-page/prestasi/index.tsx
@@ -2,7 +2,19 @@
'use client'
import prestasiState from "@/app/admin/(dashboard)/_state/landing-page/prestasi-desa";
import colors from "@/con/colors";
-import { BackgroundImage, Box, Button, Center, Container, Group, Loader, SimpleGrid, Stack, Text } from "@mantine/core";
+import {
+ BackgroundImage,
+ Box,
+ Button,
+ Center,
+ Container,
+ Group,
+ Loader,
+ SimpleGrid,
+ Stack,
+ Text,
+ Title,
+} from "@mantine/core";
import Link from "next/link";
import { useRouter } from "next/navigation";
import { useEffect, useState } from "react";
@@ -32,12 +44,31 @@ function Prestasi() {
-
- Prestasi Desa
-
-
- Kami bangga dengan pencapaian desa hingga saat ini. Semoga prestasi ini menjadi inspirasi untuk terus berkarya dan berinovasi demi kemajuan bersama.
+
+ {/* TITLE UTAMA */}
+
+ Prestasi Desa
+
+
+ {/* SUBTEXT */}
+
+ Kami bangga dengan pencapaian desa hingga saat ini. Semoga prestasi ini
+ menjadi inspirasi untuk terus berkarya dan berinovasi demi kemajuan
+ bersama.
+
-
+
Belum ada prestasi yang ditampilkan
) : (
-
+
{data.map((v, k) => (
+
-
-
- {v.kategori.name}
-
-
+
+ {/* KATEGORI */}
+
+ {v.kategori.name}
+
+
+ {/* DESKRIPSI */}
+
router.push(`/darmasaba/prestasi-desa/${v.id}`)}
diff --git a/src/app/darmasaba/_com/main-page/sdgs/index.tsx b/src/app/darmasaba/_com/main-page/sdgs/index.tsx
index ed020e47..4bcbcb4b 100644
--- a/src/app/darmasaba/_com/main-page/sdgs/index.tsx
+++ b/src/app/darmasaba/_com/main-page/sdgs/index.tsx
@@ -20,12 +20,11 @@ export default function SDGS() {
if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`)
const result = await response.json()
let data = []
+
if (Array.isArray(result.data)) data = result.data
else if (Array.isArray(result)) data = result
- else {
- setSdgsDesa([])
- return
- }
+ else return setSdgsDesa([])
+
const top4Sdgs = [...data].sort((a, b) => parseInt(b.jumlah) - parseInt(a.jumlah)).slice(0, 4)
setSdgsDesa(top4Sdgs)
} catch {
@@ -36,24 +35,38 @@ export default function SDGS() {
}, [])
return (
-
+
+
+ {/* ========== TITLE SECTION ========== */}
SDGs Desa
-
- SDGs Desa merupakan langkah nyata untuk mewujudkan desa yang maju, inklusif, dan berkelanjutan melalui 17 tujuan pembangunan dari pengentasan kemiskinan, pendidikan, kesehatan, kesetaraan gender, hingga pelestarian lingkungan.
+
+
+ SDGs Desa adalah upaya desa untuk menciptakan pembangunan yang maju, inklusif, dan berkelanjutan melalui 17 tujuan mulai dari pengentasan kemiskinan, pendidikan, kesehatan, hingga pelestarian lingkungan.
{sdgsDesa && sdgsDesa.length > 0 ? (
+
+ /* ========== LIST GRID ========== */
{sdgsDesa.map((item) => (
- {/* Stack isi teks & angka */}
+
+ {/* JUDUL ITEM */}
{item.name}
+ {/* ANGKA */}
) : (
+
+ /* ========== EMPTY STATE ========== */
-
- Data SDGs Desa belum tersedia
-
+ Data SDGs Desa belum tersedia
)}
+ {/* BUTTON */}
{
- e.currentTarget.style.transform = "translateY(-4px)";
- e.currentTarget.style.boxShadow = "0 10px 20px rgba(18,65,112,0.35)";
+ e.currentTarget.style.transform = "translateY(-4px)"
+ e.currentTarget.style.boxShadow = "0 10px 20px rgba(18,65,112,0.35)"
}}
onMouseLeave={(e) => {
- e.currentTarget.style.transform = "translateY(0)";
- e.currentTarget.style.boxShadow = "0 6px 14px rgba(18,65,112,0.25)";
+ e.currentTarget.style.transform = "translateY(0)"
+ e.currentTarget.style.boxShadow = "0 6px 14px rgba(18,65,112,0.25)"
}}
>
- Jelajahi Semua Tujuan SDGs Desa
+
+ Jelajahi Semua Tujuan SDGs Desa
+