import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import Select from "react-select"; import { useState } from "react"; import { Checkbox } from "@/components/ui/checkbox"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { format } from "date-fns"; import { cn } from "@/lib/utils"; import { Calendar as CalendarIcon, FileText, Hotel, LocateFixed, MapPinned, UsersRound, Verified, VerifiedIcon, } from "lucide-react"; import { Separator } from "../ui/separator"; import { Textarea } from "../ui/textarea"; import { JenisDokIL, JenisKegiatan, Verifikator, Kabupaten, Kecamatan, Kelurahan, Perusahaan, Kawasan, } from "@/types/perusahaan"; import { useForm, usePage } from "@inertiajs/react"; import { useToast } from "@/hooks/use-toast"; interface FormDataType { NomorInduk: string; JenisKegiatanId: string; NamaPerusahaan: string; Alamat: string; KelurahanId: string; KodePos: string; Telepon: string; Fax: string; Email: string; Lintang: string; Bujur: string; CPNama: string; CPTelepon: string; JenisDokILId: string; VerifikatorId: string; IsPublish: boolean; ILNomor: string; ILTanggal: string; ILDokumen: File | null; ReportLocked: true; PerusahaanId: string; } // interface ExistingPerusahaan { // NamaPerusahaan: string; // PerusahaanId: string; // } interface ExistingInduk { NomorInduk: string; } interface AddPerusahaanModalProps { open: boolean; onClose: () => void; onSuccess: () => void; jenisKegiatan: JenisKegiatan[]; jenisDokIL: JenisDokIL[]; verifikator: Verifikator[]; kabupaten: Kabupaten[]; kecamatan: Kecamatan[]; kelurahan: Kelurahan[]; perusahaan: Perusahaan[]; // kawasan: Kawasan[]; // existingPerusahaan: ExistingPerusahaan[]; // existingInduk: ExistingInduk[]; } export function AddPerusahaanModal({ open, onClose, onSuccess, jenisKegiatan, jenisDokIL, verifikator, kabupaten, kecamatan, kelurahan, perusahaan, }: // existingPerusahaan, // existingInduk, // kawasan, AddPerusahaanModalProps) { const { toast } = useToast(); const [loading, setLoading] = useState(false); const [date, setDate] = useState(); const { data, setData, post, reset } = useForm({ NomorInduk: "", PerusahaanId: "", JenisKegiatanId: "", NamaPerusahaan: "", Alamat: "", KelurahanId: "", KodePos: "", Telepon: "", Fax: "", Email: "", Lintang: "", Bujur: "", CPNama: "", CPTelepon: "", JenisDokILId: "", VerifikatorId: "", IsPublish: true, ILDokumen: null as File | null, ILNomor: "", ILTanggal: "", ReportLocked: true, }); const [selectedKabupaten, setSelectedKabupaten] = useState<{ value: number; label: string; } | null>(null); const [selectedKecamatan, setSelectedKecamatan] = useState<{ value: number; label: string; } | null>(null); const [selectedKelurahan, setSelectedKelurahan] = useState<{ value: number; label: string; } | null>(null); const [selectedPerusahaan, setSelectedPerusahaan] = useState<{ value: number; label: string; } | null>(null); const jenisKegiatanOptions = jenisKegiatan.map((jk) => ({ value: jk.JenisKegiatanId, label: jk.NamaJenisKegiatan, })); const jenisDokILOptions = jenisDokIL.map((jdi) => ({ value: jdi.JenisDokILId, label: jdi.NamaJenisDokIL, })); const verifikatorOptions = verifikator.map((v) => ({ value: v.VerifikatorId, label: v.NamaUnitKerja, })); const kabupatenOptions = kabupaten.map((k) => ({ value: k.KabupatenId, label: k.NamaKabupaten, })); const perusahaanOptions = perusahaan.map((per) => ({ value: per.PerusahaanId, label: per.NamaPerusahaan, })); const kecamatanOptions = kecamatan .filter( (kec) => selectedKabupaten && kec.KabupatenId === selectedKabupaten.value ) .map((kec) => ({ value: kec.KecamatanId, label: kec.NamaKecamatan, })); const kelurahanOptions = kelurahan .filter( (kel) => selectedKecamatan && kel.KecamatanId === selectedKecamatan.value ) .map((kel) => ({ value: kel.KelurahanId, label: kel.NamaKelurahan, })); const [showAlert, setShowAlert] = useState(false); const [errors, setErrors] = useState>({}); const validateForm = () => { const newErrors: Record = {}; // const titleExists = existingPerusahaan.some( // (perus) => // perus.PerusahaanId.toLowerCase() === // data.PerusahaanId.toLowerCase() // ); // const indukExists = existingInduk.some( // (induk) => // induk.NomorInduk.toLowerCase() === data.NomorInduk.toLowerCase() // ); // if (indukExists) { // setShowAlert(true); // newErrors.NomorInduk = "Nomor Induk sudah ada"; // // Auto-hide alert after 5 seconds // setTimeout(() => setShowAlert(false), 5000); // } // if (titleExists) { // setShowAlert(true); // newErrors.NamaPerusahaan = "Nama Perusahaan sudah ada"; // // Auto-hide alert after 5 seconds // setTimeout(() => setShowAlert(false), 5000); // } // if (!data.PerusahaanId) { // newErrors.PerusahaanId = "Perusahaan harus diisi"; // } if (!data.JenisKegiatanId) { newErrors.JenisKegiatanId = "Jenis Kegiatan harus dipilih"; } if (!data.VerifikatorId) { newErrors.VerifikatorId = "Admin harus dipilih"; } if (!data.Email) { newErrors.Email = "Email harus diisi"; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { toast({ title: "Validasi Gagal", description: "Silakan periksa kembali form anda", variant: "destructive", }); return; } setLoading(true); const formData = new FormData(); formData.append("NomorInduk", data.NomorInduk); formData.append("JenisKegiatanId", data.JenisKegiatanId); formData.append("VerifikatorId", data.VerifikatorId); formData.append("KelurahanId", data.KelurahanId); formData.append("NamaPerusahaan", data.NamaPerusahaan); formData.append("Alamat", data.Alamat); formData.append("KodePos", data.KodePos); formData.append("Telepon", data.Telepon); formData.append("Fax", data.Fax); formData.append("Email", data.Email); formData.append("Lintang", data.Lintang); formData.append("Bujur", data.Bujur); formData.append("CPNama", data.CPNama); formData.append("CPTelepon", data.CPTelepon); formData.append("JenisDokILId", data.JenisDokILId); formData.append("IsPublish", data.IsPublish.toString()); formData.append("ILNomor", data.ILNomor); formData.append("ILTanggal", data.ILTanggal); formData.append("ReportLocked", data.ReportLocked.toString()); if (data.ILDokumen) { formData.append("ILDokumen", data.ILDokumen); } post("/admin/perusahaan", { data: formData, forceFormData: true, onSuccess: (response) => { toast({ title: "Berhasil", description: "Perusahaan berhasil ditambahkan", variant: "default", }); reset(); onSuccess(); onClose(); }, onError: (error) => { console.error("Error:", error); toast({ title: "Gagal", description: "Terjadi kesalahan saat menambahkan perusahaan", variant: "destructive", }); }, }); }; return ( Tambah Perusahaan Baru Masukkan informasi perusahaan yang akan ditambahkan ke dalam sistem.
{/* Sisi Kiri */}

Data Perusahaan

setData({ ...data, NomorInduk: e.target.value, }) } /> {errors.NomorInduk && (

{errors.NomorInduk}

)}
setData({ ...data, NamaPerusahaan: e.target.value, }) } /> {errors.PerusahaanId && (

{errors.PerusahaanId}

)}
setData({ ...data, VerifikatorId: option?.value?.toString() || "", }) } /> {errors.VerifikatorId && (

{errors.VerifikatorId}

)}
setData({ ...data, CPNama: e.target.value, }) } />
setData({ ...data, CPTelepon: e.target.value, }) } />
{/* Dokumen Izin */}

Dokumen Izin

setData({ ...data, ILNomor: e.target.value, }) } />
setData({ ...data, ILTanggal: e.target.value, }) } />
setData({ ...data, ILDokumen: e.target.files ? e.target.files[0] : null, }) } />
{/* Sisi Kanan */}

Alamat Perusahaan

{ setSelectedKecamatan(value); setSelectedKelurahan(null); }} placeholder="Pilih Kecamatan" isSearchable isDisabled={!selectedKabupaten} required />