You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

284 lines
12 KiB

  1. // material-ui
  2. import {
  3. Grid, Button, Typography,
  4. Dialog, DialogTitle, DialogContent, DialogActions,
  5. } from '@mui/material';
  6. import MainCard from "../../../components/MainCard";
  7. import * as React from "react";
  8. import * as yup from 'yup';
  9. import { useEffect, useState } from "react";
  10. import * as HttpUtils from '../../../utils/HttpUtils';
  11. import * as UrlUtils from "../../../utils/ApiPathConst";
  12. import * as FieldUtils from "../../../utils/FieldUtils";
  13. import * as ComboData from "../../../utils/ComboData";
  14. import { useNavigate } from "react-router-dom";
  15. import { useFormik } from 'formik';
  16. const LoadingComponent = Loadable(lazy(() => import('../../extra-pages/LoadingComponent')));
  17. import Loadable from 'components/Loadable';
  18. import { lazy } from 'react';
  19. import { notifyCreateSuccess } from 'utils/CommonFunction';
  20. import {useIntl} from "react-intl";
  21. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  22. const OrganizationCard_loadFromUser = ({ userData, userId }) => {
  23. const intl = useIntl();
  24. const [currentUserData, setCurrentUserData] = useState(userData);
  25. const navigate = useNavigate();
  26. const [onReady, setOnReady] = useState(false);
  27. const [isFailPopUp, setIsFailPopUp] = useState(false);
  28. const [failText, setFailText] = useState("");
  29. useEffect(() => {
  30. //if state data are ready and assign to different field
  31. // console.log(currentApplicationDetailData)
  32. if (Object.keys(currentUserData).length > 0) {
  33. setOnReady(true);
  34. }
  35. }, [currentUserData]);
  36. function displayErrorMsg(errorMsg) {
  37. return <Typography variant="errorMessage1">{errorMsg}</Typography>
  38. }
  39. const formik = useFormik({
  40. enableReinitialize: true,
  41. initialValues: currentUserData,
  42. validationSchema: yup.object().shape({
  43. enCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))).required(displayErrorMsg(intl.formatMessage({id: 'userRequireEnglishName'}))),
  44. chCompanyName: yup.string().max(255, displayErrorMsg(intl.formatMessage({id: 'userRequireChineseName'}))).nullable(),
  45. addressLine1: yup.string().max(40).required(displayErrorMsg(intl.formatMessage({id: 'validateAddressLine1'}))),
  46. addressLine2: yup.string().max(40).nullable(),
  47. addressLine3: yup.string().max(40).nullable(),
  48. fax_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))).nullable(),
  49. tel_countryCode: yup.string().min(3, displayErrorMsg(intl.formatMessage({id: 'requireDialingCode'}))),
  50. phoneNumber: yup.string().min(8, displayErrorMsg(intl.formatMessage({id: 'requiredValidNumber'}))).required(displayErrorMsg(intl.formatMessage({id: 'requireContactNumber'}))),
  51. faxNumber: yup.string().min(8).nullable(),
  52. brExpiryDate: yup.string().min(8).required(displayErrorMsg(intl.formatMessage({id: 'pleaseFillInBusinessRegCertValidityDate'}))),
  53. brNo: yup.string().max(8).required(displayErrorMsg(intl.formatMessage({id: 'pleaseFillInBusinessRegCertNumber'})))
  54. .test('checkBrNoFormat', displayErrorMsg(displayErrorMsg(`${intl.formatMessage({id: 'pleaseFillInValidBusinessRegCertNumber'})} (e.g. 12341234)`)), function (value) {
  55. var brNo_pattern = /[0-9]{8}/
  56. if (value !== undefined) {
  57. if (value.match(brNo_pattern)) {
  58. return true
  59. } else {
  60. return false
  61. }
  62. }
  63. }),
  64. }),
  65. onSubmit: values => {
  66. HttpUtils.post({
  67. url: UrlUtils.POST_ORG_SAVE_PATH,
  68. params: {
  69. id: null,
  70. primaryUserId: userId,
  71. enCompanyName: values.enCompanyName,
  72. chCompanyName: values.chCompanyName,
  73. brNo: values.brNo,
  74. brExpiryDate: values.brExpiryDate,
  75. enCompanyNameTemp: values.enCompanyNameTemp,
  76. chCompanyNameTemp: values.chCompanyNameTemp,
  77. brExpiryDateTemp: values.brExpiryDateTemp,
  78. contactPerson: values.contactPerson,
  79. contactTel: {
  80. countryCode: values.tel_countryCode,
  81. phoneNumber: values.phoneNumber
  82. },
  83. faxNo: {
  84. countryCode: values.fax_countryCode,
  85. faxNumber: values.faxNumber
  86. },
  87. addressTemp: {
  88. country: values.country.key,
  89. district: values.district.key,
  90. addressLine1: values.addressLine1,
  91. addressLine2: values.addressLine2,
  92. addressLine3: values.addressLine3,
  93. }
  94. },
  95. onSuccess: function (responseData) {
  96. if(responseData.msg){
  97. setFailText(responseData.msg);
  98. setIsFailPopUp(true);
  99. return;
  100. }
  101. navigate('/org/' + responseData.id);
  102. notifyCreateSuccess()
  103. }
  104. });
  105. }
  106. });
  107. useEffect(() => {
  108. if (Object.keys(userData).length > 0) {
  109. setCurrentUserData(userData);
  110. }
  111. }, [userData]);
  112. return (
  113. <MainCard elevation={0}
  114. border={false}
  115. content={false}
  116. >
  117. {/* <div style={{ border: "solid 1px;", color: "red" }}>
  118. TODO: Error Summary
  119. {Object.values(formik.errors).map(error => (
  120. <div>{error}</div>
  121. ))}
  122. </div> */}
  123. <div style={{ padding: 24 }}>
  124. <form onSubmit={formik.handleSubmit}>
  125. {!onReady?
  126. <LoadingComponent />
  127. :
  128. <Grid container spacing={1}>
  129. {/*top*/}
  130. <Grid item s={12} md={12} lg={12} sx={{ mb: 3 }} alignItems={"start"} justifyContent="center">
  131. <Grid item sx={{ ml: 3, mr: 3 }}>
  132. <Button
  133. size="large"
  134. variant="contained"
  135. type="submit"
  136. sx={{
  137. textTransform: 'capitalize',
  138. alignItems: 'end'
  139. }}
  140. >
  141. Create
  142. </Button>
  143. </Grid>
  144. </Grid>
  145. {/*top*/}
  146. <Grid item lg={4}>
  147. {FieldUtils.getTextField({
  148. label: "BR No.:",
  149. valueName: "brNo",
  150. form: formik
  151. })}
  152. </Grid>
  153. <Grid item lg={8}></Grid>
  154. <Grid item lg={4}>
  155. {FieldUtils.getTextField({
  156. label: FieldUtils.notNullFieldLabel("Name (Eng):"),
  157. valueName: "enCompanyName",
  158. form: formik
  159. })}
  160. </Grid>
  161. <Grid item lg={4}>
  162. {FieldUtils.getTextField({
  163. label: "Name (Ch):",
  164. valueName: "chCompanyName",
  165. form: formik
  166. })}
  167. </Grid>
  168. <Grid item lg={4}>
  169. {FieldUtils.getDateField({
  170. label: FieldUtils.notNullFieldLabel("Expiry Date:"),
  171. valueName: "brExpiryDate",
  172. form: formik
  173. })}
  174. </Grid>
  175. <Grid item lg={4}>
  176. {FieldUtils.getTextField({
  177. label: FieldUtils.notNullFieldLabel("Contact Person:"),
  178. valueName: "contactPerson",
  179. form: formik
  180. })}
  181. </Grid>
  182. <Grid item lg={4}>
  183. {FieldUtils.getPhoneField({
  184. label: FieldUtils.notNullFieldLabel("Contact Tel:"),
  185. valueName: {
  186. code: "tel_countryCode",
  187. num: "phoneNumber"
  188. },
  189. form: formik
  190. })}
  191. </Grid>
  192. <Grid item lg={4}>
  193. {FieldUtils.getPhoneField({
  194. label: "Fax No:",
  195. valueName: {
  196. code: "fax_countryCode",
  197. num: "faxNumber"
  198. },
  199. form: formik
  200. })}
  201. </Grid>
  202. <Grid item lg={4}>
  203. {FieldUtils.getComboField({
  204. label: FieldUtils.notNullFieldLabel("Country:"),
  205. valueName: "country",
  206. dataList: ComboData.country,
  207. getOptionLabel: (option) => option.type? intl.formatMessage({ id: option.type}) : "",
  208. form: formik
  209. })}
  210. </Grid>
  211. <Grid item lg={4}>
  212. {FieldUtils.getComboField({
  213. label: FieldUtils.notNullFieldLabel("District:"),
  214. valueName: "district",
  215. dataList: ComboData.district,
  216. getOptionLabel: (option) => option.type? intl.formatMessage({ id: option.type}) : "",
  217. form: formik
  218. })}
  219. </Grid>
  220. <Grid item lg={4}>
  221. {FieldUtils.getAddressField({
  222. label: FieldUtils.notNullFieldLabel("Address:"),
  223. valueName: ["addressLine1", "addressLine2", "addressLine3"],
  224. form: formik
  225. })}
  226. </Grid>
  227. </Grid>
  228. }
  229. </form>
  230. </div>
  231. <div>
  232. <Dialog
  233. open={isFailPopUp}
  234. onClose={() => setIsFailPopUp(false)}
  235. PaperProps={{
  236. sx: {
  237. minWidth: '40vw',
  238. maxWidth: { xs: '90vw', s: '90vw', m: '70vw', lg: '70vw' },
  239. maxHeight: { xs: '90vh', s: '70vh', m: '70vh', lg: '60vh' }
  240. }
  241. }}
  242. >
  243. <DialogTitle><Typography variant="h3">Action Fail</Typography></DialogTitle>
  244. <DialogContent style={{ display: 'flex', }}>
  245. <Typography variant="h4" style={{ padding: '16px' }}>{failText}</Typography>
  246. </DialogContent>
  247. <DialogActions>
  248. <Button onClick={() => setIsFailPopUp(false)}><Typography variant="h5">OK</Typography></Button>
  249. </DialogActions>
  250. </Dialog>
  251. </div>
  252. </MainCard>
  253. );
  254. };
  255. export default OrganizationCard_loadFromUser;