25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

778 lines
35 KiB

  1. // material-ui
  2. import {
  3. Grid, TextField, Typography, Button,
  4. OutlinedInput, FormHelperText, Autocomplete
  5. } from '@mui/material';
  6. import MainCard from "../../components/MainCard";
  7. import * as React from "react";
  8. import {useForm} from "react-hook-form";
  9. import {useEffect, useState} from "react";
  10. import * as DateUtils from '../../utils/DateUtils';
  11. import * as HttpUtils from '../../utils/HttpUtils';
  12. import * as UrlUtils from "../../utils/ApiPathConst";
  13. import * as ComboData from "../../utils/ComboData";
  14. import { useFormik,FormikProvider } from 'formik';
  15. import * as yup from 'yup';
  16. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  17. const UserInformationCard_Organization = ({userData, loadDataFun}) => {
  18. const [currentUserData, setCurrentUserData] = useState(userData);
  19. const [editMode, setEditMode] = useState(false);
  20. const [locked, setLocked] = useState(false);
  21. const [district, setDistrict] = useState(null);
  22. const [country, setCountry] = useState(ComboData.country[0]);
  23. const from = useForm({defaultValues: userData});
  24. const {register,reset, handleSubmit} = from;
  25. const formik = useFormik({
  26. initialValues:(currentUserData),
  27. validationSchema:yup.object().shape({
  28. enName: yup.string().max(255).required('請輸入英文姓名'),
  29. enCompanyName: yup.string().max(255).required('請輸入英文名稱'),
  30. chName: yup.string().max(255).required('請輸入中文姓名'),
  31. address1: yup.string().max(255).required('請輸入第一行地址'),
  32. address2: yup.string().max(255).required('請輸入第二行地址'),
  33. address3: yup.string().max(255).required('請輸入第三行地址'),
  34. email: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵'),
  35. emailConfirm: yup.string().email('請輸入電郵格式').max(255).required('請輸入電郵').oneOf([yup.ref('email'), null], '請輸入相同電郵'),
  36. phoneCountryCode: yup.string().min(3,'請輸入3位數字').required('請輸入國際區號'),
  37. faxCountryCode: yup.string().min(3,'請輸入3位數字'),
  38. phone: yup.string().min(8,'請輸入8位數字').required('請輸入聯絡電話'),
  39. fax: yup.string().min(8,'請輸入8位數字'),
  40. brExpiryDate: yup.string().min(8,'請輸入商業登記證有效日期'),
  41. brNo: yup.string().min(8,'請輸入商業登記證號碼'),
  42. })
  43. });
  44. useEffect(() => {
  45. let createDate = DateUtils.datetimeStr(userData.created);
  46. let modifiedBy = DateUtils.datetimeStr(userData.modified)+", "+userData.modifiedBy;
  47. userData["createDate"] = createDate;
  48. userData["modifieDate"] = modifiedBy;
  49. userData["verifiedStatus"] = userData.verifiedBy? DateUtils.datetimeStr(userData.verifiedDate)+", "+userData.verifiedByName: "Not verify yet";
  50. userData["lastLoginDate"] = userData.lastLogin?DateUtils.datetimeStr(lastLoginDate):"";
  51. userData["country"] = userData.addressBus?.country;
  52. userData["district"] = userData.addressBus?.district;
  53. userData["addressLine1"] = userData.addressBus?.addressLine1;
  54. userData["addressLine2"] = userData.addressBus?.addressLine2;
  55. userData["addressLine3"] = userData.addressBus?.addressLine3;
  56. userData["phoneNumber"] = userData.contactTel?.phoneNumber;
  57. userData["tel_countryCode"] = userData.contactTel?.countryCode;
  58. userData["faxNumber"] = userData.faxNo?.faxNumber;
  59. userData["fax_countryCode"] = userData.faxNo?.countryCode;
  60. userData["brExpiryDate"] = userData.brExpiryDate?DateUtils.convertToDate(brExpiryDate):"";
  61. setDistrict(userData.district);
  62. setCountry(userData.country);
  63. setCurrentUserData(userData);
  64. }, [userData]);
  65. useEffect(() => {
  66. reset(currentUserData);
  67. setLocked(currentUserData.locked);
  68. }, [currentUserData]);
  69. function onSubmitForm(_data) {
  70. HttpUtils.post({
  71. url: UrlUtils.POST_IND_USER+"/"+userData.id,
  72. params: {
  73. chName: _data.chName,
  74. enName: _data.enName,
  75. contactTel: {
  76. countryCode: _data.tel_countryCode,
  77. phoneNumber: _data.phoneNumber
  78. },
  79. faxNo: {
  80. countryCode: _data.fax_countryCode,
  81. faxNumber: _data.faxNumber
  82. },
  83. addressBus: {
  84. country: country,
  85. district: district,
  86. addressLine1: _data.addressLine1,
  87. addressLine2: _data.addressLine2,
  88. addressLine3: _data.addressLine3,
  89. },
  90. identification: _data.identification,
  91. emailBus:_data.emailBus,
  92. contactPerson: _data.contactPerson,
  93. enCompanyName: _data.enCompanyName,
  94. chCompanyName: _data.chCompanyName,
  95. brNo: _data.brNo,
  96. brExpiryDate: formik.values.brExpiryDate,
  97. },
  98. onSuccess: function(){
  99. loadDataFun();
  100. }
  101. });
  102. }
  103. const onEditClick = () => {
  104. setEditMode(true);
  105. };
  106. const createOrgClick = () => {
  107. window.open("/org/fromUser/"+userData.id, "_blank", "noreferrer");
  108. };
  109. const onVerifiedClick = () => {
  110. HttpUtils.get({
  111. url: UrlUtils.GET_IND_USER_VERIFY+"/"+userData.id,
  112. onSuccess: function(){
  113. loadDataFun();
  114. }
  115. });
  116. };
  117. const doLock = () => {
  118. HttpUtils.get({
  119. url: UrlUtils.GET_USER_LOCK+"/"+userData.id,
  120. onSuccess: function(){
  121. loadDataFun();
  122. }
  123. });
  124. };
  125. const doUnlock = () => {
  126. HttpUtils.get({
  127. url: UrlUtils.GET_USER_UNLOCK+"/"+userData.id,
  128. onSuccess: function(){
  129. loadDataFun();
  130. }
  131. });
  132. };
  133. return (
  134. <MainCard elevation={0}
  135. border={false}
  136. content={false}
  137. >
  138. <Typography variant="h5" sx={{mt: 3, ml: 3, mb: 1}}>
  139. Information
  140. </Typography>
  141. <FormikProvider value={formik}>
  142. <form onSubmit={handleSubmit(onSubmitForm)}>
  143. {/*top button*/}
  144. <Grid item s={12} md={12} lg={12} sx={{mb: 3}} alignItems={"start"} justifyContent="center">
  145. <Grid container maxWidth justifyContent="flex-start">
  146. {editMode?
  147. <>
  148. <Grid item sx={{ml: 3, mr: 3}}>
  149. <Button
  150. size="large"
  151. variant="contained"
  152. onClick={loadDataFun}
  153. sx={{
  154. textTransform: 'capitalize',
  155. alignItems: 'end'
  156. }}
  157. >
  158. Cancel Edit
  159. </Button>
  160. </Grid>
  161. <Grid item sx={{ml: 3, mr: 3}}>
  162. <Button
  163. size="large"
  164. variant="contained"
  165. type="submit"
  166. color="success"
  167. sx={{
  168. textTransform: 'capitalize',
  169. alignItems: 'end'
  170. }}
  171. >
  172. Save
  173. </Button>
  174. </Grid>
  175. </>
  176. :
  177. <>
  178. <Grid item sx={{ml: 3, mr: 3}}>
  179. <Button
  180. size="large"
  181. variant="contained"
  182. sx={{
  183. textTransform: 'capitalize',
  184. alignItems: 'end'
  185. }}
  186. onClick={onEditClick}
  187. >
  188. Edit
  189. </Button>
  190. </Grid>
  191. </>
  192. }
  193. </Grid>
  194. </Grid>
  195. {/*end top button*/}
  196. <Grid container spacing={1}>
  197. <Grid item lg={4} >
  198. <Grid container alignItems={"center"}>
  199. <Grid item xs={4} s={4} md={4} lg={4}
  200. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  201. Username:
  202. </Grid>
  203. <Grid item xs={7} s={7} md={7} lg={6}>
  204. <TextField
  205. fullWidth
  206. id='username'
  207. disabled
  208. {...register("username")}
  209. />
  210. </Grid>
  211. </Grid>
  212. </Grid>
  213. <Grid item lg={4} >
  214. <Grid container alignItems={"center"}>
  215. <Grid item xs={4} s={4} md={4} lg={4}
  216. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  217. English Name:
  218. </Grid>
  219. <Grid item xs={7} s={7} md={7} lg={6}>
  220. <TextField
  221. fullWidth
  222. {...register("enName")}
  223. id='enName'
  224. disabled={!editMode}
  225. />
  226. </Grid>
  227. </Grid>
  228. </Grid>
  229. <Grid item lg={4} >
  230. <Grid container alignItems={"center"}>
  231. <Grid item xs={4} s={4} md={4} lg={4}
  232. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  233. Created Date:
  234. </Grid>
  235. <Grid item xs={7} s={7} md={7} lg={6}>
  236. <TextField
  237. fullWidth
  238. {...register("createDate")}
  239. id='createDate'
  240. disabled
  241. />
  242. </Grid>
  243. </Grid>
  244. </Grid>
  245. <Grid item lg={4} >
  246. <Grid container alignItems={"center"}>
  247. <Grid item xs={4} s={4} md={4} lg={4}
  248. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  249. Chinese Name:
  250. </Grid>
  251. <Grid item xs={7} s={7} md={7} lg={6}>
  252. <TextField
  253. fullWidth
  254. {...register("chName")}
  255. id='chName'
  256. disabled={!editMode}
  257. />
  258. </Grid>
  259. </Grid>
  260. </Grid>
  261. <Grid item lg={4}>
  262. <Grid container alignItems={"center"}>
  263. <Grid item xs={4} s={4} md={4} lg={4}
  264. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  265. Contact Tel:
  266. </Grid>
  267. <Grid item xs={2}>
  268. <TextField
  269. fullWidth
  270. {...register("tel_countryCode")}
  271. id='tel_countryCode'
  272. disabled={!editMode}
  273. />
  274. </Grid>
  275. <Grid item xs={4}>
  276. <TextField
  277. fullWidth
  278. {...register("phoneNumber")}
  279. id='phoneNumber'
  280. disabled={!editMode}
  281. />
  282. </Grid>
  283. </Grid>
  284. </Grid>
  285. <Grid item lg={4} >
  286. <Grid container alignItems={"center"}>
  287. <Grid item xs={4} s={4} md={4} lg={4}
  288. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  289. Last Updated:
  290. </Grid>
  291. <Grid item xs={7} s={7} md={7} lg={6}>
  292. <TextField
  293. fullWidth
  294. {...register("modifieDate")}
  295. id='modifieDate'
  296. disabled
  297. />
  298. </Grid>
  299. </Grid>
  300. </Grid>
  301. <Grid item lg={4}>
  302. <Grid container alignItems={"center"}>
  303. <Grid item xs={4} s={4} md={4} lg={4}
  304. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  305. Organization:
  306. </Grid>
  307. <Grid item xs={7} s={7} md={7} lg={6} >
  308. <TextField
  309. {...register("identification")}
  310. id='identification'
  311. disabled={!editMode}
  312. />
  313. {/* <Button lg={2} variant="contained" onClick={downloadFile} >View File</Button> */}
  314. </Grid>
  315. </Grid>
  316. </Grid>
  317. <Grid item lg={4}>
  318. <Grid container alignItems={"center"}>
  319. <Grid item xs={4} s={4} md={4} lg={4}
  320. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  321. Email:
  322. </Grid>
  323. <Grid item xs={7} s={7} md={7} lg={6}>
  324. <TextField
  325. fullWidth
  326. {...register("emailBus")}
  327. id='emailBus'
  328. disabled={!editMode}
  329. />
  330. </Grid>
  331. </Grid>
  332. </Grid>
  333. <Grid item lg={4}>
  334. <Grid container alignItems={"center"}>
  335. <Grid item xs={4} s={4} md={4} lg={4}
  336. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  337. Verified:
  338. </Grid>
  339. {
  340. currentUserData.verifiedBy || editMode?
  341. <Grid item xs={6}>
  342. <TextField
  343. fullWidth
  344. {...register("verifiedStatus")}
  345. id='verifiedStatus'
  346. disabled
  347. />
  348. </Grid>
  349. :
  350. <>
  351. <Grid item xs={4}>
  352. <TextField
  353. fullWidth
  354. {...register("verifiedStatus")}
  355. id='verifiedStatus'
  356. disabled
  357. />
  358. </Grid>
  359. <Grid item xs={1}>
  360. <Button
  361. size="large"
  362. variant="contained"
  363. sx={{
  364. textTransform: 'capitalize',
  365. alignItems: 'end'
  366. }}
  367. onClick={onVerifiedClick}
  368. >
  369. Verify
  370. </Button>
  371. </Grid>
  372. </>
  373. }
  374. </Grid>
  375. </Grid>
  376. <Grid item lg={4}>
  377. <Grid container alignItems={"center"}>
  378. <Grid item xs={4} s={4} md={4} lg={4}
  379. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  380. Last Login:
  381. </Grid>
  382. <Grid item xs={7} s={7} md={7} lg={6}>
  383. <TextField
  384. fullWidth
  385. {...register("lastLoginDate")}
  386. id='lastLoginDate'
  387. disabled
  388. >
  389. </TextField>
  390. </Grid>
  391. </Grid>
  392. </Grid>
  393. <Grid item lg={4}>
  394. <Grid container alignItems={"center"}>
  395. <Grid item xs={4} s={4} md={4} lg={4}
  396. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  397. Status:
  398. </Grid>
  399. {
  400. editMode?
  401. <Grid item xs={7} s={7} md={7} lg={6}>
  402. <TextField
  403. fullWidth
  404. {...register("status")}
  405. id='status'
  406. disabled
  407. />
  408. </Grid>
  409. :
  410. <>
  411. <Grid item lg={4}>
  412. <TextField
  413. fullWidth
  414. {...register("status")}
  415. id='status'
  416. disabled
  417. />
  418. </Grid>
  419. {locked?
  420. <Grid lg={1}>
  421. <Button
  422. size="large"
  423. variant="contained"
  424. color="success"
  425. sx={{
  426. textTransform: 'capitalize',
  427. alignItems: 'end'
  428. }}
  429. onClick={doUnlock}
  430. >
  431. Active
  432. </Button>
  433. </Grid>
  434. :
  435. <Grid item lg={1}>
  436. <Button
  437. size="large"
  438. variant="contained"
  439. color="error"
  440. sx={{
  441. textTransform: 'capitalize',
  442. alignItems: 'end'
  443. }}
  444. onClick={doLock}
  445. >
  446. Lock
  447. </Button>
  448. </Grid>
  449. }
  450. </>
  451. }
  452. </Grid>
  453. </Grid>
  454. </Grid>
  455. <Grid container spacing={1}>
  456. <Grid item lg={1} >
  457. <Typography variant="h5" sx={{mt: 3, ml: 3, mb: 1}}>
  458. Organization
  459. </Typography>
  460. </Grid>
  461. <Grid item lg={2}>
  462. <Button variant="contained"
  463. onClick={createOrgClick}
  464. >
  465. Create Organization
  466. </Button>
  467. </Grid>
  468. </Grid>
  469. <Grid container spacing={1}>
  470. <Grid item lg={4} >
  471. <Grid container alignItems={"center"}>
  472. <Grid item xs={4} s={4} md={4} lg={4}
  473. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  474. Org.Name (English):
  475. </Grid>
  476. <Grid item xs={7} s={7} md={7} lg={6}>
  477. <TextField
  478. fullWidth
  479. {...register("enCompanyName")}
  480. id='enCompanyName'
  481. disabled={!editMode}
  482. />
  483. </Grid>
  484. </Grid>
  485. </Grid>
  486. <Grid item lg={4} >
  487. <Grid container alignItems={"center"}>
  488. <Grid item xs={4} s={4} md={4} lg={4}
  489. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  490. Org.Name (Chinese):
  491. </Grid>
  492. <Grid item xs={7} s={7} md={7} lg={6}>
  493. <TextField
  494. fullWidth
  495. {...register("chCompanyName")}
  496. id='chCompanyName'
  497. disabled={!editMode}
  498. />
  499. </Grid>
  500. </Grid>
  501. </Grid>
  502. <Grid item lg={4} >
  503. <Grid container alignItems={"center"}>
  504. <Grid item xs={4} s={4} md={4} lg={4}
  505. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  506. BR No.:
  507. </Grid>
  508. <Grid item xs={7} s={7} md={7} lg={6}>
  509. <TextField
  510. fullWidth
  511. {...register("brNo")}
  512. id='brNo'
  513. disabled={!editMode}
  514. />
  515. </Grid>
  516. </Grid>
  517. </Grid>
  518. <Grid item lg={4} >
  519. <Grid container alignItems={"center"}>
  520. <Grid item xs={4} s={4} md={4} lg={4}
  521. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  522. Contact Person:
  523. </Grid>
  524. <Grid item xs={7} s={7} md={7} lg={6}>
  525. <TextField
  526. fullWidth
  527. {...register("contactPerson")}
  528. id='contactPerson'
  529. disabled={!editMode}
  530. />
  531. </Grid>
  532. </Grid>
  533. </Grid>
  534. <Grid item lg={4}>
  535. <Grid container alignItems={"center"}>
  536. <Grid item xs={4} s={4} md={4} lg={4}
  537. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  538. Fax No.:
  539. </Grid>
  540. <Grid item xs={2}>
  541. <TextField
  542. fullWidth
  543. {...register("fax_countryCode")}
  544. id='fax_countryCode'
  545. disabled={!editMode}
  546. />
  547. </Grid>
  548. <Grid item xs={4}>
  549. <TextField
  550. fullWidth
  551. {...register("faxNumber")}
  552. id='faxNumber'
  553. disabled={!editMode}
  554. />
  555. </Grid>
  556. </Grid>
  557. </Grid>
  558. <Grid item lg={4} >
  559. <Grid container alignItems={"center"}>
  560. <Grid item xs={4} s={4} md={4} lg={4}
  561. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  562. BR Expiry Date.:
  563. </Grid>
  564. <Grid item xs={7} s={7} md={7} lg={6}>
  565. <OutlinedInput
  566. fullWidth
  567. disabled={!editMode}
  568. {...register("brExpiryDate")}
  569. error={Boolean(formik.touched.brExpiryDate && formik.errors.brExpiryDate)}
  570. id="brExpiryDate"
  571. type="date"
  572. value={formik.values.brExpiryDate}
  573. format="dd/MM/yyyy"
  574. name="brExpiryDate"
  575. onChange={formik.handleChange}
  576. placeholder="與與商業登記證相同如有"
  577. inputProps={{
  578. onKeyDown: (e) => {
  579. if (e.key === 'Enter') {
  580. e.preventDefault();
  581. }
  582. },
  583. }}
  584. />
  585. {formik.touched.brExpiryDate && formik.errors.brExpiryDate && (
  586. <FormHelperText error id="brExpiryDate">
  587. {formik.errors.brExpiryDate}
  588. </FormHelperText>
  589. )}
  590. </Grid>
  591. </Grid>
  592. </Grid>
  593. <Grid item lg={4}>
  594. <Grid container alignItems={"top"}>
  595. <Grid item xs={4} s={4} md={4} lg={4}
  596. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'top'}}>
  597. <Grid item lg={12} sx={{alignItems: 'center'}}>Address :</Grid>
  598. </Grid>
  599. <Grid item xs={7} s={7} md={12} lg={6}>
  600. <TextField
  601. fullWidth
  602. {...register("addressLine1")}
  603. id='addressLine1'
  604. disabled={!editMode}
  605. />
  606. <TextField
  607. fullWidth
  608. {...register("addressLine2")}
  609. id='addressLine2'
  610. disabled={!editMode}
  611. />
  612. <TextField
  613. fullWidth
  614. {...register("addressLine3")}
  615. id='addressLine3'
  616. disabled={!editMode}
  617. />
  618. </Grid>
  619. </Grid>
  620. </Grid>
  621. <Grid item lg={4}>
  622. <Grid container alignItems={"center"}>
  623. <Grid item xs={4} s={4} md={4} lg={4}
  624. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  625. District:
  626. </Grid>
  627. <Grid item xs={7} s={7} md={7} lg={6}>
  628. <Autocomplete
  629. fullWidth
  630. disablePortal
  631. id="district"
  632. {...register("district")}
  633. value={district}
  634. options={ComboData.district}
  635. onChange={(event, newValue) => {
  636. setDistrict(newValue);
  637. }}
  638. disabled={!editMode}
  639. sx={{"& .MuiInputBase-root": { height: "41px" },"#district":{padding: "0px 0px 0px 0px"}, "& .MuiAutocomplete-endAdornment": { top: "auto" },}}
  640. renderInput={(params) => <TextField {...params} placeholder="區域 (只適用於香港)"/>}
  641. />
  642. </Grid>
  643. </Grid>
  644. </Grid>
  645. <Grid item lg={4}>
  646. <Grid container alignItems={"center"}>
  647. <Grid item xs={4} s={4} md={4} lg={4}
  648. sx={{ml: 3, mr: 3, display: 'flex', alignItems: 'center'}}>
  649. Country:
  650. </Grid>
  651. <Grid item xs={7} s={7} md={7} lg={6}>
  652. <Autocomplete
  653. fullWidth
  654. disablePortal
  655. disabled={!editMode}
  656. id="country"
  657. value={country}
  658. options={ComboData.country}
  659. {...register("country")}
  660. onChange={(event, newValue) => {
  661. setCountry(newValue);
  662. }}
  663. sx={{"& .MuiInputBase-root": { height: "41px" },"#country":{padding: "0px 0px 0px 0px"}, "& .MuiAutocomplete-endAdornment": { top: "auto" },}}
  664. renderInput={(params) => <TextField {...params} placeholder="國家/地區"/>}
  665. />
  666. </Grid>
  667. </Grid>
  668. </Grid>
  669. </Grid>
  670. </form>
  671. </FormikProvider>
  672. </MainCard>
  673. );
  674. };
  675. export default UserInformationCard_Organization;