import React, { useEffect, useState } from 'react'; import { Modal, Input, Divider, Typography, Switch, Button, ConfigProvider, Radio, Select, } from 'antd'; import { NotifAlert, NotifOk } from '../../../../components/Global/ToastNotif'; import { createApd, getJenisPermit, updateApd } from '../../../../api/master-apd'; import { createDevice, updateDevice } from '../../../../api/master-device'; import { Checkbox } from 'antd'; const CheckboxGroup = Checkbox.Group; const { Text } = Typography; const { TextArea } = Input; const DetailDevice = (props) => { const [confirmLoading, setConfirmLoading] = useState(false); const defaultData = { device_id: '', device_code: '', device_name: '', is_active: true, device_location: 'Building A', device_description: '', ip_address: '', }; const [FormData, setFormData] = useState(defaultData); const [jenisPermit, setJenisPermit] = useState([]); const [checkedList, setCheckedList] = useState([]); const onChange = (list) => { setCheckedList(list); }; const onChangeRadio = (e) => { setFormData({ ...FormData, type_input: e.target.value, }); }; const getDataJenisPermit = async () => { setCheckedList([]); const result = await getJenisPermit(); const data = result.data ?? []; const names = data.map((item) => ({ value: item.id_jenis_permit, label: item.nama_jenis_permit, })); setJenisPermit(names); }; const handleCancel = () => { props.setSelectedData(null); props.setActionMode('list'); }; const validateIPAddress = (ip) => { const ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; return ipRegex.test(ip); }; const handleSave = async () => { setConfirmLoading(true); // Validasi required fields // if (!FormData.device_code) { // NotifOk({ // icon: 'warning', // title: 'Peringatan', // message: 'Kolom Device Code Tidak Boleh Kosong', // }); // setConfirmLoading(false); // return; // } if (!FormData.device_name) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Kolom Device Name Tidak Boleh Kosong', }); setConfirmLoading(false); return; } if (!FormData.device_location) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Kolom Device Location Tidak Boleh Kosong', }); setConfirmLoading(false); return; } if (!FormData.ip_address) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Kolom IP Address Tidak Boleh Kosong', }); setConfirmLoading(false); return; } // Validasi format IP if (!validateIPAddress(FormData.ip_address)) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Format IP Address Tidak Valid', }); setConfirmLoading(false); return; } if (props.permitDefault && checkedList.length === 0) { NotifOk({ icon: 'warning', title: 'Peringatan', message: 'Kolom Jenis Permit Tidak Boleh Kosong', }); setConfirmLoading(false); return; } // Backend validation schema doesn't include device_code const payload = { device_name: FormData.device_name, is_active: FormData.is_active, device_location: FormData.device_location, ip_address: FormData.ip_address, }; // For CREATE: device_description is required (cannot be empty) // For UPDATE: device_description is optional if (!FormData.device_id) { // Creating - ensure description is not empty payload.device_description = FormData.device_description || '-'; } else { // Updating - include description as-is payload.device_description = FormData.device_description; } console.log('Payload to send:', payload); try { let response; if (!FormData.device_id) { response = await createDevice(payload); } else { response = await updateDevice(FormData.device_id, payload); } console.log('Save Device Response:', response); // Check if response is successful if (response && (response.statusCode === 200 || response.statusCode === 201)) { // Response.data is now a single object (already extracted from array) const deviceName = response.data?.device_name || FormData.device_name; NotifOk({ icon: 'success', title: 'Berhasil', message: `Data Device "${deviceName}" berhasil ${ FormData.device_id ? 'diubah' : 'ditambahkan' }.`, }); props.setActionMode('list'); } else { NotifAlert({ icon: 'error', title: 'Gagal', message: response?.message || 'Terjadi kesalahan saat menyimpan data.', }); } } catch (error) { console.error('Save Device Error:', error); NotifAlert({ icon: 'error', title: 'Error', message: error.message || 'Terjadi kesalahan pada server. Coba lagi nanti.', }); } setConfirmLoading(false); }; const handleInputChange = (e) => { const { name, value } = e.target; setFormData({ ...FormData, [name]: value, }); }; const handleStatusToggle = (event) => { const isChecked = event; setFormData({ ...FormData, is_active: isChecked ? true : false, }); }; useEffect(() => { const token = localStorage.getItem('token'); if (token) { // Only call getDataJenisPermit if permitDefault is enabled if (props.permitDefault) { getDataJenisPermit(); } if (props.selectedData != null) { setFormData(props.selectedData); if (props.permitDefault && props.selectedData.jenis_permit_default_arr) { setCheckedList(props.selectedData.jenis_permit_default_arr); } } else { setFormData(defaultData); } } else { // navigate('/signin'); // Uncomment if useNavigate is imported } }, [props.showModal]); return ( {!props.readOnly && ( )} , ]} > {FormData && (
Device Status
{FormData.is_active === true ? 'Running' : 'Offline'}
{/*
Device Code *
*/}
Device Name *
Device Location *
IP Address *
Device Description