AddRole.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. import {useEffect,useState,useContext} from 'react';
  2. import { Form, Input, Checkbox, Button, Select,Tabs ,InputNumber,Space,Switch,Breadcrumb } from 'antd';
  3. import MenuTree from './MenuTree';
  4. import './index.less';
  5. import RoleContext from './role-context';
  6. import apiObj from '@api/index';
  7. import backIcon from "@images/back.png";
  8. const {post,api,xPost} = apiObj;
  9. const { TabPane } = Tabs;
  10. const { Option } = Select;
  11. function AddRole(props){
  12. const { back } = props;
  13. return (
  14. <>
  15. <Breadcrumb separator="">
  16. <Breadcrumb.Item><img className='back-icon' src={backIcon} onClick={back} alt="返回上一页"/></Breadcrumb.Item>
  17. <Breadcrumb.Item>角色管理</Breadcrumb.Item>
  18. <Breadcrumb.Separator />
  19. <Breadcrumb.Item>新增角色</Breadcrumb.Item>
  20. </Breadcrumb>
  21. <div className="add-container">
  22. <ContentForm></ContentForm>
  23. </div>
  24. </>
  25. )
  26. }
  27. function ContentForm(props){
  28. const [form] = Form.useForm();
  29. const [treeDatas, setTreeDatas] = useState([]);
  30. const [tabDatas, setTabDatas] = useState([]);
  31. const [activeTab, setActiveTab] = useState('');
  32. const { save,detail } = useContext(RoleContext);
  33. const [sysCheckeds, setSysCheckeds] = useState();
  34. const initialValues=detail||{
  35. status:'1'
  36. };
  37. const vilidateRules = {
  38. required: '${label}不能为空!',
  39. types: {
  40. email: '${label} is not a valid email!',
  41. number: '${label} is not a valid number!',
  42. },
  43. };
  44. //获取菜单数据,type:组织0角色1
  45. function getTreeData(){
  46. xPost(api.getUserMenuResourceTree,{type:1}).then((res)=>{
  47. if(res.data.code===200){
  48. const data = res.data.data;
  49. const treeDatas = structureTreeData(data);
  50. setTreeDatas(treeDatas);
  51. console.log(43,detail)
  52. //默认选中第一个tab
  53. setTabDatas([treeDatas[0]]);
  54. setActiveTab(treeDatas[0].key);
  55. setSysCheckeds(treeDatas[0]?[treeDatas[0].key]:[]);
  56. }
  57. })
  58. }
  59. //数据转换为树形结构所需字段
  60. function structureTreeData(data){
  61. const arr = [];
  62. let obj={};
  63. data.map((it,i)=>{
  64. obj =JSON.stringify(it.children).replace(/softwareMenuId/g,"key").replace(/menuName/g,'title');
  65. arr[i]={
  66. title:it.softwareName,
  67. key:it.softwareId,
  68. children:JSON.parse(obj)
  69. }
  70. });
  71. //form.setFieldsValue({softwares:[{id:arr[0]?[arr[0].key]:''}]}); //默认选中第一个
  72. return arr;
  73. }
  74. useEffect(()=>{
  75. if(detail){
  76. //编辑时权限树从详情中获取,tab数据也是
  77. const treeDatas = structureTreeData(detail.loginUserMenuResourceTree);
  78. setTreeDatas(treeDatas);
  79. setSysCheckeds(detail.sids);
  80. setTabDatas(treeDatas);
  81. }else{
  82. getTreeData();
  83. }
  84. },[]);
  85. function handleCancel(){
  86. }
  87. function handleSave(){
  88. form.validateFields(['name']).then((res)=>{
  89. save(form.getFieldsValue())
  90. });
  91. }
  92. //树形结构选中事件
  93. function checkTreeEvent(i,idsArr,sourceIds){
  94. const formData=form.getFieldsValue();
  95. let arr=formData.softwares;
  96. arr[i]={
  97. id:activeTab,
  98. softwareMenuIds:idsArr,
  99. softwareResourceIds:sourceIds
  100. };
  101. form.setFieldsValue({
  102. softwares:arr
  103. });
  104. }
  105. function onTabChange(activeTab){
  106. setActiveTab(activeTab)
  107. }
  108. //开放系统勾选事件
  109. function softwareChange(checkedValue){
  110. let arr = [],item;
  111. setSysCheckeds(checkedValue);
  112. for(let i=0;i<checkedValue.length;i++){
  113. item=treeDatas.find((it)=>it.key===checkedValue[i]);
  114. if(item){
  115. arr.push(item);
  116. }
  117. }
  118. setTabDatas(arr);
  119. }
  120. return (
  121. <>
  122. <Form
  123. labelCol={{ span: 6 }}
  124. wrapperCol={{ span: 16 }}
  125. layout="horizontal"
  126. validateMessages={vilidateRules}
  127. initialValues={initialValues}
  128. form={form}
  129. >
  130. <Form.Item
  131. label="角色名称"
  132. name='name'
  133. required
  134. rules={[({ getFieldValue }) => ({
  135. validator(_, value) {
  136. if(!value){
  137. return Promise.reject(new Error('角色名称不能为空!'));
  138. }else if (value.length<51) {
  139. return Promise.resolve();
  140. }
  141. return Promise.reject(new Error('格式错误!'));
  142. },
  143. }),]}>
  144. <Input placeholder='请输入角色名称' autoComplete='off'/>
  145. </Form.Item>
  146. <Form.Item
  147. label="角色描述"
  148. name='remark'>
  149. <Input placeholder='请输入角色描述' autoComplete='off'/>
  150. </Form.Item>
  151. <Form.Item
  152. label="排序"
  153. name='orderNo'>
  154. <InputNumber placeholder='大于0的整数' min={0}/>
  155. </Form.Item>
  156. <Form.Item
  157. label="开放系统"
  158. rules={[{ required: true}]}>
  159. <Checkbox.Group value={sysCheckeds} onChange={softwareChange}>
  160. {
  161. treeDatas.map((it, i) => {
  162. return (
  163. <Form.Item key={it.key} noStyle>
  164. <Checkbox key={i} value={it.key}>{it.title}</Checkbox>
  165. </Form.Item>
  166. )
  167. })
  168. }
  169. </Checkbox.Group>
  170. </Form.Item>
  171. <Form.Item
  172. label="菜单权限"
  173. required>
  174. <Tabs onChange={onTabChange} type="card">
  175. {
  176. tabDatas.map((it,i)=>{
  177. return (
  178. <TabPane tab={it.title} key={i}>
  179. <Form.Item
  180. key={i}
  181. name={['softwares', i, 'softwareMenuIds']}
  182. valuePropName='checked'
  183. getValueFromEvent={(checked)=>{
  184. console.log(321,checked)
  185. return [];
  186. }} noStyle>
  187. <MenuTree data={it} checkeds={form.getFieldValue().softwares?form.getFieldValue().softwares[i]:[]} checkEv={(checkedKeys,sourceIds)=>checkTreeEvent(i,checkedKeys,sourceIds)}/>
  188. </Form.Item>
  189. <Form.Item key={i+"a"} hidden={true} name={['softwares', i, 'id']} noStyle>
  190. <Input/>
  191. </Form.Item>
  192. <Form.Item key={i+"b"} hidden={true} name={['softwares', i, 'softwareResourceIds']} noStyle>
  193. <Input/>
  194. </Form.Item>
  195. </TabPane>
  196. )
  197. })
  198. }
  199. </Tabs>
  200. </Form.Item>
  201. <Form.Item
  202. label="当前状态">
  203. <Space>
  204. <Form.Item
  205. name='status'
  206. valuePropName='checked'
  207. getValueFromEvent={(checked)=>{
  208. return +checked;
  209. }}
  210. noStyle>
  211. <Switch />
  212. </Form.Item>
  213. <span>启用</span>
  214. </Space>
  215. </Form.Item>
  216. </Form>
  217. <div className="button-box">
  218. <Button onClick={handleCancel}>取消</Button>
  219. <Button onClick={handleSave} type='primary'>保存</Button>
  220. </div>
  221. </>
  222. )
  223. }
  224. export default AddRole;