Sisa 1 Tabs aja yang data kesehatan warga

This commit is contained in:
2025-06-26 17:24:57 +08:00
parent 4f6cc66b7c
commit 924be5b11b
38 changed files with 1577 additions and 1065 deletions

View File

@@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import ApiFetch from "@/lib/api-fetch";
import { Prisma } from "@prisma/client";
import { toast } from "react-toastify";
@@ -5,362 +6,307 @@ import { proxy } from "valtio";
import { z } from "zod";
/* Informasi Kegiatan */
const templateInformasiKegiatan = z.object({
name: z.string().min(3, "Name minimal 3 karakter"),
tanggal: z.string().min(3, "Tanggal minimal 3 karakter"),
waktu: z.string().min(3, "Waktu minimal 3 karakter"),
lokasi: z.string().min(3, "Lokasi minimal 3 karakter"),
const templateForm = z.object({
content: z.string().min(1, "Content minimal 1 karakter"),
informasiJadwalKegiatan: z.object({
name: z.string().min(1, "Name minimal 1 karakter"),
tanggal: z.string().min(1, "Tanggal minimal 1 karakter"),
waktu: z.string().min(1, "Waktu minimal 1 karakter"),
lokasi: z.string().min(1, "Lokasi minimal 1 karakter"),
}),
deskripsiJadwalKegiatan: z.object({
deskripsi: z.string().min(1, "Deskripsi minimal 1 karakter"),
}),
layananJadwalKegiatan: z.object({
content: z.string().min(1, "Content minimal 1 karakter"),
}),
syaratKetentuanJadwalKegiatan: z.object({
content: z.string().min(1, "Content minimal 1 karakter"),
}),
dokumenJadwalKegiatan: z.object({
content: z.string().min(1, "Content minimal 1 karakter"),
}),
pendaftaranJadwalKegiatan: z.object({
name: z.string().min(1, "Name minimal 1 karakter"),
tanggal: z.string().min(1, "Tanggal minimal 1 karakter"),
namaOrangtua: z.string().min(1, "Nama Orangtua minimal 1 karakter"),
nomor: z.string().min(1, "Nomor minimal 1 karakter"),
alamat: z.string().min(1, "Alamat minimal 1 karakter"),
catatan: z.string().min(1, "Catatan minimal 1 karakter"),
}),
});
type InformasiKegiatan = Prisma.InformasiJadwalKegiatanGetPayload<{
select: {
name: true;
tanggal: true;
waktu: true;
lokasi: true;
};
}>;
const defaultForm = {
content: "",
informasiJadwalKegiatan: {
name: "",
tanggal: "",
waktu: "",
lokasi: "",
},
deskripsiJadwalKegiatan: {
deskripsi: "",
},
layananJadwalKegiatan: {
content: "",
},
syaratKetentuanJadwalKegiatan: {
content: "",
},
dokumenJadwalKegiatan: {
content: "",
},
pendaftaranJadwalKegiatan: {
name: "",
tanggal: "",
namaOrangtua: "",
nomor: "",
alamat: "",
catatan: "",
},
};
const informasiKegiatan = proxy({
const jadwalkegiatanState = proxy({
create: {
form: {} as InformasiKegiatan,
form: { ...defaultForm },
loading: false,
async create() {
const cek = templateInformasiKegiatan.safeParse(
informasiKegiatan.create.form
);
async submit() {
const cek = templateForm.safeParse(this.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
const errMsg = cek.error.issues
.map((v) => `${v.path.join(".")}: ${v.message}`)
.join("\n");
toast.error(errMsg);
return null;
}
try {
informasiKegiatan.create.loading = true;
const res = await ApiFetch.api.kesehatan.informasiJadwalKegiatan[
"create"
].post(informasiKegiatan.create.form);
this.loading = true;
const payload = { ...this.form };
const res = await (ApiFetch.api.kesehatan as any)[
"jadwal-kegiatan"
].create.post(payload);
if (res.status === 200) {
informasiKegiatan.findMany.load();
return toast.success("success create");
toast.success("Berhasil menambahkan jadwal kegiatan");
this.resetForm();
await jadwalkegiatanState.findMany.load();
return res.data;
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} catch (err: any) {
const msg = err?.message || "Terjadi kesalahan saat mengirim data";
toast.error(msg);
console.error("SUBMIT ERROR:", err);
return null;
} finally {
informasiKegiatan.create.loading = false;
this.loading = false;
}
},
resetForm() {
this.form = { ...defaultForm };
},
},
findMany: {
data: null as
| Prisma.InformasiJadwalKegiatanGetPayload<{ omit: { isActive: true } }>[]
| Prisma.JadwalKegiatanGetPayload<{
include: {
informasijadwalkegiatan: true;
deskripsijadwalkegiatan: true;
layananjadwalkegiatan: true;
dokumenjadwalkegiatan: true;
pendaftaranjadwalkegiatan: true;
};
}>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.informasiJadwalKegiatan[
"find-many"
].get();
if (res.status === 200) {
informasiKegiatan.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
/* Deskripsi Kegiatan */
const templateDeskripsiKegiatan = z.object({
deskripsi: z.string().min(3, "Content minimal 3 karakter"),
});
type DeskripsiKegiatan = Prisma.DeskripsiJadwalKegiatanGetPayload<{
select: { deskripsi: true };
}>;
const deskripsiKegiatan = proxy({
create: {
form: {} as DeskripsiKegiatan,
loading: false,
async create() {
const cek = templateDeskripsiKegiatan.safeParse(
deskripsiKegiatan.create.form
);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
async load() {
try {
deskripsiKegiatan.create.loading = true;
const res = await ApiFetch.api.kesehatan.deskripsikegiatan[
"create"
].post(deskripsiKegiatan.create.form);
this.loading = true;
const res = await (ApiFetch.api.kesehatan as any)[
"jadwal-kegiatan"
]["find-many"].get();
if (res.status === 200) {
deskripsiKegiatan.findMany.load();
return toast.success("success create");
this.data = res.data?.data ?? [];
} else {
toast.error("Gagal memuat data jadwal kegiatan");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
return res;
} catch (err) {
toast.error("Terjadi error saat load data");
console.error("LOAD ERROR:", err);
throw err;
} finally {
deskripsiKegiatan.create.loading = false;
this.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.DeskripsiJadwalKegiatanGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.deskripsikegiatan[
"find-many"
].get();
if (res.status === 200) {
deskripsiKegiatan.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
/* Layanan Tersedia */
const templateLayananTersedia = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
});
type LayananTersedia = Prisma.LayananJadwalKegiatanGetPayload<{
select: { content: true };
}>;
const layanantersedia = proxy({
create: {
form: {} as LayananTersedia,
findUnique: {
data: null as Prisma.JadwalKegiatanGetPayload<{
include: {
informasijadwalkegiatan: true;
deskripsijadwalkegiatan: true;
layananjadwalkegiatan: true;
syaratketentuanjadwalkegiatan: true;
dokumenjadwalkegiatan: true;
pendaftaranjadwalkegiatan: true;
};
}> | null,
loading: false,
async create() {
const cek = templateLayananTersedia.safeParse(
layanantersedia.create.form
);
async load(id: string) {
const res = await fetch(`/api/kesehatan/jadwal-kegiatan/${id}`);
if (res.ok) {
const data = await res.json();
jadwalkegiatanState.findUnique.data = data.data ?? null;
} else {
toast.error("Gagal load data jadwal kegiatan");
}
},
},
edit: {
id: "",
form: { ...defaultForm },
loading: false,
async load(id: string) {
const res = await fetch(`/api/kesehatan/jadwal-kegiatan/${id}`);
if (!res.ok) {
toast.error("Gagal load data jadwal kegiatan");
return;
}
const result = await res.json();
const data = result.data;
jadwalkegiatanState.edit.id = data.id;
jadwalkegiatanState.edit.form = {
content: data.content,
informasiJadwalKegiatan: {
name: data.informasijadwalkegiatan.name,
tanggal: data.informasijadwalkegiatan.tanggal,
waktu: data.informasijadwalkegiatan.waktu,
lokasi: data.informasijadwalkegiatan.lokasi,
},
layananJadwalKegiatan: {
content: data.layananjadwalkegiatan.content,
},
deskripsiJadwalKegiatan: {
deskripsi: data.deskripsijadwalkegiatan.deskripsi,
},
syaratKetentuanJadwalKegiatan: {
content: data.syaratketentuanjadwalkegiatan.content,
},
dokumenJadwalKegiatan: {
content: data.dokumenjadwalkegiatan.content,
},
pendaftaranJadwalKegiatan: {
name: data.pendaftaranjadwalkegiatan.name,
tanggal: data.pendaftaranjadwalkegiatan.tanggal,
namaOrangtua: data.pendaftaranjadwalkegiatan.namaOrangtua,
nomor: data.pendaftaranjadwalkegiatan.nomor,
alamat: data.pendaftaranjadwalkegiatan.alamat,
catatan: data.pendaftaranjadwalkegiatan.catatan,
},
};
},
async submit() {
const cek = templateForm.safeParse(jadwalkegiatanState.edit.form);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
const errMsg = cek.error.issues
.map((v) => `${v.path.join(".")}: ${v.message}`)
.join("\n");
toast.error(errMsg);
return null;
}
try {
layanantersedia.create.loading = true;
const res = await ApiFetch.api.kesehatan.layanantersedia["create"].post(
layanantersedia.create.form
);
if (res.status === 200) {
layanantersedia.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
layanantersedia.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.LayananJadwalKegiatanGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.layanantersedia[
"find-many"
].get();
if (res.status === 200) {
layanantersedia.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
jadwalkegiatanState.edit.loading = true;
const payload = {
content: jadwalkegiatanState.edit.form.content,
informasiJadwalKegiatan: {
name: jadwalkegiatanState.edit.form.informasiJadwalKegiatan.name,
tanggal: jadwalkegiatanState.edit.form.informasiJadwalKegiatan.tanggal,
waktu: jadwalkegiatanState.edit.form.informasiJadwalKegiatan.waktu,
lokasi: jadwalkegiatanState.edit.form.informasiJadwalKegiatan.lokasi,
},
layananJadwalKegiatan: {
content: jadwalkegiatanState.edit.form.layananJadwalKegiatan.content,
},
deskripsiJadwalKegiatan: {
deskripsi: jadwalkegiatanState.edit.form.deskripsiJadwalKegiatan.deskripsi,
},
syaratKetentuanJadwalKegiatan: {
content: jadwalkegiatanState.edit.form.syaratKetentuanJadwalKegiatan.content,
},
dokumenJadwalKegiatan: {
content: jadwalkegiatanState.edit.form.dokumenJadwalKegiatan.content,
},
pendaftaranJadwalKegiatan: {
name: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.name,
tanggal: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.tanggal,
namaOrangtua: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.namaOrangtua,
nomor: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.nomor,
alamat: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.alamat,
catatan: jadwalkegiatanState.edit.form.pendaftaranJadwalKegiatan.catatan,
},
};
/* Syarat dan Ketentuan */
const templateSyaratKetentuan = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
});
type SyaratKetentuan = Prisma.SyaratKetentuanJadwalKegiatanGetPayload<{
select: { content: true };
}>;
const syaratketentuan = proxy({
create: {
form: {} as SyaratKetentuan,
loading: false,
async create() {
const cek = templateSyaratKetentuan.safeParse(
syaratketentuan.create.form
);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
syaratketentuan.create.loading = true;
const res = await ApiFetch.api.kesehatan.syaratketentuan[
"create"
].post(syaratketentuan.create.form);
if (res.status === 200) {
syaratketentuan.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
syaratketentuan.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.SyaratKetentuanJadwalKegiatanGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.syaratketentuan[
"find-many"
].get();
if (res.status === 200) {
syaratketentuan.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
/* Dokumen Yang Diperlukan */
const templateDokumenDiperlukan = z.object({
content: z.string().min(3, "Content minimal 3 karakter"),
});
type DokumenDiperlukan = Prisma.DokumenJadwalKegiatanGetPayload<{
select: { content: true };
}>;
const dokumenjadwalkegiatan = proxy({
create: {
form: {} as DokumenDiperlukan,
loading: false,
async create() {
const cek = templateDokumenDiperlukan.safeParse(
dokumenjadwalkegiatan.create.form
);
if (!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
dokumenjadwalkegiatan.create.loading = true;
const res = await ApiFetch.api.kesehatan.dokumendiperlukan[
"create"
].post(dokumenjadwalkegiatan.create.form);
if (res.status === 200) {
dokumenjadwalkegiatan.findMany.load();
return toast.success("success create");
}
return toast.error("failed create");
} catch (error) {
console.log((error as Error).message);
} finally {
dokumenjadwalkegiatan.create.loading = false;
}
},
},
findMany: {
data: null as
| Prisma.DokumenJadwalKegiatanGetPayload<{ omit: { isActive: true } }>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.dokumendiperlukan[
"find-many"
].get();
if (res.status === 200) {
dokumenjadwalkegiatan.findMany.data = res.data?.data ?? [];
}
},
},
});
/* ======================================================================= */
/* Pendaftaran */
const templatePendaftaran = z.object({
name: z.string().min(3, "Nama minimal 3 karakter"),
tanggal: z.string().min(1),
namaOrangtua: z.string().min(3, "Nama minimal 3 karakter"),
nomor: z.string().min(9, "Nama minimal 9 karakter"),
alamat: z.string().min(7, "Alamat minimal 7 karakter"),
catatan: z.string().min(3, "Catatan minimal 3 karakter"),
})
type Pendaftaran = Prisma.PendaftaranJadwalKegiatanGetPayload<{
select: {
name: true;
tanggal: true;
namaOrangtua: true;
nomor: true;
alamat: true;
catatan: true;
}
}>
const pendaftaranjadwal = proxy({
create: {
form: {} as Pendaftaran,
loading: false,
async create() {
const cek = templatePendaftaran.safeParse(pendaftaranjadwal.create.form);
if(!cek.success) {
const err = `[${cek.error.issues
.map((v) => `${v.path.join(".")}`)
.join("\n")}] required`;
return toast.error(err);
}
try {
pendaftaranjadwal.create.loading = true;
const res = await ApiFetch.api.kesehatan.pendaftaranJadwalKegiatan["create"].post(
pendaftaranjadwal.create.form);
if (res.status === 200) {
pendaftaranjadwal.findMany.load();
return toast.success("success create")
const res = await fetch(
`/api/kesehatan/jadwal-kegiatan/${jadwalkegiatanState.edit.id}`,
{
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload),
}
return toast.error("failed create")
} catch (error) {
console.log((error as Error).message)
);
if (!res.ok) {
const error = await res.json();
throw new Error(error.message || "Update gagal");
}
toast.success("Berhasil update jadwal kegiatan");
await jadwalkegiatanState.findMany.load();
return true;
} catch (err) {
toast.error(
err instanceof Error ? err.message : "Terjadi kesalahan saat update"
);
return false;
} finally {
pendaftaranjadwal.create.loading = false;
jadwalkegiatanState.edit.loading = false;
}
},
resetForm() {
jadwalkegiatanState.edit.id = "";
jadwalkegiatanState.edit.form = { ...defaultForm };
},
},
delete: {
loading: false,
async byId(id: string){
try {
jadwalkegiatanState.delete.loading = true;
const res = await fetch(`/api/kesehatan/jadwal-kegiatan/del/${id}`, {
method: "DELETE",
});
const result = await res.json();
if (res.ok && result.success) {
toast.success("Jadwal kegiatan berhasil dihapus");
await jadwalkegiatanState.findMany.load();
} else {
toast.error(result.message || "Gagal menghapus");
}
} catch {
toast.error("Terjadi kesalahan saat menghapus");
} finally {
jadwalkegiatanState.delete.loading = false;
}
}
},
findMany: {
data: null as
| Prisma.PendaftaranJadwalKegiatanGetPayload<{omit: {isActive: true}}>[]
| null,
async load() {
const res = await ApiFetch.api.kesehatan.
pendaftaranJadwalKegiatan["find-many"].get();
if(res.status === 200) {
pendaftaranjadwal.findMany.data = res.data?.data ?? [];
}
}
}
})
const stateJadwalKegiatan = proxy({
informasiKegiatan,
deskripsiKegiatan,
layanantersedia,
syaratketentuan,
dokumenjadwalkegiatan,
pendaftaranjadwal
});
export default stateJadwalKegiatan;
export default jadwalkegiatanState;

View File

@@ -0,0 +1,407 @@
/* eslint-disable react-hooks/exhaustive-deps */
'use client'
import EditEditor from '@/app/admin/(dashboard)/_com/editEditor';
import jadwalKegiatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Button, 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';
interface JadwalKegiatanFormBase {
content: string;
informasiJadwalKegiatan: {
name: string;
tanggal: string;
waktu: string;
lokasi: string;
};
deskripsiJadwalKegiatan: {
deskripsi: string;
};
layananJadwalKegiatan: {
content: string;
};
syaratKetentuanJadwalKegiatan: {
content: string;
};
dokumenJadwalKegiatan: {
content: string;
};
pendaftaranJadwalKegiatan: {
name: string;
tanggal: string;
namaOrangtua: string;
nomor: string;
alamat: string;
catatan: string;
};
}
function EditJadwalKegiatan() {
const stateJadwalKegiatan = useProxy(jadwalKegiatanState);
const router = useRouter();
const params = useParams();
const [formData, setFormData] = useState<JadwalKegiatanFormBase>({
content: stateJadwalKegiatan.edit.form.content || '',
informasiJadwalKegiatan: {
name: stateJadwalKegiatan.edit.form.informasiJadwalKegiatan?.name || '',
tanggal: stateJadwalKegiatan.edit.form.informasiJadwalKegiatan?.tanggal || '',
waktu: stateJadwalKegiatan.edit.form.informasiJadwalKegiatan?.waktu || '',
lokasi: stateJadwalKegiatan.edit.form.informasiJadwalKegiatan?.lokasi || '',
},
deskripsiJadwalKegiatan: {
deskripsi: stateJadwalKegiatan.edit.form.deskripsiJadwalKegiatan?.deskripsi || '',
},
layananJadwalKegiatan: {
content: stateJadwalKegiatan.edit.form.layananJadwalKegiatan?.content || '',
},
syaratKetentuanJadwalKegiatan: {
content: stateJadwalKegiatan.edit.form.syaratKetentuanJadwalKegiatan?.content || '',
},
dokumenJadwalKegiatan: {
content: stateJadwalKegiatan.edit.form.dokumenJadwalKegiatan?.content || '',
},
pendaftaranJadwalKegiatan: {
name: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.name || '',
tanggal: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.tanggal || '',
namaOrangtua: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.namaOrangtua || '',
nomor: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.nomor || '',
alamat: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.alamat || '',
catatan: stateJadwalKegiatan.edit.form.pendaftaranJadwalKegiatan?.catatan || '',
},
});
useEffect(() => {
const loadJadwalKegiatan = async () => {
const id = params?.id as string;
if (!id) return;
try {
await stateJadwalKegiatan.edit.load(id);
const { form } = stateJadwalKegiatan.edit;
if (form) {
setFormData({
content: form.content,
informasiJadwalKegiatan: {
name: form.informasiJadwalKegiatan?.name || '',
tanggal: form.informasiJadwalKegiatan?.tanggal || '',
waktu: form.informasiJadwalKegiatan?.waktu || '',
lokasi: form.informasiJadwalKegiatan?.lokasi || '',
},
deskripsiJadwalKegiatan: {
deskripsi: form.deskripsiJadwalKegiatan?.deskripsi || '',
},
layananJadwalKegiatan: {
content: form.layananJadwalKegiatan?.content || '',
},
syaratKetentuanJadwalKegiatan: {
content: form.syaratKetentuanJadwalKegiatan?.content || '',
},
dokumenJadwalKegiatan: {
content: form.dokumenJadwalKegiatan?.content || '',
},
pendaftaranJadwalKegiatan: {
name: form.pendaftaranJadwalKegiatan?.name || '',
tanggal: form.pendaftaranJadwalKegiatan?.tanggal || '',
namaOrangtua: form.pendaftaranJadwalKegiatan?.namaOrangtua || '',
nomor: form.pendaftaranJadwalKegiatan?.nomor || '',
alamat: form.pendaftaranJadwalKegiatan?.alamat || '',
catatan: form.pendaftaranJadwalKegiatan?.catatan || '',
},
});
}
} catch (error) {
console.error("Error loading jadwal kegiatan:", error);
toast.error("Gagal memuat data jadwal kegiatan");
}
};
loadJadwalKegiatan();
}, [params?.id]);
const handleSubmit = async () => {
try {
stateJadwalKegiatan.edit.form = {
...stateJadwalKegiatan.edit.form,
content: formData.content,
informasiJadwalKegiatan: {
name: formData.informasiJadwalKegiatan.name,
tanggal: formData.informasiJadwalKegiatan.tanggal,
waktu: formData.informasiJadwalKegiatan.waktu,
lokasi: formData.informasiJadwalKegiatan.lokasi,
},
deskripsiJadwalKegiatan: {
deskripsi: formData.deskripsiJadwalKegiatan.deskripsi,
},
layananJadwalKegiatan: {
content: formData.layananJadwalKegiatan.content,
},
syaratKetentuanJadwalKegiatan: {
content: formData.syaratKetentuanJadwalKegiatan.content,
},
dokumenJadwalKegiatan: {
content: formData.dokumenJadwalKegiatan.content,
},
pendaftaranJadwalKegiatan: {
name: formData.pendaftaranJadwalKegiatan.name,
tanggal: formData.pendaftaranJadwalKegiatan.tanggal,
namaOrangtua: formData.pendaftaranJadwalKegiatan.namaOrangtua,
nomor: formData.pendaftaranJadwalKegiatan.nomor,
alamat: formData.pendaftaranJadwalKegiatan.alamat,
catatan: formData.pendaftaranJadwalKegiatan.catatan,
},
};
const success = await stateJadwalKegiatan.edit.submit();
if (success) {
toast.success("Jadwal kegiatan berhasil diperbarui!");
router.push("/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan");
}
} catch (error) {
console.error("Error updating jadwal kegiatan:", error);
toast.error(error instanceof Error ? error.message : "Gagal memperbarui data jadwal kegiatan");
}
};
return (
<Box>
<Box mb={10}>
<Button onClick={() => router.back()} variant="subtle" color="blue">
<IconArrowBack color={colors['blue-button']} size={25} />
</Button>
</Box>
<Stack gap="xs">
<Paper bg={colors['white-1']} p="md" w={{ base: '100%', md: '50%' }}>
<Stack gap="xs">
<Title order={3}>Edit Jadwal Kegiatan</Title>
<TextInput
label={<Text fz="sm" fw="bold">Nama Jadwal Kegiatan</Text>}
placeholder="masukkan nama jadwal kegiatan"
value={formData.content}
onChange={(e) => {
setFormData(prev => ({
...prev,
content: e.target.value
}));
}}
/>
<Box>
<Text fz="sm" fw="bold">Deskripsi Jadwal Kegiatan</Text>
<EditEditor
value={formData.deskripsiJadwalKegiatan.deskripsi}
onChange={(e) => {
setFormData(prev => ({
...prev,
deskripsiJadwalKegiatan: {
...prev.deskripsiJadwalKegiatan,
deskripsi: e
}
}));
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Informasi Jadwal Kegiatan</Text>
<TextInput
label={<Text fz="sm" fw="bold">Nama</Text>}
placeholder="masukkan nama"
value={formData.informasiJadwalKegiatan.name}
onChange={(e) => {
setFormData(prev => ({
...prev,
informasiJadwalKegiatan: {
...prev.informasiJadwalKegiatan,
name: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Tanggal</Text>}
placeholder="masukkan tanggal"
value={formData.informasiJadwalKegiatan.tanggal}
onChange={(e) => {
setFormData(prev => ({
...prev,
informasiJadwalKegiatan: {
...prev.informasiJadwalKegiatan,
tanggal: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Waktu</Text>}
placeholder="masukkan waktu"
value={formData.informasiJadwalKegiatan.waktu}
onChange={(e) => {
setFormData(prev => ({
...prev,
informasiJadwalKegiatan: {
...prev.informasiJadwalKegiatan,
waktu: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Lokasi</Text>}
placeholder="masukkan lokasi"
value={formData.informasiJadwalKegiatan.lokasi}
onChange={(e) => {
setFormData(prev => ({
...prev,
informasiJadwalKegiatan: {
...prev.informasiJadwalKegiatan,
lokasi: e.target.value
}
}));
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Layanan Jadwal Kegiatan</Text>
<EditEditor
value={formData.layananJadwalKegiatan.content}
onChange={(e) => {
setFormData(prev => ({
...prev,
layananJadwalKegiatan: {
...prev.layananJadwalKegiatan,
content: e
}
}));
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Syarat dan Ketentuan Jadwal Kegiatan</Text>
<EditEditor
value={formData.syaratKetentuanJadwalKegiatan.content}
onChange={(e) => {
setFormData(prev => ({
...prev,
syaratKetentuanJadwalKegiatan: {
...prev.syaratKetentuanJadwalKegiatan,
content: e
}
}));
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Dokumen Jadwal Kegiatan</Text>
<EditEditor
value={formData.dokumenJadwalKegiatan.content}
onChange={(e) => {
setFormData(prev => ({
...prev,
dokumenJadwalKegiatan: {
...prev.dokumenJadwalKegiatan,
content: e
}
}));
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Pendaftaran Jadwal Kegiatan</Text>
<TextInput
label={<Text fz="sm" fw="bold">Nama</Text>}
placeholder="masukkan nama"
value={formData.pendaftaranJadwalKegiatan.name}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
name: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Tanggal</Text>}
placeholder="masukkan tanggal"
value={formData.pendaftaranJadwalKegiatan.tanggal}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
tanggal: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Nama Orangtua</Text>}
placeholder="masukkan nama orangtua"
value={formData.pendaftaranJadwalKegiatan.namaOrangtua}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
namaOrangtua: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Nomor</Text>}
placeholder="masukkan nomor"
value={formData.pendaftaranJadwalKegiatan.nomor}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
nomor: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Alamat</Text>}
placeholder="masukkan alamat"
value={formData.pendaftaranJadwalKegiatan.alamat}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
alamat: e.target.value
}
}));
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Catatan</Text>}
placeholder="masukkan catatan"
value={formData.pendaftaranJadwalKegiatan.catatan}
onChange={(e) => {
setFormData(prev => ({
...prev,
pendaftaranJadwalKegiatan: {
...prev.pendaftaranJadwalKegiatan,
catatan: e.target.value
}
}));
}}
/>
</Box>
<Button onClick={handleSubmit} bg={colors['blue-button']}>
Simpan
</Button>
</Stack>
</Paper>
</Stack>
</Box>
);
}
export default EditJadwalKegiatan;

View File

@@ -0,0 +1,126 @@
'use client'
import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus';
import jadwalKegiatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Button, Flex, Paper, Skeleton, Stack, Text } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { IconArrowBack, IconEdit, IconX } from '@tabler/icons-react';
import { useParams, useRouter } from 'next/navigation';
import { useState } from 'react';
import { useProxy } from 'valtio/utils';
function DetailJadwalKegiatan() {
const params = useParams()
const router = useRouter();
const stateJadwalKegiatan = useProxy(jadwalKegiatanState)
const [modalHapus, setModalHapus] = useState(false);
const [selectedId, setSelectedId] = useState<string | null>(null)
useShallowEffect(() => {
stateJadwalKegiatan.findUnique.load(params?.id as string)
}, [])
const handleHapus = () => {
if (selectedId) {
stateJadwalKegiatan.delete.byId(selectedId)
setModalHapus(false)
setSelectedId(null)
router.push("/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan")
}
}
if (!stateJadwalKegiatan.findUnique.data) {
return (
<Stack py={10}>
<Skeleton h={500} />
</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>
<Text fz={"xl"} fw={"bold"}>Detail Jadwal Kegiatan</Text>
{stateJadwalKegiatan.findUnique.data ? (
<Paper bg={colors['BG-trans']} p={'md'}>
<Stack gap={"xs"}>
<Box>
<Text fz={"lg"} fw={"bold"}>Nama Kegiatan</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.content}</Text>
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Informasi</Text>
<Text fz={"md"} fw={"bold"}>Nama</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.name}</Text>
<Text fz={"md"} fw={"bold"}>Tanggal</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.tanggal}</Text>
<Text fz={"md"} fw={"bold"}>Waktu</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.waktu}</Text>
<Text fz={"md"} fw={"bold"}>Lokasi</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.lokasi}</Text>
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Deskripsi</Text>
<Text fz={"md"} dangerouslySetInnerHTML={{ __html: stateJadwalKegiatan.findUnique.data.deskripsijadwalkegiatan.deskripsi }} />
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Layanan</Text>
<Text fz={"md"} dangerouslySetInnerHTML={{ __html: stateJadwalKegiatan.findUnique.data.layananjadwalkegiatan.content }} />
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Syarat Ketentuan</Text>
<Text fz={"md"} dangerouslySetInnerHTML={{ __html: stateJadwalKegiatan.findUnique.data.syaratketentuanjadwalkegiatan.content}} />
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Dokumen</Text>
<Text fz={"md"} dangerouslySetInnerHTML={{ __html: stateJadwalKegiatan.findUnique.data.dokumenjadwalkegiatan.content }} />
</Box>
<Box>
<Text fz={"lg"} fw={"bold"}>Prosedur Pendaftaran</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.name}</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.tanggal}</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.namaOrangtua}</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.nomor}</Text>
<Text fz={"md"}>{stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.alamat}</Text>
<Text fz={"md"} dangerouslySetInnerHTML={{ __html: stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.catatan }} />
</Box>
<Box>
<Flex gap={"xs"}>
<Button color="red" onClick={() => {
if (stateJadwalKegiatan.findUnique.data) {
setSelectedId(stateJadwalKegiatan.findUnique.data.id)
setModalHapus(true)
}
}}>
<IconX size={20} />
</Button>
<Button onClick={() => router.push(`/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan/${stateJadwalKegiatan.findUnique.data?.id}/edit`)} color="green">
<IconEdit size={20} />
</Button>
</Flex>
</Box>
</Stack>
</Paper>
) : null}
</Stack>
</Paper>
{/* Modal Hapus */}
<ModalKonfirmasiHapus
opened={modalHapus}
onClose={() => setModalHapus(false)}
onConfirm={handleHapus}
text="Apakah anda yakin ingin menghapus jadwal kegiatan ini?"
/>
</Box>
);
}
export default DetailJadwalKegiatan;

View File

@@ -0,0 +1,212 @@
'use client'
import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor';
import jadwalKegiatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Button, Paper, Stack, Text, TextInput, Title } from '@mantine/core';
import { IconArrowBack } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { toast } from 'react-toastify';
import { useProxy } from 'valtio/utils';
function CreateJadwalKegiatan() {
const stateJadwalKegiatan = useProxy(jadwalKegiatanState)
const router = useRouter();
const resetForm = () => {
stateJadwalKegiatan.edit.form = {
content: "",
informasiJadwalKegiatan: {
name: "",
tanggal: "",
waktu: "",
lokasi: "",
},
deskripsiJadwalKegiatan: {
deskripsi: "",
},
layananJadwalKegiatan: {
content: "",
},
syaratKetentuanJadwalKegiatan: {
content: "",
},
dokumenJadwalKegiatan: {
content: "",
},
pendaftaranJadwalKegiatan: {
name: "",
tanggal: "",
namaOrangtua: "",
nomor: "",
alamat: "",
catatan: "",
},
};
};
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
await stateJadwalKegiatan.create.submit();
toast.success("Data berhasil disimpan");
resetForm();
// After successful submission, redirect to the list page
router.push('/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan');
}
return (
<Box component="form" onSubmit={handleSubmit}>
<Box mb={10}>
<Button variant="subtle" onClick={() => router.back()}>
<IconArrowBack color={colors['blue-button']} size={25} />
</Button>
</Box>
<Paper bg={colors['white-1']} p="md" w={{ base: '100%', md: '50%' }}>
<Stack gap="xs">
<Title order={3}>Create Jadwal Kegiatan</Title>
<TextInput
label={<Text fz="sm" fw="bold">Nama Jadwal Kegiatan</Text>}
placeholder="masukkan nama jadwal kegiatan"
value={stateJadwalKegiatan.create.form.content}
onChange={(e) => {
stateJadwalKegiatan.create.form.content = e.target.value;
}}
/>
<Box>
<Text fz="sm" fw="bold">Deskripsi Jadwal Kegiatan</Text>
<CreateEditor
value={stateJadwalKegiatan.create.form.deskripsiJadwalKegiatan.deskripsi}
onChange={(e) => {
stateJadwalKegiatan.create.form.deskripsiJadwalKegiatan.deskripsi = e;
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Informasi Jadwal Kegiatan</Text>
<TextInput
label={<Text fz="sm" fw="bold">Nama</Text>}
placeholder="masukkan nama"
value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name}
onChange={(e) => {
stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Tanggal</Text>}
placeholder="masukkan tanggal"
value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal}
onChange={(e) => {
stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Waktu</Text>}
placeholder="masukkan waktu"
value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu}
onChange={(e) => {
stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Lokasi</Text>}
placeholder="masukkan lokasi"
value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi}
onChange={(e) => {
stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi = e.target.value;
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Layanan Jadwal Kegiatan</Text>
<CreateEditor
value={stateJadwalKegiatan.create.form.layananJadwalKegiatan.content}
onChange={(e) => {
stateJadwalKegiatan.create.form.layananJadwalKegiatan.content = e;
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Syarat dan Ketentuan Jadwal Kegiatan</Text>
<CreateEditor
value={stateJadwalKegiatan.create.form.syaratKetentuanJadwalKegiatan.content}
onChange={(e) => {
stateJadwalKegiatan.create.form.syaratKetentuanJadwalKegiatan.content = e;
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Dokumen Jadwal Kegiatan</Text>
<CreateEditor
value={stateJadwalKegiatan.create.form.dokumenJadwalKegiatan.content}
onChange={(e) => {
stateJadwalKegiatan.create.form.dokumenJadwalKegiatan.content = e;
}}
/>
</Box>
<Box>
<Text fz="md" fw="bold">Pendaftaran Jadwal Kegiatan</Text>
<TextInput
label={<Text fz="sm" fw="bold">Nama</Text>}
placeholder="masukkan nama"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.name}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.name = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Tanggal</Text>}
placeholder="masukkan tanggal"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.tanggal}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.tanggal = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Nama Orangtua</Text>}
placeholder="masukkan nama orangtua"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.namaOrangtua}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.namaOrangtua = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Nomor</Text>}
placeholder="masukkan nomor"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.nomor}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.nomor = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Alamat</Text>}
placeholder="masukkan alamat"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.alamat}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.alamat = e.target.value;
}}
/>
<TextInput
label={<Text fz="sm" fw="bold">Catatan</Text>}
placeholder="masukkan catatan"
value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.catatan}
onChange={(e) => {
stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.catatan = e.target.value;
}}
/>
</Box>
<Button onClick={handleSubmit} bg={colors['blue-button']}>
Simpan
</Button>
</Stack>
</Paper>
</Box>
);
}
export default CreateJadwalKegiatan;

View File

@@ -1,27 +0,0 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Paper, Stack, Text } from '@mantine/core';
import { useProxy } from 'valtio/utils';
import { KesehatanEditor } from '../../_com/kesehatanEditor';
function DeskripsiKegiatan() {
const deskripsiKegiatanState = useProxy(stateJadwalKegiatan.deskripsiKegiatan)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Text pt={10} fw={"bold"}>Deskripsi Kegiatan</Text>
<KesehatanEditor
showSubmit={false}
onChange={(val) => {
deskripsiKegiatanState.create.form.deskripsi = val
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default DeskripsiKegiatan;

View File

@@ -1,29 +0,0 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Paper, Stack, Text } from '@mantine/core';
import { useProxy } from 'valtio/utils';
import { KesehatanEditor } from '../../_com/kesehatanEditor';
function DokumenYangDiperlukan() {
const dokumenDiperlukan = useProxy(stateJadwalKegiatan.dokumenjadwalkegiatan)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Text pt={10} fw={"bold"}>Dokumen Yang Diperlukan</Text>
<KesehatanEditor
showSubmit={false}
onChange={(val) => {
dokumenDiperlukan.create.form.content = val;
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default DokumenYangDiperlukan;

View File

@@ -1,48 +0,0 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Paper, Stack, TextInput, Title } from '@mantine/core';
import { useProxy } from 'valtio/utils';
function InformasiKegiatan() {
const informasiKegiatanState = useProxy(stateJadwalKegiatan.informasiKegiatan)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Title order={4}>Informasi Kegiatan</Title>
<TextInput
label="Nama Kegiatan"
placeholder="Masukkan nama kegiatan"
onChange={(val) => {
informasiKegiatanState.create.form.name = val.target.value
}}
/>
<TextInput
label="Tanggal"
placeholder="Masukkan tanggal kegiatan"
onChange={(val) => {
informasiKegiatanState.create.form.tanggal = val.target.value
}}
/>
<TextInput
label="Waktu"
placeholder="Masukkan waktu kegiatan"
onChange={(val) => {
informasiKegiatanState.create.form.waktu = val.target.value
}}
/>
<TextInput
label="Lokasi"
placeholder="Masukkan lokasi kegiatan"
onChange={(val) => {
informasiKegiatanState.create.form.lokasi = val.target.value
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default InformasiKegiatan;

View File

@@ -1,27 +0,0 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Paper, Stack, Text } from '@mantine/core';
import { useProxy } from 'valtio/utils';
import { KesehatanEditor } from '../../_com/kesehatanEditor';
function LayananTersedia() {
const layananTersediaState = useProxy(stateJadwalKegiatan.layanantersedia)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Text pt={10} fw={"bold"}>Layanan Yang Tersedia</Text>
<KesehatanEditor
showSubmit={false}
onChange={(val) => {
layananTersediaState.create.form.content = val;
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default LayananTersedia;

View File

@@ -1,192 +1,82 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import { Box, Button, Paper, SimpleGrid, Skeleton, Stack, Text, Title } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { useProxy } from 'valtio/utils';
import DeskripsiKegiatan from './deskripsi_kegiatan/page';
import DokumenYangDiperlukan from './dokumen_yang_diperlukan/page';
import InformasiKegiatan from './informasi_kegiatan/page';
import LayananTersedia from './layanan_yang_tersedia/page';
import Pendaftaran from './pendaftaran/page';
import SyaratDanKetentuan from './syarat_dan_ketentuan/page';
import colors from '@/con/colors';
import { Box, Button, Paper, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr } from '@mantine/core';
import { useShallowEffect } from '@mantine/hooks';
import { IconDeviceImacCog, IconSearch } from '@tabler/icons-react';
import { useRouter } from 'next/navigation';
import { useProxy } from 'valtio/utils';
import HeaderSearch from '../../../_com/header';
import JudulList from '../../../_com/judulList';
import jadwalKegiatanState from '../../../_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
function JadwalKegiatan() {
const allState = useProxy(stateJadwalKegiatan)
const submitAllForms = () => {
if (allState.informasiKegiatan.create.form.name &&
allState.informasiKegiatan.create.form.tanggal &&
allState.informasiKegiatan.create.form.waktu &&
allState.informasiKegiatan.create.form.lokasi) {
allState.informasiKegiatan.create.create()
}
if (allState.deskripsiKegiatan.create.form.deskripsi) {
allState.deskripsiKegiatan.create.create();
}
if (allState.layanantersedia.create.form.content) {
allState.layanantersedia.create.create();
}
if (allState.syaratketentuan.create.form.content) {
allState.syaratketentuan.create.create();
}
if (allState.dokumenjadwalkegiatan.create.form.content) {
allState.dokumenjadwalkegiatan.create.create();
}
if (allState.pendaftaranjadwal.create.form.name &&
allState.pendaftaranjadwal.create.form.tanggal &&
allState.pendaftaranjadwal.create.form.namaOrangtua &&
allState.pendaftaranjadwal.create.form.nomor &&
allState.pendaftaranjadwal.create.form.alamat &&
allState.pendaftaranjadwal.create.form.catatan
) {
allState.pendaftaranjadwal.create.create();
}
}
return (
<Stack py={10}>
<SimpleGrid cols={{
base: 1, md: 2
}}>
<Box>
<Stack gap={"xs"}>
<Title order={4}>Tambah Jadwal Kegiatan</Title>
<InformasiKegiatan />
<DeskripsiKegiatan />
<LayananTersedia />
<SyaratDanKetentuan />
<DokumenYangDiperlukan />
<Pendaftaran />
<Button mt={10} onClick={submitAllForms}>
Submit
</Button>
</Stack>
</Box>
<Box>
<Stack gap={"xs"}>
<Title order={4}>Data Jadwal Kegiatan</Title>
<AllList />
</Stack>
</Box>
</SimpleGrid>
</Stack>
<Box>
<HeaderSearch
title='Jadwal Kegiatan'
placeholder='pencarian'
searchIcon={<IconSearch size={20} />}
/>
<ListJadwalKegiatan/>
</Box>
);
}
function AllList() {
const allList = useProxy(stateJadwalKegiatan)
function ListJadwalKegiatan() {
const stateJadwalKegiatan = useProxy(jadwalKegiatanState)
const router = useRouter();
useShallowEffect(() => {
allList.informasiKegiatan.findMany.load()
allList.deskripsiKegiatan.findMany.load()
allList.layanantersedia.findMany.load()
allList.syaratketentuan.findMany.load()
allList.dokumenjadwalkegiatan.findMany.load()
allList.pendaftaranjadwal.findMany.load()
stateJadwalKegiatan.findMany.load()
}, [])
const isLoading = !allList.informasiKegiatan.findMany.data ||
!allList.deskripsiKegiatan.findMany.data ||
!allList.layanantersedia.findMany.data ||
!allList.syaratketentuan.findMany.data ||
!allList.dokumenjadwalkegiatan.findMany.data ||
!allList.pendaftaranjadwal.findMany.data
if (isLoading) {
if (!stateJadwalKegiatan.findMany.data) {
return (
<Stack>
<Title order={4}>Informasi Kegiatan</Title>
{Array.from({ length: 10 }).map((_, k) => <Skeleton key={k} h={40} />)}
</Stack>
);
<Box py={10}>
<Skeleton h={500}/>
</Box>
)
}
return (
<Stack gap={"xs"}>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Informasi Kegiatan</Title>
{allList.informasiKegiatan.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text>{item.name}</Text>
<Text>{item.tanggal}</Text>
<Text>{item.waktu}</Text>
<Text>{item.lokasi}</Text>
</Box>
)
})}
</Paper>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Deskripsi Kegiatan</Title>
{allList.deskripsiKegiatan.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{ __html: item.deskripsi }} />
</Box>
)
})}
</Paper>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Layanan Yang Tersedia</Title>
{allList.layanantersedia.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
</Box>
)
})}
</Paper>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Syarat dan Ketentuan</Title>
{allList.syaratketentuan.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
</Box>
)
})}
</Paper>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Dokumen Yang Diperlukan</Title>
{allList.dokumenjadwalkegiatan.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text dangerouslySetInnerHTML={{ __html: item.content }} />
</Box>
)
})}
</Paper>
<Paper bg={colors['white-1']} p={'md'}>
<Title order={4}>Pendaftaran</Title>
{allList.pendaftaranjadwal.findMany.data?.map((item) => {
return (
<Box key={item.id}>
<Text>{item.name}</Text>
<Text>{item.tanggal}</Text>
<Text>{item.namaOrangtua}</Text>
<Text>{item.nomor}</Text>
<Text>{item.alamat}</Text>
<Text>{item.catatan}</Text>
</Box>
)
})}
</Paper>
</Stack>
<Box py={10}>
<Paper bg={colors['white-1']} p={'md'}>
<Stack>
<JudulList
title='List Jadwal Kegiatan'
href='/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create'
/>
<Box style={{ overflowX: "auto" }}>
<Table striped withRowBorders withTableBorder style={{ minWidth: '700px' }}>
<TableThead>
<TableTr>
<TableTh>Nama</TableTh>
<TableTh>Tanggal</TableTh>
<TableTh>Waktu</TableTh>
<TableTh>Lokasi</TableTh>
<TableTh>Detail</TableTh>
</TableTr>
</TableThead>
<TableTbody>
{stateJadwalKegiatan.findMany.data?.map((item) => (
<TableTr key={item.id}>
<TableTd>{item.informasijadwalkegiatan.name}</TableTd>
<TableTd>{item.informasijadwalkegiatan.tanggal}</TableTd>
<TableTd>{item.informasijadwalkegiatan.waktu}</TableTd>
<TableTd>{item.informasijadwalkegiatan.lokasi}</TableTd>
<TableTd>
<Button onClick={() => router.push(`/admin/kesehatan/data-kesehatan-warga/jadwal_kegiatan/${item.id}`)}>
<IconDeviceImacCog size={25} />
</Button>
</TableTd>
</TableTr>
))}
</TableTbody>
</Table>
</Box>
</Stack>
</Paper>
</Box>
)
}
export default JadwalKegiatan;

View File

@@ -1,63 +0,0 @@
'use client'
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
import colors from '@/con/colors';
import { Box, Paper, Stack, Text, Textarea, TextInput } from '@mantine/core';
import { useProxy } from 'valtio/utils';
function Pendaftaran() {
const pendaftaran = useProxy(stateJadwalKegiatan.pendaftaranjadwal)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Text pt={10} fw={"bold"}>Pendaftaran</Text>
<TextInput
label='Nama Balita'
placeholder='Masukkan nama balita'
onChange={(val) => {
pendaftaran.create.form.name = val.target.value
}}
/>
<TextInput
label='Tanggal'
placeholder='Masukkan tanggal'
onChange={(val) => {
pendaftaran.create.form.tanggal = val.target.value
}}
/>
<TextInput
label='Nama Orang Tua / Wali'
placeholder='Masukkan nama orang tua / wali'
onChange={(val) => {
pendaftaran.create.form.namaOrangtua = val.target.value
}}
/>
<TextInput
label='No. Telepon'
placeholder='Masukkan no. telepon'
onChange={(val) => {
pendaftaran.create.form.nomor = val.target.value
}}
/>
<TextInput
label='Alamat'
placeholder='Masukkan alamat'
onChange={(val) => {
pendaftaran.create.form.alamat = val.target.value
}}
/>
<Textarea
label='Catatan Khusus (Opsional)'
placeholder='Masukkan catatan khusus'
onChange={(val) => {
pendaftaran.create.form.catatan = val.target.value
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default Pendaftaran;

View File

@@ -1,27 +0,0 @@
'use client'
import colors from '@/con/colors';
import { Box, Paper, Stack, Text } from '@mantine/core';
import { useProxy } from 'valtio/utils';
import { KesehatanEditor } from '../../_com/kesehatanEditor';
import stateJadwalKegiatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan';
function SyaratDanKetentuan() {
const syaratKetentuan = useProxy(stateJadwalKegiatan.syaratketentuan)
return (
<Box>
<Paper bg={colors['white-1']} p={'md'}>
<Stack gap={"xs"}>
<Text pt={10} fw={"bold"}>Syarat dan Ketentuan</Text>
<KesehatanEditor
showSubmit={false}
onChange={(val) => {
syaratKetentuan.create.form.content = val;
}}
/>
</Stack>
</Paper>
</Box>
);
}
export default SyaratDanKetentuan;