API & UI Admin Keamanan Laporan Publik
This commit is contained in:
@@ -0,0 +1,314 @@
|
|||||||
|
import ApiFetch from "@/lib/api-fetch";
|
||||||
|
import { Prisma } from "@prisma/client";
|
||||||
|
import { toast } from "react-toastify";
|
||||||
|
import { proxy } from "valtio";
|
||||||
|
import { z } from "zod";
|
||||||
|
|
||||||
|
const templateForm = z.object({
|
||||||
|
pencegahanKriminalitas: z.object({
|
||||||
|
programKeamanan: z.object({
|
||||||
|
nama: z.string().min(1, "Nama minimal 1 karakter"),
|
||||||
|
deskripsi: z.string().min(1, "Deskripsi minimal 1 karakter"),
|
||||||
|
slug: z.string().min(1, "Slug minimal 1 karakter"),
|
||||||
|
}),
|
||||||
|
tipsKeamanan: z.object({
|
||||||
|
judul: z.string().min(1, "Judul minimal 1 karakter"),
|
||||||
|
konten: z.string().min(1, "Konten minimal 1 karakter"),
|
||||||
|
slug: z.string().min(1, "Slug minimal 1 karakter"),
|
||||||
|
}),
|
||||||
|
videoKeamanan: z.object({
|
||||||
|
judul: z.string().min(1, "Judul minimal 1 karakter"),
|
||||||
|
deskripsi: z.string().min(1, "Deskripsi minimal 1 karakter"),
|
||||||
|
videoUrl: z.string().min(1, "Video URL minimal 1 karakter"),
|
||||||
|
slug: z.string().min(1, "Slug minimal 1 karakter"),
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
|
||||||
|
const defaultForm = {
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: "",
|
||||||
|
deskripsi: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: "",
|
||||||
|
konten: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: "",
|
||||||
|
deskripsi: "",
|
||||||
|
videoUrl: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const pencegahanKriminalitasState = proxy({
|
||||||
|
create: {
|
||||||
|
form: { ...defaultForm },
|
||||||
|
loading: false,
|
||||||
|
async create() {
|
||||||
|
const cek = templateForm.safeParse(
|
||||||
|
pencegahanKriminalitasState.create.form
|
||||||
|
);
|
||||||
|
if (!cek.success) {
|
||||||
|
const err = `[${cek.error.issues
|
||||||
|
.map((v) => `${v.path.join(".")}`)
|
||||||
|
.join("\n")}] required`;
|
||||||
|
return toast.error(err);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
pencegahanKriminalitasState.create.loading = true;
|
||||||
|
const res = await ApiFetch.api.keamanan.pencegahankriminalitas[
|
||||||
|
"create"
|
||||||
|
].post(pencegahanKriminalitasState.create.form.pencegahanKriminalitas);
|
||||||
|
if (res.status === 200) {
|
||||||
|
pencegahanKriminalitasState.findMany.load();
|
||||||
|
return toast.success("success create");
|
||||||
|
}
|
||||||
|
console.log(res);
|
||||||
|
return toast.error("failed create");
|
||||||
|
} catch (error) {
|
||||||
|
console.log((error as Error).message);
|
||||||
|
} finally {
|
||||||
|
pencegahanKriminalitasState.create.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
findMany: {
|
||||||
|
data: null as
|
||||||
|
| Prisma.PencegahanKriminalitasGetPayload<{
|
||||||
|
include: {
|
||||||
|
programKeamanan: true;
|
||||||
|
tipsKeamanan: true;
|
||||||
|
videoKeamanan: true;
|
||||||
|
};
|
||||||
|
}>[]
|
||||||
|
| null,
|
||||||
|
async load() {
|
||||||
|
const res = await ApiFetch.api.keamanan.pencegahankriminalitas[
|
||||||
|
"find-many"
|
||||||
|
].get();
|
||||||
|
if (res.status === 200) {
|
||||||
|
pencegahanKriminalitasState.findMany.data = res.data?.data ?? [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
findUnique: {
|
||||||
|
data: null as Prisma.PencegahanKriminalitasGetPayload<{
|
||||||
|
include: {
|
||||||
|
programKeamanan: true;
|
||||||
|
tipsKeamanan: true;
|
||||||
|
videoKeamanan: true;
|
||||||
|
};
|
||||||
|
}> | null,
|
||||||
|
loading: false,
|
||||||
|
async load(id: string) {
|
||||||
|
try {
|
||||||
|
const res = await fetch(`/api/keamanan/pencegahankriminalitas/${id}`);
|
||||||
|
if (res.ok) {
|
||||||
|
const data = await res.json();
|
||||||
|
pencegahanKriminalitasState.findUnique.data = data.data ?? null;
|
||||||
|
} else {
|
||||||
|
console.error("Failed to fetch data", res.status, res.statusText);
|
||||||
|
pencegahanKriminalitasState.findUnique.data = null;
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error fetching data:", error);
|
||||||
|
pencegahanKriminalitasState.findUnique.data = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
delete: {
|
||||||
|
loading: false,
|
||||||
|
async byId(id: string) {
|
||||||
|
if (!id) return toast.warn("ID tidak valid");
|
||||||
|
try {
|
||||||
|
pencegahanKriminalitasState.delete.loading = true;
|
||||||
|
const response = await fetch(
|
||||||
|
`/api/keamanan/pencegahankriminalitas/del/${id}`,
|
||||||
|
{
|
||||||
|
method: "DELETE",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const result = await response.json();
|
||||||
|
|
||||||
|
if (response.ok && result?.success) {
|
||||||
|
toast.success(
|
||||||
|
result.message || "Pencegahan kriminalitas berhasil dihapus"
|
||||||
|
);
|
||||||
|
await pencegahanKriminalitasState.findMany.load(); // refresh list
|
||||||
|
} else {
|
||||||
|
toast.error(
|
||||||
|
result?.message || "Gagal menghapus pencegahan kriminalitas"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Gagal delete:", error);
|
||||||
|
toast.error("Terjadi kesalahan saat menghapus pencegahan kriminalitas");
|
||||||
|
} finally {
|
||||||
|
pencegahanKriminalitasState.delete.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
update: {
|
||||||
|
id: "",
|
||||||
|
form: { ...defaultForm },
|
||||||
|
loading: false,
|
||||||
|
|
||||||
|
async load(id: string) {
|
||||||
|
if (!id) {
|
||||||
|
toast.warn("ID tidak valid");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
pencegahanKriminalitasState.update.loading = true;
|
||||||
|
const response = await fetch(
|
||||||
|
`/api/keamanan/pencegahankriminalitas/${id}`,
|
||||||
|
{
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(`HTTP error! status: ${response.status}`);
|
||||||
|
}
|
||||||
|
const result = await response.json();
|
||||||
|
if (result?.success) {
|
||||||
|
const data = result.data;
|
||||||
|
pencegahanKriminalitasState.update.id = data.id;
|
||||||
|
pencegahanKriminalitasState.update.form = {
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: data.programKeamanan.nama,
|
||||||
|
deskripsi: data.programKeamanan.deskripsi,
|
||||||
|
slug: data.programKeamanan.slug,
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: data.tipsKeamanan.judul,
|
||||||
|
konten: data.tipsKeamanan.konten,
|
||||||
|
slug: data.tipsKeamanan.slug,
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: data.videoKeamanan.judul,
|
||||||
|
deskripsi: data.videoKeamanan.deskripsi,
|
||||||
|
videoUrl: data.videoKeamanan.videoUrl,
|
||||||
|
slug: data.videoKeamanan.slug,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return data;
|
||||||
|
} else {
|
||||||
|
throw new Error(result?.message || "Gagal memuat data");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Gagal update:", error);
|
||||||
|
toast.error(
|
||||||
|
"Terjadi kesalahan saat mengupdate pencegahan kriminalitas"
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async update() {
|
||||||
|
const cek = templateForm.safeParse(
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
);
|
||||||
|
if (!cek.success) {
|
||||||
|
const err = `[${cek.error.issues
|
||||||
|
.map((v) => `${v.path.join(".")}`)
|
||||||
|
.join("\n")}] required`;
|
||||||
|
return toast.error(err);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
pencegahanKriminalitasState.update.loading = true;
|
||||||
|
const response = await fetch(
|
||||||
|
`/api/keamanan/pencegahankriminalitas/${pencegahanKriminalitasState.update.id}`,
|
||||||
|
{
|
||||||
|
method: "PUT",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify({
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.programKeamanan.nama,
|
||||||
|
deskripsi:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.programKeamanan.deskripsi,
|
||||||
|
slug: pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.programKeamanan.slug,
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.tipsKeamanan.judul,
|
||||||
|
konten:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.tipsKeamanan.konten,
|
||||||
|
slug: pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.tipsKeamanan.slug,
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.videoKeamanan.judul,
|
||||||
|
deskripsi:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.videoKeamanan.deskripsi,
|
||||||
|
videoUrl:
|
||||||
|
pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.videoKeamanan.videoUrl,
|
||||||
|
slug: pencegahanKriminalitasState.update.form
|
||||||
|
.pencegahanKriminalitas.videoKeamanan.slug,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if (!response.ok) {
|
||||||
|
const errorData = await response.json().catch(() => ({}));
|
||||||
|
throw new Error(
|
||||||
|
errorData.message || `HTTP error! status: ${response.status}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const result = await response.json();
|
||||||
|
if (result.success) {
|
||||||
|
toast.success("Berhasil update pencegahan kriminalitas");
|
||||||
|
await pencegahanKriminalitasState.findMany.load(); // refresh list
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
throw new Error(
|
||||||
|
result.message || "Gagal mengupdate pencegahan kriminalitas"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Gagal update:", error);
|
||||||
|
toast.error(
|
||||||
|
error instanceof Error
|
||||||
|
? error.message
|
||||||
|
: "Gagal mengupdate pencegahan kriminalitas"
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
} finally {
|
||||||
|
pencegahanKriminalitasState.update.loading = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
reset() {
|
||||||
|
pencegahanKriminalitasState.update.id = "";
|
||||||
|
pencegahanKriminalitasState.update.form = { ...defaultForm };
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
export default pencegahanKriminalitasState;
|
||||||
@@ -0,0 +1,214 @@
|
|||||||
|
/* eslint-disable react-hooks/exhaustive-deps */
|
||||||
|
'use client'
|
||||||
|
import EditEditor from '@/app/admin/(dashboard)/_com/editEditor';
|
||||||
|
import pencegahanKriminalitasState from '@/app/admin/(dashboard)/_state/keamanan/pencegahan-kriminalitas';
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
|
import { IconArrowBack } from '@tabler/icons-react';
|
||||||
|
import { useParams, useRouter } from 'next/navigation';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
import { toast } from 'react-toastify';
|
||||||
|
import { useProxy } from 'valtio/utils';
|
||||||
|
|
||||||
|
|
||||||
|
function EditPencegahanKriminalitas() {
|
||||||
|
const router = useRouter();
|
||||||
|
const params = useParams()
|
||||||
|
const kriminalitasState = useProxy(pencegahanKriminalitasState)
|
||||||
|
const [formData, setFormData] = useState({
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: kriminalitasState.update.form.pencegahanKriminalitas.programKeamanan.nama,
|
||||||
|
deskripsi: kriminalitasState.update.form.pencegahanKriminalitas.programKeamanan.deskripsi,
|
||||||
|
slug: kriminalitasState.update.form.pencegahanKriminalitas.programKeamanan.slug,
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: kriminalitasState.update.form.pencegahanKriminalitas.tipsKeamanan.judul,
|
||||||
|
konten: kriminalitasState.update.form.pencegahanKriminalitas.tipsKeamanan.konten,
|
||||||
|
slug: kriminalitasState.update.form.pencegahanKriminalitas.tipsKeamanan.slug,
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: kriminalitasState.update.form.pencegahanKriminalitas.videoKeamanan.judul,
|
||||||
|
deskripsi: kriminalitasState.update.form.pencegahanKriminalitas.videoKeamanan.deskripsi,
|
||||||
|
videoUrl: kriminalitasState.update.form.pencegahanKriminalitas.videoKeamanan.videoUrl,
|
||||||
|
slug: kriminalitasState.update.form.pencegahanKriminalitas.videoKeamanan.slug,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const loadKriminalitas = async () => {
|
||||||
|
const id = params?.id as string;
|
||||||
|
if (!id) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const data = await kriminalitasState.update.load(id);
|
||||||
|
if (data && data.pencegahanKriminalitas) {
|
||||||
|
const { programKeamanan, tipsKeamanan, videoKeamanan } = data.pencegahanKriminalitas;
|
||||||
|
|
||||||
|
setFormData({
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: programKeamanan?.nama || "",
|
||||||
|
deskripsi: programKeamanan?.deskripsi || "",
|
||||||
|
slug: programKeamanan?.slug || "",
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: tipsKeamanan?.judul || "",
|
||||||
|
konten: tipsKeamanan?.konten || "",
|
||||||
|
slug: tipsKeamanan?.slug || "",
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: videoKeamanan?.judul || "",
|
||||||
|
deskripsi: videoKeamanan?.deskripsi || "",
|
||||||
|
videoUrl: videoKeamanan?.videoUrl || "",
|
||||||
|
slug: videoKeamanan?.slug || "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error loading pencegahan kriminalitas:", error);
|
||||||
|
toast.error("Gagal memuat data pencegahan kriminalitas");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
loadKriminalitas();
|
||||||
|
}, [params.id]);
|
||||||
|
|
||||||
|
const handleSubmit = async () => {
|
||||||
|
try {
|
||||||
|
kriminalitasState.update.form = {
|
||||||
|
...kriminalitasState.update.form,
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: formData.pencegahanKriminalitas.programKeamanan.nama,
|
||||||
|
deskripsi: formData.pencegahanKriminalitas.programKeamanan.deskripsi,
|
||||||
|
slug: formData.pencegahanKriminalitas.programKeamanan.slug,
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: formData.pencegahanKriminalitas.tipsKeamanan.judul,
|
||||||
|
konten: formData.pencegahanKriminalitas.tipsKeamanan.konten,
|
||||||
|
slug: formData.pencegahanKriminalitas.tipsKeamanan.slug,
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: formData.pencegahanKriminalitas.videoKeamanan.judul,
|
||||||
|
deskripsi: formData.pencegahanKriminalitas.videoKeamanan.deskripsi,
|
||||||
|
videoUrl: formData.pencegahanKriminalitas.videoKeamanan.videoUrl,
|
||||||
|
slug: formData.pencegahanKriminalitas.videoKeamanan.slug,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
await kriminalitasState.update.update();
|
||||||
|
toast.success("Pencegahan Kriminalitas berhasil diperbarui!");
|
||||||
|
router.push("/admin/keamanan/pencegahan-kriminalitas");
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error updating pencegahan kriminalitas:", error);
|
||||||
|
toast.error("Gagal memuat data pencegahan kriminalitas");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Box mb={10}>
|
||||||
|
<Button onClick={() => router.back()} variant='subtle' color={'blue'}>
|
||||||
|
<IconArrowBack color={colors['blue-button']} size={25} />
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
|
||||||
|
<Paper w={{ base: '100%', md: '50%' }} bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack gap={"xs"}>
|
||||||
|
<Title order={4}>Edit Pencegahan Kriminalitas</Title>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.programKeamanan.nama}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.programKeamanan.nama = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Program Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Program Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.programKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.programKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Program Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Program Keamanan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Program Keamanan</Text>
|
||||||
|
<EditEditor
|
||||||
|
value={formData.pencegahanKriminalitas.programKeamanan.deskripsi}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.programKeamanan.deskripsi = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.tipsKeamanan.judul}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.tipsKeamanan.judul = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Tips Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Tips Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.tipsKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.tipsKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Tips Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Tips Keamanan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Tips Keamanan</Text>
|
||||||
|
<EditEditor
|
||||||
|
value={formData.pencegahanKriminalitas.tipsKeamanan.konten}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.tipsKeamanan.konten = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.videoKeamanan.judul}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.videoKeamanan.judul = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Video Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Video Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.videoKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.videoKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Video Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Video Keamanan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Tips Keamanan</Text>
|
||||||
|
<EditEditor
|
||||||
|
value={formData.pencegahanKriminalitas.videoKeamanan.deskripsi}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.videoKeamanan.deskripsi = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={formData.pencegahanKriminalitas.videoKeamanan.videoUrl}
|
||||||
|
onChange={(val) => {
|
||||||
|
formData.pencegahanKriminalitas.videoKeamanan.videoUrl = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Video URL</Text>}
|
||||||
|
placeholder='Masukkan video URL'
|
||||||
|
/>
|
||||||
|
<Group>
|
||||||
|
<Button bg={colors['blue-button']} onClick={handleSubmit}>Submit</Button>
|
||||||
|
</Group>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default EditPencegahanKriminalitas;
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
'use client'
|
||||||
|
import colors from '@/con/colors';
|
||||||
|
import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core';
|
||||||
|
import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react';
|
||||||
|
import { useRouter } from 'next/navigation';
|
||||||
|
import { useState } from 'react';
|
||||||
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
|
import { useParams } from 'next/navigation';
|
||||||
|
import { useProxy } from 'valtio/utils';
|
||||||
|
import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
|
||||||
|
import pencegahanKriminalitasState from '../../../_state/keamanan/pencegahan-kriminalitas';
|
||||||
|
|
||||||
|
function DetailPencegahanKriminalitas() {
|
||||||
|
const [modalHapus, setModalHapus] = useState(false)
|
||||||
|
const [selectedId, setSelectedId] = useState<string | null>(null)
|
||||||
|
const router = useRouter();
|
||||||
|
const params = useParams()
|
||||||
|
const kriminalitasState = useProxy(pencegahanKriminalitasState)
|
||||||
|
|
||||||
|
useShallowEffect(() => {
|
||||||
|
kriminalitasState.findUnique.load(params?.id as string)
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleDelete = () => {
|
||||||
|
if (selectedId) {
|
||||||
|
kriminalitasState.delete.byId(selectedId)
|
||||||
|
setModalHapus(false)
|
||||||
|
setSelectedId(null)
|
||||||
|
router.push("/admin/keamanan/pencegahan-kriminalitas")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!kriminalitasState.findUnique.data) {
|
||||||
|
return (
|
||||||
|
<Stack py={10}>
|
||||||
|
<Skeleton h={40} />
|
||||||
|
</Stack>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Box mb={10}>
|
||||||
|
<Button variant="subtle" onClick={() => router.back()}>
|
||||||
|
<IconArrowBack color={colors['blue-button']} size={25} />
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
<Paper w={{ base: "100%", md: "50%" }} bg={colors['white-1']} p={'md'}>
|
||||||
|
<Stack>
|
||||||
|
<Paper bg={colors['BG-trans']} p={'md'}>
|
||||||
|
<Text fz={"xl"} fw={"bold"}>Detail Pencegahan Kriminalitas</Text>
|
||||||
|
{kriminalitasState.findUnique.data ? (
|
||||||
|
<Paper key={kriminalitasState.findUnique.data.id} bg={colors['BG-trans']}>
|
||||||
|
<Stack gap={"xs"} py={'md'}>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Judul Program Keamanan</Text>
|
||||||
|
<Text fz={"lg"}>{kriminalitasState.findUnique.data?.programKeamanan.nama}</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Slug</Text>
|
||||||
|
<Text fz={"lg"}>{kriminalitasState.findUnique.data?.programKeamanan.slug}</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Deskripsi</Text>
|
||||||
|
<Text fz={"lg"} dangerouslySetInnerHTML={{ __html: kriminalitasState.findUnique.data?.programKeamanan.deskripsi || '' }} />
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Judul Tips Keamanan</Text>
|
||||||
|
<Text fz={"lg"}>{kriminalitasState.findUnique.data?.tipsKeamanan.judul}</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Slug Tips Keamanan</Text>
|
||||||
|
<Text fz={"lg"}>{kriminalitasState.findUnique.data?.tipsKeamanan.slug}</Text>
|
||||||
|
</Box>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"lg"}>Deskripsi Tips Keamanan</Text>
|
||||||
|
<Text fz={"lg"} dangerouslySetInnerHTML={{ __html: kriminalitasState.findUnique.data?.tipsKeamanan.konten || '' }} />
|
||||||
|
</Box>
|
||||||
|
<Flex gap={"xs"} mt={10}>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
if (kriminalitasState.findUnique.data) {
|
||||||
|
setSelectedId(kriminalitasState.findUnique.data.id);
|
||||||
|
setModalHapus(true);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
disabled={kriminalitasState.delete.loading || !kriminalitasState.findUnique.data}
|
||||||
|
color={"red"}
|
||||||
|
>
|
||||||
|
<IconX size={20} />
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
onClick={() => {
|
||||||
|
if (kriminalitasState.findUnique.data) {
|
||||||
|
router.push(`/admin/keamanan/pencegahan-kriminalitas/${kriminalitasState.findUnique.data.id}/edit`);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
disabled={!kriminalitasState.findUnique.data}
|
||||||
|
color={"green"}
|
||||||
|
>
|
||||||
|
<IconEdit size={20} />
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
) : null}
|
||||||
|
</Paper>
|
||||||
|
</Stack>
|
||||||
|
</Paper>
|
||||||
|
|
||||||
|
{/* Modal Hapus */}
|
||||||
|
<ModalKonfirmasiHapus
|
||||||
|
opened={modalHapus}
|
||||||
|
onClose={() => setModalHapus(false)}
|
||||||
|
onConfirm={handleDelete}
|
||||||
|
text="Apakah anda yakin ingin menghapus pencegahan kriminalitas ini?"
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default DetailPencegahanKriminalitas;
|
||||||
@@ -1,43 +1,145 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
|
import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
|
||||||
import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
|
import { IconArrowBack } from '@tabler/icons-react';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
import { KeamananEditor } from '../../_com/keamananEditor';
|
import { useProxy } from 'valtio/utils';
|
||||||
|
import CreateEditor from '../../../_com/createEditor';
|
||||||
|
import pencegahanKriminalitasState from '../../../_state/keamanan/pencegahan-kriminalitas';
|
||||||
|
|
||||||
|
|
||||||
function CreatePencegahanKriminalitas() {
|
function CreatePencegahanKriminalitas() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const kriminalitasState = useProxy(pencegahanKriminalitasState)
|
||||||
|
|
||||||
|
const resetForm = () => {
|
||||||
|
kriminalitasState.create.form = {
|
||||||
|
pencegahanKriminalitas: {
|
||||||
|
programKeamanan: {
|
||||||
|
nama: "",
|
||||||
|
deskripsi: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
tipsKeamanan: {
|
||||||
|
judul: "",
|
||||||
|
konten: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
videoKeamanan: {
|
||||||
|
judul: "",
|
||||||
|
deskripsi: "",
|
||||||
|
videoUrl: "",
|
||||||
|
slug: "",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSubmit = async () => {
|
||||||
|
await kriminalitasState.create.create();
|
||||||
|
resetForm();
|
||||||
|
router.push('/admin/keamanan/pencegahan-kriminalitas');
|
||||||
|
}
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Box mb={10}>
|
<Box mb={10}>
|
||||||
<Button onClick={() => router.back()} variant='subtle' color={'blue'}>
|
<Button onClick={() => router.back()} variant='subtle' color={'blue'}>
|
||||||
<IconArrowBack color={colors['blue-button']} size={25}/>
|
<IconArrowBack color={colors['blue-button']} size={25} />
|
||||||
</Button>
|
</Button>
|
||||||
</Box>
|
</Box>
|
||||||
|
|
||||||
<Paper w={{base: '100%', md: '50%'}} bg={colors['white-1']} p={'md'}>
|
<Paper w={{ base: '100%', md: '50%' }} bg={colors['white-1']} p={'md'}>
|
||||||
<Stack gap={"xs"}>
|
<Stack gap={"xs"}>
|
||||||
<Title order={4}>Create Pencegahan Kriminalitas</Title>
|
<Title order={4}>Create Pencegahan Kriminalitas</Title>
|
||||||
<Box>
|
|
||||||
<Text fw={"bold"} fz={"sm"}>Masukkan Image</Text>
|
|
||||||
<IconImageInPicture size={50} />
|
|
||||||
</Box>
|
|
||||||
<TextInput
|
<TextInput
|
||||||
label={<Text fw={"bold"} fz={"sm"}>Nama Pencegahan Kriminalitas</Text>}
|
value={kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.nama}
|
||||||
placeholder='Masukkan nama Pencegahan Kriminalitas'
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.nama = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Program Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Program Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Program Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Program Keamanan'
|
||||||
/>
|
/>
|
||||||
<Box>
|
<Box>
|
||||||
<Text fw={"bold"} fz={"sm"}>Deskripsi Pencegahan Kriminalitas</Text>
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Program Keamanan</Text>
|
||||||
<KeamananEditor
|
<CreateEditor
|
||||||
showSubmit={false}
|
value={kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.deskripsi}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.programKeamanan.deskripsi = val;
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.judul}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.judul = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Tips Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Tips Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Tips Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Tips Keamanan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Tips Keamanan</Text>
|
||||||
|
<CreateEditor
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.konten}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.tipsKeamanan.konten = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.judul}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.judul = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Judul Video Keamanan</Text>}
|
||||||
|
placeholder='Masukkan judul Video Keamanan'
|
||||||
|
/>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.slug}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.slug = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Slug Video Keamanan</Text>}
|
||||||
|
placeholder='Masukkan slug Video Keamanan'
|
||||||
|
/>
|
||||||
|
<Box>
|
||||||
|
<Text fw={"bold"} fz={"sm"}>Deskripsi Tips Keamanan</Text>
|
||||||
|
<CreateEditor
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.deskripsi}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.deskripsi = val;
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<TextInput
|
||||||
|
value={kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.videoUrl}
|
||||||
|
onChange={(val) => {
|
||||||
|
kriminalitasState.create.form.pencegahanKriminalitas.videoKeamanan.videoUrl = val.target.value;
|
||||||
|
}}
|
||||||
|
label={<Text fw={"bold"} fz={"sm"}>Video URL</Text>}
|
||||||
|
placeholder='Masukkan video URL'
|
||||||
|
/>
|
||||||
<Group>
|
<Group>
|
||||||
<Button bg={colors['blue-button']}>Submit</Button>
|
<Button onClick={handleSubmit} bg={colors['blue-button']}>Submit</Button>
|
||||||
</Group>
|
</Group>
|
||||||
</Stack>
|
</Stack>
|
||||||
</Paper>
|
</Paper>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,70 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import colors from '@/con/colors';
|
|
||||||
import { Box, Button, Paper, Stack, Flex, Text, Image } from '@mantine/core';
|
|
||||||
import { IconArrowBack, IconX, IconEdit } from '@tabler/icons-react';
|
|
||||||
import { useRouter } from 'next/navigation';
|
|
||||||
import React from 'react';
|
|
||||||
// import { ModalKonfirmasiHapus } from '../../../_com/modalKonfirmasiHapus';
|
|
||||||
|
|
||||||
function DetailPencegahanKriminalitas() {
|
|
||||||
const router = useRouter();
|
|
||||||
return (
|
|
||||||
<Box>
|
|
||||||
<Box mb={10}>
|
|
||||||
<Button variant="subtle" onClick={() => router.back()}>
|
|
||||||
<IconArrowBack color={colors['blue-button']} size={25} />
|
|
||||||
</Button>
|
|
||||||
</Box>
|
|
||||||
<Paper w={{ base: "100%", md: "50%" }} bg={colors['white-1']} p={'md'}>
|
|
||||||
<Stack>
|
|
||||||
<Text fz={"xl"} fw={"bold"}>Detail Pencegahan Kriminalitas</Text>
|
|
||||||
|
|
||||||
<Paper bg={colors['BG-trans']} p={'md'}>
|
|
||||||
<Stack gap={"xs"}>
|
|
||||||
<Box>
|
|
||||||
<Text fz={"lg"} fw={"bold"}>Nama Pencegahan Kriminalitas</Text>
|
|
||||||
<Text fz={"lg"}>Test Judul</Text>
|
|
||||||
</Box>
|
|
||||||
<Box>
|
|
||||||
<Text fz={"lg"} fw={"bold"}>Nomor Pencegahan Kriminalitas</Text>
|
|
||||||
<Text fz={"lg"}>Test Kategori</Text>
|
|
||||||
</Box>
|
|
||||||
<Box>
|
|
||||||
<Text fz={"lg"} fw={"bold"}>Deskripsi</Text>
|
|
||||||
<Text fz={"lg"}>Test Deskripsi</Text>
|
|
||||||
</Box>
|
|
||||||
<Box>
|
|
||||||
<Text fz={"lg"} fw={"bold"}>Gambar</Text>
|
|
||||||
<Image src={"/"} alt="gambar" />
|
|
||||||
</Box>
|
|
||||||
<Box>
|
|
||||||
<Text fz={"lg"} fw={"bold"}>Konten</Text>
|
|
||||||
<Text fz={"lg"} >Test Konten</Text>
|
|
||||||
</Box>
|
|
||||||
<Box>
|
|
||||||
<Flex gap={"xs"}>
|
|
||||||
<Button color="red">
|
|
||||||
<IconX size={20} />
|
|
||||||
</Button>
|
|
||||||
<Button onClick={() => router.push('/admin/keamanan/pencegahan-kriminalitas/edit')} color="green">
|
|
||||||
<IconEdit size={20} />
|
|
||||||
</Button>
|
|
||||||
</Flex>
|
|
||||||
</Box>
|
|
||||||
</Stack>
|
|
||||||
</Paper>
|
|
||||||
</Stack>
|
|
||||||
</Paper>
|
|
||||||
|
|
||||||
{/* Modal Hapus
|
|
||||||
<ModalKonfirmasiHapus
|
|
||||||
opened={modalHapus}
|
|
||||||
onClose={() => setModalHapus(false)}
|
|
||||||
onConfirm={handleHapus}
|
|
||||||
text="Apakah anda yakin ingin menghapus potensi ini?"
|
|
||||||
/> */}
|
|
||||||
</Box>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default DetailPencegahanKriminalitas;
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
'use client'
|
|
||||||
import colors from '@/con/colors';
|
|
||||||
import { Box, Button, Group, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
|
|
||||||
import { IconArrowBack, IconImageInPicture } from '@tabler/icons-react';
|
|
||||||
import { useRouter } from 'next/navigation';
|
|
||||||
import { KeamananEditor } from '../../_com/keamananEditor';
|
|
||||||
|
|
||||||
function EditPencegahanKriminalitas() {
|
|
||||||
const router = useRouter();
|
|
||||||
return (
|
|
||||||
<Box>
|
|
||||||
<Box mb={10}>
|
|
||||||
<Button onClick={() => router.back()} variant='subtle' color={'blue'}>
|
|
||||||
<IconArrowBack color={colors['blue-button']} size={25}/>
|
|
||||||
</Button>
|
|
||||||
</Box>
|
|
||||||
|
|
||||||
<Paper w={{base: '100%', md: '50%'}} bg={colors['white-1']} p={'md'}>
|
|
||||||
<Stack gap={"xs"}>
|
|
||||||
<Title order={4}>Edit Pencegahan Kriminalitas</Title>
|
|
||||||
<Box>
|
|
||||||
<Text fw={"bold"} fz={"sm"}>Masukkan Image</Text>
|
|
||||||
<IconImageInPicture size={50} />
|
|
||||||
</Box>
|
|
||||||
<TextInput
|
|
||||||
label={<Text fw={"bold"} fz={"sm"}>Nama Pencegahan Kriminalitas</Text>}
|
|
||||||
placeholder='Masukkan nama Pencegahan Kriminalitas'
|
|
||||||
/>
|
|
||||||
<Box>
|
|
||||||
<Text fw={"bold"} fz={"sm"}>Deskripsi Pencegahan Kriminalitas</Text>
|
|
||||||
<KeamananEditor
|
|
||||||
showSubmit={false}
|
|
||||||
/>
|
|
||||||
</Box>
|
|
||||||
<Group>
|
|
||||||
<Button bg={colors['blue-button']}>Submit</Button>
|
|
||||||
</Group>
|
|
||||||
</Stack>
|
|
||||||
</Paper>
|
|
||||||
</Box>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default EditPencegahanKriminalitas;
|
|
||||||
@@ -1,10 +1,13 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import colors from '@/con/colors';
|
import colors from '@/con/colors';
|
||||||
import { Box, Button, Paper, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
|
import { Box, Button, Paper, Skeleton, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text } from '@mantine/core';
|
||||||
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
import { IconDeviceImac, IconSearch } from '@tabler/icons-react';
|
||||||
import HeaderSearch from '../../_com/header';
|
import HeaderSearch from '../../_com/header';
|
||||||
import JudulList from '../../_com/judulList';
|
import JudulList from '../../_com/judulList';
|
||||||
import { useRouter } from 'next/navigation';
|
import { useRouter } from 'next/navigation';
|
||||||
|
import { useProxy } from 'valtio/utils';
|
||||||
|
import pencegahanKriminalitasState from '../../_state/keamanan/pencegahan-kriminalitas';
|
||||||
|
import { useShallowEffect } from '@mantine/hooks';
|
||||||
|
|
||||||
function PencegahanKriminalitas() {
|
function PencegahanKriminalitas() {
|
||||||
return (
|
return (
|
||||||
@@ -20,34 +23,52 @@ function PencegahanKriminalitas() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ListPencegahanKriminalitas() {
|
function ListPencegahanKriminalitas() {
|
||||||
|
const kriminalitasState = useProxy(pencegahanKriminalitasState)
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
|
useShallowEffect(() => {
|
||||||
|
kriminalitasState.findMany.load()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
if (!kriminalitasState.findMany.data) {
|
||||||
|
return (
|
||||||
|
<Box py={10}>
|
||||||
|
<Skeleton h={500}/>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box py={10}>
|
<Box py={10}>
|
||||||
<Paper bg={colors['white-1']} p={'md'}>
|
<Paper bg={colors['white-1']} p={'md'}>
|
||||||
<JudulList
|
<JudulList
|
||||||
title='List Pencegahan Kriminalitas'
|
title='List Pencegahan Kriminalitas'
|
||||||
href='/admin/keamanan/pencegahan-kriminalitas/create'
|
href='/admin/keamanan/pencegahan-kriminalitas/create'
|
||||||
/>
|
/>
|
||||||
<Table striped withTableBorder withRowBorders>
|
<Table striped withTableBorder withRowBorders>
|
||||||
<TableThead>
|
<TableThead>
|
||||||
<TableTr>
|
<TableTr>
|
||||||
<TableTh>Nama Pencegahan Kriminalitas</TableTh>
|
<TableTh>Nama Pencegahan Kriminalitas</TableTh>
|
||||||
<TableTh>Nomor Pencegahan Kriminalitas</TableTh>
|
<TableTh>Slug</TableTh>
|
||||||
<TableTh>Deskripsi</TableTh>
|
<TableTh>Deskripsi</TableTh>
|
||||||
<TableTh>Detail</TableTh>
|
<TableTh>Detail</TableTh>
|
||||||
</TableTr>
|
</TableTr>
|
||||||
</TableThead>
|
</TableThead>
|
||||||
<TableTbody>
|
<TableTbody>
|
||||||
<TableTr>
|
{kriminalitasState.findMany.data?.map((item) => (
|
||||||
<TableTd>Pencegahan Kriminalitas 1</TableTd>
|
<TableTr key={item.id}>
|
||||||
<TableTd>0896232831883</TableTd>
|
<TableTd>{item.programKeamanan.nama}</TableTd>
|
||||||
<TableTd>Pencegahan Kriminalitas 1</TableTd>
|
<TableTd>{item.programKeamanan.slug}</TableTd>
|
||||||
<TableTd>
|
<TableTd>
|
||||||
<Button onClick={() => router.push('/admin/keamanan/pencegahan-kriminalitas/detail')}>
|
<Text fz={'sm'} dangerouslySetInnerHTML={{__html: item.programKeamanan.deskripsi || ''}} />
|
||||||
|
</TableTd>
|
||||||
|
<TableTd>
|
||||||
|
<Button onClick={() => router.push(`/admin/keamanan/pencegahan-kriminalitas/${item.id}`)}>
|
||||||
<IconDeviceImac size={20} />
|
<IconDeviceImac size={20} />
|
||||||
</Button>
|
</Button>
|
||||||
</TableTd>
|
</TableTd>
|
||||||
</TableTr>
|
</TableTr>
|
||||||
|
))}
|
||||||
</TableTbody>
|
</TableTbody>
|
||||||
</Table>
|
</Table>
|
||||||
</Paper>
|
</Paper>
|
||||||
|
|||||||
@@ -23,7 +23,8 @@ const pencegahanKriminalitasDelete = async (context: Context) => {
|
|||||||
if (!pencegahanKriminalitas) {
|
if (!pencegahanKriminalitas) {
|
||||||
return {
|
return {
|
||||||
status: 404,
|
status: 404,
|
||||||
body: "Pencegahan kriminalitas tidak ditemukan",
|
success: false,
|
||||||
|
message: "Pencegahan kriminalitas tidak ditemukan",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,7 +34,8 @@ const pencegahanKriminalitasDelete = async (context: Context) => {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
status: 200,
|
status: 200,
|
||||||
body: "Pencegahan kriminalitas berhasil dihapus",
|
success: true,
|
||||||
|
message: "Pencegahan kriminalitas berhasil dihapus",
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
export default pencegahanKriminalitasDelete;
|
export default pencegahanKriminalitasDelete;
|
||||||
|
|||||||
Reference in New Issue
Block a user