| @@ -376,21 +376,66 @@ const CustomFormWizard = (props) => { | |||||
| } | } | ||||
| function handleIdNo(idNo,selectedIdDocType,checkDigit) { | function handleIdNo(idNo,selectedIdDocType,checkDigit) { | ||||
| var pattern = /^[A-Z][0-9]*$/; | |||||
| var space = /\s/; | |||||
| if (!idNo.match(pattern)) { | |||||
| return false; | |||||
| }else if | |||||
| (selectedIdDocType=="HKID"&&checkDigit==""){ | |||||
| return false; | |||||
| } | |||||
| else if (idNo.match(space)) { | |||||
| return false; | |||||
| }else if (idNo.length < 7) { | |||||
| return false; | |||||
| } else { | |||||
| // console.log("IdNo true") | |||||
| return true; | |||||
| // var pattern = /^[A-Z][0-9]*$/; | |||||
| var pattern_HKIDv1 = /^[A-Z]{1}[0-9]{6}$/; | |||||
| var pattern_HKIDv2 = /^[A-Z]{2}[0-9]{6}$/; | |||||
| var pattern_passport = /^[A-Z]{1}[0-9]{8}$/; | |||||
| var pattern_CHID = /^[0-9]{6}(20|19)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9X]{1}/; | |||||
| var pattern_otherCert = /^[A-Z]{1}[0-9]{5,}/; | |||||
| // var space = /\s/; | |||||
| // if (!idNo.match(pattern)) { | |||||
| // return false; | |||||
| // } else if (selectedIdDocType=="HKID"&&checkDigit==""){ | |||||
| // return false; | |||||
| // } else if (idNo.match(space)) { | |||||
| // return false; | |||||
| // } else if (idNo.length < 6) { | |||||
| // return false; | |||||
| // } else { | |||||
| // // console.log("IdNo true") | |||||
| // return true; | |||||
| // } | |||||
| switch (selectedIdDocType) { | |||||
| case "HKID": | |||||
| if (checkDigit === "") return false | |||||
| if (idNo.match(pattern_HKIDv1)) { | |||||
| return true | |||||
| } else if (idNo.match(pattern_HKIDv2)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "passport": | |||||
| if (idNo.match(pattern_passport)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "CNID": | |||||
| if (idNo.match(pattern_CHID)) { | |||||
| const subStr_year = idNo.substring(6, 10) | |||||
| const subStr_month = idNo.substring(10, 12) | |||||
| const subStr_date = idNo.substring(12, 14) | |||||
| const today = new Date() | |||||
| const inputDate = new Date(`${subStr_year}-${subStr_month}-${subStr_date}`) | |||||
| if (inputDate > today || inputDate === "Invalid Date" || inputDate.getFullYear().toString() !== subStr_year || (inputDate.getMonth() + 1).toString().padStart(2, "0") !== subStr_month || inputDate.getDate().toString().padStart(2, "0") !== subStr_date) { | |||||
| return false | |||||
| } else { | |||||
| return true | |||||
| } | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "otherCert": | |||||
| if (idNo.match(pattern_otherCert)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| default: | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| @@ -480,17 +525,57 @@ const CustomFormWizard = (props) => { | |||||
| address3: yup.string().max(255).required('請輸入第三行地址'), | address3: yup.string().max(255).required('請輸入第三行地址'), | ||||
| email: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵'), | email: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵'), | ||||
| emailConfirm: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵').oneOf([yup.ref('email'), null], '請輸入相同電郵'), | emailConfirm: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵').oneOf([yup.ref('email'), null], '請輸入相同電郵'), | ||||
| idNo: yup.string().required('請輸入證件號碼') | |||||
| .matches(/^[aA-zZ0-9\s]+$/, "證件號碼不包含特殊字符") | |||||
| .matches(/^\S*$/, '證件號碼不包含空格') | |||||
| .test('checkIDCardFormat', '請輸入香港身份證號碼', function(value) { | |||||
| idNo: yup.string().required(`請輸入${selectedIdDocInputType}號碼`) | |||||
| .matches(/^[aA-zZ0-9\s]+$/, `${selectedIdDocInputType}號碼不包含特殊字符`) | |||||
| .matches(/^\S*$/, `${selectedIdDocInputType}號碼不包含空格`) | |||||
| .test('checkIDCardFormat', `請輸入有效的${selectedIdDocInputType}號碼`, function(value) { | |||||
| const idDocType = selectedIdDocType.type; | const idDocType = selectedIdDocType.type; | ||||
| var pattern = /^[A-Z][0-9]*$/; | |||||
| var pattern_HKIDv1 = /^[A-Z]{1}[0-9]{6}$/; | |||||
| var pattern_HKIDv2 = /^[A-Z]{2}[0-9]{6}$/; | |||||
| var pattern_passport = /^[A-Z]{1}[0-9]{8}$/; | |||||
| var pattern_CHID = /^[0-9]{6}(20|19)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}[0-9X]{1}/; | |||||
| var pattern_otherCert = /^[A-Z]{1}[0-9]{5,}/; | |||||
| if(value!==undefined){ | if(value!==undefined){ | ||||
| if (!value.match(pattern)&&idDocType=="HKID"&&value.length<7) { | |||||
| return false | |||||
| } else { | |||||
| return true | |||||
| switch (idDocType) { | |||||
| case "HKID": | |||||
| if (value.match(pattern_HKIDv1)) { | |||||
| return true | |||||
| } else if (value.match(pattern_HKIDv2)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "passport": | |||||
| if (value.match(pattern_passport)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "CNID": | |||||
| if (value.match(pattern_CHID)) { | |||||
| const subStr_year = value.substring(6, 10) | |||||
| const subStr_month = value.substring(10, 12) | |||||
| const subStr_date = value.substring(12, 14) | |||||
| const today = new Date() | |||||
| const inputDate = new Date(`${subStr_year}-${subStr_month}-${subStr_date}`) | |||||
| if (inputDate > today || inputDate === "Invalid Date" || inputDate.getFullYear().toString() !== subStr_year || (inputDate.getMonth() + 1).toString().padStart(2, "0") !== subStr_month || inputDate.getDate().toString().padStart(2, "0") !== subStr_date) { | |||||
| return false | |||||
| } else { | |||||
| return true | |||||
| } | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| case "otherCert": | |||||
| if (value.match(pattern_otherCert)) { | |||||
| return true | |||||
| } else { | |||||
| return false | |||||
| } | |||||
| default: | |||||
| break; | |||||
| } | } | ||||
| } | } | ||||
| }), | }), | ||||
| @@ -754,17 +839,31 @@ const CustomFormWizard = (props) => { | |||||
| <OutlinedInput | <OutlinedInput | ||||
| id="idNo-login" | id="idNo-login" | ||||
| type="text" | type="text" | ||||
| value={formik.values.idNo.toUpperCase().trim()} | |||||
| name="idNo" | name="idNo" | ||||
| onChange={formik.handleChange} | |||||
| value={formik.values.idNo} | |||||
| onChange={async (e)=>{ | |||||
| const ele = document.getElementById('idNo-login') | |||||
| const startPos = ele.selectionStart | |||||
| if (e.type === "change") { | |||||
| if (!(e.target.value.match(/\s/g))) { | |||||
| const newValue = await e.target.value.toUpperCase() | |||||
| await formik.setFieldValue("idNo", newValue) | |||||
| ele.setSelectionRange(startPos, startPos) | |||||
| } else { | |||||
| await formik.setFieldValue("idNo", formik.values.idNo) | |||||
| ele.setSelectionRange(startPos-1, startPos-1) | |||||
| } | |||||
| } | |||||
| }} | |||||
| placeholder="證件號碼" | placeholder="證件號碼" | ||||
| fullWidth | fullWidth | ||||
| sx={{mr:1}} | sx={{mr:1}} | ||||
| error={Boolean(formik.touched.idNo && formik.errors.idNo)} | error={Boolean(formik.touched.idNo && formik.errors.idNo)} | ||||
| onBlur={formik.handleBlur} | onBlur={formik.handleBlur} | ||||
| inputProps={{ | inputProps={{ | ||||
| maxLength: selectedIdDocType.type =='HKID'?7:18, | |||||
| maxLength: selectedIdDocType.type =='HKID'?8:18, | |||||
| onKeyDown: (e) => { | onKeyDown: (e) => { | ||||
| console.log(e) | |||||
| if (e.key === 'Enter') { | if (e.key === 'Enter') { | ||||
| e.preventDefault(); | e.preventDefault(); | ||||
| } | } | ||||
| @@ -813,9 +912,22 @@ const CustomFormWizard = (props) => { | |||||
| <OutlinedInput | <OutlinedInput | ||||
| id="idNo-login" | id="idNo-login" | ||||
| type="text" | type="text" | ||||
| value={formik.values.idNo.trim()} | |||||
| value={formik.values.idNo} | |||||
| name="idNo" | name="idNo" | ||||
| onChange={formik.handleChange} | |||||
| onChange={async (e)=>{ | |||||
| const ele = document.getElementById('idNo-login') | |||||
| const startPos = ele.selectionStart | |||||
| if (e.type === "change") { | |||||
| if (!(e.target.value.match(/\s/g))) { | |||||
| const newValue = await e.target.value.toUpperCase() | |||||
| await formik.setFieldValue("idNo", newValue) | |||||
| ele.setSelectionRange(startPos, startPos) | |||||
| } else { | |||||
| await formik.setFieldValue("idNo", formik.values.idNo) | |||||
| ele.setSelectionRange(startPos-1, startPos-1) | |||||
| } | |||||
| } | |||||
| }} | |||||
| placeholder="證件號碼" | placeholder="證件號碼" | ||||
| fullWidth | fullWidth | ||||
| sx={{mr:1}} | sx={{mr:1}} | ||||