userGroupManagement.jsx 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /**
  2. * 用户分组
  3. */
  4. import React from 'react';
  5. import { Layout, Input, Table, Button, Icon, Menu } from 'antd'
  6. import { connect } from 'dva'
  7. import './userGroupManagement.less'
  8. import DetailBox from './userGroupDetailBox'
  9. import AddMemberBox from '../common/selectUserBox'
  10. const { Sider, Content } = Layout
  11. const { Search } = Input
  12. class UserGroupManagement extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. visibleAddMemberBox: false
  17. }
  18. }
  19. componentDidMount() {
  20. const { dispatch } = this.props;
  21. dispatch({ type: 'userGroup/fetchList' });
  22. }
  23. onSort(list) {
  24. return list.sort((a, b) => {
  25. return new Date(b.createTime) - new Date(a.createTime);
  26. });
  27. }
  28. showDetailBox = (operate) => {
  29. const { userGroup, dispatch } = this.props;
  30. const { selectedGroup } = userGroup;
  31. if(operate === 'create') {
  32. dispatch({ type: 'userGroup/setNewModel', model: {
  33. visibleDetailBox: true,
  34. operate
  35. }});
  36. }else {
  37. dispatch({ type: 'userGroup/setNewModel', model: { ...selectedGroup, visibleDetailBox: true, operate } });
  38. }
  39. }
  40. showAddMemberBox = () => {
  41. const { dispatch } = this.props;
  42. dispatch({ type: 'userGroup/setNewModelField', name: 'visibleAddMemberBox', value: true });
  43. }
  44. render() {
  45. const { userGroup, dispatch } = this.props;
  46. const { selectedGroup } = userGroup;
  47. const reg = new RegExp('([+ \\- & | ! ( ) { } \\[ \\] ^ \" ~ * ? : ( ) \/])', 'g'); // 需要转义的字符
  48. let filterLabel = (userGroup.filterLabel || '').replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1'); // 添加转义符号
  49. const columns = [{
  50. title: '用户',
  51. dataIndex: 'name',
  52. width: 200
  53. }, {
  54. title: '操作',
  55. width: 50,
  56. render: (text, record, index) => (
  57. <span style={{ cursor: 'pointer', color: 'red' }} onClick={() => {
  58. dispatch({ type: 'userGroup/remoteMemberDelete', userCode: record.code, groupCode: selectedGroup.code });
  59. }}>删除</span>
  60. ),
  61. }]
  62. const selectedKeys = selectedGroup ? [selectedGroup.code] : [];
  63. return (
  64. <Layout className='group-layout'>
  65. <Sider>
  66. <div className='search-area'>
  67. <Search
  68. value={userGroup.filterLabel}
  69. placeholder="请输入关键字"
  70. onChange={e => {
  71. dispatch({ type: 'userGroup/setFilterLabel', label: e.target.value });
  72. }}
  73. />
  74. </div>
  75. <Menu
  76. selectedKeys={selectedKeys}
  77. >
  78. {userGroup.list.map(l => {
  79. let reg = new RegExp('(' + filterLabel + '){1}', 'ig');
  80. if((l.name || '').search(reg) !== -1) {
  81. return { ...l, visible: true };
  82. }else {
  83. return { ...l, visible: false };
  84. }
  85. }).map(l => (
  86. <Menu.Item key={l.code+''} style={{ display: l.visible ? 'block' : 'none' }} onClick={() => {
  87. dispatch({ type: 'userGroup/chageSelectedGroup', group: l });
  88. }} >
  89. <span>
  90. { filterLabel ?
  91. ((l.name || '').split(new RegExp(`(${filterLabel})`, 'i')).map((fragment, i) => {
  92. return (
  93. fragment.toLowerCase().replace(new RegExp('(\\\\)', 'g'), '\\$1').replace(reg, '\\$1') === filterLabel.toLowerCase() ?
  94. <span key={i} style={{fontWeight: 'bold', color: 'red'}} className="highlight">{fragment}</span> :
  95. fragment
  96. )
  97. }
  98. )) : l.name
  99. }
  100. </span>
  101. </Menu.Item>
  102. ))}
  103. </Menu>
  104. <div className='addbtn-area'>
  105. <Button className='add-btn' onClick={() => {this.showDetailBox('create')}}>
  106. <Icon type="plus-circle-o" />添加用户组
  107. </Button>
  108. <DetailBox />
  109. </div>
  110. </Sider>
  111. <Content>
  112. <div className='groupname'>
  113. <span>{selectedGroup ? selectedGroup.name : ''}</span>
  114. {selectedGroup && <Button className='delete-btn' onClick={() => {
  115. dispatch({ type: 'userGroup/remoteDelete', group: selectedGroup });
  116. }}>
  117. <Icon type="delete" />删除用户组
  118. </Button>}
  119. {selectedGroup && <Button className='edit-btn' onClick={() => {this.showDetailBox('modify')}}>
  120. <Icon type="edit" />编辑用户组
  121. </Button>}
  122. </div>
  123. <Table
  124. className='member-table'
  125. columns={columns}
  126. dataSource={selectedGroup ? (selectedGroup.member.map((d, i) => ({...d, key: i})) || []) : []}
  127. size='small'
  128. />
  129. <div className='addbtn-area'>
  130. {selectedGroup && <Button className='add-btn' onClick={() => {
  131. this.setState({
  132. visibleAddMemberBox: true
  133. });
  134. }}>
  135. <Icon type="plus-circle-o" />添加用户
  136. </Button>}
  137. <AddMemberBox
  138. visibleBox={this.state.visibleAddMemberBox}
  139. title='添加用户组成员'
  140. hideBox={() => {
  141. this.setState({
  142. visibleAddMemberBox: false
  143. });
  144. }}
  145. multiple={false}
  146. okHandler={(selectedUser) => {
  147. dispatch({ type: 'userGroup/remoteMemberAdd', user: selectedUser, group: selectedGroup });
  148. }}
  149. />
  150. </div>
  151. </Content>
  152. </Layout>
  153. )
  154. }
  155. }
  156. export default connect(( { present: { userGroup } } ) => ({ userGroup }))(UserGroupManagement);