Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 

588 Zeilen
27 KiB

  1. // material-ui
  2. import {
  3. Grid, Typography, Button,
  4. Dialog, DialogTitle, DialogContent, DialogActions
  5. } from '@mui/material';
  6. import MainCard from "../../components/MainCard";
  7. import * as React from "react";
  8. import * as FieldUtils from "../../utils/FieldUtils";
  9. import * as HttpUtils from '../../utils/HttpUtils';
  10. import * as UrlUtils from "../../utils/ApiPathConst";
  11. import * as ComboData from "../../utils/ComboData";
  12. import { useFormik } from 'formik';
  13. import * as yup from 'yup';
  14. const LoadingComponent = Loadable(lazy(() => import('../extra-pages/LoadingComponent')));
  15. import Loadable from 'components/Loadable';
  16. import { lazy } from 'react';
  17. // ==============================|| DASHBOARD - DEFAULT ||============================== //
  18. const UserInformationCard_Organization = ({ userData, loadDataFun, orgData }) => {
  19. const [currentUserData, setCurrentUserData] = React.useState(userData);
  20. const [isWarningPopUp, setIsWarningPopUp] = React.useState(false);
  21. const [warningText, setWarningText] = React.useState("");
  22. const [isConfirmPopUp, setIsConfirmPopUp] = React.useState(false);
  23. const [confirmText, setConfirmText] = React.useState("");
  24. const [confirmAction, setConfirmAction] = React.useState();
  25. const [editMode, setEditMode] = React.useState(false);
  26. const [onReady, setOnReady] = React.useState(false);
  27. React.useEffect(() => {
  28. //if state data are ready and assign to different field
  29. // console.log(currentApplicationDetailData)
  30. if (Object.keys(currentUserData).length > 0) {
  31. setOnReady(true);
  32. }
  33. }, [currentUserData]);
  34. const formik = useFormik({
  35. enableReinitialize: true,
  36. initialValues: currentUserData,
  37. validationSchema: yup.object().shape({
  38. contactPerson: yup.string().max(255).required('請輸入姓名'),
  39. enCompanyName: yup.string().max(255).required('請輸入英文名稱'),
  40. chCompanyName: yup.string().max(255).nullable(),
  41. addressLine1: yup.string().max(255).required('請輸入第一行地址'),
  42. addressLine2: yup.string().max(255).nullable(),
  43. addressLine3: yup.string().max(255).nullable(),
  44. emailBus: yup.string().max(255).required('請輸入電郵'),
  45. tel_countryCode: yup.string().min(3, '請輸入3位數字').required('請輸入國際區號'),
  46. fax_countryCode: yup.string().min(3, '請輸入3位數字').nullable(),
  47. phoneNumber: yup.string().min(8, '請輸入8位數字').required('請輸入聯絡電話'),
  48. faxNumber: yup.string().min(8, '請輸入8位數字').nullable(),
  49. brExpiryDate: yup.string().min(8, '請輸入商業登記證有效日期'),
  50. brNo: yup.string().min(8, '請輸入有效商業登記證號碼').max(8, '請輸入有效商業登記證號碼').required('請輸入商業登記證號碼'),
  51. }),
  52. onSubmit: (values) => {
  53. HttpUtils.post({
  54. url: UrlUtils.POST_ORG_USER + "/" + userData.id,
  55. params: {
  56. contactTel: {
  57. countryCode: values.tel_countryCode,
  58. phoneNumber: values.phoneNumber
  59. },
  60. // faxNo: {
  61. // countryCode: values.fax_countryCode,
  62. // faxNumber: values.faxNumber
  63. // },
  64. // addressBus: {
  65. // country: values.country,
  66. // district: values.district,
  67. // addressLine1: values.addressLine1,
  68. // addressLine2: values.addressLine2,
  69. // addressLine3: values.addressLine3,
  70. // },
  71. identification: values.identification,
  72. emailBus: values.emailBus,
  73. contactPerson: values.contactPerson,
  74. // enCompanyName: values.enCompanyName,
  75. // chCompanyName: values.chCompanyName,
  76. orgId: values.orgId,
  77. // brNo: values.brNo,
  78. // brExpiryDate: values.brExpiryDate,
  79. },
  80. onSuccess: function () {
  81. loadDataFun();
  82. }
  83. });
  84. }
  85. });
  86. React.useEffect(() => {
  87. if (Object.keys(userData).length > 0) {
  88. setCurrentUserData(userData);
  89. }
  90. }, [userData]);
  91. const onEditClick = () => {
  92. setEditMode(true);
  93. };
  94. const createOrgClick = () => {
  95. window.open("/org/fromUser/" + userData.id, "_blank", "noreferrer");
  96. window.addEventListener("focus", onFocus)
  97. };
  98. const onFocus = () => {
  99. loadDataFun();
  100. window.removeEventListener("focus", onFocus)
  101. }
  102. const onVerifiedClick = () => {
  103. if (formik?.values?.orgId) {
  104. HttpUtils.get({
  105. url: UrlUtils.GET_IND_USER_VERIFY + "/" + userData.id,
  106. onSuccess: function () {
  107. loadDataFun();
  108. }
  109. });
  110. } else {
  111. setWarningText("Please select Organization before active this account.")
  112. setIsWarningPopUp(true);
  113. }
  114. };
  115. const doLock = () => {
  116. setConfirmText("Confirm to Lock this Account?");
  117. setConfirmAction({
  118. function: function () {
  119. HttpUtils.get({
  120. url: UrlUtils.GET_USER_LOCK + "/" + userData.id,
  121. onSuccess: function () {
  122. loadDataFun();
  123. }
  124. });
  125. }
  126. });
  127. setIsConfirmPopUp(true);
  128. };
  129. const doUnlock = () => {
  130. setConfirmText("Confirm to Un-Lock this Account?");
  131. setConfirmAction({
  132. function: function () {
  133. HttpUtils.get({
  134. url: UrlUtils.GET_USER_UNLOCK + "/" + userData.id,
  135. onSuccess: function () {
  136. loadDataFun();
  137. }
  138. });
  139. }
  140. });
  141. setIsConfirmPopUp(true);
  142. };
  143. return (
  144. <MainCard elevation={0}
  145. border={false}
  146. content={false}
  147. >
  148. {!onReady?
  149. <LoadingComponent />
  150. :
  151. <form onSubmit={formik.handleSubmit}>
  152. {/*top button*/}
  153. <Grid item s={12} md={12} lg={12} sx={{ mb: 3 }} alignItems={"start"} justifyContent="center">
  154. <Grid container maxWidth justifyContent="flex-start">
  155. {editMode ?
  156. <>
  157. <Grid item sx={{ ml: 3, mr: 3 }}>
  158. <Button
  159. size="large"
  160. variant="contained"
  161. onClick={loadDataFun}
  162. sx={{
  163. textTransform: 'capitalize',
  164. alignItems: 'end'
  165. }}
  166. >
  167. Reset & Back
  168. </Button>
  169. </Grid>
  170. <Grid item sx={{ ml: 3, mr: 3 }}>
  171. <Button
  172. size="large"
  173. variant="contained"
  174. type="submit"
  175. color="success"
  176. sx={{
  177. textTransform: 'capitalize',
  178. alignItems: 'end'
  179. }}
  180. >
  181. Save
  182. </Button>
  183. </Grid>
  184. </>
  185. :
  186. <>
  187. <Grid item sx={{ ml: 3, mr: 3 }}>
  188. <Button
  189. size="large"
  190. variant="contained"
  191. sx={{
  192. textTransform: 'capitalize',
  193. alignItems: 'end'
  194. }}
  195. onClick={onEditClick}
  196. >
  197. Edit
  198. </Button>
  199. </Grid>
  200. </>
  201. }
  202. </Grid>
  203. </Grid>
  204. {/*end top button*/}
  205. <div style={{ paddingLeft: 24, paddingRight: 24 }}>
  206. <Grid container spacing={1}>
  207. <Grid item lg={4}>
  208. {FieldUtils.getTextField({
  209. label: "Username:",
  210. valueName: "username",
  211. disabled: true,
  212. form: formik
  213. })}
  214. </Grid>
  215. <Grid item lg={4}>
  216. {FieldUtils.getTextField({
  217. label: "Name:",
  218. valueName: "contactPerson",
  219. disabled: (!editMode),
  220. form: formik
  221. })}
  222. </Grid>
  223. <Grid item lg={4}>
  224. {FieldUtils.getTextField({
  225. label: "Created Date:",
  226. valueName: "createDate",
  227. disabled: true,
  228. form: formik
  229. })}
  230. </Grid>
  231. <Grid item lg={4}>
  232. {FieldUtils.getTextField({
  233. label: "Email:",
  234. valueName: "emailBus",
  235. disabled: (!editMode),
  236. form: formik
  237. })}
  238. </Grid>
  239. <Grid item lg={4}>
  240. {FieldUtils.getPhoneField({
  241. label: "Contact Tel:",
  242. valueName: {
  243. code: "tel_countryCode",
  244. num: "phoneNumber"
  245. },
  246. disabled: (!editMode),
  247. form: formik
  248. })}
  249. </Grid>
  250. <Grid item lg={4}>
  251. {FieldUtils.getTextField({
  252. label: "Last Updated:",
  253. valueName: "modifieDate",
  254. disabled: true,
  255. form: formik
  256. })}
  257. </Grid>
  258. <Grid item lg={4}>
  259. {FieldUtils.getComboField({
  260. label: "Organization:",
  261. valueName: "orgId",
  262. disabled: (!editMode),
  263. dataList: orgData,
  264. filterOptions: (options, state) => {
  265. if (!state || !state.inputValue) return options;
  266. let searchStr = state.inputValue.toLowerCase().toLowerCase().trim();
  267. const displayOptions = options.filter((option) => {
  268. let brNo = option.brNo.toLowerCase().trim();
  269. let enCompanyName = option.enCompanyName ? option.enCompanyName.toLowerCase().trim() : "";
  270. let chCompanyName = option.chCompanyName ? option.chCompanyName.toLowerCase().trim() : "";
  271. return brNo.includes(searchStr) || enCompanyName.includes(searchStr) || chCompanyName.includes(searchStr);
  272. },
  273. );
  274. return displayOptions;
  275. },
  276. getOptionLabel: (item) => item ? typeof item === 'number' ? item + "" : (item["brNo"] ? item["brNo"] + "-" + item["enCompanyName"]: "") : "",
  277. isOptionEqualToValue: (option, newValue, setValue, setInputValue) => {
  278. if (option.id == newValue) {
  279. setValue(option);
  280. setInputValue(option["brNo"] + "-" + option["enCompanyName"]);
  281. return true;
  282. }
  283. return option == newValue;
  284. },
  285. onInputChange: (event, newValue, setInputValue) => {
  286. if (newValue != null) {
  287. setInputValue(newValue);
  288. }
  289. },
  290. onChange: (event, newValue) => {
  291. if (newValue == null) {
  292. formik.setFieldValue("orgId", "");
  293. return;
  294. }
  295. formik.setFieldValue("orgId", newValue.id);
  296. },
  297. form: formik
  298. })}
  299. </Grid>
  300. <Grid item lg={4}>
  301. <Grid container alignItems={"center"}>
  302. <Grid item xs={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}>
  303. Verified:
  304. </Grid>
  305. {
  306. currentUserData.verifiedBy || editMode ?
  307. <Grid item xs={12} md={6} lg={6}>
  308. {FieldUtils.initField({
  309. valueName: "verifiedStatus",
  310. disabled: true,
  311. form: formik,
  312. })}
  313. </Grid>
  314. :
  315. <>
  316. <Grid item xs={10} md={4} lg={4}>
  317. {FieldUtils.initField({
  318. valueName: "verifiedStatus",
  319. disabled: true,
  320. form: formik,
  321. })}
  322. </Grid>
  323. <Grid item xs={1} md={1} lg={1}>
  324. <Button
  325. size="large"
  326. variant="contained"
  327. sx={{
  328. textTransform: 'capitalize',
  329. alignItems: 'end'
  330. }}
  331. onClick={() => { onVerifiedClick() }}
  332. >
  333. Verify
  334. </Button>
  335. </Grid>
  336. </>
  337. }
  338. </Grid>
  339. </Grid>
  340. <Grid item lg={4}>
  341. {FieldUtils.getTextField({
  342. label: "Last Login:",
  343. valueName: "lastLoginDate",
  344. disabled: true,
  345. form: formik
  346. })}
  347. </Grid>
  348. <Grid item lg={8}></Grid>
  349. <Grid item lg={4}>
  350. <Grid container alignItems={"center"}>
  351. <Grid item xs={12} md={3} lg={3} sx={{ display: 'flex', alignItems: 'center' }}>
  352. Status:
  353. </Grid>
  354. {
  355. editMode ?
  356. <Grid item xs={12} md={6} lg={6}>
  357. {FieldUtils.initField({
  358. valueName: "status",
  359. disabled: true,
  360. form: formik,
  361. })}
  362. </Grid>
  363. :
  364. <>
  365. <Grid item xs={10} md={4} lg={4}>
  366. {FieldUtils.initField({
  367. valueName: "status",
  368. disabled: true,
  369. form: formik,
  370. })}
  371. </Grid>
  372. {formik.values.locked ?
  373. <Grid item xs={1} md={1} lg={1}>
  374. <Button
  375. size="large"
  376. variant="contained"
  377. color="success"
  378. sx={{
  379. textTransform: 'capitalize',
  380. alignItems: 'end'
  381. }}
  382. onClick={doUnlock}
  383. >
  384. Active
  385. </Button>
  386. </Grid>
  387. :
  388. <Grid item xs={1} md={1} lg={1}>
  389. <Button
  390. size="large"
  391. variant="contained"
  392. color="error"
  393. sx={{
  394. textTransform: 'capitalize',
  395. alignItems: 'end'
  396. }}
  397. onClick={doLock}
  398. >
  399. Lock
  400. </Button>
  401. </Grid>
  402. }
  403. </>
  404. }
  405. </Grid>
  406. </Grid>
  407. </Grid>
  408. </div>
  409. <div style={{ paddingLeft: 24, paddingRight: 24 }}>
  410. <Grid container spacing={1} >
  411. <Grid item lg={12} >
  412. <Grid container alignItems={"center"}>
  413. <Grid item lg={1} >
  414. <Typography variant="h5" sx={{ display: 'flex', alignItems: 'center' }}>
  415. Organization
  416. </Typography>
  417. </Grid>
  418. {currentUserData.orgId==null?
  419. <Grid item lg={2} >
  420. <Button variant="contained"
  421. onClick={createOrgClick}
  422. >
  423. Create Organization
  424. </Button>
  425. </Grid>
  426. :null
  427. }
  428. </Grid>
  429. </Grid>
  430. <Grid item lg={4}>
  431. {FieldUtils.getTextField({
  432. label: "Org.Name (English):",
  433. valueName: "enCompanyName",
  434. disabled: true,
  435. form: formik
  436. })}
  437. </Grid>
  438. <Grid item lg={4}>
  439. {FieldUtils.getTextField({
  440. label: "Org.Name (Chinese):",
  441. valueName: "chCompanyName",
  442. disabled: true,
  443. form: formik
  444. })}
  445. </Grid>
  446. <Grid item lg={4}>
  447. {FieldUtils.getTextField({
  448. label: "BR No.:",
  449. valueName: "brNo",
  450. disabled: true,
  451. form: formik
  452. })}
  453. </Grid>
  454. <Grid item lg={4}>
  455. {FieldUtils.getComboField({
  456. label: "Country:",
  457. valueName: "country",
  458. dataList: ComboData.country,
  459. disabled: true,
  460. form: formik
  461. })}
  462. </Grid>
  463. <Grid item lg={4}>
  464. {FieldUtils.getPhoneField({
  465. label: "Fax No.:",
  466. valueName: {
  467. code: "fax_countryCode",
  468. num: "faxNumber"
  469. },
  470. disabled: true,
  471. form: formik
  472. })}
  473. </Grid>
  474. <Grid item lg={4}>
  475. {FieldUtils.getDateField({
  476. label: "BR Expiry Date.:",
  477. valueName: "brExpiryDate",
  478. disabled: true,
  479. form: formik
  480. })}
  481. </Grid>
  482. <Grid item lg={4}>
  483. {FieldUtils.getAddressField({
  484. label: "Address:",
  485. valueName: ["addressLine1", "addressLine2", "addressLine3"],
  486. disabled: true,
  487. form: formik
  488. })}
  489. </Grid>
  490. <Grid item lg={4}>
  491. {FieldUtils.getComboField({
  492. label: "District:",
  493. valueName: "district",
  494. dataList: ComboData.district,
  495. disabled: true,
  496. form: formik
  497. })}
  498. </Grid>
  499. </Grid>
  500. </div>
  501. </form>
  502. }
  503. <div>
  504. <Dialog open={isWarningPopUp} onClose={() => setIsWarningPopUp(false)} >
  505. <DialogTitle>Warning</DialogTitle>
  506. <DialogContent style={{ display: 'flex', }}>
  507. <Typography variant="h3" style={{ padding: '16px' }}>{warningText}</Typography>
  508. </DialogContent>
  509. <DialogActions>
  510. <Button onClick={() => setIsWarningPopUp(false)}>Close</Button>
  511. </DialogActions>
  512. </Dialog>
  513. </div>
  514. <div>
  515. <Dialog open={isConfirmPopUp} onClose={() => setIsConfirmPopUp(false)} >
  516. <DialogTitle>Confirm</DialogTitle>
  517. <DialogContent style={{ display: 'flex', }}>
  518. <Typography variant="h3" style={{ padding: '16px' }}>{confirmText}</Typography>
  519. </DialogContent>
  520. <DialogActions>
  521. <Button onClick={() => { setIsConfirmPopUp(false) }}>Close</Button>
  522. <Button onClick={() => { confirmAction?.function(); }}>Confirm</Button>
  523. </DialogActions>
  524. </Dialog>
  525. </div>
  526. </MainCard>
  527. );
  528. };
  529. export default UserInformationCard_Organization;