From 924be5b11b90dd9d2a09ba1e99e237d7669188c2 Mon Sep 17 00:00:00 2001 From: nico Date: Thu, 26 Jun 2025 17:24:57 +0800 Subject: [PATCH] Sisa 1 Tabs aja yang data kesehatan warga --- .../20250626061909_26_jun_25_01/migration.sql | 92 +++ prisma/schema.prisma | 34 +- .../data_kesehatan_warga/jadwalKegiatan.ts | 592 ++++++++---------- .../jadwal_kegiatan/[id]/edit/page.tsx | 407 ++++++++++++ .../jadwal_kegiatan/[id]/page.tsx | 126 ++++ .../jadwal_kegiatan/create/page.tsx | 212 +++++++ .../deskripsi_kegiatan/page.tsx | 27 - .../dokumen_yang_diperlukan/page.tsx | 29 - .../informasi_kegiatan/page.tsx | 48 -- .../layanan_yang_tersedia/page.tsx | 27 - .../jadwal_kegiatan/page.tsx | 236 ++----- .../jadwal_kegiatan/pendaftaran/page.tsx | 63 -- .../syarat_dan_ketentuan/page.tsx | 27 - .../jadwal_kegiatan/create.ts | 61 ++ .../jadwal_kegiatan/del.ts | 43 ++ .../deskripsi_kegiatan/create.ts | 28 - .../deskripsi_kegiatan/find-many.ts | 8 - .../deskripsi_kegiatan/index.ts | 16 - .../dokumen_yang_diperlukan/create.ts | 26 - .../dokumen_yang_diperlukan/find-many.ts | 8 - .../dokumen_yang_diperlukan/index.ts | 17 - .../jadwal_kegiatan/findMany.ts | 30 + .../jadwal_kegiatan/findUnique.ts | 53 ++ .../jadwal_kegiatan/index.ts | 89 +++ .../informasi_kegiatan/create.ts | 33 - .../informasi_kegiatan/find-many.ts | 8 - .../informasi_kegiatan/index.ts | 19 - .../layanan_yang_tersedia/create.ts | 26 - .../layanan_yang_tersedia/find-many.ts | 8 - .../layanan_yang_tersedia/index.ts | 17 - .../jadwal_kegiatan/pendaftaran/create.ts | 36 -- .../jadwal_kegiatan/pendaftaran/find-many.ts | 8 - .../jadwal_kegiatan/pendaftaran/index.ts | 21 - .../syarat_dan_ketentuan/create.ts | 26 - .../syarat_dan_ketentuan/find-many.ts | 8 - .../syarat_dan_ketentuan/index.ts | 16 - .../jadwal_kegiatan/updt.ts | 103 +++ .../api/[[...slugs]]/_lib/kesehatan/index.ts | 14 +- 38 files changed, 1577 insertions(+), 1065 deletions(-) create mode 100644 prisma/migrations/20250626061909_26_jun_25_01/migration.sql create mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx create mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx create mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/deskripsi_kegiatan/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/dokumen_yang_diperlukan/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/informasi_kegiatan/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/layanan_yang_tersedia/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/pendaftaran/page.tsx delete mode 100644 src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/syarat_dan_ketentuan/page.tsx create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/create.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/del.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/deskripsi_kegiatan/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/deskripsi_kegiatan/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/deskripsi_kegiatan/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/dokumen_yang_diperlukan/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/dokumen_yang_diperlukan/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/dokumen_yang_diperlukan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/findMany.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/findUnique.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/informasi_kegiatan/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/informasi_kegiatan/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/informasi_kegiatan/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/layanan_yang_tersedia/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/layanan_yang_tersedia/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/layanan_yang_tersedia/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/pendaftaran/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/pendaftaran/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/pendaftaran/index.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/syarat_dan_ketentuan/create.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/syarat_dan_ketentuan/find-many.ts delete mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/syarat_dan_ketentuan/index.ts create mode 100644 src/app/api/[[...slugs]]/_lib/kesehatan/data_kesehatan_warga/jadwal_kegiatan/updt.ts diff --git a/prisma/migrations/20250626061909_26_jun_25_01/migration.sql b/prisma/migrations/20250626061909_26_jun_25_01/migration.sql new file mode 100644 index 00000000..6e7910ce --- /dev/null +++ b/prisma/migrations/20250626061909_26_jun_25_01/migration.sql @@ -0,0 +1,92 @@ +/* + Warnings: + + - The primary key for the `ArtikelKesehatan` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `DoctorSign` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `FirstAid` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `Introduction` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `MythVsFact` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `Prevention` table will be changed. If it partially fails, the table could be left without primary key constraint. + - The primary key for the `Symptom` table will be changed. If it partially fails, the table could be left without primary key constraint. + - Added the required column `deskripsiJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `dokumenJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `informasiJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `layananJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `pendaftaranJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `syaratKetentuanJadwalKegiatanId` to the `JadwalKegiatan` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "ArtikelKesehatan" DROP CONSTRAINT "ArtikelKesehatan_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "ArtikelKesehatan_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "ArtikelKesehatan_id_seq"; + +-- AlterTable +ALTER TABLE "DoctorSign" DROP CONSTRAINT "DoctorSign_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "DoctorSign_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "DoctorSign_id_seq"; + +-- AlterTable +ALTER TABLE "FirstAid" DROP CONSTRAINT "FirstAid_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "FirstAid_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "FirstAid_id_seq"; + +-- AlterTable +ALTER TABLE "Introduction" DROP CONSTRAINT "Introduction_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Introduction_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Introduction_id_seq"; + +-- AlterTable +ALTER TABLE "JadwalKegiatan" ADD COLUMN "deskripsiJadwalKegiatanId" TEXT NOT NULL, +ADD COLUMN "dokumenJadwalKegiatanId" TEXT NOT NULL, +ADD COLUMN "informasiJadwalKegiatanId" TEXT NOT NULL, +ADD COLUMN "layananJadwalKegiatanId" TEXT NOT NULL, +ADD COLUMN "pendaftaranJadwalKegiatanId" TEXT NOT NULL, +ADD COLUMN "syaratKetentuanJadwalKegiatanId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "MythVsFact" DROP CONSTRAINT "MythVsFact_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "MythVsFact_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "MythVsFact_id_seq"; + +-- AlterTable +ALTER TABLE "Prevention" DROP CONSTRAINT "Prevention_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Prevention_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Prevention_id_seq"; + +-- AlterTable +ALTER TABLE "Symptom" DROP CONSTRAINT "Symptom_pkey", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT, +ADD CONSTRAINT "Symptom_pkey" PRIMARY KEY ("id"); +DROP SEQUENCE "Symptom_id_seq"; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_informasiJadwalKegiatanId_fkey" FOREIGN KEY ("informasiJadwalKegiatanId") REFERENCES "InformasiJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_deskripsiJadwalKegiatanId_fkey" FOREIGN KEY ("deskripsiJadwalKegiatanId") REFERENCES "DeskripsiJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_layananJadwalKegiatanId_fkey" FOREIGN KEY ("layananJadwalKegiatanId") REFERENCES "LayananJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_syaratKetentuanJadwalKegiatanId_fkey" FOREIGN KEY ("syaratKetentuanJadwalKegiatanId") REFERENCES "SyaratKetentuanJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_dokumenJadwalKegiatanId_fkey" FOREIGN KEY ("dokumenJadwalKegiatanId") REFERENCES "DokumenJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JadwalKegiatan" ADD CONSTRAINT "JadwalKegiatan_pendaftaranJadwalKegiatanId_fkey" FOREIGN KEY ("pendaftaranJadwalKegiatanId") REFERENCES "PendaftaranJadwalKegiatan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 716f13af..f591974f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -560,6 +560,18 @@ model TarifDanLayanan { model JadwalKegiatan { id String @id @default(cuid()) content String + informasijadwalkegiatan InformasiJadwalKegiatan @relation(fields: [informasiJadwalKegiatanId], references: [id]) + informasiJadwalKegiatanId String + deskripsijadwalkegiatan DeskripsiJadwalKegiatan @relation(fields: [deskripsiJadwalKegiatanId], references: [id]) + deskripsiJadwalKegiatanId String + layananjadwalkegiatan LayananJadwalKegiatan @relation(fields: [layananJadwalKegiatanId], references: [id]) + layananJadwalKegiatanId String + syaratketentuanjadwalkegiatan SyaratKetentuanJadwalKegiatan @relation(fields: [syaratKetentuanJadwalKegiatanId], references: [id]) + syaratKetentuanJadwalKegiatanId String + dokumenjadwalkegiatan DokumenJadwalKegiatan @relation(fields: [dokumenJadwalKegiatanId], references: [id]) + dokumenJadwalKegiatanId String + pendaftaranjadwalkegiatan PendaftaranJadwalKegiatan @relation(fields: [pendaftaranJadwalKegiatanId], references: [id]) + pendaftaranJadwalKegiatanId String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) @@ -576,6 +588,7 @@ model InformasiJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model DeskripsiJadwalKegiatan { @@ -585,6 +598,7 @@ model DeskripsiJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model LayananJadwalKegiatan { @@ -594,6 +608,8 @@ model LayananJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + JadwalKegiatan JadwalKegiatan[] } model SyaratKetentuanJadwalKegiatan { @@ -603,6 +619,8 @@ model SyaratKetentuanJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + JadwalKegiatan JadwalKegiatan[] } model DokumenJadwalKegiatan { @@ -612,6 +630,7 @@ model DokumenJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model PendaftaranJadwalKegiatan { @@ -626,6 +645,7 @@ model PendaftaranJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } // ========================================= PERSENTASE KELAHIRAN & KEMATIAN ========================================= // @@ -656,7 +676,7 @@ model GrafikKepuasan { // ========================================= ARTIKEL KESEHATAN ========================================= // model ArtikelKesehatan { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) @@ -666,7 +686,7 @@ model ArtikelKesehatan { } model Introduction { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -675,7 +695,7 @@ model Introduction { } model Symptom { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) @@ -685,7 +705,7 @@ model Symptom { } model Prevention { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) @@ -695,7 +715,7 @@ model Prevention { } model FirstAid { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) @@ -705,7 +725,7 @@ model FirstAid { } model MythVsFact { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String mitos String fakta String @@ -716,7 +736,7 @@ model MythVsFact { } model DoctorSign { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt diff --git a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan.ts b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan.ts index 4198a18d..fd91dd89 100644 --- a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan.ts +++ b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/jadwalKegiatan.ts @@ -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; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx new file mode 100644 index 00000000..06f84f83 --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/edit/page.tsx @@ -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({ + 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 ( + + + + + + + + Edit Jadwal Kegiatan + Nama Jadwal Kegiatan} + placeholder="masukkan nama jadwal kegiatan" + value={formData.content} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + content: e.target.value + })); + }} + /> + + Deskripsi Jadwal Kegiatan + { + setFormData(prev => ({ + ...prev, + deskripsiJadwalKegiatan: { + ...prev.deskripsiJadwalKegiatan, + deskripsi: e + } + })); + }} + /> + + + Informasi Jadwal Kegiatan + Nama} + placeholder="masukkan nama" + value={formData.informasiJadwalKegiatan.name} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + informasiJadwalKegiatan: { + ...prev.informasiJadwalKegiatan, + name: e.target.value + } + })); + }} + /> + Tanggal} + placeholder="masukkan tanggal" + value={formData.informasiJadwalKegiatan.tanggal} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + informasiJadwalKegiatan: { + ...prev.informasiJadwalKegiatan, + tanggal: e.target.value + } + })); + }} + /> + Waktu} + placeholder="masukkan waktu" + value={formData.informasiJadwalKegiatan.waktu} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + informasiJadwalKegiatan: { + ...prev.informasiJadwalKegiatan, + waktu: e.target.value + } + })); + }} + /> + Lokasi} + placeholder="masukkan lokasi" + value={formData.informasiJadwalKegiatan.lokasi} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + informasiJadwalKegiatan: { + ...prev.informasiJadwalKegiatan, + lokasi: e.target.value + } + })); + }} + /> + + + Layanan Jadwal Kegiatan + { + setFormData(prev => ({ + ...prev, + layananJadwalKegiatan: { + ...prev.layananJadwalKegiatan, + content: e + } + })); + }} + /> + + + Syarat dan Ketentuan Jadwal Kegiatan + { + setFormData(prev => ({ + ...prev, + syaratKetentuanJadwalKegiatan: { + ...prev.syaratKetentuanJadwalKegiatan, + content: e + } + })); + }} + /> + + + Dokumen Jadwal Kegiatan + { + setFormData(prev => ({ + ...prev, + dokumenJadwalKegiatan: { + ...prev.dokumenJadwalKegiatan, + content: e + } + })); + }} + /> + + + Pendaftaran Jadwal Kegiatan + Nama} + placeholder="masukkan nama" + value={formData.pendaftaranJadwalKegiatan.name} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + name: e.target.value + } + })); + }} + /> + Tanggal} + placeholder="masukkan tanggal" + value={formData.pendaftaranJadwalKegiatan.tanggal} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + tanggal: e.target.value + } + })); + }} + /> + Nama Orangtua} + placeholder="masukkan nama orangtua" + value={formData.pendaftaranJadwalKegiatan.namaOrangtua} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + namaOrangtua: e.target.value + } + })); + }} + /> + Nomor} + placeholder="masukkan nomor" + value={formData.pendaftaranJadwalKegiatan.nomor} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + nomor: e.target.value + } + })); + }} + /> + Alamat} + placeholder="masukkan alamat" + value={formData.pendaftaranJadwalKegiatan.alamat} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + alamat: e.target.value + } + })); + }} + /> + Catatan} + placeholder="masukkan catatan" + value={formData.pendaftaranJadwalKegiatan.catatan} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + pendaftaranJadwalKegiatan: { + ...prev.pendaftaranJadwalKegiatan, + catatan: e.target.value + } + })); + }} + /> + + + + + + + + ); +} + +export default EditJadwalKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx new file mode 100644 index 00000000..fcbee448 --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/[id]/page.tsx @@ -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(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 ( + + + + ) + } + + + return ( + + + + + + + Detail Jadwal Kegiatan + {stateJadwalKegiatan.findUnique.data ? ( + + + + Nama Kegiatan + {stateJadwalKegiatan.findUnique.data.content} + + + Informasi + Nama + {stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.name} + Tanggal + {stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.tanggal} + Waktu + {stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.waktu} + Lokasi + {stateJadwalKegiatan.findUnique.data.informasijadwalkegiatan.lokasi} + + + Deskripsi + + + + Layanan + + + + Syarat Ketentuan + + + + Dokumen + + + + Prosedur Pendaftaran + {stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.name} + {stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.tanggal} + {stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.namaOrangtua} + {stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.nomor} + {stateJadwalKegiatan.findUnique.data.pendaftaranjadwalkegiatan.alamat} + + + + + + + + + + + ) : null} + + + + {/* Modal Hapus */} + setModalHapus(false)} + onConfirm={handleHapus} + text="Apakah anda yakin ingin menghapus jadwal kegiatan ini?" + /> + + ); +} + +export default DetailJadwalKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx new file mode 100644 index 00000000..c9c01fa7 --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/create/page.tsx @@ -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 ( + + + + + + + + Create Jadwal Kegiatan + Nama Jadwal Kegiatan} + placeholder="masukkan nama jadwal kegiatan" + value={stateJadwalKegiatan.create.form.content} + onChange={(e) => { + stateJadwalKegiatan.create.form.content = e.target.value; + }} + /> + + Deskripsi Jadwal Kegiatan + { + stateJadwalKegiatan.create.form.deskripsiJadwalKegiatan.deskripsi = e; + }} + /> + + + Informasi Jadwal Kegiatan + Nama} + placeholder="masukkan nama" + value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name} + onChange={(e) => { + stateJadwalKegiatan.create.form.informasiJadwalKegiatan.name = e.target.value; + }} + /> + Tanggal} + placeholder="masukkan tanggal" + value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal} + onChange={(e) => { + stateJadwalKegiatan.create.form.informasiJadwalKegiatan.tanggal = e.target.value; + }} + /> + Waktu} + placeholder="masukkan waktu" + value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu} + onChange={(e) => { + stateJadwalKegiatan.create.form.informasiJadwalKegiatan.waktu = e.target.value; + }} + /> + Lokasi} + placeholder="masukkan lokasi" + value={stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi} + onChange={(e) => { + stateJadwalKegiatan.create.form.informasiJadwalKegiatan.lokasi = e.target.value; + }} + /> + + + Layanan Jadwal Kegiatan + { + stateJadwalKegiatan.create.form.layananJadwalKegiatan.content = e; + }} + /> + + + Syarat dan Ketentuan Jadwal Kegiatan + { + stateJadwalKegiatan.create.form.syaratKetentuanJadwalKegiatan.content = e; + }} + /> + + + Dokumen Jadwal Kegiatan + { + stateJadwalKegiatan.create.form.dokumenJadwalKegiatan.content = e; + }} + /> + + + Pendaftaran Jadwal Kegiatan + Nama} + placeholder="masukkan nama" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.name} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.name = e.target.value; + }} + /> + Tanggal} + placeholder="masukkan tanggal" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.tanggal} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.tanggal = e.target.value; + }} + /> + Nama Orangtua} + placeholder="masukkan nama orangtua" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.namaOrangtua} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.namaOrangtua = e.target.value; + }} + /> + Nomor} + placeholder="masukkan nomor" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.nomor} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.nomor = e.target.value; + }} + /> + Alamat} + placeholder="masukkan alamat" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.alamat} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.alamat = e.target.value; + }} + /> + Catatan} + placeholder="masukkan catatan" + value={stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.catatan} + onChange={(e) => { + stateJadwalKegiatan.create.form.pendaftaranJadwalKegiatan.catatan = e.target.value; + }} + /> + + + + + + + ); +} + +export default CreateJadwalKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/deskripsi_kegiatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/deskripsi_kegiatan/page.tsx deleted file mode 100644 index 01016aa5..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/deskripsi_kegiatan/page.tsx +++ /dev/null @@ -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 ( - - - - Deskripsi Kegiatan - { - deskripsiKegiatanState.create.form.deskripsi = val - }} - /> - - - - ); -} - -export default DeskripsiKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/dokumen_yang_diperlukan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/dokumen_yang_diperlukan/page.tsx deleted file mode 100644 index 0576e07b..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/dokumen_yang_diperlukan/page.tsx +++ /dev/null @@ -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 ( - - - - Dokumen Yang Diperlukan - { - dokumenDiperlukan.create.form.content = val; - }} - /> - - - - ); -} - -export default DokumenYangDiperlukan; - - diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/informasi_kegiatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/informasi_kegiatan/page.tsx deleted file mode 100644 index 88cab315..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/informasi_kegiatan/page.tsx +++ /dev/null @@ -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 ( - - - - Informasi Kegiatan - { - informasiKegiatanState.create.form.name = val.target.value - }} - /> - { - informasiKegiatanState.create.form.tanggal = val.target.value - }} - /> - { - informasiKegiatanState.create.form.waktu = val.target.value - }} - /> - { - informasiKegiatanState.create.form.lokasi = val.target.value - }} - /> - - - - ); -} - -export default InformasiKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/layanan_yang_tersedia/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/layanan_yang_tersedia/page.tsx deleted file mode 100644 index bcca180f..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/layanan_yang_tersedia/page.tsx +++ /dev/null @@ -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 ( - - - - Layanan Yang Tersedia - { - layananTersediaState.create.form.content = val; - }} - /> - - - - ); -} - -export default LayananTersedia; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/page.tsx index 792a618b..99b9734e 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/page.tsx @@ -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 ( - - - - - Tambah Jadwal Kegiatan - - - - - - - - - - - - - Data Jadwal Kegiatan - - - - - + + } + /> + + ); } -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 ( - - Informasi Kegiatan - {Array.from({ length: 10 }).map((_, k) => )} - - ); + + + + ) } return ( - - - - Informasi Kegiatan - {allList.informasiKegiatan.findMany.data?.map((item) => { - return ( - - {item.name} - {item.tanggal} - {item.waktu} - {item.lokasi} - - ) - })} - - - - - Deskripsi Kegiatan - {allList.deskripsiKegiatan.findMany.data?.map((item) => { - return ( - - - - ) - })} - - - - Layanan Yang Tersedia - {allList.layanantersedia.findMany.data?.map((item) => { - return ( - - - - ) - })} - - - - Syarat dan Ketentuan - {allList.syaratketentuan.findMany.data?.map((item) => { - return ( - - - - ) - })} - - - - Dokumen Yang Diperlukan - {allList.dokumenjadwalkegiatan.findMany.data?.map((item) => { - return ( - - - - ) - })} - - - - Pendaftaran - {allList.pendaftaranjadwal.findMany.data?.map((item) => { - return ( - - {item.name} - {item.tanggal} - {item.namaOrangtua} - {item.nomor} - {item.alamat} - {item.catatan} - - ) - })} - - + + + + + + + + + Nama + Tanggal + Waktu + Lokasi + Detail + + + + {stateJadwalKegiatan.findMany.data?.map((item) => ( + + {item.informasijadwalkegiatan.name} + {item.informasijadwalkegiatan.tanggal} + {item.informasijadwalkegiatan.waktu} + {item.informasijadwalkegiatan.lokasi} + + + + + ))} + +
+
+
+
+
) } - export default JadwalKegiatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/pendaftaran/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/pendaftaran/page.tsx deleted file mode 100644 index 6fa56544..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/jadwal_kegiatan/pendaftaran/page.tsx +++ /dev/null @@ -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 ( - - - - Pendaftaran - { - pendaftaran.create.form.name = val.target.value - }} - /> - { - pendaftaran.create.form.tanggal = val.target.value - }} - /> - { - pendaftaran.create.form.namaOrangtua = val.target.value - }} - /> - { - pendaftaran.create.form.nomor = val.target.value - }} - /> - { - pendaftaran.create.form.alamat = val.target.value - }} - /> -