import * as Yup from 'yup'; import { useSnackbar } from 'notistack'; import { useNavigate } from 'react-router-dom'; import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import MenuItem from '@mui/material/MenuItem'; import Select, { SelectChangeEvent } from '@mui/material/Select'; import * as React from 'react'; // form import { Controller, useForm } from 'react-hook-form'; import { yupResolver } from '@hookform/resolvers/yup'; // @mui import { styled } from '@mui/material/styles'; import { LoadingButton } from '@mui/lab'; import { Box, Button, ButtonGroup, Card, Grid, Stack, Typography, TextField, Tab, Chip, Autocomplete, } from '@mui/material'; import TabContext from '@mui/lab/TabContext'; import TabList from '@mui/lab/TabList'; import TabPanel from '@mui/lab/TabPanel'; import CancelIcon from '@mui/icons-material/Cancel'; // components import { FormProvider, RHFTextField, RHFRadioGroup, RHFUploadAvatar, RHFSwitch, RHFSelect, RHFEditor, RHFDatepicker, RHFMultiCheckbox, RHFCheckbox, RHFCustomMultiCheckbox, } from '../../../components/hook-form'; import axios from '../../../utils/axios'; import { fCurrency } from '../../../utils/formatNumber'; import { Organizations } from '../../../@types/organization'; import { Provinces } from '../../../@types/organization'; import { Cities } from '../../../@types/organization'; import { Districts } from '../../../@types/organization'; import { Villages } from '../../../@types/organization'; import { Label } from '@mui/icons-material'; import MyDropzone from '../../../components/MyDropzone'; const LabelStyle = styled(Typography)(({ theme }) => ({ ...theme.typography.h6, marginBottom: theme.spacing(2), marginTop: theme.spacing(2), })); const HeaderStyle = styled('header')(({ theme }) => ({ display: 'flex', alignItems: 'center', justifyContent: 'space-between', })); const Title = styled(Typography)(({ theme }) => ({ ...theme.typography.h4, boxShadow: 'none', // paddingBottom: theme.spacing(3), fontWeight: 700, })); // const [timezone, setTimezone] = React.useState(''); // const selectInput = (event: SelectChangeEvent) => { // setTimezone(event.target.value as string); // const name = event.target.name; // const value = event.target.value; // setInputs((values) => ({ ...values, [name]: value })); // }; // const [inputs, setInputs] = useState({}); interface FormValuesProps extends Partial { taxes: boolean; inStock: boolean; } type Props = { isEdit: boolean; currentOrganizations?: Organizations; }; export default function OrganizationsForm({ isEdit, currentOrganizations }: Props) { const navigate = useNavigate(); const [organizations_group, setOrganizationsGroups] = useState([]); // const [ errors, setErrors ] = useState<{ [key: string]: string }>({}); const { enqueueSnackbar } = useSnackbar(); const NewCorporateSchema = Yup.object().shape({ name: Yup.string().required('Name is required'), code: Yup.string().required('Corporate Code is required'), // file: Yup.boolean().required('Corporate Status is required'), }); const defaultValues = useMemo( () => ({ name: currentOrganizations?.name || '', code: currentOrganizations?.code || '', phone: currentOrganizations?.phone || '', lat: currentOrganizations?.lat || '', lng: currentOrganizations?.lng || '', address: currentOrganizations?.address || '', timezone: currentOrganizations?.timezone || '', active: currentOrganizations?.active === 1 ? true : false, province_id: currentOrganizations?.province_id || '', city_id: currentOrganizations?.city_id || '', district_id: currentOrganizations?.district_id || '', village_id: currentOrganizations?.village_id || '', postal_code: currentOrganizations?.postal_code || '', description: currentOrganizations?.description || '', }), // eslint-disable-next-line react-hooks/exhaustive-deps [currentOrganizations] ); console.log('defaultValues', defaultValues); function StatusLabel({ value }: { value: boolean }) { return ( ); } const methods = useForm({ resolver: yupResolver(NewCorporateSchema), defaultValues, }); const { reset, watch, control, setValue, getValues, setError, handleSubmit, formState: { isSubmitting }, } = methods; const values = watch(); useEffect(() => { if (isEdit && currentOrganizations) { reset(defaultValues); } if (!isEdit) { reset(defaultValues); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [isEdit, currentOrganizations]); const onSubmit = async (data: FormValuesProps) => { try { const formData = new FormData(); formData.append('name', data.name); formData.append('code', data.code); formData.append('phone', data.phone); formData.append('lat', data.lat); formData.append('lng', data.lng); formData.append('address', data.address); formData.append('active', data.active ? '1' : '0'); if (data.province_id === currentOrganizations?.province_id) { formData.append('province_id', data.province_id); } else { formData.append('province_id', data.province_id?.value ?? ''); } if (data.city_id === currentOrganizations?.city_id) { formData.append('city_id', data.city_id); } else { formData.append('city_id', data.city_id?.value ?? ''); } if (data.district_id === currentOrganizations?.district_id) { formData.append('district_id', data.district_id); } else { formData.append('district_id', data.district_id?.value ?? ''); } if (data.village_id === currentOrganizations?.village_id) { formData.append('village_id', data.village_id); } else { formData.append('village_id', data.village_id?.value ?? ''); } formData.append('postal_code', data.postal_code); formData.append('description', data.description); if (!isEdit) { console.log('formData', formData); const response = await axios.post('/organizations', formData); } else { formData.append('_method', 'PUT'); const response = await axios.post( '/organizations/' + currentOrganizations?.id ?? '', formData ); } reset(); enqueueSnackbar( !isEdit ? 'Organizations Created Successfully!' : 'Organizations Udpated Successfully!', { variant: 'success' } ); navigate('/master/hospitals'); } catch (error: any) { if (error && error.response.status === 422) { console.log('error', error.response.data.errors); for (const [key, value] of Object.entries(error.response.data.errors)) { setError(key, { message: value[0] }); enqueueSnackbar(value[0] ?? 'Failed Processing Request', { variant: 'error' }); } } else { enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' }); } } const ascent = document?.querySelector('ascent'); if (ascent != null) { ascent.innerHTML = ''; } }; const [province, setProvince] = useState([]); const [city, setCity] = useState([]); const [district, setDistrict] = useState([]); const [village, setVillage] = useState([]); useEffect(() => { axios.get('/province').then((res) => { setProvince(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); }); const loadCity = async () => { if (values.province_id == currentOrganizations?.province_id) { const res = await axios.get('/city?province_id=' + values.province_id); setCity(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } else { const res = await axios.get('/city?province_id=' + values.province_id?.value); setCity(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } }; const loadDistrict = async () => { if (values.city_id == currentOrganizations?.city_id) { const res = await axios.get('/district?city_id=' + values.city_id); setDistrict(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } else { const res = await axios.get('/district?city_id=' + values.city_id?.value); setDistrict(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } }; const loadVillage = async () => { if (values.district_id == currentOrganizations?.district_id) { const res = await axios.get('/village?district_id=' + values.district_id); setVillage(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } else { const res = await axios.get('/village?district_id=' + values.district_id?.value); setVillage(res.data.data.map((item: any) => ({ value: item.id, label: item.name }))); } }; if (values.province_id) { loadCity(); } if (values.city_id) { loadDistrict(); } if (values.district_id) { loadVillage(); } }, [values.province_id, values.city_id, values.district_id, values.village_id]); const findValueProvince = province.find( (item: any) => item.value === currentOrganizations?.province_id ); const findValueCity = city.find((item: any) => item.value === currentOrganizations?.city_id); const findValueDistrict = district.find( (item: any) => item.value === currentOrganizations?.district_id ); const findValueVillage = village.find( (item: any) => item.value === currentOrganizations?.village_id ); return ( Data Rumah Sakit {/* Status Rumah Sakit */} Nama Rumah Sakit Code Rumah Sakit Nomor IGD Alamat Provinsi ( option.label ?? findValueProvince?.label ?? ''} value={value} onChange={(event: any, newValue: any) => { console.log('newValue', newValue); setValue('province_id', newValue?.value); onChange(newValue); }} renderInput={(params) => ( )} /> )} /> Kabupaten / Kota ( option.label ?? findValueCity?.label ?? ''} value={value} onChange={(event: any, newValue: any) => { console.log('newValue', newValue); setValue('city_id', newValue?.value); onChange(newValue); }} renderInput={(params) => ( )} /> )} /> Kecamatan ( option.label ?? findValueDistrict?.label ?? ''} value={value} onChange={(event: any, newValue: any) => { console.log('newValue', newValue); setValue('district_id', newValue?.value); onChange(newValue); }} renderInput={(params) => ( )} /> )} /> Desa ( option.label ?? findValueVillage?.label ?? ''} value={value} onChange={(event: any, newValue: any) => { console.log('newValue', newValue); setValue('village_id', newValue?.value); onChange(newValue); }} renderInput={(params) => ( )} /> )} /> Kode Pos Latitude Longitude Deskripsi {!isEdit ? 'Simpan' : 'Simpan Perubahan'} ); }