upload foto, dan bugs import

This commit is contained in:
pajri
2022-12-21 17:22:45 +07:00
parent 88ad144921
commit b1c908a6f6
12 changed files with 576 additions and 169 deletions

View File

@@ -42,6 +42,7 @@ import { Corporate } from '../../@types/corporates';
import axios from '../../utils/axios';
import { fCurrency } from '../../utils/formatNumber';
import RHFAutocomplete from '../../components/hook-form/RHFAutocomplete';
import UploadImage from '../../components/UploadImage';
const LabelStyle = styled(Typography)(({ theme }) => ({
...theme.typography.subtitle2,
@@ -61,7 +62,7 @@ type Props = {
export default function CorporateForm({ isEdit, currentCorporate }: Props) {
const navigate = useNavigate();
const [corporate_groups, setCorporateGroups] = useState([])
const [corporate_groups, setCorporateGroups] = useState([]);
// const [ errors, setErrors ] = useState<{ [key: string]: string }>({});
@@ -72,10 +73,10 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
code: Yup.string().required('Corporate Code is required'),
active: Yup.boolean().required('Corporate Status is required'),
type: Yup.string().required('Type is required'),
parent_id: Yup.string().when("type", {
parent_id: Yup.string().when('type', {
is: 'subcorporate',
then: Yup.string().required("Corporate is required because type is Sub Corporate")
})
then: Yup.string().required('Corporate is required because type is Sub Corporate'),
}),
});
const defaultValues = useMemo(
@@ -88,16 +89,20 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
policy_id: currentCorporate?.current_policy?.id || '',
policy_code: currentCorporate?.current_policy?.code || '',
policy_total_premi: currentCorporate?.current_policy?.total_premi || 0,
policy_minimal_deposit_percentage: currentCorporate?.current_policy?.minimal_deposit_percentage || 50,
policy_minimal_deposit_percentage:
currentCorporate?.current_policy?.minimal_deposit_percentage || 50,
policy_minimal_deposit_net: currentCorporate?.current_policy?.minimal_deposit_net || 0,
policy_minimal_alert_percentage: currentCorporate?.current_policy?.minimal_alert_percentage || 25,
policy_minimal_alert_percentage:
currentCorporate?.current_policy?.minimal_alert_percentage || 25,
policy_minimal_alert_net: currentCorporate?.current_policy?.minimal_alert_net || 0,
policy_stop_service_percentage: currentCorporate?.current_policy?.minimal_stop_service_percentage || 25,
policy_stop_service_percentage:
currentCorporate?.current_policy?.minimal_stop_service_percentage || 25,
policy_stop_service_net: currentCorporate?.current_policy?.minimal_stop_service_net || 0,
policy_start: currentCorporate?.current_policy?.start || '',
policy_end: currentCorporate?.current_policy?.end || '',
linking_rules: currentCorporate?.linking_rules || ['nrik', 'nik', 'member_id'],
type: currentCorporate?.type || 'corporate'
type: currentCorporate?.type || 'corporate',
logo: currentCorporate?.logo || '',
}),
// eslint-disable-next-line react-hooks/exhaustive-deps
[currentCorporate]
@@ -129,35 +134,65 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
reset(defaultValues);
}
axios.get('/corporates/create')
axios
.get('/corporates/create')
.then((res) => {
setCorporateGroups(res.data.corporate_groups)
setCorporateGroups(res.data.corporate_groups);
})
.catch((err) => {
enqueueSnackbar("Opps, failed to get Corporate Group List", { variant: 'error' })
})
enqueueSnackbar('Opps, failed to get Corporate Group List', { variant: 'error' });
});
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [isEdit, currentCorporate]);
const currentImage = currentCorporate?.avatar_url;
const [file, setFile] = useState(null);
const [save, setSave] = useState(null);
console.log('save', save);
const onSubmit = async (data: FormValuesProps) => {
try {
const formData = new FormData();
formData.append('logo', file);
formData.append('name', data.name);
formData.append('code', data.code);
formData.append('active', data.active ? '1' : '0');
formData.append('type', data.type);
formData.append('welcome_message', data.welcome_message);
formData.append('help_text', data.help_text);
formData.append('policy_id', data.policy_id);
formData.append('policy_code', data.policy_code);
formData.append('policy_total_premi', data.policy_total_premi);
formData.append('policy_minimal_deposit_percentage', data.policy_minimal_deposit_percentage);
formData.append('policy_minimal_deposit_net', data.policy_minimal_deposit_net);
formData.append('policy_minimal_alert_percentage', data.policy_minimal_alert_percentage);
formData.append('policy_minimal_alert_net', data.policy_minimal_alert_net);
formData.append('policy_stop_service_percentage', data.policy_stop_service_percentage);
formData.append('policy_stop_service_net', data.policy_stop_service_net);
formData.append('policy_start', data.policy_start);
formData.append('policy_end', data.policy_end);
formData.append('linking_rules', data.linking_rules);
if (!isEdit) {
const response = await axios.post('/corporates', data);
const response = await axios.post('/corporates', formData);
} else {
const response = await axios.put('/corporates/' + currentCorporate?.id ?? '', data);
formData.append('_method', 'PUT');
const response = await axios.post(`/corporates/${currentCorporate?.id}`, formData);
}
reset();
enqueueSnackbar(!isEdit ? 'Corporate Created Successfully!' : 'Corporate Udpated Successfully!', { variant: 'success' });
enqueueSnackbar(
!isEdit ? 'Corporate Created Successfully!' : 'Corporate Udpated Successfully!',
{ variant: 'success' }
);
navigate('/corporates');
} catch (error: any) {
if (error && error.response.status === 422) {
for (const [key, value] of Object.entries(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 {
} else {
enqueueSnackbar(error.message ?? 'Failed Processing Request', { variant: 'error' });
}
}
@@ -183,100 +218,103 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
// Only Handle Change on Policy Total Premi
useEffect(() => {
let calc_policy_minimal_deposit_net = values.policy_total_premi * values.policy_minimal_deposit_percentage / 100;
let calc_policy_minimal_deposit_net =
(values.policy_total_premi * values.policy_minimal_deposit_percentage) / 100;
setValue('policy_minimal_deposit_net', calc_policy_minimal_deposit_net);
let calc_policy_minimal_alert_net = values.policy_total_premi * values.policy_minimal_alert_percentage / 100;
let calc_policy_minimal_alert_net =
(values.policy_total_premi * values.policy_minimal_alert_percentage) / 100;
setValue('policy_minimal_alert_net', calc_policy_minimal_alert_net);
let calc_policy_stop_service_net = values.policy_total_premi * values.policy_stop_service_percentage / 100;
let calc_policy_stop_service_net =
(values.policy_total_premi * values.policy_stop_service_percentage) / 100;
setValue('policy_stop_service_net', calc_policy_stop_service_net);
}, [values.policy_total_premi]);
// Only Handle on Change Policy Minimal Deposit
const handleMinimalDepositNetChange = (e) => {
setValue('policy_minimal_deposit_net', e.target.value);
setValue('policy_minimal_deposit_percentage', e.target.value / values.policy_total_premi * 100);
}
setValue(
'policy_minimal_deposit_percentage',
(e.target.value / values.policy_total_premi) * 100
);
};
const handleMinimalDepositPercentageChange = (e) => {
setValue('policy_minimal_deposit_percentage', e.target.value);
setValue('policy_minimal_deposit_net', values.policy_total_premi * e.target.value / 100);
}
setValue('policy_minimal_deposit_net', (values.policy_total_premi * e.target.value) / 100);
};
// Only Handle on Change Minimal Alert
const handleMinimalAlertNetChange = (e) => {
setValue('policy_minimal_alert_net', e.target.value);
setValue('policy_minimal_alert_percentage', e.target.value / values.policy_total_premi * 100);
}
setValue('policy_minimal_alert_percentage', (e.target.value / values.policy_total_premi) * 100);
};
const handleMinimalAlertPercentageChange = (e) => {
setValue('policy_minimal_alert_percentage', e.target.value);
setValue('policy_minimal_alert_net', values.policy_total_premi * e.target.value / 100);
}
setValue('policy_minimal_alert_net', (values.policy_total_premi * e.target.value) / 100);
};
// Only Handle on Change Minimum Stop Service
const handleStopServiceNetChange = (e) => {
setValue('policy_stop_service_net', e.target.value);
setValue('policy_stop_service_percentage', e.target.value / values.policy_total_premi * 100);
}
setValue('policy_stop_service_percentage', (e.target.value / values.policy_total_premi) * 100);
};
const handleStopServicePercentageChange = (e) => {
setValue('policy_stop_service_percentage', e.target.value);
setValue('policy_stop_service_net', values.policy_total_premi * e.target.value / 100);
}
setValue('policy_stop_service_net', (values.policy_total_premi * e.target.value) / 100);
};
const linking_rules_checkbox_name = "linking_rules"
const linking_rules_checkbox_name = 'linking_rules';
const linking_tools = [
{
"value" : "nrik",
"label" : "No. KTP"
value: 'nrik',
label: 'No. KTP',
},
{
"value" : "nik",
"label" : "Nomor Induk Karyawan (NIK)"
value: 'nik',
label: 'Nomor Induk Karyawan (NIK)',
},
{
"value" : "member_id",
"label" : "Member ID"
value: 'member_id',
label: 'Member ID',
},
{
"value" : "phone",
"label" : "Nomor Telepon"
value: 'phone',
label: 'Nomor Telepon',
},
{
"value" : "email",
"label" : "E-Mail"
value: 'email',
label: 'E-Mail',
},
]
];
const types = [
{
"value" : "corporate",
"label" : "Corporate"
value: 'corporate',
label: 'Corporate',
},
{
"value" : "subcorporate",
"label" : "Sub Corporate"
value: 'subcorporate',
label: 'Sub Corporate',
},
]
];
const options = [
{
"label" : "Something",
"id" : "Something"
label: 'Something',
id: 'Something',
},
{
"label" : "Syalalalal",
"id" : "Syalalalal"
label: 'Syalalalal',
id: 'Syalalalal',
},
{
"label" : "Lilili",
"id" : "Lilili"
label: 'Lilili',
id: 'Lilili',
},
]
];
const handleTypeChange = (event: SelectChangeEvent) => {
setValue('type', event.target.value)
}
setValue('type', event.target.value);
};
return (
<FormProvider methods={methods} onSubmit={handleSubmit(onSubmit)}>
@@ -285,7 +323,9 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
<Grid item xs={12} md={8}>
<Card sx={{ p: 3 }}>
<Stack spacing={3}>
<Grid item xs={12}><Typography variant='h5'>Corporate Profile</Typography></Grid>
<Grid item xs={12}>
<Typography variant="h5">Corporate Profile</Typography>
</Grid>
<RHFSelect name="type" label="Type" placeholder="Type">
<option value="" />
@@ -295,30 +335,40 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
</option>
))}
</RHFSelect>
{/* // TODO Use Autocomplete */}
{( values.type == 'subcorporate' && <RHFSelect name="parent_id" label="Parent Corporate Group" placeholder="Parent Corporate Group">
<option value="" />
{corporate_groups
.filter((option) => option.value != values.id)
.map((option, index) => (
<option key={index} value={option.value}>
{option.label}
</option>
))}
</RHFSelect> )}
{values.type == 'subcorporate' && (
<RHFSelect
name="parent_id"
label="Parent Corporate Group"
placeholder="Parent Corporate Group"
>
<option value="" />
{corporate_groups
.filter((option) => option.value != values.id)
.map((option, index) => (
<option key={index} value={option.value}>
{option.label}
</option>
))}
</RHFSelect>
)}
<RHFTextField name="code" label="Corporate Code" />
<RHFTextField name="name" label="Corporate Name" />
<Stack spacing={1}>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Welcome Message</Typography>
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Welcome Message
</Typography>
<RHFEditor name="welcome_message" />
</Stack>
<Stack spacing={1}>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Help Text</Typography>
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Help Text
</Typography>
<RHFEditor name="help_text" />
</Stack>
@@ -342,103 +392,149 @@ export default function CorporateForm({ isEdit, currentCorporate }: Props) {
<Grid item xs={12} md={4}>
<Stack spacing={3}>
<Card sx={{ p: 3 }}>
{ JSON.stringify(values.active) }
{JSON.stringify(values.active)}
<RHFSwitch name="active" label="Is Company Active" />
<Stack spacing={3} mt={2}>
<Stack spacing={3} mt={2} alignItems="center">
<Typography align="center">Company Logo</Typography>
<RHFUploadAvatar name="logo"
{/* <RHFUploadAvatar
name="logo"
showPreview
accept={'image/*'}
accept="image/*"
maxSize={3145728}
onDrop={handleDrop}
onRemove={handleRemove}
/>
/> */}
<UploadImage setFile={setFile} currentImage={currentImage} />
</Stack>
</Card>
<Card sx={{ p: 3 }}>
<Stack>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Linking Rules</Typography>
<Stack>
<RHFCustomMultiCheckbox name='linking_rules' options={linking_tools} />
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Linking Rules
</Typography>
<Stack>
<RHFCustomMultiCheckbox name="linking_rules" options={linking_tools} />
</Stack>
</Stack>
</Card>
</Stack>
</Grid>
{( values.type == 'corporate' && <Grid item xs={12} md={12}>
{/* <Card sx={{ p:3, mb:3, background: 'gray', color: 'white' }}><Typography>Policy Detail</Typography></Card> */}
<Card sx={{ p: 3 }}>
<Stack spacing={3} mt={2}>
<Grid item xs={12}><Typography variant='h5'>Policy Detail</Typography></Grid>
<input type="hidden" name="policy_id" />
<Stack spacing={1}>
<RHFTextField name="policy_code" label="Policy Number" />
{(!(currentCorporate?.id) && <Typography variant="caption">Will be generated if empty</Typography>)}
</Stack>
{/* <Typography>Minimal Deposit Policy Level</Typography> */}
<Stack direction="row" spacing={2}>
<Grid item xs={12} md={6}>
<RHFDatepicker name="policy_start" label="Start Date (YYYY-MM-DD)" />
{values.type == 'corporate' && (
<Grid item xs={12} md={12}>
{/* <Card sx={{ p:3, mb:3, background: 'gray', color: 'white' }}><Typography>Policy Detail</Typography></Card> */}
<Card sx={{ p: 3 }}>
<Stack spacing={3} mt={2}>
<Grid item xs={12}>
<Typography variant="h5">Policy Detail</Typography>
</Grid>
<Grid item xs={12} md={6}>
<RHFDatepicker name="policy_end" label="End Date (YYYY-MM-DD)" />
</Grid>
</Stack>
<RHFTextField name="policy_total_premi" label={"Deposit Intial Fund ("+fCurrency(values.policy_total_premi)+")"}/>
<input type="hidden" name="policy_id" />
<Stack spacing={1}>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Minimal Deposit Policy Level</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField name="policy_minimal_deposit_percentage" label="Percentage (%)" onChange={handleMinimalDepositPercentageChange}/>
<Stack spacing={1}>
<RHFTextField name="policy_code" label="Policy Number" />
{!currentCorporate?.id && (
<Typography variant="caption">Will be generated if empty</Typography>
)}
</Stack>
{/* <Typography>Minimal Deposit Policy Level</Typography> */}
<Stack direction="row" spacing={2}>
<Grid item xs={12} md={6}>
<RHFDatepicker name="policy_start" label="Start Date (YYYY-MM-DD)" />
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField name="policy_minimal_deposit_net" label={"Net ("+fCurrency(values.policy_minimal_deposit_net)+")"} onChange={handleMinimalDepositNetChange}/>
<Grid item xs={12} md={6}>
<RHFDatepicker name="policy_end" label="End Date (YYYY-MM-DD)" />
</Grid>
</Grid>
</Stack>
</Stack>
<Stack spacing={1}>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Minimal Alert Level</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField name="policy_minimal_alert_percentage" label="Percentage (%)" onChange={handleMinimalAlertPercentageChange}/>
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField name="policy_minimal_alert_net" label={"Net ("+fCurrency(values.policy_minimal_alert_net)+")"} onChange={handleMinimalAlertNetChange}/>
</Grid>
</Grid>
</Stack>
<RHFTextField
name="policy_total_premi"
label={'Deposit Intial Fund (' + fCurrency(values.policy_total_premi) + ')'}
/>
<Stack spacing={1}>
<Typography variant='subtitle2' sx={{ color: "text.secondary" }}>Stop Service Level</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField name="policy_stop_service_percentage" label="Percentage (%)" onChange={handleStopServicePercentageChange}/>
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField name="policy_stop_service_net" label={"Net ("+fCurrency(values.policy_stop_service_net)+")"} onChange={handleStopServiceNetChange}/>
</Grid>
</Grid>
<Stack spacing={1}>
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Minimal Deposit Policy Level
</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField
name="policy_minimal_deposit_percentage"
label="Percentage (%)"
onChange={handleMinimalDepositPercentageChange}
/>
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField
name="policy_minimal_deposit_net"
label={'Net (' + fCurrency(values.policy_minimal_deposit_net) + ')'}
onChange={handleMinimalDepositNetChange}
/>
</Grid>
</Grid>
</Stack>
<Stack spacing={1}>
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Minimal Alert Level
</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField
name="policy_minimal_alert_percentage"
label="Percentage (%)"
onChange={handleMinimalAlertPercentageChange}
/>
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField
name="policy_minimal_alert_net"
label={'Net (' + fCurrency(values.policy_minimal_alert_net) + ')'}
onChange={handleMinimalAlertNetChange}
/>
</Grid>
</Grid>
</Stack>
<Stack spacing={1}>
<Typography variant="subtitle2" sx={{ color: 'text.secondary' }}>
Stop Service Level
</Typography>
<Grid container>
<Grid item xs={12} md={3}>
<RHFTextField
name="policy_stop_service_percentage"
label="Percentage (%)"
onChange={handleStopServicePercentageChange}
/>
</Grid>
<Grid item xs={12} md={9}>
<RHFTextField
name="policy_stop_service_net"
label={'Net (' + fCurrency(values.policy_stop_service_net) + ')'}
onChange={handleStopServiceNetChange}
/>
</Grid>
</Grid>
</Stack>
</Stack>
</Stack>
</Card>
</Grid> )}
</Card>
</Grid>
)}
<Grid item xs={12} md={4}>
<LoadingButton type="submit" variant="contained" size="large" fullWidth={true} loading={isSubmitting}>
<LoadingButton
type="submit"
variant="contained"
size="large"
fullWidth={true}
loading={isSubmitting}
>
{!isEdit ? 'Save New Corporate' : 'Save Corporate'}
</LoadingButton>
</Grid>
</Grid>
</FormProvider>
);
};
}