2. update client & subsidiary contact infotags/Baseline_30082024_FRONTEND_UAT
@@ -382,9 +382,9 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||
fullWidth | |||
type="number" | |||
inputProps={{ step: "0.01" }} | |||
InputLabelProps={{ | |||
shrink: Boolean(watch("subContractFee")), | |||
}} | |||
// InputLabelProps={{ | |||
// shrink: Boolean(watch("subContractFee")), | |||
// }} | |||
{...register("subContractFee", { valueAsNumber: true })} | |||
/> | |||
</Grid> | |||
@@ -412,9 +412,9 @@ const ProjectClientDetails: React.FC<Props> = ({ | |||
<Typography variant="overline" display="block"> | |||
{t("Client Details")} | |||
</Typography> | |||
<Button LinkComponent={Link} href="/settings/customer"> | |||
{/* <Button LinkComponent={Link} href="/settings/customer"> | |||
{t("Add or Edit Clients")} | |||
</Button> | |||
</Button> */} | |||
</Stack> | |||
<Grid container spacing={2} columns={{ xs: 6, sm: 12 }}> | |||
<Grid item xs={6}> | |||
@@ -142,7 +142,7 @@ const ContactInfo: React.FC<Props> = ({ | |||
resetField("addContacts") | |||
// reset({addContacts: defaultValues.addContacts}) | |||
setRows((prev) => defaultValues.addContacts) | |||
setRowModesModel(rows.reduce((acc, row) => ({...acc, [row.id]: { mode: GridRowModes.View } }), {})) | |||
setRowModesModel(rows.reduce((acc, row) => ({ ...acc, [row.id]: { mode: GridRowModes.View } }), {})) | |||
} | |||
}, [defaultValues]) | |||
@@ -159,6 +159,14 @@ const ContactInfo: React.FC<Props> = ({ | |||
headerName: t('Contact Phone'), | |||
editable: true, | |||
flex: 1, | |||
// type: "number", | |||
// valueSetter: ({ value, row }) => { | |||
// const phone = value.replace(/\D/g, '') | |||
// return { ...row, phone } | |||
// }, | |||
}, | |||
{ | |||
field: 'email', | |||
@@ -232,8 +240,11 @@ const ContactInfo: React.FC<Props> = ({ | |||
setError("addContacts", { message: "Contact details include empty fields", type: "required" }) | |||
} else { | |||
const errorRows_EmailFormat = rows.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))) | |||
if (errorRows_EmailFormat.length > 0) { | |||
setError("addContacts", { message: "Contact details include empty fields", type: "email_format" }) | |||
const errorRows_PhoneFormat = rows.filter(row => !/^[+0-9][0-9\s]*$/.test(String(row.phone))) | |||
if (errorRows_EmailFormat.length > 0 || errorRows_PhoneFormat.length > 0) { | |||
setError("addContacts", { message: "Contact details include empty fields", type: "format" }) | |||
} else { | |||
clearErrors("addContacts") | |||
} | |||
@@ -264,8 +275,8 @@ const ContactInfo: React.FC<Props> = ({ | |||
{Boolean(errors.addContacts?.type === "required") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure at least one row is created, and all the fields are inputted and saved")} | |||
</Typography>} | |||
{Boolean(errors.addContacts?.type === "email_format") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure all the email formats are correct")} | |||
{Boolean(errors.addContacts?.type === "format") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure all the email and phone formats are correct")} | |||
</Typography>} | |||
{/* </div> */} | |||
<CustomDatagrid | |||
@@ -284,7 +295,15 @@ const ContactInfo: React.FC<Props> = ({ | |||
toolbar: { setRows, setRowModesModel }, | |||
}} | |||
sx={{ | |||
height: '100%' | |||
height: '100%', | |||
'& input[type=number]::-webkit-outer-spin-button': { | |||
'-webkit-appearance': 'none', | |||
margin: 0 | |||
}, | |||
'& input[type=number]::-webkit-inner-spin-button': { | |||
'-webkit-appearance': 'none', | |||
margin: 0 | |||
} | |||
}} | |||
/> | |||
<CardActions sx={{ justifyContent: "flex-end" }}> | |||
@@ -182,9 +182,11 @@ const CustomerSave: React.FC<Props> = ({ | |||
formProps.setError("addContacts", { message: "Contact info includes empty fields", type: "required" }) | |||
} | |||
if (data.addContacts.length > 0 && data.addContacts.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))).length > 0) { | |||
if (data.addContacts.length > 0 | |||
&& data.addContacts.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))).length > 0 | |||
&& data.addContacts.filter(row => !/^[+0-9][0-9\s]*$/.test(String(row.phone))).length > 0) { | |||
haveError = true | |||
formProps.setError("addContacts", { message: "Contact info includes invalid email", type: "email_format" }) | |||
formProps.setError("addContacts", { message: "Contact info includes invalid email or phone", type: "format" }) | |||
} | |||
if (haveError) { | |||
@@ -199,20 +201,20 @@ const CustomerSave: React.FC<Props> = ({ | |||
setServerError(""); | |||
submitDialog(async () => { | |||
const response = await saveCustomer(data); | |||
if (response.message === "Success") { | |||
successDialog(t("Submit Success"), t).then(() => { | |||
router.replace("/settings/customer"); | |||
}) | |||
} else { | |||
errorDialog(t("Submit Fail"), t).then(() => { | |||
formProps.setError("code", { message: response.message, type: "custom" }) | |||
setTabIndex(0) | |||
return false | |||
}) | |||
} | |||
}, t) | |||
const response = await saveCustomer(data); | |||
if (response.message === "Success") { | |||
successDialog(t("Submit Success"), t).then(() => { | |||
router.replace("/settings/customer"); | |||
}) | |||
} else { | |||
errorDialog(t("Submit Fail"), t).then(() => { | |||
formProps.setError("code", { message: response.message, type: "custom" }) | |||
setTabIndex(0) | |||
return false | |||
}) | |||
} | |||
}, t) | |||
} catch (e) { | |||
console.log(e) | |||
setServerError(t("An error has occurred. Please try again later.")); | |||
@@ -233,8 +233,10 @@ const ContactInfo: React.FC<Props> = ({ | |||
} else { | |||
const errorRows_EmailFormat = rows.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))) | |||
if (errorRows_EmailFormat.length > 0) { | |||
setError("addContacts", { message: "Contact details include empty fields", type: "email_format" }) | |||
const errorRows_PhoneFormat = rows.filter(row => !/^[+0-9][0-9\s]*$/.test(String(row.phone))) | |||
if (errorRows_EmailFormat.length > 0 || errorRows_PhoneFormat.length > 0) { | |||
setError("addContacts", { message: "Contact details include empty fields", type: "format" }) | |||
} else { | |||
clearErrors("addContacts") | |||
} | |||
@@ -265,8 +267,8 @@ const ContactInfo: React.FC<Props> = ({ | |||
{Boolean(errors.addContacts?.type === "required") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure at least one row is created, and all the fields are inputted and saved")} | |||
</Typography>} | |||
{Boolean(errors.addContacts?.type === "email_format") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure all the email formats are correct")} | |||
{Boolean(errors.addContacts?.type === "format") && <Typography sx={(theme) => ({ color: theme.palette.error.main })} variant="overline" display='inline-block' noWrap> | |||
{t("Please ensure all the email and phone formats are correct")} | |||
</Typography>} | |||
{/* </div> */} | |||
<CustomDatagrid | |||
@@ -285,7 +287,15 @@ const ContactInfo: React.FC<Props> = ({ | |||
toolbar: { setRows, setRowModesModel }, | |||
}} | |||
sx={{ | |||
height: '100%' | |||
height: '100%', | |||
'& input[type=number]::-webkit-outer-spin-button': { | |||
'-webkit-appearance': 'none', | |||
margin: 0 | |||
}, | |||
'& input[type=number]::-webkit-inner-spin-button': { | |||
'-webkit-appearance': 'none', | |||
margin: 0 | |||
} | |||
}} | |||
/> | |||
<CardActions sx={{ justifyContent: "flex-end" }}> | |||
@@ -157,9 +157,11 @@ const SubsidiaryDetail: React.FC<Props> = ({ | |||
formProps.setError("addContacts", { message: "Contact info includes empty fields", type: "required" }) | |||
} | |||
if (data.addContacts.length > 0 && data.addContacts.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))).length > 0) { | |||
if (data.addContacts.length > 0 | |||
&& data.addContacts.filter(row => !/^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$/.test(String(row.email))).length > 0 | |||
&& data.addContacts.filter(row => !/^[+0-9][0-9\s]*$/.test(String(row.phone))).length > 0) { | |||
haveError = true | |||
formProps.setError("addContacts", { message: "Contact info includes invalid email", type: "email_format" }) | |||
formProps.setError("addContacts", { message: "Contact info includes invalid email or phone", type: "format" }) | |||
} | |||
if (haveError) { | |||
@@ -44,7 +44,7 @@ | |||
"Contact Email": "Contact Email", | |||
"Contact Phone": "Contact Phone", | |||
"Please ensure at least one row is created, and all the fields are inputted and saved": "Please ensure at least one row is created, and all the fields are inputted and saved", | |||
"Please ensure all the email formats are correct": "Please ensure all the email formats are correct", | |||
"Please ensure all the email and phone formats are correct": "Please ensure all the email and phone formats are correct", | |||
"Do you want to submit?": "Do you want to submit?", | |||
"Submit Success": "Submit Success", | |||
@@ -44,7 +44,7 @@ | |||
"Contact Email": "Contact Email", | |||
"Contact Phone": "Contact Phone", | |||
"Please ensure at least one row is created, and all the fields are inputted and saved": "Please ensure at least one row is created, and all the fields are inputted and saved", | |||
"Please ensure all the email formats are correct": "Please ensure all the email formats are correct", | |||
"Please ensure all the email and phone formats are correct": "Please ensure all the email and phone formats are correct", | |||
"Do you want to submit?": "Do you want to submit?", | |||
"Submit Success": "Submit Success", | |||
@@ -44,7 +44,7 @@ | |||
"Contact Email": "聯絡電郵", | |||
"Contact Phone": "聯絡電話", | |||
"Please ensure at least one row is created, and all the fields are inputted and saved": "請確保已建立至少一行, 及已輸入和儲存所有欄位", | |||
"Please ensure all the email formats are correct": "請確保所有電郵格式輸入正確", | |||
"Please ensure all the email and phone formats are correct": "請確保所有電郵和電話格式輸入正確", | |||
"Do you want to submit?": "你是否確認要提交?", | |||
"Submit Success": "提交成功", | |||
@@ -44,7 +44,7 @@ | |||
"Contact Email": "聯絡電郵", | |||
"Contact Phone": "聯絡電話", | |||
"Please ensure at least one row is created, and all the fields are inputted and saved": "請確保已建立至少一行, 及已輸入和儲存所有欄位", | |||
"Please ensure all the email formats are correct": "請確保所有電郵格式輸入正確", | |||
"Please ensure all the email and phone formats are correct": "請確保所有電郵和電話格式輸入正確", | |||
"Do you want to submit?": "你是否確認要提交?", | |||
"Submit Success": "提交成功", | |||