@@ -125,7 +125,7 @@ | |||||
<Typography sx={{ mt: 2, mb: 1 }}> | <Typography sx={{ mt: 2, mb: 1 }}> | ||||
All steps completed - you're finished | All steps completed - you're finished | ||||
</Typography> | </Typography> | ||||
<Stack direction="row" sx={{ pt: 2 }}> | |||||
<Stack direction="row" sx={{ pb: 2 }}> | |||||
<Stack sx={{ flex: '1 1 auto' }} /> | <Stack sx={{ flex: '1 1 auto' }} /> | ||||
<Button onClick={handleReset}>Reset</Button> | <Button onClick={handleReset}>Reset</Button> | ||||
</Stack> | </Stack> | ||||
@@ -141,7 +141,7 @@ const AuthWrapper = Loadable(lazy(() => import('./AuthWrapperCustom'))); | |||||
<CustomFormWizard setUpdateValid={setUpdateValid} step={activeStep} /> | <CustomFormWizard setUpdateValid={setUpdateValid} step={activeStep} /> | ||||
{/* <CustomFormWizard step={activeStep} /> */} | {/* <CustomFormWizard step={activeStep} /> */} | ||||
</AuthWrapper> | </AuthWrapper> | ||||
<Stack direction="row" sx={{ pt: 2 }}> | |||||
<Stack direction="row" sx={{ pb: 2 }}> | |||||
{ activeStep === 2|| activeStep === 0? ( | { activeStep === 2|| activeStep === 0? ( | ||||
<Button | <Button | ||||
color="inherit" | color="inherit" | ||||
@@ -1,6 +1,8 @@ | |||||
import React, { | import React, { | ||||
useEffect, | useEffect, | ||||
useState} from 'react'; | |||||
useState, | |||||
lazy | |||||
} from 'react'; | |||||
import { Link as RouterLink } from 'react-router-dom'; | import { Link as RouterLink } from 'react-router-dom'; | ||||
import {useNavigate} from 'react-router-dom'; | import {useNavigate} from 'react-router-dom'; | ||||
import {useForm,} from 'react-hook-form' | import {useForm,} from 'react-hook-form' | ||||
@@ -29,6 +31,8 @@ import { useFormik,FormikProvider } from 'formik'; | |||||
// project import | // project import | ||||
//import FirebaseSocial from './FirebaseSocial'; | //import FirebaseSocial from './FirebaseSocial'; | ||||
import AnimateButton from 'components/@extended/AnimateButton'; | import AnimateButton from 'components/@extended/AnimateButton'; | ||||
import Loadable from 'components/Loadable'; | |||||
const PasswordAlertDialog = Loadable(lazy(() => import('./PasswordAlertDialog'))); | |||||
// assets | // assets | ||||
import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; | import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; | ||||
@@ -51,9 +55,9 @@ const AuthLoginCustom = () => { | |||||
// let [posts, setPosts] = useState([]); | // let [posts, setPosts] = useState([]); | ||||
const [isValid, setisValid] = useState(false); | const [isValid, setisValid] = useState(false); | ||||
const [isSuccess, setSuccess] = useState(); | |||||
const [isSumitting, setSumitting] = useState(); | |||||
// const [isSuccess, setSuccess] = useState(); | |||||
// const [isSumitting, setSumitting] = useState(); | |||||
const [open, setOpen] = React.useState(false); | |||||
// useEffect(() => { | // useEffect(() => { | ||||
// // console.log("POST: " + posts.accessToken); | // // console.log("POST: " + posts.accessToken); | ||||
// },[posts]); | // },[posts]); | ||||
@@ -64,7 +68,7 @@ const AuthLoginCustom = () => { | |||||
const tryLogin = () => { | const tryLogin = () => { | ||||
if(isValid){ | if(isValid){ | ||||
setSumitting(true) | |||||
// setSumitting(true) | |||||
useJwt | useJwt | ||||
.login({username: values.username, password: values.password}) | .login({username: values.username, password: values.password}) | ||||
.then((response) => { | .then((response) => { | ||||
@@ -77,16 +81,18 @@ const AuthLoginCustom = () => { | |||||
//avatar: require('src/assets/images/users/avatar-3.png').default, | //avatar: require('src/assets/images/users/avatar-3.png').default, | ||||
} | } | ||||
const data = {...userData, accessToken: response.data.accessToken, refreshToken: response.data.refreshToken} | const data = {...userData, accessToken: response.data.accessToken, refreshToken: response.data.refreshToken} | ||||
setSuccess(true) | |||||
// setSuccess(true) | |||||
dispatch(handleLogin(data)) | dispatch(handleLogin(data)) | ||||
navigate('/dashboard'); | navigate('/dashboard'); | ||||
setSumitting(false) | |||||
console.log(isSuccess) | |||||
// setSumitting(false) | |||||
}) | }) | ||||
.catch((error) => { | .catch((error) => { | ||||
setSuccess(false) | |||||
// setSuccess(false) | |||||
setOpen(true) | |||||
console.error(error) | console.error(error) | ||||
}); | }); | ||||
}else{ | |||||
setOpen(true) | |||||
} | } | ||||
} | } | ||||
@@ -149,6 +155,10 @@ const AuthLoginCustom = () => { | |||||
// } | // } | ||||
// } | // } | ||||
const handleClose = () => { | |||||
setOpen(false); | |||||
}; | |||||
const { values } = formik | const { values } = formik | ||||
useEffect(() => { | useEffect(() => { | ||||
checkDataField(values) | checkDataField(values) | ||||
@@ -162,11 +172,6 @@ const AuthLoginCustom = () => { | |||||
<Grid container spacing={3}> | <Grid container spacing={3}> | ||||
<Grid item xs={12}> | <Grid item xs={12}> | ||||
<Stack spacing={1}> | <Stack spacing={1}> | ||||
{!isSuccess && isSumitting && ( | |||||
<FormHelperText error id="standard-weight-helper-text-username-login"> | |||||
用戶登入名稱或密碼錯誤 | |||||
</FormHelperText> | |||||
)} | |||||
<InputLabel htmlFor="email-login">用戶登入名稱</InputLabel> | <InputLabel htmlFor="email-login">用戶登入名稱</InputLabel> | ||||
<OutlinedInput | <OutlinedInput | ||||
id="username" | id="username" | ||||
@@ -269,6 +274,7 @@ const AuthLoginCustom = () => { | |||||
{/* <FirebaseSocial />*/} | {/* <FirebaseSocial />*/} | ||||
{/*</Grid> */} | {/*</Grid> */} | ||||
</Grid> | </Grid> | ||||
<PasswordAlertDialog open={open} handleClose={handleClose}/> | |||||
</form> | </form> | ||||
</FormikProvider> | </FormikProvider> | ||||
); | ); | ||||
@@ -28,15 +28,16 @@ import * as yup from 'yup'; | |||||
// import AnimateButton from 'components/@extended/AnimateButton'; | // import AnimateButton from 'components/@extended/AnimateButton'; | ||||
import { strengthColorChi, strengthIndicator } from 'utils/password-strength'; | import { strengthColorChi, strengthIndicator } from 'utils/password-strength'; | ||||
import {apiPath} from "auth/utils"; | |||||
// import {apiPath} from "auth/utils"; | |||||
import axios from "axios"; | import axios from "axios"; | ||||
import {POST_PUBLIC_USER_REGISTER} from "utils/ApiPathConst"; | import {POST_PUBLIC_USER_REGISTER} from "utils/ApiPathConst"; | ||||
import * as HttpUtils from 'utils/HttpUtils'; | |||||
// import * as HttpUtils from 'utils/HttpUtils'; | |||||
import Loadable from 'components/Loadable'; | import Loadable from 'components/Loadable'; | ||||
import { lazy } from 'react'; | import { lazy } from 'react'; | ||||
const UploadFileTable = Loadable(lazy(() => import('./UploadFileTable'))); | const UploadFileTable = Loadable(lazy(() => import('./UploadFileTable'))); | ||||
const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); | const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); | ||||
const PreviewUploadFileTable = Loadable(lazy(() => import('./PreviewUploadFileTable'))); | |||||
// import UploadFileTable from './UploadFileTable'; | // import UploadFileTable from './UploadFileTable'; | ||||
// import LoadingComponent from "../../extra-pages/LoadingComponent"; | // import LoadingComponent from "../../extra-pages/LoadingComponent"; | ||||
@@ -57,6 +58,7 @@ const BusCustomFormWizard = (props) => { | |||||
const [fileListData, setFileListData] = useState([]); | const [fileListData, setFileListData] = useState([]); | ||||
const [checkUpload, setCheckUpload] = useState(false); | const [checkUpload, setCheckUpload] = useState(false); | ||||
const [isLoading, setLoding] = useState(true); | const [isLoading, setLoding] = useState(true); | ||||
const [updateRows, setUpdateRows] = useState([]); | |||||
const handleClickShowPassword = () => { | const handleClickShowPassword = () => { | ||||
setShowPassword(!showPassword); | setShowPassword(!showPassword); | ||||
@@ -92,7 +94,7 @@ const BusCustomFormWizard = (props) => { | |||||
+ "於所有文本、平面圖像、圖畫、圖片、照片以及數據或其他資料的匯編,均受版權保障。\n香" | + "於所有文本、平面圖像、圖畫、圖片、照片以及數據或其他資料的匯編,均受版權保障。\n香" | ||||
+ "港特別行政區政府是本網頁內所有版權作品的擁有人,除非預先得到政府物流服務署的書面" | + "港特別行政區政府是本網頁內所有版權作品的擁有人,除非預先得到政府物流服務署的書面" | ||||
+ "授權,否則嚴禁複製、改編、分發、發布或向公眾提供該等版權作品。" | + "授權,否則嚴禁複製、改編、分發、發布或向公眾提供該等版權作品。" | ||||
// const refType = "identification"; | |||||
const refType = "identification"; | |||||
useEffect(() => { | useEffect(() => { | ||||
changePassword(''); | changePassword(''); | ||||
@@ -186,12 +188,13 @@ const BusCustomFormWizard = (props) => { | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
if (!isDuplicate) { | |||||
if (!isDuplicate && i+currentIndex<5) { | |||||
file.id = currentIndex+i | file.id = currentIndex+i | ||||
saveFileList.push(file) | saveFileList.push(file) | ||||
updateList.items.add(file); | updateList.items.add(file); | ||||
} | } | ||||
console.log("currentIndex") | |||||
console.log(currentIndex) | |||||
} | } | ||||
let updatedFileList = updateList.files; | let updatedFileList = updateList.files; | ||||
@@ -247,9 +250,8 @@ const BusCustomFormWizard = (props) => { | |||||
tncFlag = false | tncFlag = false | ||||
} | } | ||||
if (isValid){ | |||||
axios.post(`${apiPath}${POST_PUBLIC_USER_REGISTER}`, { | |||||
username: values.username, | |||||
const user = { | |||||
username: values.username, | |||||
password: values.password, | password: values.password, | ||||
name: values.username, | name: values.username, | ||||
enCompanyName: values.enCompanyName, | enCompanyName: values.enCompanyName, | ||||
@@ -257,27 +259,36 @@ const BusCustomFormWizard = (props) => { | |||||
emailBus: values.email, | emailBus: values.email, | ||||
brNo:values.brNo, | brNo:values.brNo, | ||||
brExpiryDate:values.brExpiryDate, | brExpiryDate:values.brExpiryDate, | ||||
userFaxNo:userFaxNo, | |||||
busUserContactTel:busUserContactTel, | |||||
busUserAddress:busUserAddress, | |||||
contactPerson: values.enName, | contactPerson: values.enName, | ||||
tncFlag:tncFlag, | tncFlag:tncFlag, | ||||
type:"ORG" | type:"ORG" | ||||
}; | |||||
var formData = new FormData(); | |||||
for (let i = 0; i < fileListData.length; i++){ | |||||
const file = fileListData[i] | |||||
formData.append("multipartFileList", file); | |||||
} | |||||
formData.append("refType", refType); | |||||
for (const [key, value] of Object.entries(user)) { | |||||
formData.append(key, value); | |||||
} | |||||
formData.append("userFaxNo", JSON.stringify(userFaxNo)); | |||||
formData.append("busUserContactTel", JSON.stringify(busUserContactTel)); | |||||
formData.append("busUserAddress", JSON.stringify(busUserAddress)); | |||||
if (isValid){ | |||||
axios.post(POST_PUBLIC_USER_REGISTER, formData,{ | |||||
headers: { | |||||
"Content-Type":"multipart/form-data" | |||||
} | |||||
}) | }) | ||||
.then((response) => { | .then((response) => { | ||||
console.log(response) | |||||
setCheckUpload(true) | setCheckUpload(true) | ||||
HttpUtils.fileUpload( | |||||
{ | |||||
refType:"brFile", | |||||
refId: response.data.id, | |||||
file: fileList[0], | |||||
onSuccess: (response)=>{ | |||||
console.log(response); | |||||
setLoding(false); | |||||
// setOpen(true); | |||||
} | |||||
} | |||||
); | |||||
setLoding(false); | |||||
}) | }) | ||||
.catch(error => { | .catch(error => { | ||||
console.error(error); | console.error(error); | ||||
@@ -319,7 +330,6 @@ const BusCustomFormWizard = (props) => { | |||||
var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; | var validRegex = /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/; | ||||
// var result = reg.test(email); | // var result = reg.test(email); | ||||
var result = email.match(validRegex); | var result = email.match(validRegex); | ||||
console.log("test1: "+result) | |||||
if (result == false) { | if (result == false) { | ||||
return false; | return false; | ||||
} | } | ||||
@@ -879,7 +889,14 @@ const BusCustomFormWizard = (props) => { | |||||
value={formik.values.phoneCountryCode} | value={formik.values.phoneCountryCode} | ||||
name="phoneCountryCode" | name="phoneCountryCode" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("phoneCountryCode",value); | |||||
}} | |||||
placeholder="國際區號" | placeholder="國際區號" | ||||
error={Boolean(formik.touched.phone && formik.errors.phone)} | error={Boolean(formik.touched.phone && formik.errors.phone)} | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
@@ -899,7 +916,14 @@ const BusCustomFormWizard = (props) => { | |||||
value={formik.values.phone} | value={formik.values.phone} | ||||
name="phone" | name="phone" | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("phone",value); | |||||
}} | |||||
placeholder="聯絡電話" | placeholder="聯絡電話" | ||||
error={Boolean(formik.touched.phone && formik.errors.phone)} | error={Boolean(formik.touched.phone && formik.errors.phone)} | ||||
inputProps={{ | inputProps={{ | ||||
@@ -935,7 +959,14 @@ const BusCustomFormWizard = (props) => { | |||||
value={formik.values.faxCountryCode} | value={formik.values.faxCountryCode} | ||||
name="faxCountryCode" | name="faxCountryCode" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("faxCountryCode",value); | |||||
}} | |||||
placeholder="國際區號" | placeholder="國際區號" | ||||
inputProps={{ | inputProps={{ | ||||
maxLength: 3, | maxLength: 3, | ||||
@@ -953,7 +984,14 @@ const BusCustomFormWizard = (props) => { | |||||
value={formik.values.fax} | value={formik.values.fax} | ||||
name="fax" | name="fax" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("fax",value); | |||||
}} | |||||
placeholder="傳真號碼" | placeholder="傳真號碼" | ||||
inputProps={{ | inputProps={{ | ||||
maxLength: 8, | maxLength: 8, | ||||
@@ -980,7 +1018,7 @@ const BusCustomFormWizard = (props) => { | |||||
<span style={{color: '#f10000'}}>*</span> | <span style={{color: '#f10000'}}>*</span> | ||||
</Typography> | </Typography> | ||||
<Typography display="inline" variant="h6" sx={{ fontSize: 12,color: 'primary.primary'}}>請上傳你的 有效商業登記證及其他文件 的數碼檔案,以驗證你的身份。</Typography> | <Typography display="inline" variant="h6" sx={{ fontSize: 12,color: 'primary.primary'}}>請上傳你的 有效商業登記證及其他文件 的數碼檔案,以驗證你的身份。</Typography> | ||||
<Typography display="inline" variant="h6" sx={{ fontSize: 12,color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> | |||||
{/* <Typography display="inline" variant="h6" sx={{ fontSize: 12,color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> */} | |||||
<Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | ||||
<Button variant="contained" component="label" sx={{ fontSize: 12,height:'40px'}}>上傳商業登記證及其他文件 | <Button variant="contained" component="label" sx={{ fontSize: 12,height:'40px'}}>上傳商業登記證及其他文件 | ||||
<input | <input | ||||
@@ -996,7 +1034,7 @@ const BusCustomFormWizard = (props) => { | |||||
{/* <Typography display="inline" variant="h6" sx={{ fontSize: 12, color: 'primary.primary'}}></Typography> */} | {/* <Typography display="inline" variant="h6" sx={{ fontSize: 12, color: 'primary.primary'}}></Typography> */} | ||||
</Stack> | </Stack> | ||||
{fileList !=null? | {fileList !=null? | ||||
<UploadFileTable recordList={fileListData} />:null} | |||||
<UploadFileTable key="uploadTable" recordList={fileListData} setUpdateRows={setUpdateRows}/>:null} | |||||
{/* <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | {/* <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | ||||
<Button variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | <Button variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | ||||
<Button disabled={!formik.isValid} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | <Button disabled={!formik.isValid} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | ||||
@@ -1221,7 +1259,17 @@ const BusCustomFormWizard = (props) => { | |||||
</Typography> | </Typography> | ||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
<Grid item xs={12} md={12} mt={1} mb={1}> | |||||
<Grid container> | |||||
<Grid item xs={12} md={12}> | |||||
<Stack spacing={1} direction="column" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}> | |||||
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary'}}>身份證明文件</Typography> | |||||
{fileList !=null? | |||||
<PreviewUploadFileTable key="previewTable" recordList={fileListData} />:null} | |||||
</Stack> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | |||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -36,6 +36,7 @@ import * as ComboData from "../../../utils/ComboData"; | |||||
import Loadable from 'components/Loadable'; | import Loadable from 'components/Loadable'; | ||||
import { lazy } from 'react'; | import { lazy } from 'react'; | ||||
const UploadFileTable = Loadable(lazy(() => import('./UploadFileTable'))); | const UploadFileTable = Loadable(lazy(() => import('./UploadFileTable'))); | ||||
const PreviewUploadFileTable = Loadable(lazy(() => import('./PreviewUploadFileTable'))); | |||||
const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); | const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent'))); | ||||
// import UploadFileTable from './UploadFileTable'; | // import UploadFileTable from './UploadFileTable'; | ||||
// import LoadingComponent from "../../extra-pages/LoadingComponent"; | // import LoadingComponent from "../../extra-pages/LoadingComponent"; | ||||
@@ -58,6 +59,7 @@ const CustomFormWizard = (props) => { | |||||
const [fileList, setFileList] = useState([]); | const [fileList, setFileList] = useState([]); | ||||
const [fileListData, setFileListData] = useState([]); | const [fileListData, setFileListData] = useState([]); | ||||
const [checkUpload, setCheckUpload] = useState(false); | const [checkUpload, setCheckUpload] = useState(false); | ||||
const [isLoading, setLoding] = useState(true); | |||||
const [updateRows, setUpdateRows] = useState([]); | const [updateRows, setUpdateRows] = useState([]); | ||||
const handleClickShowPassword = () => { | const handleClickShowPassword = () => { | ||||
@@ -83,7 +85,6 @@ const CustomFormWizard = (props) => { | |||||
const [termsAndConAccept, setTermsAndConAccept] = useState(false); | const [termsAndConAccept, setTermsAndConAccept] = useState(false); | ||||
const [termsAndConNotAccept, setTermsAndConNotAccept] = useState(false); | const [termsAndConNotAccept, setTermsAndConNotAccept] = useState(false); | ||||
const [isValid, setisValid] = useState(false); | const [isValid, setisValid] = useState(false); | ||||
const [isLoading, setLoding] = useState(true); | |||||
const idDocTypeComboList = ComboData.idDocType; | const idDocTypeComboList = ComboData.idDocType; | ||||
const address4ComboList = ComboData.district; | const address4ComboList = ComboData.district; | ||||
@@ -191,7 +192,7 @@ const CustomFormWizard = (props) => { | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
if (!isDuplicate) { | |||||
if (!isDuplicate && i+currentIndex<5) { | |||||
file.id = currentIndex+i | file.id = currentIndex+i | ||||
saveFileList.push(file) | saveFileList.push(file) | ||||
updateList.items.add(file); | updateList.items.add(file); | ||||
@@ -287,9 +288,6 @@ const CustomFormWizard = (props) => { | |||||
// formData.append("refCode", refCode); | // formData.append("refCode", refCode); | ||||
// } | // } | ||||
console.log("formData:") | |||||
console.log(formData) | |||||
if (isValid){ | if (isValid){ | ||||
axios.post(POST_PUBLIC_USER_REGISTER, formData,{ | axios.post(POST_PUBLIC_USER_REGISTER, formData,{ | ||||
headers: { | headers: { | ||||
@@ -399,9 +397,9 @@ const CustomFormWizard = (props) => { | |||||
checkDigit:yup.string().max(1).required('請輸入括號內的數字或字母'), | checkDigit:yup.string().max(1).required('請輸入括號內的數字或字母'), | ||||
idDocType: yup.string().max(255).required('請輸入證件類別'), | idDocType: yup.string().max(255).required('請輸入證件類別'), | ||||
phoneCountryCode: yup.string().min(3,'請輸入3位數字').required('請輸入國際區號'), | phoneCountryCode: yup.string().min(3,'請輸入3位數字').required('請輸入國際區號'), | ||||
faxCountryCode: yup.string().min(3,'請輸入3位數字'), | |||||
// faxCountryCode: yup.string().min(3,'請輸入3位數字'), | |||||
phone: yup.string().min(8,'請輸入8位數字').required('請輸入聯絡電話'), | phone: yup.string().min(8,'請輸入8位數字').required('請輸入聯絡電話'), | ||||
fax: yup.string().min(8,'請輸入8位數字'), | |||||
// fax: yup.string().min(8,'請輸入8位數字'), | |||||
}), | }), | ||||
}); | }); | ||||
@@ -959,7 +957,14 @@ const CustomFormWizard = (props) => { | |||||
value={formik.values.phoneCountryCode} | value={formik.values.phoneCountryCode} | ||||
name="phoneCountryCode" | name="phoneCountryCode" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("phoneCountryCode",value); | |||||
}} | |||||
placeholder="國際區號" | placeholder="國際區號" | ||||
error={Boolean(formik.touched.phone && formik.errors.phone)} | error={Boolean(formik.touched.phone && formik.errors.phone)} | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
@@ -979,7 +984,14 @@ const CustomFormWizard = (props) => { | |||||
value={formik.values.phone} | value={formik.values.phone} | ||||
name="phone" | name="phone" | ||||
// onBlur={formik.handleBlur} | // onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("phone",value); | |||||
}} | |||||
placeholder="聯絡電話" | placeholder="聯絡電話" | ||||
error={Boolean(formik.touched.phone && formik.errors.phone)} | error={Boolean(formik.touched.phone && formik.errors.phone)} | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
@@ -1015,7 +1027,14 @@ const CustomFormWizard = (props) => { | |||||
type="faxCountryCode" | type="faxCountryCode" | ||||
value={formik.values.faxCountryCode} | value={formik.values.faxCountryCode} | ||||
name="faxCountryCode" | name="faxCountryCode" | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("faxCountryCode",value); | |||||
}} | |||||
placeholder="國際區號" | placeholder="國際區號" | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
inputProps={{ | inputProps={{ | ||||
@@ -1034,7 +1053,14 @@ const CustomFormWizard = (props) => { | |||||
value={formik.values.fax} | value={formik.values.fax} | ||||
name="fax" | name="fax" | ||||
onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
onChange={formik.handleChange} | |||||
// onChange={formik.handleChange} | |||||
onChange={(event) => { | |||||
const value = event.target.value; | |||||
if (value.match(/[^0-9]/)) { | |||||
return event.preventDefault(); | |||||
} | |||||
formik.setFieldValue("fax",value); | |||||
}} | |||||
placeholder="傳真號碼" | placeholder="傳真號碼" | ||||
inputProps={{ | inputProps={{ | ||||
maxLength: 8, | maxLength: 8, | ||||
@@ -1075,7 +1101,7 @@ const CustomFormWizard = (props) => { | |||||
<Typography display="inline" variant="h6" sx={{ fontSize: 12, color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> | <Typography display="inline" variant="h6" sx={{ fontSize: 12, color: 'primary.primary'}}>如: 香港身份證; 護照; 中國內地身份證等</Typography> | ||||
</Stack> | </Stack> | ||||
{fileList !=null? | {fileList !=null? | ||||
<UploadFileTable recordList={fileListData} setUpdateRows={setUpdateRows} disableDelete={false}/>:null} | |||||
<UploadFileTable key="uploadTable" recordList={fileListData} setUpdateRows={setUpdateRows}/>:null} | |||||
{/* <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | {/* <Stack mt={1} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | ||||
<Button variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | <Button variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | ||||
<Button disabled={!formik.isValid} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | <Button disabled={!formik.isValid} variant="contained" type="submit" sx={{ fontSize: 12,height:'25px'}}>Submit</Button> | ||||
@@ -1296,13 +1322,11 @@ const CustomFormWizard = (props) => { | |||||
<Stack spacing={1} direction="column" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}> | <Stack spacing={1} direction="column" justifyContent="space-between" alignItems="baseline" sx={{ mb: { xs: -0.5, sm: 0.5 } }}> | ||||
<Typography display="inline" variant="h4" sx={{ color: 'primary.primary'}}>身份證明文件</Typography> | <Typography display="inline" variant="h4" sx={{ color: 'primary.primary'}}>身份證明文件</Typography> | ||||
{fileList !=null? | {fileList !=null? | ||||
<UploadFileTable recordList={fileListData} updateRows={updateRows} disableDelete={true}/>:null} | |||||
<PreviewUploadFileTable key="previewTable" recordList={fileListData} />:null} | |||||
</Stack> | </Stack> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
</Grid> | </Grid> | ||||
@@ -0,0 +1,48 @@ | |||||
import React, { | |||||
// useEffect, | |||||
// useState | |||||
} from 'react'; | |||||
// material-ui | |||||
import { | |||||
Button, | |||||
// Link, | |||||
Stack, | |||||
Typography, | |||||
Dialog, | |||||
DialogActions, | |||||
DialogContent, | |||||
DialogContentText, | |||||
DialogTitle | |||||
} from '@mui/material'; | |||||
import CancelOutlinedIcon from '@mui/icons-material/CancelOutlined'; | |||||
const PasswordAlertDialog = (props) => { | |||||
return ( | |||||
<Dialog | |||||
open={props.open} | |||||
onClose={props.handleClose} | |||||
aria-labelledby="alert-dialog-title" | |||||
aria-describedby="alert-dialog-description" | |||||
> | |||||
<DialogTitle id="alert-dialog-title"> | |||||
<Stack mt={1} mr={4} direction="row" justifyContent="flex-start" alignItems="center" spacing={2}> | |||||
<CancelOutlinedIcon color="error" sx={{width:"35px",height:"40px"}}/> | |||||
<Typography display="inline" variant="h4">用戶名或密碼錯誤</Typography> | |||||
</Stack> | |||||
</DialogTitle> | |||||
<DialogContent> | |||||
<DialogContentText id="alert-dialog-description"> | |||||
{""} | |||||
</DialogContentText> | |||||
</DialogContent> | |||||
<DialogActions> | |||||
<Button variant="contained" color="error" onClick={props.handleClose} autoFocus> | |||||
關閉 | |||||
</Button> | |||||
</DialogActions> | |||||
</Dialog> | |||||
); | |||||
}; | |||||
export default PasswordAlertDialog; |
@@ -0,0 +1,107 @@ | |||||
// material-ui | |||||
import * as React from 'react'; | |||||
import { | |||||
DataGrid, | |||||
// GridActionsCellItem, | |||||
// GridRowModes | |||||
} from "@mui/x-data-grid"; | |||||
// import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline'; | |||||
import {useEffect} from "react"; | |||||
// import {useNavigate} from "react-router-dom"; | |||||
// import { useTheme } from '@mui/material/styles'; | |||||
import { | |||||
Box, | |||||
Stack | |||||
} from '@mui/material'; | |||||
// ==============================|| EVENT TABLE ||============================== // | |||||
export default function PreviewUploadFileTable({recordList,}) { | |||||
const [rows, setRows] = React.useState(recordList); | |||||
const [rowModesModel] = React.useState({}); | |||||
// const theme = useTheme(); | |||||
// const navigate = useNavigate() | |||||
useEffect(() => { | |||||
setRows(recordList); | |||||
}, [recordList]); | |||||
function NoRowsOverlay() { | |||||
return ( | |||||
<Stack height="100%" alignItems="center" justifyContent="center"> | |||||
沒有上傳檔案 | |||||
{/* <pre>(rows={[]})</pre> */} | |||||
</Stack> | |||||
); | |||||
} | |||||
// const handleCancelClick = (id) => () => { | |||||
// setRowModesModel({ | |||||
// ...rowModesModel, | |||||
// [id]: { mode: GridRowModes.View, ignoreModifications: true }, | |||||
// }); | |||||
// console.log("Starting Delete") | |||||
// const editedRow = rows.find((row) => row.id === id); | |||||
// console.log(editedRow) | |||||
// console.log(editedRow.isNew) | |||||
// setUpdateRows(rows.filter((row) => row.id !== id)); | |||||
// setRows(rows.filter((row) => row.id !== id)); | |||||
// } | |||||
const columns = [ | |||||
// { | |||||
// field: 'actions', | |||||
// type: 'actions', | |||||
// headerName: '', | |||||
// width: 30, | |||||
// cellClassName: 'actions', | |||||
// getActions: ({id}) => { | |||||
// return [ | |||||
// <GridActionsCellItem | |||||
// key="OutSave" | |||||
// icon={<RemoveCircleOutlineIcon/>} | |||||
// label="delete" | |||||
// className="textPrimary" | |||||
// onClick={handleCancelClick(id)} | |||||
// color="error" | |||||
// />] | |||||
// }, | |||||
// }, | |||||
{ | |||||
id: 'name', | |||||
field: 'name', | |||||
headerName: '檔案名稱', | |||||
flex: 1, | |||||
}, | |||||
{ | |||||
id: 'size', | |||||
field: 'size', | |||||
headerName: '檔案大小', | |||||
valueGetter: (params) => { | |||||
// console.log(params) | |||||
return Math.ceil(params.value/1024)+" KB"; | |||||
}, | |||||
flex: 1, | |||||
}, | |||||
]; | |||||
return ( | |||||
<Box style={{ height: '200px', width: '100%' }}> | |||||
<DataGrid | |||||
rows={rows} | |||||
columns={columns} | |||||
editMode="row" | |||||
sx={{border:1}} | |||||
rowModesModel={rowModesModel} | |||||
disablePagination | |||||
components={{ NoRowsOverlay, }} | |||||
// hideFooterPagination={true} | |||||
disableSelectionOnClick | |||||
disableColumnMenu | |||||
disableColumnSelector | |||||
hideFooter | |||||
/> | |||||
</Box> | |||||
); | |||||
} |
@@ -15,7 +15,7 @@ import { | |||||
} from '@mui/material'; | } from '@mui/material'; | ||||
// ==============================|| EVENT TABLE ||============================== // | // ==============================|| EVENT TABLE ||============================== // | ||||
export default function UploadFileTable({recordList, setUpdateRows, disableDelete}) { | |||||
export default function UploadFileTable({recordList, setUpdateRows,}) { | |||||
const [rows, setRows] = React.useState(recordList); | const [rows, setRows] = React.useState(recordList); | ||||
const [rowModesModel,setRowModesModel] = React.useState({}); | const [rowModesModel,setRowModesModel] = React.useState({}); | ||||
@@ -25,12 +25,9 @@ export default function UploadFileTable({recordList, setUpdateRows, disableDelet | |||||
useEffect(() => { | useEffect(() => { | ||||
setRows(recordList); | setRows(recordList); | ||||
// console.log(disableDelete); | |||||
}, [recordList]); | }, [recordList]); | ||||
// useEffect(() => { | |||||
// console.log(updateRows); | |||||
// }, [updateRows]); | |||||
function NoRowsOverlay() { | function NoRowsOverlay() { | ||||
return ( | return ( | ||||
<Stack height="100%" alignItems="center" justifyContent="center"> | <Stack height="100%" alignItems="center" justifyContent="center"> | ||||
@@ -60,7 +57,7 @@ export default function UploadFileTable({recordList, setUpdateRows, disableDelet | |||||
headerName: '', | headerName: '', | ||||
width: 30, | width: 30, | ||||
cellClassName: 'actions', | cellClassName: 'actions', | ||||
hide:{disableDelete}, | |||||
// hide:true, | |||||
getActions: ({id}) => { | getActions: ({id}) => { | ||||
return [ | return [ | ||||
<GridActionsCellItem | <GridActionsCellItem | ||||