498 lines
17 KiB
TypeScript
498 lines
17 KiB
TypeScript
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<Organizations> {
|
|
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 (
|
|
<Chip
|
|
label={value ? 'Aktif' : 'Tidak Aktif'}
|
|
size="medium"
|
|
sx={{
|
|
backgroundColor: value ? 'rgba(84, 214, 44, 0.16)' : 'rgba(255, 72, 66, 0.16)',
|
|
color: value ? '#229A16' : '#B72136',
|
|
padding: '1 8 1 8 px',
|
|
borderRadius: '4px',
|
|
fontSize: '12px',
|
|
fontWeight: 'bold',
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|
|
const methods = useForm<FormValuesProps>({
|
|
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<any>([]);
|
|
const [city, setCity] = useState<any>([]);
|
|
const [district, setDistrict] = useState<any>([]);
|
|
const [village, setVillage] = useState<any>([]);
|
|
|
|
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 (
|
|
<FormProvider methods={methods} onSubmit={handleSubmit(onSubmit)}>
|
|
<Stack spacing={3}>
|
|
<Card sx={{ p: 5 }}>
|
|
<HeaderStyle>
|
|
<Grid item xs={6} md={6}>
|
|
<Title>Data Rumah Sakit</Title>
|
|
</Grid>
|
|
<Grid item xs={6} md={6}>
|
|
{/* <Typography>Status Rumah Sakit</Typography> */}
|
|
<RHFSwitch name="active" label="" />
|
|
<StatusLabel value={values.active} />
|
|
</Grid>
|
|
</HeaderStyle>
|
|
<Box sx={{ width: '100%', typography: 'body1', mt: 2 }}>
|
|
<Grid container rowSpacing={4} columnSpacing={{ xs: 1, sm: 2, md: 3 }}>
|
|
<Grid item xs={12}>
|
|
<LabelStyle>Nama Rumah Sakit</LabelStyle>
|
|
<RHFTextField name="name" placeholder="Tuliskan Nama Rumah Sakit" />
|
|
</Grid>
|
|
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Code Rumah Sakit</LabelStyle>
|
|
<RHFTextField name="code" placeholder="Tuliskan Code Rumah Sakit" />
|
|
</Grid>
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Nomor IGD</LabelStyle>
|
|
<RHFTextField name="phone" placeholder="Tuliskan No IGD" />
|
|
</Grid>
|
|
<Grid item xs={12}>
|
|
<LabelStyle>Alamat</LabelStyle>
|
|
<RHFTextField name="address" placeholder="Tuliskan Alamat" />
|
|
</Grid>
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Provinsi</LabelStyle>
|
|
|
|
<Controller
|
|
name="province_id"
|
|
control={control}
|
|
render={({ field: { onChange, value } }) => (
|
|
<Autocomplete
|
|
id="combo-box-demo"
|
|
options={province}
|
|
getOptionLabel={(option) => option.label ?? findValueProvince?.label ?? ''}
|
|
value={value}
|
|
onChange={(event: any, newValue: any) => {
|
|
console.log('newValue', newValue);
|
|
setValue('province_id', newValue?.value);
|
|
onChange(newValue);
|
|
}}
|
|
renderInput={(params) => (
|
|
<TextField {...params} label="Provinsi" variant="outlined" fullWidth />
|
|
)}
|
|
/>
|
|
)}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Kabupaten / Kota</LabelStyle>
|
|
|
|
<Controller
|
|
name="city_id"
|
|
control={control}
|
|
render={({ field: { onChange, value } }) => (
|
|
<Autocomplete
|
|
id="combo-box-demo"
|
|
options={city}
|
|
getOptionLabel={(option) => option.label ?? findValueCity?.label ?? ''}
|
|
value={value}
|
|
onChange={(event: any, newValue: any) => {
|
|
console.log('newValue', newValue);
|
|
setValue('city_id', newValue?.value);
|
|
onChange(newValue);
|
|
}}
|
|
renderInput={(params) => (
|
|
<TextField
|
|
{...params}
|
|
label="Kabupaten / Kota"
|
|
variant="outlined"
|
|
fullWidth
|
|
/>
|
|
)}
|
|
/>
|
|
)}
|
|
/>
|
|
</Grid>
|
|
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Kecamatan</LabelStyle>
|
|
|
|
<Controller
|
|
name="district_id"
|
|
control={control}
|
|
render={({ field: { onChange, value } }) => (
|
|
<Autocomplete
|
|
id="combo-box-demo"
|
|
options={district}
|
|
getOptionLabel={(option) => option.label ?? findValueDistrict?.label ?? ''}
|
|
value={value}
|
|
onChange={(event: any, newValue: any) => {
|
|
console.log('newValue', newValue);
|
|
setValue('district_id', newValue?.value);
|
|
onChange(newValue);
|
|
}}
|
|
renderInput={(params) => (
|
|
<TextField {...params} label="Kecamatan" variant="outlined" fullWidth />
|
|
)}
|
|
/>
|
|
)}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} md={6}>
|
|
<LabelStyle>Desa</LabelStyle>
|
|
|
|
<Controller
|
|
name="village_id"
|
|
control={control}
|
|
render={({ field: { onChange, value } }) => (
|
|
<Autocomplete
|
|
id="combo-box-demo"
|
|
options={village}
|
|
getOptionLabel={(option) => option.label ?? findValueVillage?.label ?? ''}
|
|
value={value}
|
|
onChange={(event: any, newValue: any) => {
|
|
console.log('newValue', newValue);
|
|
setValue('village_id', newValue?.value);
|
|
onChange(newValue);
|
|
}}
|
|
renderInput={(params) => (
|
|
<TextField {...params} label="Desa" variant="outlined" fullWidth />
|
|
)}
|
|
/>
|
|
)}
|
|
/>
|
|
</Grid>
|
|
<Grid item xs={12} md={4}>
|
|
<LabelStyle>Kode Pos</LabelStyle>
|
|
<RHFTextField name="postal_code" placeholder="Tuliskan Kode Pos" />
|
|
</Grid>
|
|
<Grid item xs={12} md={4}>
|
|
<LabelStyle>Latitude</LabelStyle>
|
|
<RHFTextField name="lat" placeholder="Tuliskan Lattitude" />
|
|
</Grid>
|
|
<Grid item xs={12} md={4}>
|
|
<LabelStyle>Longitude</LabelStyle>
|
|
<RHFTextField name="lng" placeholder="Tuliskan Longitude" />
|
|
</Grid>
|
|
<Grid item xs={12}>
|
|
<LabelStyle>Deskripsi</LabelStyle>
|
|
<RHFEditor name="description" placeholder="Tuliskan Deskripsi" />
|
|
</Grid>
|
|
</Grid>
|
|
</Box>
|
|
|
|
<Box sx={{ width: '100%', mt: 5 }}>
|
|
<Stack
|
|
alignItems="center"
|
|
justifyContent="end"
|
|
direction={{ xs: 'column', md: 'row' }}
|
|
sx={{ width: 1, textAlign: { xs: 'center', md: 'left' } }}
|
|
>
|
|
<Grid item xs={12} md={4}>
|
|
<LoadingButton
|
|
sx={{ boxShadow: '0px 2px 4px rgba(0, 0, 0, 0.1)' }}
|
|
type="submit"
|
|
variant="contained"
|
|
size="large"
|
|
// fullWidth={true}
|
|
loading={isSubmitting}
|
|
>
|
|
{!isEdit ? 'Simpan' : 'Simpan Perubahan'}
|
|
</LoadingButton>
|
|
</Grid>
|
|
</Stack>
|
|
</Box>
|
|
</Card>
|
|
</Stack>
|
|
</FormProvider>
|
|
);
|
|
}
|