CreateRoleDialog.tsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. import {
  2. makeStyles,
  3. Theme,
  4. Typography,
  5. Checkbox,
  6. FormGroup,
  7. FormControlLabel,
  8. } from '@material-ui/core';
  9. import { FC, useMemo, useState, useEffect } from 'react';
  10. import { useTranslation } from 'react-i18next';
  11. import DialogTemplate from '@/components/customDialog/DialogTemplate';
  12. import CustomInput from '@/components/customInput/CustomInput';
  13. import { ITextfieldConfig } from '@/components/customInput/Types';
  14. import { useFormValidation } from '@/hooks/Form';
  15. import { formatForm } from '@/utils/Form';
  16. import { UserHttp } from '@/http/User';
  17. import { CreateRoleProps, CreateRoleParams, Privilege } from './Types';
  18. const useStyles = makeStyles((theme: Theme) => ({
  19. input: {
  20. margin: theme.spacing(1, 0, 0.5),
  21. },
  22. dialogWrapper: {
  23. maxWidth: theme.spacing(88),
  24. },
  25. checkBox: {
  26. width: theme.spacing(24),
  27. },
  28. formGrp: {
  29. marginBottom: theme.spacing(2),
  30. },
  31. subTitle: {
  32. marginBottom: theme.spacing(0.5),
  33. },
  34. }));
  35. const CreateRoleDialog: FC<CreateRoleProps> = ({ onCreate, handleClose }) => {
  36. const { t: commonTrans } = useTranslation();
  37. const { t: userTrans } = useTranslation('user');
  38. const { t: btnTrans } = useTranslation('btn');
  39. const { t: warningTrans } = useTranslation('warning');
  40. const [rbacOptions, setRbacOptions] = useState({
  41. GlobalPrivileges: {},
  42. CollectionPrivileges: {},
  43. RbacObjects: {},
  44. UserPrivileges: {},
  45. Privileges: {},
  46. });
  47. const fetchRBAC = async () => {
  48. const rbacOptions = await UserHttp.getRBAC();
  49. const roles = await UserHttp.getRoles();
  50. console.log(rbacOptions, roles);
  51. setRbacOptions(rbacOptions);
  52. };
  53. useEffect(() => {
  54. fetchRBAC();
  55. }, []);
  56. const [form, setForm] = useState<CreateRoleParams>({
  57. roleName: '',
  58. privileges: [],
  59. });
  60. const checkedForm = useMemo(() => {
  61. return formatForm(form);
  62. }, [form]);
  63. const { validation, checkIsValid, disabled } = useFormValidation(checkedForm);
  64. const classes = useStyles();
  65. const handleInputChange = (key: 'roleName', value: string) => {
  66. setForm(v => {
  67. const newFrom = { ...v, [key]: value };
  68. // update roleName
  69. newFrom.privileges.forEach(p => (p.roleName = value));
  70. return newFrom;
  71. });
  72. };
  73. const createConfigs: ITextfieldConfig[] = [
  74. {
  75. label: userTrans('role'),
  76. key: 'roleName',
  77. onChange: (value: string) => handleInputChange('roleName', value),
  78. variant: 'filled',
  79. className: classes.input,
  80. placeholder: userTrans('role'),
  81. fullWidth: true,
  82. validations: [
  83. {
  84. rule: 'require',
  85. errorText: warningTrans('required', {
  86. name: userTrans('role'),
  87. }),
  88. },
  89. ],
  90. defaultValue: form.roleName,
  91. },
  92. ];
  93. const handleCreateRole = async () => {
  94. await UserHttp.createRole(form);
  95. await UserHttp.updateRolePrivileges(form);
  96. onCreate(form);
  97. };
  98. // prepare data
  99. const globalPriviledgeOptions = Object.values(rbacOptions.GlobalPrivileges);
  100. const collectionPrivilegeOptions = Object.values(
  101. rbacOptions.CollectionPrivileges
  102. );
  103. const userPrivilegeOptions = Object.values(rbacOptions.UserPrivileges);
  104. return (
  105. <DialogTemplate
  106. title={userTrans('createRoleTitle')}
  107. handleClose={handleClose}
  108. confirmLabel={btnTrans('create')}
  109. handleConfirm={handleCreateRole}
  110. confirmDisabled={disabled}
  111. dialogClass={classes.dialogWrapper}
  112. >
  113. <>
  114. {createConfigs.map(v => (
  115. <CustomInput
  116. type="text"
  117. textConfig={v}
  118. checkValid={checkIsValid}
  119. validInfo={validation}
  120. key={v.label}
  121. />
  122. ))}
  123. <Typography variant="h5" component="h5" className={classes.subTitle}>
  124. {userTrans('privileges')}
  125. </Typography>
  126. <Typography variant="h6" component="h6" className={classes.subTitle}>
  127. {userTrans('objectGlobal')}
  128. </Typography>
  129. <FormGroup row className={classes.formGrp}>
  130. {globalPriviledgeOptions.map((r: any, index: number) => (
  131. <FormControlLabel
  132. control={
  133. <Checkbox
  134. onChange={(
  135. e: React.ChangeEvent<HTMLInputElement>,
  136. checked: boolean
  137. ) => {
  138. let newPivilegs = [...form.privileges];
  139. if (!checked) {
  140. newPivilegs = newPivilegs.filter(
  141. (n: Privilege) => n.privilegeName !== r
  142. );
  143. } else {
  144. newPivilegs.push({
  145. privilegeName: r,
  146. object: 'Global',
  147. objectName: '*',
  148. roleName: form.roleName,
  149. });
  150. }
  151. console.log(newPivilegs);
  152. setForm(v => ({ ...v, privileges: [...newPivilegs] }));
  153. }}
  154. />
  155. }
  156. key={r}
  157. label={r}
  158. value={r}
  159. className={classes.checkBox}
  160. />
  161. ))}
  162. </FormGroup>
  163. <Typography variant="h6" component="h6" className={classes.subTitle}>
  164. {userTrans('objectCollection')}
  165. </Typography>
  166. <FormGroup row className={classes.formGrp}>
  167. {collectionPrivilegeOptions.map((r: any, index: number) => (
  168. <FormControlLabel
  169. control={
  170. <Checkbox
  171. onChange={(
  172. e: React.ChangeEvent<HTMLInputElement>,
  173. checked: boolean
  174. ) => {
  175. let newPivilegs = [...form.privileges];
  176. if (!checked) {
  177. newPivilegs = newPivilegs.filter(
  178. (n: Privilege) => n.privilegeName !== r
  179. );
  180. } else {
  181. newPivilegs.push({
  182. privilegeName: r,
  183. object: 'Collection',
  184. objectName: '*',
  185. roleName: form.roleName,
  186. });
  187. }
  188. console.log(newPivilegs);
  189. setForm(v => ({ ...v, privileges: [...newPivilegs] }));
  190. }}
  191. />
  192. }
  193. key={r}
  194. label={r}
  195. value={r}
  196. className={classes.checkBox}
  197. />
  198. ))}
  199. </FormGroup>
  200. <Typography variant="h6" component="h6" className={classes.subTitle}>
  201. {userTrans('objectUser')}
  202. </Typography>
  203. <FormGroup row className={classes.formGrp}>
  204. {userPrivilegeOptions.map((r: any, index: number) => (
  205. <FormControlLabel
  206. control={
  207. <Checkbox
  208. onChange={(
  209. e: React.ChangeEvent<HTMLInputElement>,
  210. checked: boolean
  211. ) => {
  212. let newPivilegs = [...form.privileges];
  213. if (!checked) {
  214. newPivilegs = newPivilegs.filter(
  215. (n: Privilege) => n.privilegeName !== r
  216. );
  217. } else {
  218. newPivilegs.push({
  219. privilegeName: r,
  220. object: 'User',
  221. objectName: '*',
  222. roleName: form.roleName,
  223. });
  224. }
  225. console.log(newPivilegs);
  226. setForm(v => ({ ...v, privileges: [...newPivilegs] }));
  227. }}
  228. />
  229. }
  230. key={r}
  231. label={r}
  232. value={r}
  233. className={classes.checkBox}
  234. />
  235. ))}
  236. </FormGroup>
  237. </>
  238. </DialogTemplate>
  239. );
  240. };
  241. export default CreateRoleDialog;