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

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