Update validation, dll Hospital-Portal

This commit is contained in:
ivan
2023-07-20 11:51:44 +07:00
parent 5632e9ff29
commit 4c8570b542
28 changed files with 598 additions and 128 deletions

View File

@@ -1,5 +1,5 @@
import * as Yup from 'yup';
import { useState } from 'react';
import React, { useContext, useRef, useState, useEffect } from 'react';
import { Link as RouterLink, useNavigate } from 'react-router-dom';
// form
import { useForm } from 'react-hook-form';
@@ -15,6 +15,7 @@ import useIsMountedRef from '@/hooks/useIsMountedRef';
// components
import Iconify from '@/components/Iconify';
import { FormProvider, RHFTextField, RHFCheckbox } from '@/components/hook-form';
import { LanguageContext } from '@/contexts/LanguageContext';
// ----------------------------------------------------------------------
@@ -26,6 +27,7 @@ type FormValuesProps = {
};
export default function LoginForm() {
const { localeData } = useContext(LanguageContext);
const { login } = useAuth();
const navigate = useNavigate();
@@ -34,8 +36,8 @@ export default function LoginForm() {
const [showPassword, setShowPassword] = useState(false);
const LoginSchema = Yup.object().shape({
email: Yup.string().email('Email must be a valid email address').required('Email is required'),
password: Yup.string().required('Password is required'),
email: Yup.string().email('Format email tidak valid').required('Email harus diisi'),
password: Yup.string().required('Password harus diisi'),
});
const defaultValues = {
@@ -75,10 +77,10 @@ export default function LoginForm() {
return (
<FormProvider methods={methods} onSubmit={handleSubmit(onSubmit)}>
<Stack spacing={3}>
<Alert severity="info">Email : admin@linksehat.dev & Password : password</Alert>
{!!errors.afterSubmit && <Alert severity="error">{errors.afterSubmit.message}</Alert>}
<Alert severity="info">{localeData.infoLogin}</Alert>
{!!errors.afterSubmit && <Alert severity="error">{errors.afterSubmit.data.meta.message}</Alert>}
<RHFTextField name="email" label="Email address" />
<RHFTextField name="email" label="Email" required/>
<RHFTextField
name="password"
@@ -93,14 +95,15 @@ export default function LoginForm() {
</InputAdornment>
),
}}
required
/>
</Stack>
<Stack direction="row" alignItems="center" justifyContent="space-between" sx={{ my: 2 }}>
<RHFCheckbox name="remember" label="Remember me" />
{/*<RHFCheckbox name="remember" label="Remember me" />
<Link component={RouterLink} variant="subtitle2" to={PATH_AUTH.resetPassword}>
Forgot password?
</Link>
</Link>*/}
</Stack>
<LoadingButton
@@ -109,6 +112,7 @@ export default function LoginForm() {
type="submit"
variant="contained"
loading={isSubmitting}
sx={{ marginTop: 2 }}
>
Login
</LoadingButton>

View File

@@ -13,7 +13,7 @@ import {
} from '@mui/material';
import { ChevronRight } from '@mui/icons-material';
// React
import React, { useState } from 'react';
import React, { useContext, useState } from 'react';
import { LoadingButton } from '@mui/lab';
import Iconify from '@/components/Iconify';
import { DatePicker, LocalizationProvider, MobileDatePicker } from '@mui/x-date-pickers';
@@ -25,6 +25,7 @@ import MuiDialog from '@/components/MuiDialog';
import axios from '@/utils/axios';
import { useSnackbar } from 'notistack';
import DialogMember from './DialogMember';
import { LanguageContext } from '@/contexts/LanguageContext';
// ----------------------------------------------------------------------
@@ -46,29 +47,32 @@ const ItemNotificationStyle = styled(Card)(({ theme }) => ({
// ----------------------------------------------------------------------
export default function CardSearchMember(handleSubmitSuccess) {
const { localeData } = useContext(LanguageContext);
const {enqueueSnackbar} = useSnackbar();
const [noPolis, setNoPolis] = useState('AW001-01');
const [tanggalLahir, setTanggalLahir] = useState('1991-01-10');
const [birthDate, setBirthDate] = useState('1991-01-10');
const [loadingBenefit, setLoadingBenefit] = useState(false);
const [loadingClaim, setLoadingClaim] = useState(false);
const [openDialogBenefit, setOpenDialogBenefit] = useState(false);
const [openDialogClaim, setOpenDialogClaim] = useState(false);
const [currentMember, setCurrentMember] = useState(null);
const [nameMember, setNameMember] = useState('');
function handleSearchMember() {
setLoadingBenefit(true)
axios.post('/search-member', {
no_polis: noPolis,
birth_date: tanggalLahir ? fPostFormat(tanggalLahir, 'yyyy-MM-dd') : null
birth_date: birthDate ? fPostFormat(birthDate, 'yyyy-MM-dd') : null
})
.then((response) => {
setOpenDialogBenefit(true)
setCurrentMember(response.data.data)
setNameMember(response.data.data.name);
})
.catch(({response}) => {
enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.message : 'Opps, Something went Wrong!'), {variant : "error"})
enqueueSnackbar(response.data.errors ? response.data.errors[0] : (response.data ? response.data.meta.message : 'Opps, Something went Wrong!'), {variant : "error"})
})
.then(() => {
setLoadingBenefit(false)
@@ -90,23 +94,23 @@ export default function CardSearchMember(handleSubmitSuccess) {
component="span"
sx={{ display: 'flex', alignItems: 'center' }}
>
Pengajuan Jaminan
{localeData.txtCardSearchMember1}
</Typography>
</Typography>
</Stack>
<Stack gap={2}>
<TextField variant="outlined" label="Member ID" value={noPolis} onChange={(event) => {
<TextField variant="outlined" label={localeData.txtCardSearchMember4} value={noPolis} onChange={(event) => {
setNoPolis(event.target.value)
}}></TextField>
}} required></TextField>
<LocalizationProvider dateAdapter={AdapterDateFns}>
<DatePicker
label="Tanggal Lahir"
value={tanggalLahir}
label={localeData.txtCardSearchMember3}
value={birthDate}
onChange={(newValue) => {
setTanggalLahir( (newValue));
}}
inputFormat="dd-MM-yyyy"
renderInput={(params) => <TextField {...params} />}
renderInput={(params) => <TextField {...params} required/>}
/>
</LocalizationProvider>
@@ -124,7 +128,7 @@ export default function CardSearchMember(handleSubmitSuccess) {
}}
>
<Iconify icon="eva:eye-fill" marginRight={0.75} />
Cari Member
{localeData.txtCardSearchMember2}
</LoadingButton>
{/* <LoadingButton
variant="contained"
@@ -142,7 +146,7 @@ export default function CardSearchMember(handleSubmitSuccess) {
{/*
<DialogBenefit open={openDialogBenefit} setOpen={setOpenDialogBenefit}></DialogBenefit> */}
<MuiDialog
title={{name: "Member"}}
title={{name: nameMember}}
openDialog={openDialogBenefit}
setOpenDialog={setOpenDialogBenefit}
content={DialogMember(currentMember, () => {setOpenDialogBenefit(false); handleSubmitSuccess()})}

View File

@@ -4,20 +4,22 @@ import { LoadingButton, TabPanel } from "@mui/lab";
import { Button, Card, Divider, Grid, LinearProgress, linearProgressClasses, Typography } from "@mui/material";
import { Tab, Tabs } from "@mui/material";
import { Box, Stack } from "@mui/material";
import { useEffect, useState } from "react";
import React, { useEffect, useState, useContext } from "react";
import { fCurrency } from '@/utils/formatNumber';
import { fPostFormat } from '@/utils/formatTime';
import { Avatar } from '@mui/material';
import Iconify from '@/components/Iconify';
import FormRequestClaim from './FormRequestClaim';
import { LanguageContext } from '@/contexts/LanguageContext';
export default function DialogMember(member, handleSubmitSuccess) {
const { localeData } = useContext(LanguageContext);
const [currentTab, setCurrentTab] = useState('request')
// ----------------------------------------------------------------------
useEffect(() => {
setCurrentTab('benefit')
setCurrentTab('detail')
}, [member])
function handleChangeTab(event: React.SyntheticEvent, newValue: string) {
@@ -67,13 +69,93 @@ export default function DialogMember(member, handleSubmitSuccess) {
onChange={handleChangeTab}
aria-label="wrapped label tabs example"
>
<Tab
value="benefit"
label="Benefit Summary"
/>
<Tab value="request" label="Request Penjaminan" />
<Tab value="detail" label={localeData.txtDialogMember3} />
<Tab value="benefit" label={localeData.txtDialogMember1} />
<Tab value="request" label={localeData.txtDialogMember2} />
</Tabs>
<TabPanel value={currentTab} index={'detail'}>
<Stack spacing={2}>
<Grid container sx={{ pb: 2, mb: 2, borderBottom: 0 }}>
<Grid item xs={6}>
<Grid container>
<Grid item xs={6}>
Mapping ID
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Policy Number
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
NRIC
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
NIK
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Email
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
</Grid>
</Grid>
<Grid item xs={6}>
<Grid container>
<Grid item xs={6}>
Birth Date
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Gender
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Marital Status
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Language
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Race
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
<Grid item xs={6}>
Relationship
</Grid>
<Grid item xs={6}>
: {1 ?? '-'}
</Grid>
</Grid>
</Grid>
</Grid>
</Stack>
</TabPanel>
<TabPanel value={currentTab} index={'benefit'}>
<Grid container spacing={2}>
{ member && member?.current_plan?.corporate_benefits?.map((corporateBenefit, index) => {return (