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/migrations/20250627155416_nico_27_jun_25_o1/migration.sql b/prisma/migrations/20250627155416_nico_27_jun_25_o1/migration.sql new file mode 100644 index 00000000..c198dc4f --- /dev/null +++ b/prisma/migrations/20250627155416_nico_27_jun_25_o1/migration.sql @@ -0,0 +1,68 @@ +/* + Warnings: + + - The primary key for the `DataKematian_Kelahiran` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `uuid` on the `DataKematian_Kelahiran` table. All the data in the column will be lost. + - The primary key for the `GrafikKepuasan` table will be changed. If it partially fails, the table could be left without primary key constraint. + - You are about to drop the column `uuid` on the `GrafikKepuasan` table. All the data in the column will be lost. + - A unique constraint covering the columns `[id]` on the table `DataKematian_Kelahiran` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `GrafikKepuasan` will be added. If there are existing duplicate values, this will fail. + - Added the required column `doctorSignId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `firstAidId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `introductionId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `mythVsFactId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `preventionId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + - Added the required column `symptomId` to the `ArtikelKesehatan` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX "DataKematian_Kelahiran_uuid_key"; + +-- DropIndex +DROP INDEX "GrafikKepuasan_uuid_key"; + +-- AlterTable +ALTER TABLE "ArtikelKesehatan" ADD COLUMN "doctorSignId" TEXT NOT NULL, +ADD COLUMN "firstAidId" TEXT NOT NULL, +ADD COLUMN "introductionId" TEXT NOT NULL, +ADD COLUMN "mythVsFactId" TEXT NOT NULL, +ADD COLUMN "preventionId" TEXT NOT NULL, +ADD COLUMN "symptomId" TEXT NOT NULL; + +-- AlterTable +ALTER TABLE "DataKematian_Kelahiran" DROP CONSTRAINT "DataKematian_Kelahiran_pkey", +DROP COLUMN "uuid", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT; +DROP SEQUENCE "DataKematian_Kelahiran_id_seq"; + +-- AlterTable +ALTER TABLE "GrafikKepuasan" DROP CONSTRAINT "GrafikKepuasan_pkey", +DROP COLUMN "uuid", +ALTER COLUMN "id" DROP DEFAULT, +ALTER COLUMN "id" SET DATA TYPE TEXT; +DROP SEQUENCE "GrafikKepuasan_id_seq"; + +-- CreateIndex +CREATE UNIQUE INDEX "DataKematian_Kelahiran_id_key" ON "DataKematian_Kelahiran"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "GrafikKepuasan_id_key" ON "GrafikKepuasan"("id"); + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_introductionId_fkey" FOREIGN KEY ("introductionId") REFERENCES "Introduction"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_symptomId_fkey" FOREIGN KEY ("symptomId") REFERENCES "Symptom"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_preventionId_fkey" FOREIGN KEY ("preventionId") REFERENCES "Prevention"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_firstAidId_fkey" FOREIGN KEY ("firstAidId") REFERENCES "FirstAid"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_mythVsFactId_fkey" FOREIGN KEY ("mythVsFactId") REFERENCES "MythVsFact"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "ArtikelKesehatan" ADD CONSTRAINT "ArtikelKesehatan_doctorSignId_fkey" FOREIGN KEY ("doctorSignId") REFERENCES "DoctorSign"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20250630030216_nico_30_jun_25_1/migration.sql b/prisma/migrations/20250630030216_nico_30_jun_25_1/migration.sql new file mode 100644 index 00000000..08b04044 --- /dev/null +++ b/prisma/migrations/20250630030216_nico_30_jun_25_1/migration.sql @@ -0,0 +1,201 @@ +-- CreateEnum +CREATE TYPE "StatusLaporan" AS ENUM ('SELESAI', 'PROSES', 'GAGAL'); + +-- AlterTable +ALTER TABLE "DataKematian_Kelahiran" ADD CONSTRAINT "DataKematian_Kelahiran_pkey" PRIMARY KEY ("id"); + +-- DropIndex +DROP INDEX "DataKematian_Kelahiran_id_key"; + +-- AlterTable +ALTER TABLE "GrafikKepuasan" ADD CONSTRAINT "GrafikKepuasan_pkey" PRIMARY KEY ("id"); + +-- DropIndex +DROP INDEX "GrafikKepuasan_id_key"; + +-- CreateTable +CREATE TABLE "KeamananLingkungan" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + "deskripsi" TEXT NOT NULL, + "imageId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "KeamananLingkungan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PolsekTerdekat" ( + "id" TEXT NOT NULL, + "nama" TEXT NOT NULL, + "jarakKeDesa" TEXT NOT NULL, + "alamat" TEXT NOT NULL, + "nomorTelepon" TEXT NOT NULL, + "jamOperasional" TEXT NOT NULL, + "embedMapUrl" TEXT NOT NULL, + "namaTempatMaps" TEXT NOT NULL, + "alamatMaps" TEXT NOT NULL, + "linkPetunjukArah" TEXT NOT NULL, + "layananPolsekId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "PolsekTerdekat_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LayananPolsek" ( + "id" TEXT NOT NULL, + "nama" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "LayananPolsek_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "KontakDaruratKeamanan" ( + "id" TEXT NOT NULL, + "nama" TEXT NOT NULL, + "kontak" TEXT NOT NULL, + "icon" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "KontakDaruratKeamanan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PencegahanKriminalitas" ( + "id" TEXT NOT NULL, + "programKeamananId" TEXT NOT NULL, + "tipsKeamananId" TEXT NOT NULL, + "videoKeamananId" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "PencegahanKriminalitas_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "ProgramKeamanan" ( + "id" TEXT NOT NULL, + "nama" TEXT NOT NULL, + "deskripsi" TEXT, + "slug" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ProgramKeamanan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TipsKeamanan" ( + "id" TEXT NOT NULL, + "judul" TEXT NOT NULL, + "konten" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "TipsKeamanan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "VideoKeamanan" ( + "id" TEXT NOT NULL, + "judul" TEXT NOT NULL, + "deskripsi" TEXT, + "videoUrl" TEXT NOT NULL, + "slug" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "VideoKeamanan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LaporanPublik" ( + "id" TEXT NOT NULL, + "judul" TEXT NOT NULL, + "lokasi" TEXT NOT NULL, + "tanggalWaktu" TIMESTAMP(3) NOT NULL, + "status" "StatusLaporan" NOT NULL, + "kronologi" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LaporanPublik_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PenangananLaporanPublik" ( + "id" TEXT NOT NULL, + "laporanId" TEXT NOT NULL, + "deskripsi" TEXT NOT NULL, + + CONSTRAINT "PenangananLaporanPublik_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Pelapor" ( + "id" TEXT NOT NULL, + "nama" TEXT NOT NULL, + "alamat" TEXT NOT NULL, + "nomorTelepon" TEXT NOT NULL, + "imageId" TEXT NOT NULL, + + CONSTRAINT "Pelapor_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MenuTipsKeamanan" ( + "id" TEXT NOT NULL, + "judul" TEXT NOT NULL, + "deskripsi" TEXT NOT NULL, + "imageId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + "deletedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "isActive" BOOLEAN NOT NULL DEFAULT true, + + CONSTRAINT "MenuTipsKeamanan_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "ProgramKeamanan_slug_key" ON "ProgramKeamanan"("slug"); + +-- AddForeignKey +ALTER TABLE "KeamananLingkungan" ADD CONSTRAINT "KeamananLingkungan_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PolsekTerdekat" ADD CONSTRAINT "PolsekTerdekat_layananPolsekId_fkey" FOREIGN KEY ("layananPolsekId") REFERENCES "LayananPolsek"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PencegahanKriminalitas" ADD CONSTRAINT "PencegahanKriminalitas_programKeamananId_fkey" FOREIGN KEY ("programKeamananId") REFERENCES "ProgramKeamanan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PencegahanKriminalitas" ADD CONSTRAINT "PencegahanKriminalitas_tipsKeamananId_fkey" FOREIGN KEY ("tipsKeamananId") REFERENCES "TipsKeamanan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PencegahanKriminalitas" ADD CONSTRAINT "PencegahanKriminalitas_videoKeamananId_fkey" FOREIGN KEY ("videoKeamananId") REFERENCES "VideoKeamanan"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PenangananLaporanPublik" ADD CONSTRAINT "PenangananLaporanPublik_laporanId_fkey" FOREIGN KEY ("laporanId") REFERENCES "LaporanPublik"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Pelapor" ADD CONSTRAINT "Pelapor_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MenuTipsKeamanan" ADD CONSTRAINT "MenuTipsKeamanan_imageId_fkey" FOREIGN KEY ("imageId") REFERENCES "FileStorage"("id") ON DELETE SET NULL ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 716f13af..e976a222 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -73,9 +73,15 @@ model FileStorage { Puskesmas Puskesmas[] ProgramKesehatan ProgramKesehatan[] PenangananDarurat PenangananDarurat[] - KontakDarurat KontakDarurat[] + KontakDarurat KontakDarurat[] InfoWabahPenyakit InfoWabahPenyakit[] + + KeamananLingkungan KeamananLingkungan[] + + MenuTipsKeamanan MenuTipsKeamanan[] + + Pelapor Pelapor[] } //========================================= MENU PPID ========================================= // @@ -471,24 +477,24 @@ model Penghargaan { // ========================================= FASILITAS KESEHATAN ========================================= // model FasilitasKesehatan { - id String @id @default(cuid()) - name String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) - informasiumum InformasiUmum @relation(fields: [informasiUmumId], references: [id]) - informasiUmumId String - layananunggulan LayananUnggulan @relation(fields: [layananUnggulanId], references: [id]) - layananUnggulanId String - dokterdantenagamedis DokterdanTenagaMedis @relation(fields: [dokterdanTenagaMedisId], references: [id]) + id String @id @default(cuid()) + name String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + informasiumum InformasiUmum @relation(fields: [informasiUmumId], references: [id]) + informasiUmumId String + layananunggulan LayananUnggulan @relation(fields: [layananUnggulanId], references: [id]) + layananUnggulanId String + dokterdantenagamedis DokterdanTenagaMedis @relation(fields: [dokterdanTenagaMedisId], references: [id]) dokterdanTenagaMedisId String - fasilitaspendukung FasilitasPendukung @relation(fields: [fasilitasPendukungId], references: [id]) - fasilitasPendukungId String - prosedurpendaftaran ProsedurPendaftaran @relation(fields: [prosedurPendaftaranId], references: [id]) - prosedurPendaftaranId String - tarifdanlayanan TarifDanLayanan @relation(fields: [tarifDanLayananId], references: [id]) - tarifDanLayananId String + fasilitaspendukung FasilitasPendukung @relation(fields: [fasilitasPendukungId], references: [id]) + fasilitasPendukungId String + prosedurpendaftaran ProsedurPendaftaran @relation(fields: [prosedurPendaftaranId], references: [id]) + prosedurPendaftaranId String + tarifdanlayanan TarifDanLayanan @relation(fields: [tarifDanLayananId], references: [id]) + tarifDanLayananId String } model InformasiUmum { @@ -558,33 +564,47 @@ model TarifDanLayanan { // ========================================= JADWAL KEGIATAN ========================================= // model JadwalKegiatan { - id String @id @default(cuid()) - content String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + 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()) + isActive Boolean @default(true) } model InformasiJadwalKegiatan { - id String @id @default(cuid()) - name String - tanggal String - waktu String - lokasi String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + name String + tanggal String + waktu String + lokasi String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model DeskripsiJadwalKegiatan { - id String @id @default(cuid()) - deskripsi String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + deskripsi String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model LayananJadwalKegiatan { @@ -594,6 +614,8 @@ model LayananJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + JadwalKegiatan JadwalKegiatan[] } model SyaratKetentuanJadwalKegiatan { @@ -603,35 +625,38 @@ model SyaratKetentuanJadwalKegiatan { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + JadwalKegiatan JadwalKegiatan[] } model DokumenJadwalKegiatan { - id String @id @default(cuid()) - content String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } model PendaftaranJadwalKegiatan { - id String @id @default(cuid()) - name String - tanggal String - namaOrangtua String - nomor String - alamat String - catatan String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + name String + tanggal String + namaOrangtua String + nomor String + alamat String + catatan String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + JadwalKegiatan JadwalKegiatan[] } // ========================================= PERSENTASE KELAHIRAN & KEMATIAN ========================================= // model DataKematian_Kelahiran { - id Int @id @default(autoincrement()) - uuid String @default(cuid()) @unique + id String @id @default(cuid()) tahun String kematianKasar String kematianBayi String @@ -644,8 +669,7 @@ model DataKematian_Kelahiran { // ========================================= GRAFIK KEPUASAN ========================================= // model GrafikKepuasan { - id Int @id @default(autoincrement()) - uuid String @default(cuid()) @unique + id String @id @default(cuid()) label String jumlah String createdAt DateTime @default(now()) @@ -656,56 +680,74 @@ model GrafikKepuasan { // ========================================= ARTIKEL KESEHATAN ========================================= // model ArtikelKesehatan { - id Int @id @default(autoincrement()) - title String - content String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + title String + content String + introduction Introduction @relation(fields: [introductionId], references: [id]) + introductionId String + symptom Symptom @relation(fields: [symptomId], references: [id]) + symptomId String + prevention Prevention @relation(fields: [preventionId], references: [id]) + preventionId String + firstaid FirstAid @relation(fields: [firstAidId], references: [id]) + firstAidId String + mythvsfact MythVsFact @relation(fields: [mythVsFactId], references: [id]) + mythVsFactId String + doctorsign DoctorSign @relation(fields: [doctorSignId], references: [id]) + doctorSignId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) } model Introduction { - id Int @id @default(autoincrement()) - content String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + ArtikelKesehatan ArtikelKesehatan[] } model Symptom { - id Int @id @default(autoincrement()) - title String - content String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + id String @id @default(cuid()) + title String + content String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + ArtikelKesehatan ArtikelKesehatan[] } model Prevention { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + ArtikelKesehatan ArtikelKesehatan[] } model FirstAid { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + ArtikelKesehatan ArtikelKesehatan[] } model MythVsFact { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) title String mitos String fakta String @@ -713,15 +755,19 @@ model MythVsFact { updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + ArtikelKesehatan ArtikelKesehatan[] } model DoctorSign { - id Int @id @default(autoincrement()) + id String @id @default(cuid()) content String createdAt DateTime @default(now()) updatedAt DateTime @updatedAt deletedAt DateTime @default(now()) isActive Boolean @default(true) + + ArtikelKesehatan ArtikelKesehatan[] } // ========================================= POSYANDU ========================================= // @@ -819,16 +865,166 @@ model KontakDarurat { deletedAt DateTime @default(now()) isActive Boolean @default(true) } + // ========================================= INFO WABAH PENYAKIT ========================================= // model InfoWabahPenyakit { - id String @id @default(cuid()) - name String + id String @id @default(cuid()) + name String deskripsiSingkat String deskripsiLengkap String - image FileStorage @relation(fields: [imageId], references: [id]) - imageId String - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - deletedAt DateTime @default(now()) - isActive Boolean @default(true) + image FileStorage @relation(fields: [imageId], references: [id]) + imageId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +// ========================================= MENU KEAMANAN ========================================= // +// ========================================= KEAMANAN LINGKUNGAN ========================================= // +model KeamananLingkungan { + id String @id @default(cuid()) + name String @db.Text + deskripsi String @db.Text + image FileStorage? @relation(fields: [imageId], references: [id]) + imageId String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +// ========================================= POLSEK TERDEKAT ========================================= // +model PolsekTerdekat { + id String @id @default(uuid()) + nama String + jarakKeDesa String + alamat String + nomorTelepon String + jamOperasional String + embedMapUrl String + namaTempatMaps String + alamatMaps String + linkPetunjukArah String + layananPolsek LayananPolsek @relation(fields: [layananPolsekId], references: [id]) + layananPolsekId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model LayananPolsek { + id String @id @default(uuid()) + nama String // contoh: "Pelayanan SKCK", "Laporan Kriminal" + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) + PolsekTerdekat PolsekTerdekat[] +} + +// ========================================= KONTAK DARURAT ========================================= // +model KontakDaruratKeamanan { + id String @id @default(cuid()) + nama String // contoh: "Polisi", "Ambulans", "Pemadam Kebakaran" + kontak String // contoh: "081xxxxxxxxxx" + icon String? // opsional, untuk simpan nama icon-nya jika mau + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +// ========================================= PENCEGAHAN KRIMINALITAS ========================================= // +model PencegahanKriminalitas { + id String @id @default(cuid()) + programKeamanan ProgramKeamanan @relation(fields: [programKeamananId], references: [id]) + programKeamananId String + tipsKeamanan TipsKeamanan @relation(fields: [tipsKeamananId], references: [id]) + tipsKeamananId String + videoKeamanan VideoKeamanan @relation(fields: [videoKeamananId], references: [id]) + videoKeamananId String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) +} + +model ProgramKeamanan { + id String @id @default(cuid()) + nama String // contoh: "Ronda Malam" + deskripsi String? // jika mau tambahkan info detail + slug String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + PencegahanKriminalitas PencegahanKriminalitas[] +} + +model TipsKeamanan { + id String @id @default(cuid()) + judul String + konten String + slug String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + PencegahanKriminalitas PencegahanKriminalitas[] +} + +model VideoKeamanan { + id String @id @default(cuid()) + judul String + deskripsi String? + videoUrl String // link youtube atau embed url + slug String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + PencegahanKriminalitas PencegahanKriminalitas[] +} + +// ========================================= LAPORAN PUBLIK ========================================= // +model LaporanPublik { + id String @id @default(cuid()) + judul String + lokasi String + tanggalWaktu DateTime + status StatusLaporan + penanganan PenangananLaporanPublik[] + kronologi String? // Optional, bisa diisi detail kronologi + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model PenangananLaporanPublik { + id String @id @default(cuid()) + laporanId String + deskripsi String + laporan LaporanPublik @relation(fields: [laporanId], references: [id], onDelete: Cascade) +} + +enum StatusLaporan { + SELESAI + PROSES + GAGAL +} + +model Pelapor { + id String @id @default(cuid()) + nama String + alamat String + nomorTelepon String + image FileStorage @relation(fields: [imageId], references: [id]) + imageId String +} +// ========================================= TIPS KEAMANAN ========================================= // +model MenuTipsKeamanan { + id String @id @default(cuid()) + judul String + deskripsi String + image FileStorage? @relation(fields: [imageId], references: [id]) + imageId String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + deletedAt DateTime @default(now()) + isActive Boolean @default(true) } diff --git a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan.ts b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan.ts index e750a7c9..50d1efd6 100644 --- a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan.ts +++ b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan.ts @@ -1,339 +1,306 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import ApiFetch from "@/lib/api-fetch"; import { Prisma } from "@prisma/client"; import { toast } from "react-toastify"; import { proxy } from "valtio"; import { z } from "zod"; -/* Introduction */ -const templateIntroduction = z.object({ - content: z.string().min(3, "Content minimal 3 karakter"), -}) +const templateForm = z.object({ + title: z.string().min(1, "Judul harus diisi"), + content: z.string().min(1, "Content harus diisi"), + introduction: z.object({ + content: z.string().min(1, "Content harus diisi"), + }), + symptom: z.object({ + title: z.string().min(1, "Judul harus diisi"), + content: z.string().min(1, "Content harus diisi"), + }), + prevention: z.object({ + title: z.string().min(1, "Judul harus diisi"), + content: z.string().min(1, "Content harus diisi"), + }), + firstAid: z.object({ + title: z.string().min(1, "Judul harus diisi"), + content: z.string().min(1, "Content harus diisi"), + }), + mythVsFact: z.object({ + title: z.string().min(1, "Judul harus diisi"), + mitos: z.string().min(1, "Mitos harus diisi"), + fakta: z.string().min(1, "Fakta harus diisi"), + }), + doctorSign: z.object({ + content: z.string().min(1, "Content harus diisi"), + }), +}); -type Introduction = Prisma.IntroductionGetPayload<{ - select: { - content: true; - }; -}>; +const defaultForm = { + title: "", + content: "", + introduction: { + content: "", + }, + symptom: { + title: "", + content: "", + }, + prevention: { + title: "", + content: "", + }, + firstAid: { + title: "", + content: "", + }, + mythVsFact: { + title: "", + mitos: "", + fakta: "", + }, + doctorSign: { + content: "", + }, +}; -const introduction = proxy({ +const artikelKesehatanState = proxy({ create: { - form: {} as Introduction, + form: { ...defaultForm }, loading: false, - async create() { - const cek = templateIntroduction.safeParse(introduction.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 { - introduction.create.loading = true; - const res = await ApiFetch.api.kesehatan.introduction["create"].post(introduction.create.form); + this.loading = true; + const payload = { ...this.form }; + + const res = await (ApiFetch.api.kesehatan as any)[ + "artikel-kesehatan" + ].create.post(payload); + if (res.status === 200) { - introduction.findMany.load(); - return toast.success("success create"); + toast.success("Berhasil menambahkan artikel kesehatan"); + this.resetForm(); + await artikelKesehatanState.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 { - introduction.create.loading = false; + this.loading = false; } }, - }, - findMany: { - data: null as - | Prisma.IntroductionGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.kesehatan.introduction["find-many"].get(); - if (res.status === 200) { - introduction.findMany.data = res.data?.data ?? []; - } - } - } -}); -/* ======================================================================= */ - -/* symptom */ -const templateSymptom = z.object({ - title: z.string().min(3, "Title minimal 3 karakter"), - content: z.string().min(3, "Content minimal 3 karakter"), -}) - -type Symptom = Prisma.SymptomGetPayload<{ - select: { - title: true; - content: true; - }; -}>; - -const symptom = proxy({ - create: { - form: {} as Symptom, - loading: false, - async create() { - const cek = templateSymptom.safeParse(symptom.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); - } - try { - symptom.create.loading = true; - const res = await ApiFetch.api.kesehatan.symptom["create"].post(symptom.create.form); - if (res.status === 200) { - symptom.findMany.load(); - return toast.success("success create"); - } - return toast.error("failed create"); - } catch (error) { - console.log((error as Error).message); - } finally { - symptom.create.loading = false; - } + resetForm() { + this.form = { ...defaultForm }; }, }, findMany: { data: null as - | Prisma.SymptomGetPayload<{ omit: { isActive: true } }>[] + | Prisma.ArtikelKesehatanGetPayload<{ + include: { + introduction: true; + symptom: true; + prevention: true; + firstaid: true; + mythvsfact: true; + doctorsign: true; + }; + }>[] | null, + loading: false, async load() { - const res = await ApiFetch.api.kesehatan.symptom["find-many"].get(); - if (res.status === 200) { - symptom.findMany.data = res.data?.data ?? []; + try { + this.loading = true; + const res = await (ApiFetch.api.kesehatan as any)["artikel-kesehatan"][ + "find-many" + ].get(); + + if (res.status === 200) { + this.data = res.data?.data ?? []; + } else { + toast.error("Gagal memuat data artikel kesehatan"); + } + + return res; + } catch (err) { + toast.error("Terjadi error saat load data"); + console.error("LOAD ERROR:", err); + throw err; + } finally { + this.loading = false; + } + }, + }, + findUnique: { + data: null as Prisma.ArtikelKesehatanGetPayload<{ + include: { + introduction: true; + symptom: true; + prevention: true; + firstaid: true; + mythvsfact: true; + doctorsign: true; + }; + }> | null, + loading: false, + async load(id: string) { + const res = await fetch(`/api/kesehatan/artikel-kesehatan/${id}`); + if (res.ok) { + const data = await res.json(); + artikelKesehatanState.findUnique.data = data.data ?? null; + } else { + toast.error("Gagal load data artikel kesehatan"); + } + }, + }, + edit: { + id: "", + form: { ...defaultForm }, + loading: false, + async load(id: string) { + const res = await fetch(`/api/kesehatan/artikel-kesehatan/${id}`); + if (!res.ok) { + toast.error("Gagal load data artikel kesehatan"); + return; + } + + const result = await res.json(); + const data = result.data; + + artikelKesehatanState.edit.id = data.id; + artikelKesehatanState.edit.form = { + title: data.title, + content: data.content, + introduction: { + content: data.introduction.content, + }, + symptom: { + title: data.symptom.title, + content: data.symptom.content, + }, + prevention: { + title: data.prevention.title, + content: data.prevention.content, + }, + firstAid: { + title: data.firstaid.title, + content: data.firstaid.content, + }, + mythVsFact: { + title: data.mythvsfact.title, + mitos: data.mythvsfact.mitos, + fakta: data.mythvsfact.fakta, + }, + doctorSign: { + content: data.doctorsign.content, + }, + }; + }, + async submit() { + const cek = templateForm.safeParse(artikelKesehatanState.edit.form); + if (!cek.success) { + const errMsg = cek.error.issues + .map((v) => `${v.path.join(".")}: ${v.message}`) + .join("\n"); + toast.error(errMsg); + return null; + } + + try { + artikelKesehatanState.edit.loading = true; + const payload = { + title: artikelKesehatanState.edit.form.title, + content: artikelKesehatanState.edit.form.content, + introduction: { + content: artikelKesehatanState.edit.form.introduction.content, + }, + symptom: { + title: artikelKesehatanState.edit.form.symptom.title, + content: artikelKesehatanState.edit.form.symptom.content, + }, + prevention: { + title: artikelKesehatanState.edit.form.prevention.title, + content: artikelKesehatanState.edit.form.prevention.content, + }, + firstAid: { + title: artikelKesehatanState.edit.form.firstAid.title, + content: artikelKesehatanState.edit.form.firstAid.content, + }, + mythVsFact: { + title: artikelKesehatanState.edit.form.mythVsFact.title, + mitos: artikelKesehatanState.edit.form.mythVsFact.mitos, + fakta: artikelKesehatanState.edit.form.mythVsFact.fakta, + }, + doctorSign: { + content: artikelKesehatanState.edit.form.doctorSign.content, + }, + }; + + const res = await fetch( + `/api/kesehatan/artikel-kesehatan/${artikelKesehatanState.edit.id}`, + { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(payload), + } + ); + + if (!res.ok) { + const error = await res.json(); + throw new Error(error.message || "Update gagal"); + } + + toast.success("Berhasil update artikel kesehatan"); + await artikelKesehatanState.findMany.load(); + return true; + } catch (err) { + toast.error( + err instanceof Error ? err.message : "Terjadi kesalahan saat update" + ); + return false; + } finally { + artikelKesehatanState.edit.loading = false; + } + }, + resetForm() { + artikelKesehatanState.edit.id = ""; + artikelKesehatanState.edit.form = { ...defaultForm }; + }, + }, + delete: { + loading: false, + async byId(id: string) { + try { + artikelKesehatanState.delete.loading = true; + const res = await fetch( + `/api/kesehatan/artikel-kesehatan/del/${id}`, + { + method: "DELETE", + } + ); + + const result = await res.json(); + if (res.ok && result.success) { + toast.success("Artikel kesehatan berhasil dihapus"); + await artikelKesehatanState.findMany.load(); + } else { + toast.error(result.message || "Gagal menghapus"); + } + } catch { + toast.error("Terjadi kesalahan saat menghapus"); + } finally { + artikelKesehatanState.delete.loading = false; } }, }, }); -/* ======================================================================= */ -/* Prevention */ -const templatePrevention = z.object({ - title: z.string().min(3, "Title minimal 3 karakter"), - content: z.string().min(3, "Content minimal 3 karakter"), -}) - -type Prevention = Prisma.PreventionGetPayload<{ - select: { - title: true; - content: true; - }; -}>; - -const prevention = proxy({ - create: { - form: {} as Prevention, - loading: false, - async create() { - const cek = templatePrevention.safeParse(prevention.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); - } - try { - prevention.create.loading = true; - const res = await ApiFetch.api.kesehatan.prevention["create"].post(prevention.create.form); - if (res.status === 200) { - prevention.findMany.load(); - return toast.success("success create"); - } - return toast.error("failed create"); - } catch (error) { - console.log((error as Error).message); - } finally { - prevention.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.PreventionGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.kesehatan.prevention["find-many"].get(); - if (res.status === 200) { - prevention.findMany.data = res.data?.data ?? []; - } - }, - }, -}); -/* ======================================================================= */ - -/* First Aid */ -const templateFirstAid = z.object({ - title: z.string().min(3, "Title minimal 3 karakter"), - content: z.string().min(3, "Content minimal 3 karakter"), -}) - -type FirstAid = Prisma.FirstAidGetPayload<{ - select: { - title: true; - content: true; - }; -}>; - -const firstAid = proxy({ - create: { - form: {} as FirstAid, - loading: false, - async create() { - const cek = templateFirstAid.safeParse(firstAid.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); - } - try { - firstAid.create.loading = true; - const res = await ApiFetch.api.kesehatan.firstaid["create"].post(firstAid.create.form); - if (res.status === 200) { - firstAid.findMany.load(); - return toast.success("success create"); - } - return toast.error("failed create"); - } catch (error) { - console.log((error as Error).message); - } finally { - firstAid.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.FirstAidGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.kesehatan.firstaid["find-many"].get(); - if (res.status === 200) { - firstAid.findMany.data = res.data?.data ?? []; - } - }, - }, -}) -/* ======================================================================= */ - -/* Myth vs Fact */ -const templateMythFact = z.object({ - title: z.string().min(3, "Title minimal 3 karakter"), - mitos: z.string().min(3, "Mitos minimal 3 karakter"), - fakta: z.string().min(3, "Fakta minimal 3 karakter"), -}) - -type MythFact = Prisma.MythVsFactGetPayload<{ - select: { - title: true; - mitos: true; - fakta: true; - }; -}>; - -const mythFact = proxy({ - create: { - form: {} as MythFact, - loading: false, - async create() { - const cek = templateMythFact.safeParse(mythFact.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); - } - try { - mythFact.create.loading = true; - const res = await ApiFetch.api.kesehatan.mythvsfact["create"].post(mythFact.create.form); - if (res.status === 200) { - mythFact.findMany.load(); - return toast.success("success create"); - } - return toast.error("failed create"); - } catch (error) { - console.log((error as Error).message); - } finally { - mythFact.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.MythVsFactGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.kesehatan.mythvsfact["find-many"].get(); - if (res.status === 200) { - mythFact.findMany.data = res.data?.data ?? []; - } - }, - }, -}) -/* ======================================================================= */ - -/* Doctor Sign */ -const templateDoctorSign = z.object({ - content: z.string().min(3, "Content minimal 3 karakter"), -}) - -type DoctorSign = Prisma.DoctorSignGetPayload<{ - select: { - content: true - } -}> - -const doctorSign = proxy({ - create: { - form: {} as DoctorSign, - loading: false, - async create() { - const cek = templateDoctorSign.safeParse(doctorSign.create.form); - if (!cek.success) { - const err = `[${cek.error.issues - .map((v) => `${v.path.join(".")}`) - .join("\n")}] required`; - return toast.error(err); - } - try { - doctorSign.create.loading = true; - const res = await ApiFetch.api.kesehatan.doctor_sign["create"].post(doctorSign.create.form); - if (res.status === 200) { - doctorSign.findMany.load(); - return toast.success("success create"); - } - return toast.error("failed create"); - } catch (error) { - console.log((error as Error).message); - } finally { - doctorSign.create.loading = false; - } - }, - }, - findMany: { - data: null as - | Prisma.DoctorSignGetPayload<{ omit: { isActive: true } }>[] - | null, - async load() { - const res = await ApiFetch.api.kesehatan.doctor_sign["find-many"].get(); - if (res.status === 200) { - doctorSign.findMany.data = res.data?.data ?? []; - } - }, - }, -}) - -/* ======================================================================= */ - -const stateArtikelKesehatan = proxy({ - introduction, - symptom, - prevention, - firstAid, - mythFact, - doctorSign -}) - -export default stateArtikelKesehatan \ No newline at end of file +export default artikelKesehatanState; diff --git a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan.ts b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan.ts index 8873aab3..2244b3ab 100644 --- a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan.ts +++ b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan.ts @@ -39,15 +39,15 @@ const grafikkepuasan = proxy({ const res = await ApiFetch.api.kesehatan.grafikkepuasan["create"].post(grafikkepuasan.create.form); if (res.status === 200) { - const uuid = res.data?.data?.uuid; - if (uuid) { + const id = res.data?.data?.id; + if (id) { toast.success("Success create"); grafikkepuasan.create.form = { label: "", jumlah: "", }; grafikkepuasan.findMany.load(); - return uuid; + return id; } } toast.error("failed create"); @@ -77,9 +77,9 @@ const grafikkepuasan = proxy({ data: null as Prisma.GrafikKepuasanGetPayload<{ omit: { isActive: true } }> | null, - async load(uuid: string) { + async load(id: string) { try { - const res = await fetch(`/api/kesehatan/grafikkepuasan/${uuid}`); + const res = await fetch(`/api/kesehatan/grafikkepuasan/${id}`); if (res.ok) { const data = await res.json(); grafikkepuasan.findUnique.data = data.data ?? null; @@ -94,14 +94,14 @@ const grafikkepuasan = proxy({ }, }, update: { - uuid: "", + id: "", form: {...defaultForm}, loading: false, async byId() { }, async submit() { - const uuid = this.uuid; - if (!uuid) { + const id = this.id; + if (!id) { toast.warn("ID tidak valid"); return null; } @@ -114,7 +114,7 @@ const grafikkepuasan = proxy({ } try { this.loading = true; - const response = await fetch(`/api/kesehatan/grafikkepuasan/${uuid}`, { + const response = await fetch(`/api/kesehatan/grafikkepuasan/${id}`, { method: "PUT", headers: { "Content-Type": "application/json", @@ -143,13 +143,14 @@ const grafikkepuasan = proxy({ }, delete: { loading: false, - async byId(uuid: string) { - if (!uuid) { + async byId(id: string) { + if (!id) { return toast.warn("ID tidak valid"); } try { grafikkepuasan.delete.loading = true; - const response = await fetch(`/api/kesehatan/grafikkepuasan/del/${uuid}`, { + + const response = await fetch(`/api/kesehatan/grafikkepuasan/del/${id}`, { method: "DELETE", headers: { "Content-Type": "application/json", 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)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts index 38bf1412..3444f3b5 100644 --- a/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts +++ b/src/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/persentaseKelahiran.ts @@ -45,12 +45,12 @@ const persentasekelahiran = proxy({ ); if (res.status === 200) { - const uuid = res.data?.data?.uuid; - if (uuid) { + const id = res.data?.data?.id; + if (id) { toast.success("Success create"); persentasekelahiran.create.form = { ...defaultForm }; persentasekelahiran.findMany.load(); - return uuid; + return id; } } toast.error("failed create"); @@ -79,9 +79,9 @@ const persentasekelahiran = proxy({ data: null as Prisma.DataKematian_KelahiranGetPayload<{ omit: { isActive: true }; }> | null, - async load(uuid: string) { + async load(id: string) { try { - const res = await fetch(`/api/kesehatan/persentasekelahiran/${uuid}`); + const res = await fetch(`/api/kesehatan/persentasekelahiran/${id}`); if (res.ok) { const data = await res.json(); persentasekelahiran.findUnique.data = data.data ?? null; @@ -97,13 +97,13 @@ const persentasekelahiran = proxy({ }, update: { - uuid: "", + id: "", form: { ...defaultForm }, loading: false, async submit() { - const uuid = this.uuid; - if (!uuid) { - toast.warn("UUID tidak valid"); + const id = this.id; + if (!id) { + toast.warn("ID tidak valid"); return null; } @@ -125,7 +125,7 @@ update: { try { this.loading = true; - const res = await fetch(`/api/kesehatan/persentasekelahiran/${uuid}`, { + const res = await fetch(`/api/kesehatan/persentasekelahiran/${id}`, { method: "PUT", headers: { "Content-Type": "application/json", @@ -155,13 +155,13 @@ update: { delete: { loading: false, - async byId(uuid: string) { - if (!uuid) return toast.warn("UUID tidak valid"); + async byId(id: string) { + if (!id) return toast.warn("ID tidak valid"); try { persentasekelahiran.delete.loading = true; - const response = await fetch(`/api/kesehatan/persentasekelahiran/del/${uuid}`, { + const response = await fetch(`/api/kesehatan/persentasekelahiran/del/${id}`, { method: "DELETE", headers: { "Content-Type": "application/json", @@ -175,7 +175,7 @@ update: { } else { toast.error(result?.message || "Gagal menghapus persentase kelahiran"); } - } catch (error) { + } catch (error) { console.error("Gagal delete:", error); toast.error("Terjadi kesalahan saat menghapus persentase kelahiran"); } finally { diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx new file mode 100644 index 00000000..a3be391c --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/edit/page.tsx @@ -0,0 +1,374 @@ +/* eslint-disable react-hooks/exhaustive-deps */ +'use client' + +import EditEditor from '@/app/admin/(dashboard)/_com/editEditor'; +import artikelKesehatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; +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 ArtikelKesehatanFormBase { + title: string; + content: string; + introduction: { + content: string; + }; + symptom: { + title: string; + content: string; + }; + prevention: { + title: string; + content: string; + }; + firstAid: { + title: string; + content: string; + }; + mythVsFact: { + title: string; + mitos: string; + fakta: string; + }; + doctorSign: { + content: string; + }; +} + +function EditArtikelKesehatan() { + const stateArtikelKesehatan = useProxy(artikelKesehatanState); + const router = useRouter(); + const params = useParams(); + + const [formData, setFormData] = useState({ + title: stateArtikelKesehatan.edit.form.title || '', + content: stateArtikelKesehatan.edit.form.content || '', + introduction: { + content: stateArtikelKesehatan.edit.form.introduction?.content || '', + }, + symptom: { + title: stateArtikelKesehatan.edit.form.symptom?.title || '', + content: stateArtikelKesehatan.edit.form.symptom?.content || '', + }, + prevention: { + title: stateArtikelKesehatan.edit.form.prevention?.title || '', + content: stateArtikelKesehatan.edit.form.prevention?.content || '', + }, + firstAid: { + title: stateArtikelKesehatan.edit.form.firstAid?.title || '', + content: stateArtikelKesehatan.edit.form.firstAid?.content || '', + }, + mythVsFact: { + title: stateArtikelKesehatan.edit.form.mythVsFact?.title || '', + mitos: stateArtikelKesehatan.edit.form.mythVsFact?.mitos || '', + fakta: stateArtikelKesehatan.edit.form.mythVsFact?.fakta || '', + }, + doctorSign: { + content: stateArtikelKesehatan.edit.form.doctorSign?.content || '', + }, + }); + + useEffect(() => { + const loadArtikelKesehatan = async () => { + const id = params?.id as string; + if (!id) return; + + try { + await stateArtikelKesehatan.edit.load(id); + const { form } = stateArtikelKesehatan.edit; + if (form) { + setFormData({ + title: form.title, + content: form.content, + introduction: { + content: form.introduction?.content || '', + }, + symptom: { + title: form.symptom?.title || '', + content: form.symptom?.content || '', + }, + prevention: { + title: form.prevention?.title || '', + content: form.prevention?.content || '', + }, + firstAid: { + title: form.firstAid?.title || '', + content: form.firstAid?.content || '', + }, + mythVsFact: { + title: form.mythVsFact?.title || '', + mitos: form.mythVsFact?.mitos || '', + fakta: form.mythVsFact?.fakta || '', + }, + doctorSign: { + content: form.doctorSign?.content || '', + }, + }); + } + } catch (error) { + console.error("Error loading artikel kesehatan:", error); + toast.error("Gagal memuat data artikel kesehatan"); + } + }; + loadArtikelKesehatan(); + }, [params?.id]); + + const handleSubmit = async () => { + try { + stateArtikelKesehatan.edit.form = { + ...stateArtikelKesehatan.edit.form, + title: formData.title, + content: formData.content, + introduction: { + content: formData.introduction.content, + }, + symptom: { + title: formData.symptom.title, + content: formData.symptom.content, + }, + prevention: { + title: formData.prevention.title, + content: formData.prevention.content, + }, + firstAid: { + title: formData.firstAid.title, + content: formData.firstAid.content, + }, + mythVsFact: { + title: formData.mythVsFact.title, + mitos: formData.mythVsFact.mitos, + fakta: formData.mythVsFact.fakta, + }, + doctorSign: { + content: formData.doctorSign.content, + }, + }; + const success = await stateArtikelKesehatan.edit.submit(); + if (success) { + toast.success("Artikel kesehatan berhasil diperbarui!"); + router.push("/admin/kesehatan/data-kesehatan-warga/artikel_kesehatan"); + } + } catch (error) { + console.error("Error updating artikel kesehatan:", error); + toast.error(error instanceof Error ? error.message : "Gagal memperbarui data artikel kesehatan"); + } + }; + return ( + + + + + + + Edit Artikel Kesehatan + Judul} + placeholder="masukkan judul" + value={formData.title} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + title: e.target.value + })); + }} + /> + Deskripsi} + placeholder="masukkan deskripsi" + value={formData.content} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + content: e.target.value + })); + }} + /> + Pendahuluan} + placeholder="masukkan pendahuluan" + value={formData.introduction.content} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + introduction: { + ...prev.introduction, + content: e.target.value + } + })); + }} + /> + + Gejala + + Judul} + placeholder="masukkan judul gejala penyakit" + value={formData.symptom.title} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + symptom: { + ...prev.symptom, + title: e.target.value + } + })); + }} + /> + + Deskripsi Gejala + { + setFormData(prev => ({ + ...prev, + symptom: { + ...prev.symptom, + content: e + } + })); + }} + /> + + + + + + Pencegahan + Judul} + placeholder="masukkan judul" + value={formData.prevention.title} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + prevention: { + ...prev.prevention, + title: e.target.value + } + })); + }} + /> + { + setFormData(prev => ({ + ...prev, + prevention: { + ...prev.prevention, + content: e + } + })); + }} + /> + + + Pertolongan Pertama + Judul} + placeholder="masukkan judul" + value={formData.firstAid.title} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + firstAid: { + ...prev.firstAid, + title: e.target.value + } + })); + }} + /> + { + setFormData(prev => ({ + ...prev, + firstAid: { + ...prev.firstAid, + content: e + } + })); + }} + /> + + + Mitos dan Fakta + Judul} + placeholder="masukkan judul" + value={formData.mythVsFact.title} + onChange={(e) => { + setFormData(prev => ({ + ...prev, + mythVsFact: { + ...prev.mythVsFact, + title: e.target.value + } + })); + }} + /> + + + Mitos + + { + setFormData(prev => ({ + ...prev, + mythVsFact: { + ...prev.mythVsFact, + mitos: e + } + })); + }} + /> + + + + Fakta + + { + setFormData(prev => ({ + ...prev, + mythVsFact: { + ...prev.mythVsFact, + fakta: e + } + })); + }} + /> + + + + Kapan Harus Ke Dokter + { + setFormData(prev => ({ + ...prev, + doctorSign: { + ...prev.doctorSign, + content: e + } + })); + }} + /> + + + + + + ); +} + +export default EditArtikelKesehatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx new file mode 100644 index 00000000..d5202321 --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/[id]/page.tsx @@ -0,0 +1,143 @@ +'use client' +import { ModalKonfirmasiHapus } from '@/app/admin/(dashboard)/_com/modalKonfirmasiHapus'; +import artikelKesehatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; +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 DetailArtikelKesehatan() { + const params = useParams() + const router = useRouter(); + const stateArtikelKesehatan = useProxy(artikelKesehatanState) + const [modalHapus, setModalHapus] = useState(false); + const [selectedId, setSelectedId] = useState(null) + + useShallowEffect(() => { + stateArtikelKesehatan.findUnique.load(params?.id as string) + }, []) + + const handleHapus = () => { + if (selectedId) { + stateArtikelKesehatan.delete.byId(selectedId) + setModalHapus(false) + setSelectedId(null) + router.push("/admin/kesehatan/data-kesehatan-warga/artikel_kesehatan") + } + } + + if (!stateArtikelKesehatan.findUnique.data) { + return ( + + + + ) + } + + + return ( + + + + + + + Detail Artikel Kesehatan + {stateArtikelKesehatan.findUnique.data ? ( + + + + Judul + {stateArtikelKesehatan.findUnique.data.title} + + + Deskripsi + + + + Pendahuluan + + + + + Gejala + Judul Gejala + {stateArtikelKesehatan.findUnique.data.symptom.title} + Deskripsi Gejala + + + + + + Pencegahan + Judul Pencegahan + {stateArtikelKesehatan.findUnique.data.prevention.title} + Deskripsi Pencegahan + + + + + + Pertolongan Pertama + Judul Pertolongan Pertama + {stateArtikelKesehatan.findUnique.data.firstaid.title} + Deskripsi Pertolongan Pertama + + + + + + Mitos dan Fakta + Judul Mitos dan Fakta + {stateArtikelKesehatan.findUnique.data.mythvsfact.title} + Deskripsi Mitos + + Deskripsi Fakta + + + + + + Kapan Harus ke Dokter + Deskripsi Kapan Harus ke Dokter + + + + + + + + + + + + ) : null} + + + + {/* Modal Hapus */} + setModalHapus(false)} + onConfirm={handleHapus} + text="Apakah anda yakin ingin menghapus artikel kesehatan ini?" + /> + + ); +} + +export default DetailArtikelKesehatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx new file mode 100644 index 00000000..3aeab04f --- /dev/null +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/create/page.tsx @@ -0,0 +1,203 @@ +'use client' +import CreateEditor from '@/app/admin/(dashboard)/_com/createEditor'; +import artikelKesehatanState from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; +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 CreateArtikelKesehatan() { + const stateArtikelKesehatan = useProxy(artikelKesehatanState) + const router = useRouter(); + + + const resetForm = () => { + stateArtikelKesehatan.create.form = { + title: "", + content: "", + introduction: { + content: "", + }, + symptom: { + title: "", + content: "", + }, + prevention: { + title: "", + content: "", + }, + firstAid: { + title: "", + content: "", + }, + mythVsFact: { + title: "", + mitos: "", + fakta: "", + }, + doctorSign: { + content: "" + } + }; + }; + + + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + await stateArtikelKesehatan.create.submit(); + + toast.success("Data berhasil disimpan"); + resetForm(); + // After successful submission, redirect to the list page + router.push('/admin/kesehatan/data-kesehatan-warga/artikel_kesehatan'); + } + + return ( + + + + + + + + Create Artikel Kesehatan + Judul} + placeholder="masukkan judul" + value={stateArtikelKesehatan.create.form.title} + onChange={(e) => { + stateArtikelKesehatan.create.form.title = e.target.value; + }} + /> + Deskripsi} + placeholder="masukkan deskripsi" + value={stateArtikelKesehatan.create.form.content} + onChange={(e) => { + stateArtikelKesehatan.create.form.content = e.target.value; + }} + /> + Pendahuluan} + placeholder="masukkan pendahuluan" + value={stateArtikelKesehatan.create.form.introduction.content} + onChange={(e) => { + stateArtikelKesehatan.create.form.introduction.content = e.target.value; + }} + /> + + Gejala + + Judul} + placeholder="masukkan judul gejala penyakit" + value={stateArtikelKesehatan.create.form.symptom.title} + onChange={(e) => { + stateArtikelKesehatan.create.form.symptom.title = e.target.value; + }} + /> + + Deskripsi Gejala + { + stateArtikelKesehatan.create.form.symptom.content = e; + }} + /> + + + + + + Pencegahan + Judul} + placeholder="masukkan judul" + value={stateArtikelKesehatan.create.form.prevention.title} + onChange={(e) => { + stateArtikelKesehatan.create.form.prevention.title = e.target.value; + }} + /> + { + stateArtikelKesehatan.create.form.prevention.content = e; + }} + /> + + + Pertolongan Pertama + Judul} + placeholder="masukkan judul" + value={stateArtikelKesehatan.create.form.firstAid.title} + onChange={(e) => { + stateArtikelKesehatan.create.form.firstAid.title = e.target.value; + }} + /> + { + stateArtikelKesehatan.create.form.firstAid.content = e; + }} + /> + + + Mitos dan Fakta + Judul} + placeholder="masukkan judul" + value={stateArtikelKesehatan.create.form.mythVsFact.title} + onChange={(e) => { + stateArtikelKesehatan.create.form.mythVsFact.title = e.target.value; + }} + /> + + + Mitos + + { + stateArtikelKesehatan.create.form.mythVsFact.mitos = e; + }} + /> + + + + Fakta + + { + stateArtikelKesehatan.create.form.mythVsFact.fakta = e; + }} + /> + + + + Kapan Harus Ke Dokter + { + stateArtikelKesehatan.create.form.doctorSign.content = e; + }} + /> + + + + + + + ); +} + +export default CreateArtikelKesehatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/doctor_sign/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/doctor_sign/page.tsx deleted file mode 100644 index 6f09affc..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/doctor_sign/page.tsx +++ /dev/null @@ -1,25 +0,0 @@ -'use client' -import colors from '@/con/colors'; -import { Box, Paper, Text } from '@mantine/core'; -import { KesehatanEditor } from '../../_com/kesehatanEditor'; -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import { useProxy } from 'valtio/utils'; - -function DoctorSignUI() { - const doctorSign = useProxy(stateArtikelKesehatan.doctorSign) - return ( - - - Kapan Harus ke Dokter - { - doctorSign.create.form.content = val - }} - /> - - - ); -} - -export default DoctorSignUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/first_aid/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/first_aid/page.tsx deleted file mode 100644 index 71a082a5..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/first_aid/page.tsx +++ /dev/null @@ -1,33 +0,0 @@ -'use client' -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import colors from '@/con/colors'; -import { Box, Paper, Stack, Text, TextInput } from '@mantine/core'; -import { useProxy } from 'valtio/utils'; -import { KesehatanEditor } from '../../_com/kesehatanEditor'; - -function FirstAidUI() { - const firstAidState = useProxy(stateArtikelKesehatan.firstAid) - return ( - - - - Judul Pertolongan Pertama} - placeholder="Masukkan judul" - onChange={(val) => { - firstAidState.create.form.title = val.target.value - }} - /> - { - firstAidState.create.form.content = val - }} - /> - - - - ); -} - -export default FirstAidUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/introduction/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/introduction/page.tsx deleted file mode 100644 index 95eefb74..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/introduction/page.tsx +++ /dev/null @@ -1,28 +0,0 @@ -'use client' -import { Box, Paper, Stack, Text } from '@mantine/core'; -import React from 'react'; -import { useProxy } from 'valtio/utils'; -import colors from '@/con/colors'; -import { KesehatanEditor } from '../../_com/kesehatanEditor'; -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; - -function IntoductionUI() { - const introduction = useProxy(stateArtikelKesehatan.introduction) - return ( - - - - Pendahuluan - { - introduction.create.form.content = val; - }} - /> - - - - ); -} - -export default IntoductionUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/mythVsfact/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/mythVsfact/page.tsx deleted file mode 100644 index 6a22d179..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/mythVsfact/page.tsx +++ /dev/null @@ -1,40 +0,0 @@ -'use client' -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import colors from '@/con/colors'; -import { Box, Paper, Stack, Text, TextInput } from '@mantine/core'; -import { useProxy } from 'valtio/utils'; - -function MythFactUI() { - const mythFact = useProxy(stateArtikelKesehatan.mythFact) - return ( - - - - Judul Pertolongan Pertama Penyakit} - placeholder="Masukkan judul" - onChange={(val) => { - mythFact.create.form.title = val.target.value - }} - /> - Mitos} - placeholder="Masukkan mitos" - onChange={(val) => { - mythFact.create.form.mitos = val.target.value - }} - /> - Fakta} - placeholder="Masukkan fakta" - onChange={(val) => { - mythFact.create.form.fakta = val.target.value - }} - /> - - - - ); -} - -export default MythFactUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx index fb964e67..5946a042 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/page.tsx @@ -1,172 +1,79 @@ 'use client' -import { Box, Button, Center, Group, Paper, SimpleGrid, Skeleton, Stack, Table, TableTbody, TableTd, TableTh, TableThead, TableTr, Text, Title } from '@mantine/core'; -import IntoductionUI from './introduction/page'; -import SymptomUI from './symptom/page'; -import PreventionUI from './prevention/page'; -import MythFactUI from './mythVsfact/page'; -import DoctorSignUI from './doctor_sign/page'; -import { useProxy } from 'valtio/utils'; -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import FirstAidUI from './first_aid/page'; -import { useShallowEffect } from '@mantine/hooks'; 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 artikelKesehatanState from '../../../_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; + function ArtikelKesehatan() { - const state = useProxy(stateArtikelKesehatan) - const submitAllForms = () => { - if (state.introduction.create.form.content) { - state.introduction.create.create() - } - if (state.symptom.create.form.title && state.symptom.create.form.content) { - state.symptom.create.create() - } - if (state.prevention.create.form.title && state.prevention.create.form.content) { - state.prevention.create.create() - } - if (state.firstAid.create.form.title && state.firstAid.create.form.content) { - state.firstAid.create.create() - } - if (state.mythFact.create.form.title && state.mythFact.create.form.mitos && state.mythFact.create.form.fakta) { - state.mythFact.create.create() - } - if (state.doctorSign.create.form.content) { - state.doctorSign.create.create() - } - } return ( - - - - - Artikel Kesehatan - - - - - - - - - - - - - - - Data Artikel Kesehatan - - - - - + + } + /> + + ); } -function AllList() { - const listState = useProxy(stateArtikelKesehatan) +function ListArtikelKesehatan() { + const stateArtikelKesehatan = useProxy(artikelKesehatanState) + const router = useRouter(); + useShallowEffect(() => { - listState.introduction.findMany.load(); - listState.symptom.findMany.load(); - listState.prevention.findMany.load(); - listState.firstAid.findMany.load(); - listState.mythFact.findMany.load(); - listState.doctorSign.findMany.load(); + stateArtikelKesehatan.findMany.load() }, []) - if (!listState.introduction.findMany.data - || !listState.symptom.findMany.data - || !listState.prevention.findMany.data - || !listState.firstAid.findMany.data - || !listState.mythFact.findMany.data - || !listState.doctorSign.findMany.data - ) return - {Array.from({ length: 10 }).map((v, k) => )} - - return - {/* Introduction */} + if (!stateArtikelKesehatan.findMany.data) { + return ( + + + + ) + } + return ( + - Pendahuluan - {listState.introduction.findMany.data?.map((item) => ( - - - - ))} - - {/* Symptom */} - - Gejala Penyakit - {listState.symptom.findMany.data?.map((item) => ( - - {item.title} - - - ))} - - {/* Prevention */} - - Pencegahan Penyakit - {listState.prevention.findMany.data?.map((item) => ( - - {item.title} - - - ))} - - {/* First Aid */} - - Pertolongan Pertama - {listState.firstAid.findMany.data?.map((item) => ( - - {item.title} - - - ))} - - {/* Myth Fact */} - - Mitos vs Fakta - {listState.mythFact.findMany.data?.map((item) => ( - - {item.title} - - - - -
Mitos
-
- -
Fakta
-
+ + + +
+ + + Judul + Content + Detail - - - {item.mitos} - {item.fakta} - + + {stateArtikelKesehatan.findMany.data?.map((item) => ( + + {item.title} + {item.content} + + + + + ))}
- ))} +
- {/* Doctor Sign */} - - Kapan Harus Ke Dokter? - {listState.doctorSign.findMany.data?.map((item) => ( - - - - ))} - - + + ) } -export default ArtikelKesehatan; \ No newline at end of file +export default ArtikelKesehatan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/prevention/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/prevention/page.tsx deleted file mode 100644 index 5dd3533d..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/prevention/page.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client' -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import colors from '@/con/colors'; -import { Box, Paper, Stack, Text, TextInput } from '@mantine/core'; -import { useProxy } from 'valtio/utils'; -import { KesehatanEditor } from '../../_com/kesehatanEditor'; - -function PreventionUI() { - const preventionState = useProxy(stateArtikelKesehatan.prevention) - return ( - - - - Judul Pencegahan Penyakit} - placeholder="Masukkan judul" - onChange={(val) => { - preventionState.create.form.title = val.target.value - }} - /> - { - preventionState.create.form.content = val - }} - /> - - - - ); -} - -export default PreventionUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/symptom/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/symptom/page.tsx deleted file mode 100644 index d5f3f302..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/artikel_kesehatan/symptom/page.tsx +++ /dev/null @@ -1,34 +0,0 @@ -'use client' -import stateArtikelKesehatan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/artikelKesehatan'; -import colors from '@/con/colors'; -import { Box, Paper, Stack, Text, TextInput } from '@mantine/core'; -import { useProxy } from 'valtio/utils'; -import { KesehatanEditor } from '../../_com/kesehatanEditor'; - -function SymptomUI() { - const symptomState = useProxy(stateArtikelKesehatan.symptom) - return ( - - - - Judul Gejala Penyakit} - placeholder='masukkan judul' - onChange={(val) => { - symptomState.create.form.title = val.target.value - }} - /> - { - symptomState.create.form.content = val - }} - /> - - - - ); -} - -export default SymptomUI; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[uuid]/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[uuid]/page.tsx deleted file mode 100644 index 39133915..00000000 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/[uuid]/page.tsx +++ /dev/null @@ -1,80 +0,0 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -'use client' - -import grafikkepuasan from '@/app/admin/(dashboard)/_state/kesehatan/data_kesehatan_warga/grafikKepuasan'; -import colors from '@/con/colors'; -import { Box, Button, Paper, Stack, TextInput, Title } from '@mantine/core'; -import { IconArrowBack } from '@tabler/icons-react'; -import { useParams, useRouter } from 'next/navigation'; -import { useEffect } from 'react'; -import { useProxy } from 'valtio/utils'; - -function EditGrafikHasilKepuasan() { - const router = useRouter() - const params = useParams() as { uuid: string } - const stateGrafikKepuasan = useProxy(grafikkepuasan) - - const uuid = params.uuid - - // Load data saat komponen mount - useEffect(() => { - if (uuid) { - stateGrafikKepuasan.findUnique.load(uuid).then(() => { - const data = stateGrafikKepuasan.findUnique.data - if (data) { - stateGrafikKepuasan.update.form = { - label: data.label || '', - jumlah: data.jumlah || '', - } - } - }) - } - }, [uuid]) - - const handleSubmit = async () => { - // Set the ID before submitting - stateGrafikKepuasan.update.uuid = uuid; - await stateGrafikKepuasan.update.submit(); - router.push('/admin/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan') - } -return ( - - - - - - - Edit Grafik Hasil Kepuasan - { - stateGrafikKepuasan.update.form.label = val.currentTarget.value; - }} - /> - { - stateGrafikKepuasan.update.form.jumlah = val.currentTarget.value; - }} - /> - - - - - ) -} - -export default EditGrafikHasilKepuasan; diff --git a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx index 7ef36104..935f1d32 100644 --- a/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx +++ b/src/app/admin/(dashboard)/kesehatan/data-kesehatan-warga/grafik_hasil_kepuasan/page.tsx @@ -45,7 +45,7 @@ function GrafikHasilKepuasanMasyarakat() { setMounted(true); if (stateGrafikKepuasan.findMany.data) { setChartData(stateGrafikKepuasan.findMany.data.map((item) => ({ - id: item.uuid, + id: item.id, label: item.label, jumlah: Number(item.jumlah), }))); @@ -82,11 +82,11 @@ function GrafikHasilKepuasanMasyarakat() { {stateGrafikKepuasan.findMany.data?.map((item) => ( - + {item.label} {item.jumlah} - @@ -95,7 +95,7 @@ function GrafikHasilKepuasanMasyarakat() { color='red' disabled={stateGrafikKepuasan.delete.loading} onClick={() => { - setSelectedId(item.uuid) + setSelectedId(item.id) setModalHapus(true) }}> 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 - }} - /> -