Add Layanan Polsek submenu polsek terdekat

Seeder menu keamanan -> menu ekonomi submenu : demografi pekerjaan, junlah pengangguran, lowongan kerja lokal, pasar desa, program kemiskinan, sektor unggulan, struktur organisasi
This commit is contained in:
2026-01-17 10:32:48 +08:00
parent 184854d273
commit 17b20e0d40
67 changed files with 3238 additions and 1079 deletions

View File

@@ -1,6 +1,7 @@
/* eslint-disable react-hooks/exhaustive-deps */
/* eslint-disable @typescript-eslint/no-explicit-any */
'use client';
import EditEditor from '@/app/admin/(dashboard)/_com/editEditor';
import pasarDesaState from '@/app/admin/(dashboard)/_state/ekonomi/pasar-desa/pasar-desa';
import colors from '@/con/colors';
import ApiFetch from '@/lib/api-fetch';
@@ -33,6 +34,7 @@ type FormData = {
rating: number;
kategoriId: string[];
kontak: string;
deskripsi: string;
};
function EditPasarDesa() {
@@ -51,6 +53,7 @@ function EditPasarDesa() {
rating: 0,
kategoriId: [],
kontak: '',
deskripsi: ''
});
const [originalData, setOriginalData] = useState({
@@ -62,6 +65,7 @@ function EditPasarDesa() {
rating: 0,
kategoriId: [],
kontak: '',
deskripsi: ''
});
// load data awal
@@ -83,6 +87,7 @@ function EditPasarDesa() {
rating: data.rating || 0,
kategoriId: data.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
kontak: data.kontak || '',
deskripsi: data.deskripsi || ''
});
setOriginalData({
nama: data.nama || '',
@@ -93,6 +98,7 @@ function EditPasarDesa() {
rating: data.rating || 0,
kategoriId: data.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
kontak: data.kontak || '',
deskripsi: data.deskripsi || ''
});
if (data.image?.link) setPreviewImage(data.image.link);
}
@@ -120,12 +126,13 @@ function EditPasarDesa() {
rating: originalData.rating,
kategoriId: (originalData as any)?.KategoriToPasar?.map((k: any) => k.kategoriId) || [],
kontak: originalData.kontak,
deskripsi: originalData.deskripsi
});
setPreviewImage(originalData.imageUrl || null);
setFile(null);
toast.info("Form dikembalikan ke data awal");
};
const handleSubmit = async () => {
try {
@@ -157,7 +164,7 @@ function EditPasarDesa() {
};
return (
<Box px={{ base: 0, md: 'xs' }} py="xs">
<Box px={{ base: 0, md: 'xs' }} py="xs">
<Group mb="md">
<Button variant="subtle" onClick={() => router.back()} p="xs" radius="md">
<IconArrowBack color={colors['blue-button']} size={24} />
@@ -316,6 +323,19 @@ function EditPasarDesa() {
error={!formData.kategoriId.length ? 'Pilih minimal satu kategori' : undefined}
/>
{/* Input Deskripsi */}
<Box>
<Text fz="sm" fw="bold" mb={6}>
Deskripsi
</Text>
<EditEditor
value={formData.deskripsi}
onChange={(htmlContent) =>
setFormData((prev) => ({ ...prev, deskripsi: htmlContent }))
}
/>
</Box>
<Group justify="right">
<Button
variant="outline"

View File

@@ -23,6 +23,7 @@ import { useEffect, useState } from 'react';
import { toast } from 'react-toastify';
import { useProxy } from 'valtio/utils';
import pasarDesaState from '../../../../_state/ekonomi/pasar-desa/pasar-desa';
import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor';
export default function CreatePasarDesa() {
const router = useRouter();
@@ -44,6 +45,7 @@ export default function CreatePasarDesa() {
rating: 0,
kategoriId: [],
kontak: '',
deskripsi: ''
};
setPreviewImage(null);
setFile(null);
@@ -80,7 +82,7 @@ export default function CreatePasarDesa() {
};
return (
<Box px={{ base: 0, md: 'xs' }} py="xs">
<Box px={{ base: 0, md: 'xs' }} py="xs">
{/* Header dengan tombol kembali */}
<Group mb="md">
<Button variant="subtle" onClick={() => router.back()} p="xs" radius="md">
@@ -234,6 +236,18 @@ export default function CreatePasarDesa() {
}
/>
<Box>
<Text fw="bold" fz="sm" mb={6}>
Deskripsi Produk
</Text>
<CreateEditor
value={statePasar.pasarDesa.create.form.deskripsi}
onChange={(val) => {
statePasar.pasarDesa.create.form.deskripsi = val;
}}
/>
</Box>
{/* Tombol Submit */}
<Group justify="right">
<Button