From a8d3a3a9ff197915ab9eff3b761f55a7a1418483 Mon Sep 17 00:00:00 2001 From: amaliadwiy Date: Tue, 20 Jan 2026 17:15:16 +0800 Subject: [PATCH] fix: pelayanan surat Deskripsi: - mandatory pada form tambah pelayanan surat - mandatory pada form update pelayanan surat No Issues --- src/lib/categoryPelayananSurat.ts | 461 ++++++++------------- src/pages/darmasaba/surat.tsx | 61 ++- src/pages/darmasaba/update_data_surat.tsx | 81 +++- src/server/routes/pelayanan_surat_route.ts | 7 +- 4 files changed, 293 insertions(+), 317 deletions(-) diff --git a/src/lib/categoryPelayananSurat.ts b/src/lib/categoryPelayananSurat.ts index 36ad709..f014c6b 100644 --- a/src/lib/categoryPelayananSurat.ts +++ b/src/lib/categoryPelayananSurat.ts @@ -8,472 +8,377 @@ export const categoryPelayananSurat = [ { key: "pengantar_kelian", name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas di Wilayah Masing-masing" + desc: "Surat Pengantar Kelian Banjar Dinas di Wilayah Masing-masing", + required: true }, { key: "ktp_kk", name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" + desc: "Fotokopi KTP atau Kartu Keluarga", + required: true }, { key: "dokumen_beda", name: "Dokumen Pendukung", - desc: "Fotokopi dokumen yang terdapat perbedaan biodata (ijazah, sertifikat, dll)" + desc: "Fotokopi dokumen yang terdapat perbedaan biodata (ijazah, sertifikat, dll)", + required: true } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, - { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, + { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true }, + { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", desc: "Jenis kelamin pemohon", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat lengkap tempat tinggal", type: "text" }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" }, + { key: "alamat", name: "Alamat", desc: "Alamat lengkap tempat tinggal", type: "text", required: true }, + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true }, { key: "dokumen", name: "Nama Dokumen", - desc: "Jenis dokumen yang mengalami perbedaan biodata (cth : ijazah, sertifikat, dll)", - type: "text" + desc: "Jenis dokumen yang mengalami perbedaan biodata", + type: "text", + required: true }, { key: "data_dokumen", name: "Data Dokumen", - desc: "Data dokumen yg berbeda (cth : nama, tempat lahir, tanggal lahir, jenis kelamin, alamat, pekerjaan)", - type: "text" + desc: "Data dokumen yg berbeda", + type: "text", + required: true }, - { - key: "dokumen_a", - name: "Data pada Dokumen A", - desc: "Data biodata yang tertulis pada dokumen pertama", - type: "text" - }, - { - key: "dokumen_b", - name: "Data pada Dokumen B", - desc: "Data biodata yang tertulis pada dokumen kedua", - type: "text" - } + { key: "dokumen_a", name: "Data pada Dokumen A", desc: "Data biodata pada dokumen pertama", type: "text", required: true }, + { key: "dokumen_b", name: "Data pada Dokumen B", desc: "Data biodata pada dokumen kedua", type: "text", required: true } ] }, { id: "skbelumkawin", name: "Surat Keterangan Belum Kawin", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kk", - name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" - }, - { - key: "akta_cerai", - name: "Akta Cerai", - desc: "Fotokopi akta cerai (jika berstatus janda/duda)" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau Kartu Keluarga", required: true }, + { key: "akta_cerai", name: "Akta Cerai", desc: "Fotokopi akta cerai (jika berstatus janda/duda)", required: false } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, - { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, + { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true }, + { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", desc: "Jenis kelamin pemohon", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, + { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true }, { key: "agama", name: "Agama", desc: "Agama pemohon", type: "enum", - options: enumAgama + options: enumAgama, + required: true }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" } + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true } ] }, + { id: "skdomisiliorganisasi", name: "Surat Keterangan Domisili Organisasi", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "skt_organisasi", - name: "SKT Organisasi", - desc: "Fotokopi SKT Organisasi atau pengukuhan kelompok" - }, - { - key: "susunan_pengurus", - name: "Susunan Pengurus", - desc: "Susunan pengurus lengkap dengan kop organisasi" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "skt_organisasi", name: "SKT Organisasi", desc: "Fotokopi SKT Organisasi", required: true }, + { key: "susunan_pengurus", name: "Susunan Pengurus", desc: "Susunan pengurus organisasi", required: true } ], dataText: [], dataPelengkap: [ - { key: "nama_organisasi", name: "Nama Organisasi", desc: "Nama resmi organisasi", type: "text" }, - { key: "jenis_organisasi", name: "Jenis Organisasi", desc: "Jenis atau bentuk organisasi", type: "text" }, - { key: "alamat_organisasi", name: "Alamat Organisasi", desc: "Alamat sekretariat organisasi", type: "text" }, - { key: "no_telepon", name: "Nomor Telepon", desc: "Nomor telepon organisasi", type: "text" }, - { key: "nama_pimpinan", name: "Nama Pimpinan", desc: "Nama pimpinan organisasi", type: "text" }, - { key: "keperluan", name: "Keperluan", desc: "Keperluan pembuatan surat", type: "text" } + { key: "nama_organisasi", name: "Nama Organisasi", desc: "Nama resmi organisasi", type: "text", required: true }, + { key: "jenis_organisasi", name: "Jenis Organisasi", desc: "Jenis organisasi", type: "text", required: true }, + { key: "alamat_organisasi", name: "Alamat Organisasi", desc: "Alamat sekretariat", type: "text", required: true }, + { key: "no_telepon", name: "Nomor Telepon", desc: "Nomor telepon organisasi", type: "text", required: true }, + { key: "nama_pimpinan", name: "Nama Pimpinan", desc: "Nama pimpinan", type: "text", required: true }, + { key: "keperluan", name: "Keperluan", desc: "Keperluan pembuatan surat", type: "text", required: true } ] }, { id: "skkelahiran", name: "Surat Keterangan Kelahiran", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "surat_lahir", - name: "Surat Keterangan Lahir", - desc: "Surat keterangan lahir dari bidan/dokter (jika ada)" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "surat_lahir", name: "Surat Keterangan Lahir", desc: "Surat keterangan lahir dari bidan/dokter (jika ada)", required: false } ], dataText: [], dataPelengkap: [ - { key: "nama_anak", name: "Nama Anak", desc: "Nama bayi/anak", type: "text" }, - { key: "tanggal_lahir_anak", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date" }, - { key: "pukul_lahir", name: "Pukul Lahir", desc: "Waktu kelahiran anak", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat kelahiran anak", type: "text" }, + { key: "nama_anak", name: "Nama Anak", desc: "Nama bayi/anak", type: "text", required: true }, + { key: "tanggal_lahir_anak", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date", required: true }, + { key: "pukul_lahir", name: "Pukul Lahir", desc: "Waktu kelahiran", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat kelahiran", type: "text", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin Anak", desc: "Jenis kelamin anak", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "anak_ke", name: "Anak Ke-", desc: "Urutan kelahiran anak", type: "number" }, - { key: "nik_ibu", name: "NIK Ibu", desc: "NIK ibu kandung", type: "number" }, - { key: "nama_ibu", name: "Nama Ibu", desc: "Nama lengkap ibu", type: "text" }, - { key: "tempat_lahir_ibu", name: "Tempat Lahir Ibu", desc: "Tempat lahir ibu kandung", type: "text" }, - { key: "tanggal_lahir_ibu", name: "Tanggal Lahir Ibu", desc: "Tanggal lahir ibu kandung", type: "date" }, - { key: "pekerjaan_ibu", name: "Pekerjaan Ibu", desc: "Pekerjaan ibu kandung", type: "text" }, - { key: "alamat_ibu", name: "Alamat Ibu", desc: "Alamat ibu kandung", type: "text" }, - { key: "nama_ayah", name: "Nama Ayah", desc: "Nama lengkap ayah", type: "text" }, - { key: "nik_ayah", name: "NIK Ayah", desc: "NIK ayah kandung", type: "number" }, - { key: "tempat_lahir_ayah", name: "Tempat Lahir Ayah", desc: "Tempat lahir ayah kandung", type: "text" }, - { key: "tanggal_lahir_ayah", name: "Tanggal Lahir Ayah", desc: "Tanggal lahir ayah kandung", type: "date" }, - { key: "pekerjaan_ayah", name: "Pekerjaan Ayah", desc: "Pekerjaan ayah kandung", type: "text" }, - { key: "alamat_ayah", name: "Alamat Ayah", desc: "Alamat ayah kandung", type: "text" }, - { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pihak yang melaporkan", type: "text" }, - { key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan pelapor dengan anak", type: "text" }, - { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text" } + { key: "anak_ke", name: "Anak Ke-", desc: "Urutan kelahiran", type: "number", required: true }, + { key: "nik_ibu", name: "NIK Ibu", desc: "NIK ibu kandung", type: "number", required: true }, + { key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu kandung", type: "text", required: true }, + { key: "tempat_lahir_ibu", name: "Tempat Lahir Ibu", desc: "Tempat lahir ibu", type: "text", required: true }, + { key: "tanggal_lahir_ibu", name: "Tanggal Lahir Ibu", desc: "Tanggal lahir ibu", type: "date", required: true }, + { key: "pekerjaan_ibu", name: "Pekerjaan Ibu", desc: "Pekerjaan ibu", type: "text", required: true }, + { key: "alamat_ibu", name: "Alamat Ibu", desc: "Alamat ibu", type: "text", required: true }, + { key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah kandung", type: "text", required: true }, + { key: "nik_ayah", name: "NIK Ayah", desc: "NIK ayah kandung", type: "number", required: true }, + { key: "tempat_lahir_ayah", name: "Tempat Lahir Ayah", desc: "Tempat lahir ayah", type: "text", required: true }, + { key: "tanggal_lahir_ayah", name: "Tanggal Lahir Ayah", desc: "Tanggal lahir ayah", type: "date", required: true }, + { key: "pekerjaan_ayah", name: "Pekerjaan Ayah", desc: "Pekerjaan ayah", type: "text", required: true }, + { key: "alamat_ayah", name: "Alamat Ayah", desc: "Alamat ayah", type: "text", required: true }, + { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pelapor", type: "text", required: true }, + { key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan dengan anak", type: "text", required: true }, + { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text", required: true } ] - }, { id: "skkelakuanbaik", name: "Surat Keterangan Kelakuan Baik (Pengantar SKCK)", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kk", - name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau KK", required: true } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, - { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, + { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number", required: true }, + { key: "nama", name: "Nama Lengkap", desc: "Nama sesuai KTP", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", - desc: "Jenis kelamin pemohon", + desc: "Jenis kelamin", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, { key: "agama", name: "Agama", - desc: "Agama pemohon", + desc: "Agama", type: "enum", - options: enumAgama + options: enumAgama, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text" }, - { key: "polsek", name: "Polsek Tujuan", desc: "Polsek tujuan pembuatan SKCK", type: "text" } + { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true }, + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan", type: "text", required: true }, + { key: "polsek", name: "Polsek Tujuan", desc: "Polsek tujuan", type: "text", required: true } ] - }, { id: "skkematian", name: "Surat Keterangan Kematian", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kk", - name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" - }, - { - key: "surat_kematian", - name: "Surat Keterangan Kematian", - desc: "Surat keterangan kematian dari rumah sakit/dokter (jika ada)" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP atau KK", required: true }, + { key: "surat_kematian", name: "Surat Keterangan Kematian", desc: "Surat keterangan kematian dari rumah sakit/dokter (jika ada)", required: false } ], dataText: [], dataPelengkap: [ - { key: "nik_pelapor", name: "NIK Pelapor", desc: "Nomor Induk Kependudukan pelapor", type: "number" }, - { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama lengkap pelapor", type: "text" }, - { key: "pekerjaan_pelapor", name: "Pekerjaan Pelapor", desc: "Pekerjaan pelapor", type: "text" }, - { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat tempat tinggal pelapor", type: "text" }, - { key: "hubungan_pelapor", name: "Hubungan dengan Almarhum", desc: "Hubungan pelapor dengan almarhum", type: "text" }, - { key: "nama_almarhum", name: "Nama Almarhum", desc: "Nama lengkap almarhum", type: "text" }, - { key: "nik_almarhum", name: "NIK Almarhum", desc: "Nomor Induk Kependudukan almarhum", type: "number" }, - { key: "tempat_lahir_almarhum", name: "Tempat Lahir Almarhum", desc: "Tempat lahir almarhum", type: "text" }, - { key: "tanggal_lahir_almarhum", name: "Tanggal Lahir Almarhum", desc: "Tanggal lahir almarhum", type: "date" }, - { key: "alamat_almarhum", name: "Alamat Almarhum", desc: "Alamat terakhir almarhum", type: "text" }, + { key: "nik_pelapor", name: "NIK Pelapor", desc: "NIK pelapor", type: "number", required: true }, + { key: "nama_pelapor", name: "Nama Pelapor", desc: "Nama pelapor", type: "text", required: true }, + { key: "pekerjaan_pelapor", name: "Pekerjaan Pelapor", desc: "Pekerjaan pelapor", type: "text", required: true }, + { key: "alamat_pelapor", name: "Alamat Pelapor", desc: "Alamat pelapor", type: "text", required: true }, + { key: "hubungan_pelapor", name: "Hubungan Pelapor", desc: "Hubungan dengan almarhum", type: "text", required: true }, + { key: "nama_almarhum", name: "Nama Almarhum", desc: "Nama almarhum", type: "text", required: true }, + { key: "nik_almarhum", name: "NIK Almarhum", desc: "NIK almarhum", type: "number", required: true }, + { key: "tempat_lahir_almarhum", name: "Tempat Lahir", desc: "Tempat lahir almarhum", type: "text", required: true }, + { key: "tanggal_lahir_almarhum", name: "Tanggal Lahir", desc: "Tanggal lahir almarhum", type: "date", required: true }, + { key: "alamat_almarhum", name: "Alamat", desc: "Alamat terakhir", type: "text", required: true }, { key: "agama_almarhum", name: "Agama Almarhum", desc: "Agama almarhum", type: "enum", - options: enumAgama + options: enumAgama, + required: true }, - { key: "tanggal_kematian", name: "Tanggal Kematian", desc: "Tanggal meninggal dunia", type: "date" }, - { key: "waktu_kematian", name: "Waktu Kematian", desc: "Waktu meninggal dunia", type: "text" }, - { key: "tempat_kematian", name: "Tempat Kematian", desc: "Tempat meninggal dunia", type: "text" }, - { key: "penyebab_kematian", name: "Penyebab Kematian", desc: "Penyebab meninggal dunia", type: "text" } + { key: "tanggal_kematian", name: "Tanggal Kematian", desc: "Tanggal meninggal dunia", type: "date", required: true }, + { key: "waktu_kematian", name: "Waktu Kematian", desc: "Waktu meninggal dunia", type: "text", required: true }, + { key: "tempat_kematian", name: "Tempat Kematian", desc: "Tempat meninggal dunia", type: "text", required: true }, + { key: "penyebab_kematian", name: "Penyebab Kematian", desc: "Penyebab meninggal dunia", type: "text", required: true } ] }, { id: "skpenghasilan", name: "Surat Keterangan Penghasilan", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_ortu_kk", - name: "KTP Orang Tua / KK", - desc: "Fotokopi KTP orang tua atau Kartu Keluarga" - }, - { - key: "surat_pernyataan", - name: "Surat Pernyataan", - desc: "Surat pernyataan penghasilan bermaterai" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_ortu_kk", name: "KTP Orang Tua / KK", desc: "Fotokopi KTP orang tua/KK", required: true }, + { key: "surat_pernyataan", name: "Surat Pernyataan Penghasilan", desc: "Surat pernyataan penghasilan bermaterai", required: true } ], dataText: [], dataPelengkap: [ - { key: "nama", name: "Nama Lengkap", desc: "Nama pemohon", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, + { key: "nama", name: "Nama Lengkap", desc: "Nama pemohon", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", - desc: "Jenis kelamin pemohon", + desc: "Jenis kelamin", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon/orang tua", type: "text" }, - { key: "penghasilan", name: "Penghasilan", desc: "Jumlah penghasilan per bulan", type: "number" }, - { key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan surat penghasilan", type: "text" } + { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text", required: true }, + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemohon", type: "text", required: true }, + { key: "penghasilan", name: "Penghasilan", desc: "Jumlah penghasilan per bulan", type: "number", required: true }, + { key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan surat penghasilan", type: "text", required: true } ] }, { id: "sktempatusaha", name: "Surat Keterangan Tempat Usaha", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kk", - name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" - }, - { - key: "foto_lokasi", - name: "Foto Lokasi Usaha", - desc: "Foto lokasi usaha dicetak dan distempel oleh Kelian" - }, - { - key: "dokumen_lahan", - name: "Dokumen Lahan", - desc: "SPPT, Sertifikat, atau surat sewa tempat usaha" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP/KK", required: true }, + { key: "foto_lokasi", name: "Foto Lokasi Usaha", desc: "Foto lokasi usaha", required: true }, + { key: "dokumen_lahan", name: "Dokumen Lahan", desc: "SPPT/Sertifikat/surat sewa tempat usaha", required: true } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, - { key: "nama_pemilik", name: "Nama Pemilik", desc: "Nama pemilik usaha", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, - { key: "alamat_pemilik", name: "Alamat Pemilik", desc: "Alamat pemilik usaha", type: "text" }, - { key: "nama_usaha", name: "Nama Usaha", desc: "Nama usaha", type: "text" }, - { key: "bidang_usaha", name: "Bidang Usaha", desc: "Bidang atau jenis usaha", type: "text" }, - { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat lokasi usaha", type: "text" }, - { key: "status_tempat", name: "Status Tempat Usaha", desc: "Status kepemilikan tempat usaha", type: "enum", options: enumStatusTempatUsaha }, - { key: "luas_usaha", name: "Luas Tempat Usaha", desc: "Luas tempat usaha (m²)", type: "number" }, - { key: "jumlah_karyawan", name: "Jumlah Karyawan", desc: "Jumlah tenaga kerja", type: "number" }, - { key: "tujuan", name: "Tujuan Pembuatan Surat", desc: "Tujuan pembuatan surat keterangan", type: "text" } + { key: "nik", name: "NIK", desc: "NIK pemilik", type: "number", required: true }, + { key: "nama_pemilik", name: "Nama Pemilik", desc: "Nama pemilik usaha", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, + { key: "alamat_pemilik", name: "Alamat Pemilik", desc: "Alamat pemilik", type: "text", required: true }, + { key: "nama_usaha", name: "Nama Usaha", desc: "Nama usaha", type: "text", required: true }, + { key: "bidang_usaha", name: "Bidang Usaha", desc: "Bidang usaha", type: "text", required: true }, + { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat usaha", type: "text", required: true }, + { + key: "status_tempat", + name: "Status Tempat Usaha", + desc: "Status kepemilikan tempat usaha", + type: "enum", + options: enumStatusTempatUsaha, + required: true + }, + { key: "luas_usaha", name: "Luas Tempat Usaha", desc: "Luas tempat usaha (m²)", type: "number", required: true }, + { key: "jumlah_karyawan", name: "Jumlah Karyawan", desc: "Jumlah karyawan", type: "number", required: true }, + { key: "tujuan", name: "Tujuan Pembuatan Surat", desc: "Tujuan pembuatan surat keterangan", type: "text", required: true } ] }, { id: "sktidakmampu", name: "Surat Keterangan Tidak Mampu", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kia_kk", - name: "KTP / KIA / KK", - desc: "Fotokopi KTP, KIA, atau Kartu Keluarga" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kia_kk", name: "KTP / KIA / KK", desc: "Fotokopi KTP/KIA/KK", required: true } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan pemohon", type: "number" }, - { key: "nama", name: "Nama Lengkap", desc: "Nama lengkap pemohon", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir pemohon", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir pemohon", type: "date" }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal pemohon", type: "text" }, - { key: "alasan", name: "Alasan Permohonan", desc: "Alasan pengajuan Surat Keterangan Tidak Mampu", type: "text" } + { key: "nik", name: "NIK", desc: "NIK pemohon", type: "number", required: true }, + { key: "nama Lengkap", name: "Nama", desc: "Nama pemohon", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, + { key: "alamat", name: "Alamat", desc: "Alamat pemohon", type: "text", required: true }, + { key: "alasan", name: "Alasan Permohonan", desc: "Alasan permohonan", type: "text", required: true } ] }, { id: "skusaha", name: "Surat Keterangan Usaha", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kk", - name: "KTP / KK", - desc: "Fotokopi KTP atau Kartu Keluarga" - }, - { - key: "foto_lokasi", - name: "Foto Lokasi Usaha", - desc: "Foto lokasi usaha dicetak dan distempel oleh Kelian" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kk", name: "KTP / KK", desc: "Fotokopi KTP/KK", required: true }, + { key: "foto_lokasi", name: "Foto Lokasi Usaha", desc: "Foto lokasi usaha", required: true } ], dataText: [], dataPelengkap: [ - { key: "nama", name: "Nama Lengkap", desc: "Nama pemilik usaha", type: "text" }, + { key: "nama", name: "Nama Lengkap", desc: "Nama pemilik usaha", type: "text", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", desc: "Jenis kelamin pemilik usaha", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date" }, - { key: "negara", name: "Kewarganegaraan", desc: "Kewarganegaraan pemilik usaha", type: "text" }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, + { key: "negara", name: "Kewarganegaraan", desc: "Kewarganegaraan", type: "text", required: true }, { key: "agama", name: "Agama", - desc: "Agama pemilik usaha", + desc: "Agama", type: "enum", - options: enumAgama + options: enumAgama, + required: true }, { key: "status_perkawinan", name: "Status Perkawinan", desc: "Status perkawinan", type: "enum", - options: enumStatusPerkawinan + options: enumStatusPerkawinan, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan pemilik usaha", type: "text" }, - { key: "jenis_usaha", name: "Jenis Usaha", desc: "Jenis usaha yang dijalankan", type: "text" }, - { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat lokasi usaha", type: "text" } + { key: "alamat", name: "Alamat", desc: "Alamat", type: "text", required: true }, + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan", type: "text", required: true }, + { key: "jenis_usaha", name: "Jenis Usaha", desc: "Jenis usaha", type: "text", required: true }, + { key: "alamat_usaha", name: "Alamat Usaha", desc: "Alamat usaha", type: "text", required: true } ] }, { id: "skyatimpiatu", name: "Surat Keterangan Yatim / Piatu / Yatim Piatu", syaratDokumen: [ - { - key: "pengantar_kelian", - name: "Pengantar Kelian", - desc: "Surat Pengantar Kelian Banjar Dinas" - }, - { - key: "ktp_kia_kk", - name: "KTP / KIA / KK", - desc: "Fotokopi KTP, KIA, atau Kartu Keluarga" - } + { key: "pengantar_kelian", name: "Pengantar Kelian", desc: "Surat Pengantar Kelian Banjar Dinas", required: true }, + { key: "ktp_kia_kk", name: "KTP / KIA / KK", desc: "Fotokopi KTP/KIA/KK", required: true } ], dataText: [], dataPelengkap: [ - { key: "nik", name: "NIK", desc: "Nomor Induk Kependudukan", type: "number" }, - { key: "nama", name: "Nama Lengkap", desc: "Nama anak", type: "text" }, - { key: "tempat_lahir", name: "Tempat Lahir Anak", desc: "Tempat lahir anak", type: "text" }, - { key: "tanggal_lahir", name: "Tanggal Lahir Anak", desc: "Tanggal lahir anak", type: "date" }, + { key: "nik", name: "NIK", desc: "NIK anak", type: "number", required: true }, + { key: "nama", name: "Nama", desc: "Nama anak", type: "text", required: true }, + { key: "tempat_lahir", name: "Tempat Lahir", desc: "Tempat lahir", type: "text", required: true }, + { key: "tanggal_lahir", name: "Tanggal Lahir", desc: "Tanggal lahir", type: "date", required: true }, { key: "jenis_kelamin", name: "Jenis Kelamin", desc: "Jenis kelamin anak", type: "enum", - options: enumJenisKelamin + options: enumJenisKelamin, + required: true }, - { key: "alamat", name: "Alamat", desc: "Alamat tempat tinggal", type: "text" }, - { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan (jika ada)", type: "text" }, - - { key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah kandung", type: "text" }, + { key: "alamat", name: "Alamat", desc: "Alamat", type: "text", required: true }, + { key: "pekerjaan", name: "Pekerjaan", desc: "Pekerjaan (jika ada)", type: "text", required: false }, + { key: "nama_ayah", name: "Nama Ayah", desc: "Nama ayah", type: "text", required: true }, { key: "status_ayah", name: "Status Ayah", - desc: "Status ayah (hidup / meninggal)", + desc: "Status ayah", type: "enum", - options: enumStatusHidup + options: enumStatusHidup, + required: true }, - { key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu kandung", type: "text" }, + { key: "nama_ibu", name: "Nama Ibu", desc: "Nama ibu", type: "text", required: true }, { key: "status_ibu", name: "Status Ibu", - desc: "Status ibu (hidup / meninggal)", + desc: "Status ibu", type: "enum", - options: enumStatusHidup + options: enumStatusHidup, + required: true } ] - } ]; diff --git a/src/pages/darmasaba/surat.tsx b/src/pages/darmasaba/surat.tsx index 039c973..4dfa135 100644 --- a/src/pages/darmasaba/surat.tsx +++ b/src/pages/darmasaba/surat.tsx @@ -42,6 +42,7 @@ import useSWR from "swr"; type DataItem = { key: string; value: string; + required: boolean; }; type FormSurat = { @@ -119,15 +120,17 @@ export default function FormSurat() { nama: "", phone: "", dataPelengkap: (get.data?.dataPelengkap || []).map( - (item: { key: string }) => ({ + (item: { key: string, required: boolean }) => ({ key: item.key, value: "", + required: item.required }), ), syaratDokumen: (get.data?.syaratDokumen || []).map( - (item: { key: string }) => ({ + (item: { key: string, required: boolean }) => ({ key: item.key, value: "", + required: item.required }), ), }); @@ -167,10 +170,10 @@ export default function FormSurat() { if (Array.isArray(value)) { return value.some( (item) => - typeof item.value === "string" && item.value.trim() === "", + (typeof item.value === "string" && item.value.trim() === "" && item.required) || (typeof item.value === "object" && item.value === null && item.required), ); } - return typeof value === "string" && value.trim() === ""; + return typeof value === "string" && value.trim() === "" ; }); if (isFormKosong) { @@ -276,13 +279,14 @@ export default function FormSurat() { value: any; }) { if (key === "dataPelengkap" || key === "syaratDokumen") { - const errorMsg = validateField(value.key, value.value); - - setErrors((prev) => ({ - ...prev, - [value.key]: errorMsg, - })); + if (value.required == true) { + const errorMsg = validateField(value.key, value.value); + setErrors((prev) => ({ + ...prev, + [value.key]: errorMsg, + })); + } setFormSurat((prev) => ({ ...prev, [key]: updateArrayByKey(prev[key], value.key, value.value), @@ -400,7 +404,7 @@ export default function FormSurat() { } + label={} placeholder="Budi Setiawan" value={formSurat.nama} error={errors.nama_kontak} @@ -414,6 +418,7 @@ export default function FormSurat() { @@ -450,6 +455,7 @@ export default function FormSurat() { } data={item.options ?? []} @@ -457,7 +463,7 @@ export default function FormSurat() { onChange={(e) => { validationForm({ key: "dataPelengkap", - value: { key: item.key, value: e }, + value: { key: item.key, value: e, required: item.required }, }); }} value={ @@ -474,6 +480,7 @@ export default function FormSurat() { } placeholder={item.name} @@ -488,6 +495,7 @@ export default function FormSurat() { value: { key: item.key, value: formatted, + required: item.required, }, }); }} @@ -500,6 +508,7 @@ export default function FormSurat() { } placeholder={item.name} @@ -509,6 +518,7 @@ export default function FormSurat() { value: { key: item.key, value: e.target.value, + required: item.required, }, }) } @@ -545,6 +555,7 @@ export default function FormSurat() { }) } name={item.name} + required={item.required} /> ), @@ -569,10 +580,20 @@ export default function FormSurat() { ); } -function FieldLabel({ label, hint }: { label: string; hint?: string }) { +function FieldLabel({ label, hint, required = false, }: { label: string; hint?: string; required?: boolean; }) { return ( - {label} + + + {label} + {required && ( + + * + + )} + + + {hint && ( @@ -584,6 +605,7 @@ function FieldLabel({ label, hint }: { label: string; hint?: string }) { ); } + function FormSection({ title, icon, @@ -619,6 +641,7 @@ function FileInputWrapper({ preview, name, description, + required = false, }: { label: string; placeholder?: string; @@ -627,12 +650,20 @@ function FileInputWrapper({ preview?: string | null; name: string; description?: string; + required?: boolean; }) { return ( - {label} + + {label} + {required && ( + + * + + )} + {description && ( diff --git a/src/pages/darmasaba/update_data_surat.tsx b/src/pages/darmasaba/update_data_surat.tsx index 1b158d5..41a5372 100644 --- a/src/pages/darmasaba/update_data_surat.tsx +++ b/src/pages/darmasaba/update_data_surat.tsx @@ -50,6 +50,7 @@ type UpdateDataItem = { id: string; key: string; value: any; + required: boolean; }; type FormSurat = { @@ -125,10 +126,20 @@ export default function UpdateDataSurat() { ); } -function FieldLabel({ label, hint }: { label: string; hint?: string }) { +function FieldLabel({ label, hint, required = false, }: { label: string; hint?: string; required?: boolean; }) { return ( - {label} + + + {label} + {required && ( + + * + + )} + + + {hint && ( @@ -139,7 +150,6 @@ function FieldLabel({ label, hint }: { label: string; hint?: string }) { ); } - function FormSection({ title, icon, @@ -185,6 +195,8 @@ function FileInputWrapper({ description, linkView, disabled, + required = false, + }: { label: string; placeholder?: string; @@ -195,6 +207,7 @@ function FileInputWrapper({ name: string; description?: string; disabled?: boolean; + required?: boolean; }) { const [viewImg, setViewImg] = useState(""); const [openedPreviewFile, setOpenedPreviewFile] = useState(false); @@ -219,7 +232,14 @@ function FileInputWrapper({ - {label} + + {label} + {required && ( + + * + + )} + {description && ( @@ -478,21 +498,33 @@ function DataUpdate({ kategori: "dataPelengkap" | "syaratDokumen"; value: UpdateDataItem; }) { - const errorMsg = validateField(value.key, value.value); + if (kategori == "syaratDokumen" && value.value == null) { + setFormSurat((prev) => ({ + ...prev, + syaratDokumen: prev.syaratDokumen.filter( + (item) => item.id !== value.id + ), + })); + } else { + if (value.required == true) { + const errorMsg = validateField(value.key, value.value); + setErrors((prev) => ({ + ...prev, + [value.id]: errorMsg, + })); + } - setErrors((prev) => ({ - ...prev, - [value.id]: errorMsg, - })); - setFormSurat((prev) => ({ - ...prev, - [kategori]: upsertById(prev[kategori], { - id: value.id, - key: value.key, - value: value.value, - }), - })); + setFormSurat((prev) => ({ + ...prev, + [kategori]: upsertById(prev[kategori], { + id: value.id, + key: value.key, + value: value.value, + required: value.required, + }), + })); + } } @@ -529,7 +561,7 @@ function DataUpdate({ if (Array.isArray(value)) { return value.some( (item) => - typeof item.value === "string" && item.value.trim() === "", + (typeof item.value === "string" && item.value.trim() === "" && item.required) || (typeof item.value === "object" && item.value === null && item.required), ); } @@ -677,13 +709,13 @@ function DataUpdate({