您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 

483 行
20 KiB

  1. // material-ui
  2. import {
  3. Grid, Typography, Button
  4. } from '@mui/material';
  5. import MainCard from "../../components/MainCard";
  6. import * as React from "react";
  7. import {useEffect, useState} from "react";
  8. import * as yup from 'yup';
  9. import { useFormik } from 'formik';
  10. import * as FieldUtils from "../../utils/FieldUtils";
  11. import * as HttpUtils from '../../utils/HttpUtils';
  12. import * as UrlUtils from "../../utils/ApiPathConst";
  13. import * as ComboData from "../../utils/ComboData";
  14. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  15. const UserInformationCard_Individual = ({formData, loadDataFun}) => {
  16. const [currentUserData, setCurrentUserData] = useState(formData);
  17. const [editMode, setEditMode] = useState(false);
  18. const [locked, setLocked] = useState(false);
  19. const formik = useFormik({
  20. enableReinitialize:true,
  21. initialValues:currentUserData,
  22. validationSchema:yup.object().shape({
  23. enName: yup.string().max(255).required('請輸入英文姓名'),
  24. chName: yup.string().max(255).required('請輸入中文姓名'),
  25. addressLine1: yup.string().max(255).required('請輸入第一行地址'),
  26. addressLine2: yup.string().max(255).nullable(),
  27. addressLine3: yup.string().max(255).nullable(),
  28. emailAddress: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵'),
  29. identification: yup.string().min(7,"請輸入證件號碼").required('請輸入證件號碼'),
  30. checkDigit:yup.string().max(1).required('請輸入括號內的數字或字母').nullable(),
  31. idDocType: yup.string().max(255).required('請輸入證件類別'),
  32. tel_countryCode: yup.string().min(3,'請輸入3位數字').required('請輸入國際區號'),
  33. fax_countryCode: yup.string().min(3,'請輸入3位數字'),
  34. phoneNumber: yup.string().min(8,'請輸入8位數字').required('請輸入聯絡電話'),
  35. faxNumber: yup.string().min(8,'請輸入8位數字').required('請輸入8位數字'),
  36. }),
  37. onSubmit:values=>{
  38. console.log(values);
  39. HttpUtils.post({
  40. url: UrlUtils.POST_IND_USER+"/"+formData.id,
  41. params: {
  42. prefix: values.prefix,
  43. enName: values.enName,
  44. chName: values.chName,
  45. idDocType: values.idDocType,
  46. mobileNumber: {
  47. countryCode: values.tel_countryCode,
  48. phoneNumber: values.phoneNumber
  49. },
  50. identification: values.identification,
  51. checkDigit: values.checkDigit,
  52. faxNo:{
  53. countryCode: values.fax_countryCode,
  54. faxNumber: values.faxNumber
  55. },
  56. emailAddress:values.emailAddress,
  57. address:{
  58. country:values.country,
  59. district:values.district,
  60. addressLine1: values.addressLine1,
  61. addressLine2: values.addressLine2,
  62. addressLine3: values.addressLine3,
  63. },
  64. },
  65. onSuccess: function(){
  66. loadDataFun();
  67. }
  68. });
  69. }
  70. });
  71. useEffect(() => {
  72. setCurrentUserData(formData);
  73. }, [formData]);
  74. useEffect(() => {
  75. setLocked(currentUserData.locked);
  76. }, [currentUserData]);
  77. const onEditClick = () => {
  78. setEditMode(true);
  79. };
  80. const onVerifiedClick = () => {
  81. HttpUtils.get({
  82. url: UrlUtils.GET_IND_USER_VERIFY+"/"+formData.id,
  83. onSuccess: function(){
  84. loadDataFun();
  85. }
  86. });
  87. };
  88. const doLock = () => {
  89. HttpUtils.get({
  90. url: UrlUtils.GET_USER_LOCK+"/"+formData.id,
  91. onSuccess: function(){
  92. loadDataFun();
  93. }
  94. });
  95. };
  96. const doUnlock = () => {
  97. HttpUtils.get({
  98. url: UrlUtils.GET_USER_UNLOCK+"/"+formData.id,
  99. onSuccess: function(){
  100. loadDataFun();
  101. }
  102. });
  103. };
  104. return (
  105. <MainCard elevation={0}
  106. border={false}
  107. content={false}
  108. >
  109. <Typography variant="h5" sx={{mt: 3, ml: 3, mb: 1}}>
  110. Individual User Information
  111. </Typography>
  112. <form onSubmit={formik.handleSubmit}>
  113. {/*top button*/}
  114. <Grid item s={12} md={12} lg={12} sx={{mb: 3}} alignItems={"start"} justifyContent="center">
  115. <Grid container maxWidth justifyContent="flex-start">
  116. {editMode?
  117. <>
  118. <Grid item sx={{ml: 3, mr: 3}}>
  119. <Button
  120. size="large"
  121. variant="contained"
  122. onClick={loadDataFun}
  123. sx={{
  124. textTransform: 'capitalize',
  125. alignItems: 'end'
  126. }}
  127. >
  128. Cancel Edit
  129. </Button>
  130. </Grid>
  131. <Grid item sx={{ml: 3, mr: 3}}>
  132. <Button
  133. size="large"
  134. variant="contained"
  135. type="submit"
  136. color="success"
  137. sx={{
  138. textTransform: 'capitalize',
  139. alignItems: 'end'
  140. }}
  141. >
  142. Save
  143. </Button>
  144. </Grid>
  145. </>
  146. :
  147. <>
  148. <Grid item sx={{ml: 3, mr: 3}}>
  149. <Button
  150. size="large"
  151. variant="contained"
  152. sx={{
  153. textTransform: 'capitalize',
  154. alignItems: 'end'
  155. }}
  156. onClick={onEditClick}
  157. >
  158. Edit
  159. </Button>
  160. </Grid>
  161. </>
  162. }
  163. </Grid>
  164. </Grid>
  165. {/*end top button*/}
  166. <Grid container spacing={1}>
  167. {FieldUtils.getTextField({
  168. label:"Username:",
  169. valueName:"username",
  170. disabled:true,
  171. form: formik
  172. })}
  173. {FieldUtils.getTextField({
  174. label:"English Name:",
  175. valueName:"enName",
  176. disabled:(!editMode),
  177. form: formik
  178. })}
  179. {FieldUtils.getTextField({
  180. label:"Created Date:",
  181. valueName:"createDate",
  182. disabled:true,
  183. form: formik
  184. })}
  185. {FieldUtils.getTextField({
  186. label:"Prefix:",
  187. valueName:"prefix",
  188. disabled:(!editMode),
  189. form: formik
  190. })}
  191. {FieldUtils.getTextField({
  192. label:"Chinese Name:",
  193. valueName:"chName",
  194. disabled:(!editMode),
  195. form: formik
  196. })}
  197. {FieldUtils.getTextField({
  198. label:"Last Updated:",
  199. valueName:"modifieDate",
  200. disabled:true,
  201. form: formik
  202. })}
  203. {FieldUtils.getComboField({
  204. label:"ID Type:",
  205. valueName:"idDocType",
  206. disabled:(!editMode),
  207. dataList: ComboData.idDocType,
  208. filterOptions:(options) => options,
  209. getOptionLabel:(item) => item?typeof item==='string'?item:(item["type"]?item["type"]+"-"+item["label"]:""):"",
  210. // getOptionSelected: (option, value) => option.label === value.label,
  211. // isOptionEqualToValue:(option, newValue) => {
  212. // return option.type === newValue;
  213. // },
  214. onInputChange:(event, newValue, setInputValue)=>{
  215. if(newValue == null){
  216. setInputValue("");
  217. }
  218. let _val = newValue.split("-");
  219. if(_val[0]){
  220. setInputValue(_val[0]);
  221. }
  222. },
  223. onChange:(event, newValue)=>{
  224. if(newValue == null){
  225. formik.setFieldValue("idDocType","");
  226. return;
  227. }
  228. formik.setFieldValue("idDocType",newValue.type);
  229. },
  230. form: formik
  231. })}
  232. {FieldUtils.getPhoneField({
  233. label:"Contact Tel:",
  234. valueName:{
  235. code: "tel_countryCode",
  236. num:"phoneNumber"
  237. },
  238. disabled:(!editMode),
  239. form: formik
  240. })}
  241. <Grid item lg={4}>
  242. <Grid container alignItems={"center"}>
  243. <Grid item xs={4} s={4} md={4} lg={4}
  244. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  245. Verified:
  246. </Grid>
  247. {
  248. currentUserData.verifiedBy || editMode?
  249. <Grid item xs={6}>
  250. {FieldUtils.initField({
  251. valueName:"verifiedStatus",
  252. disabled:true,
  253. form: formik,
  254. })}
  255. </Grid>
  256. :
  257. <>
  258. <Grid item xs={4}>
  259. {FieldUtils.initField({
  260. valueName:"verifiedStatus",
  261. disabled:true,
  262. form: formik,
  263. })}
  264. </Grid>
  265. <Grid item xs={1}>
  266. <Button
  267. size="large"
  268. variant="contained"
  269. sx={{
  270. textTransform: 'capitalize',
  271. alignItems: 'end',
  272. }}
  273. onClick={onVerifiedClick}
  274. >
  275. Verify
  276. </Button>
  277. </Grid>
  278. </>
  279. }
  280. </Grid>
  281. </Grid>
  282. <Grid item lg={4}>
  283. <Grid container alignItems={"center"}>
  284. <Grid item xs={4} s={4} md={4} lg={4}
  285. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  286. ID No.:
  287. </Grid>
  288. <Grid item lg={6}>
  289. <Grid container>
  290. {formik.values.idDocType =="HKID"?
  291. <>
  292. <Grid item lg={8}>
  293. {FieldUtils.initField({
  294. valueName:"identification",
  295. disabled:(!editMode),
  296. form: formik,
  297. placeholder:"證件號碼",
  298. inputProps:{
  299. maxLength: 7,
  300. onKeyDown: (e) => {
  301. if (e.key === 'Enter') {
  302. e.preventDefault();
  303. }
  304. },
  305. }
  306. })}
  307. </Grid>
  308. <Grid item lg={4}>
  309. {FieldUtils.initField({
  310. valueName:"checkDigit",
  311. disabled:(!editMode),
  312. form: formik
  313. })}
  314. </Grid>
  315. </>:
  316. <Grid item lg={12}>
  317. {FieldUtils.initField({
  318. valueName:"identification",
  319. disabled:(!editMode),
  320. form: formik
  321. })}
  322. </Grid>
  323. }
  324. </Grid>
  325. </Grid>
  326. </Grid>
  327. </Grid>
  328. {FieldUtils.getPhoneField({
  329. label:"Fax No.:",
  330. valueName:{
  331. code: "fax_countryCode",
  332. num:"faxNumber"
  333. },
  334. disabled:(!editMode),
  335. form: formik
  336. })}
  337. {FieldUtils.getTextField({
  338. label:"Last Login:",
  339. valueName:"lastLoginDate",
  340. disabled:true,
  341. form: formik
  342. })}
  343. {FieldUtils.getComboField({
  344. label:"Country:",
  345. valueName:"country",
  346. dataList: ComboData.country,
  347. disabled:(!editMode),
  348. form: formik
  349. })}
  350. {FieldUtils.getTextField({
  351. label:"Email:",
  352. valueName:"emailAddress",
  353. disabled:(!editMode),
  354. form: formik
  355. })}
  356. <Grid item lg={4}>
  357. <Grid container alignItems={"center"}>
  358. <Grid item xs={4} s={4} md={4} lg={4}
  359. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  360. Status:
  361. </Grid>
  362. {
  363. editMode?
  364. <Grid item lg={7}>
  365. {FieldUtils.initField({
  366. valueName:"status",
  367. disabled:true,
  368. form: formik,
  369. })}
  370. </Grid>
  371. :
  372. <>
  373. <Grid item lg={4}>
  374. {FieldUtils.initField({
  375. valueName:"status",
  376. disabled:true,
  377. form: formik,
  378. })}
  379. </Grid>
  380. {locked?
  381. <Grid item lg={1}>
  382. <Button
  383. size="large"
  384. variant="contained"
  385. color="success"
  386. sx={{
  387. textTransform: 'capitalize',
  388. alignItems: 'end'
  389. }}
  390. onClick={doUnlock}
  391. >
  392. Active
  393. </Button>
  394. </Grid>
  395. :
  396. <Grid item lg={1}>
  397. <Button
  398. size="large"
  399. variant="contained"
  400. color="error"
  401. sx={{
  402. textTransform: 'capitalize',
  403. alignItems: 'end'
  404. }}
  405. onClick={doLock}
  406. >
  407. Lock
  408. </Button>
  409. </Grid>
  410. }
  411. </>
  412. }
  413. </Grid>
  414. </Grid>
  415. {FieldUtils.getAddressField({
  416. label:"Address:",
  417. valueName:["addressLine1","addressLine2","addressLine3"],
  418. disabled:(!editMode),
  419. form: formik})}
  420. {FieldUtils.getComboField({
  421. label:"District:",
  422. valueName:"district",
  423. dataList: ComboData.district,
  424. disabled:(!editMode),
  425. form: formik})}
  426. </Grid>
  427. </form>
  428. </MainCard>
  429. );
  430. };
  431. export default UserInformationCard_Individual;