From 2e3d8e7d5715862733e43070e7df73b48a81948f Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期三, 28 七月 2021 23:49:55 +0800 Subject: [PATCH] 2021-07-28 --- src/tabviews/rolemanage/index.jsx | 670 +++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 525 insertions(+), 145 deletions(-) diff --git a/src/tabviews/rolemanage/index.jsx b/src/tabviews/rolemanage/index.jsx index 99b8022..f334a5c 100644 --- a/src/tabviews/rolemanage/index.jsx +++ b/src/tabviews/rolemanage/index.jsx @@ -1,7 +1,8 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import { Card, Col, Row, Icon, Menu, notification, Spin, Input, Tabs, Button, Tree, Empty } from 'antd' +import { Card, Col, Row, Icon, Menu, notification, Spin, Input, Tabs, Button, Tree, Empty, Select } from 'antd' +import md5 from 'md5' import Api from '@/api' import Utils from '@/utils/utils.js' @@ -20,14 +21,16 @@ export default class RoleManage extends Component { static propTpyes = { MenuNo: PropTypes.string, // 鑿滃崟鍙傛暟 - MenuID: PropTypes.string // 鑿滃崟Id + MenuID: PropTypes.string // 鑿滃崟Id } state = { dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, loading: true, loadingTree: false, + loadingAppTree: false, roleList: null, + filterRoleList: [], selectRoleId: '', mainMenus: null, menuTrees: null, @@ -36,9 +39,17 @@ selectMenuTrees: null, selectMenuOpenKeys: [], primarykey: '', - tabKey: '', submitloading: false, - initCheckKeys: null + initCheckKeys: null, + activeKey: 'manage', + appTrees: null, + appCheckedKeys: [], + appOpenKeys: [], + applist: [], + selectApp: null, + selectSubApp: null, + selectAppTrees: null, + selectAppOpenKeys: [], } /** @@ -52,7 +63,8 @@ if (result.status) { this.setState({ - roleList: result.data + roleList: result.data, + filterRoleList: result.data || [] }) } else { notification.warning({ @@ -61,6 +73,35 @@ duration: 5 }) } + } + + getAppList = () => { + let param = { + func: 's_get_kei' + } + + Api.getCloudConfig(param).then(result => { + if (result.status) { + let applist = result.data.map(item => { + item.sublist = item.data_detail || [] + item.sublist = item.sublist.map(cell => { + cell.ID = cell.d_id + return cell + }) + + return item + }) + let selectApp = applist[0] || null + + this.setState({ applist, selectApp }) + } else { + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + }) } /** @@ -103,12 +144,12 @@ * @description 鑾峰彇鎵�鏈夎彍鍗曡妭鐐癸紝褰㈡垚鏉冮檺鏍� */ getAllMenuList = async () => { - const { selectRoleId, mainMenus, tabKey } = this.state + const { selectRoleId, mainMenus } = this.state let param = { func: 's_rolemenu_get_FunMenu', RoleID: selectRoleId, - SelectedType: tabKey + SelectedType: '' } let result = await Api.getSystemConfig(param) @@ -153,61 +194,147 @@ * @description 閫夋嫨瑙掕壊涓斿瓨鍦ㄦ潈闄愭爲鏃讹紝鑾峰彇宸插垎閰嶇粨鏋� */ getSelectMenuList = async () => { - const { selectRoleId, menuTrees, tabKey } = this.state - if (!menuTrees) return + const { selectRoleId, menuTrees, activeKey } = this.state + if (!menuTrees || !selectRoleId || activeKey !== 'manage') return let param = { func: 's_rolemenu_get_Menulist', RoleID: selectRoleId } + this.setState({ + loadingTree: true + }) + let result = await Api.getSystemConfig(param) if (result.status) { let _openKeys = [] - if (tabKey === '') { - let _initKeys = result.data.map(item => item.MenuID) - _initKeys = Array.from(new Set(_initKeys)) + let _initKeys = result.data.map(item => item.MenuID) + _initKeys = Array.from(new Set(_initKeys)) - selectMap = new Map() - this.getCheckedKeys(fromJS(menuTrees).toJS(), _initKeys) + selectMap = new Map() + this.getCheckedKeys(fromJS(menuTrees).toJS(), _initKeys) - if (menuTrees[0]) { - if (menuTrees[0].key === 'PC' && menuTrees[0].children) { - this.getOpenNode(menuTrees[0].children[0], _openKeys) - } else { - this.getOpenNode(menuTrees[0], _openKeys) - } + if (menuTrees[0]) { + if (menuTrees[0].key === 'PC' && menuTrees[0].children) { + this.getOpenNode(menuTrees[0].children[0], _openKeys) + } else { + this.getOpenNode(menuTrees[0], _openKeys) } - - this.setState({ - loadingTree: false, - initCheckKeys: _initKeys, - checkedKeys: Array.from(selectMap.keys()), - menuOpenKeys: _openKeys - }) - } else { - let Keys = result.data.map(item => item.MenuID) - let _tree = this.getSelectTree(fromJS(menuTrees).toJS(), Keys) - - if (_tree[0]) { - if (_tree[0].key === 'PC' && _tree[0].children) { - this.getOpenNode(_tree[0].children[0], _openKeys) - } else { - this.getOpenNode(_tree[0], _openKeys) - } - } - - this.setState({ - loadingTree: false, - selectMenuTrees: _tree, - selectMenuOpenKeys: _openKeys - }) } + + let _openkeys = [] + let Keys = result.data.map(item => item.MenuID) + let _tree = this.getSelectTree(fromJS(menuTrees).toJS(), Keys) + + if (_tree[0]) { + if (_tree[0].key === 'PC' && _tree[0].children) { + this.getOpenNode(_tree[0].children[0], _openkeys) + } else { + this.getOpenNode(_tree[0], _openkeys) + } + } + + this.setState({ + loadingTree: false, + initCheckKeys: _initKeys, + checkedKeys: Array.from(selectMap.keys()), + menuOpenKeys: _openKeys, + selectMenuTrees: _tree, + selectMenuOpenKeys: _openkeys + }) } else { this.setState({ loadingTree: false + }) + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + } + + /** + * @description 閫夋嫨瑙掕壊涓斿瓨鍦ㄦ潈闄愭爲鏃讹紝鑾峰彇宸插垎閰嶇粨鏋� + */ + getSelectAppNodeList = async () => { + const { selectRoleId, selectSubApp, selectApp, appTrees, activeKey } = this.state + + if (!appTrees || !selectRoleId || activeKey !== 'app' || !selectSubApp || !selectApp) return + + let param = { + func: 's_rolemenu_get_Menulist', + RoleID: selectRoleId, + TypeCharOne: selectApp.kei_no, + typename: selectSubApp.typename, + lang: selectSubApp.lang + } + + this.setState({ + loadingAppTree: true + }) + + let result = await Api.getSystemConfig(param) + + if (result.status) { + let _initKeys = result.data.map(item => item.MenuID) + _initKeys = Array.from(new Set(_initKeys)) + let _checkedKeys = [] + + let getCheckedKeys = (parents) => { + parents.forEach(item => { + if (_initKeys.includes(item.key)) { + if (item.children && item.children.length > 0) { + getCheckedKeys(item.children) + } else { + _checkedKeys.push(item.key) + } + } + }) + } + + getCheckedKeys(appTrees) + + let _openKeys = [] + let getOpenNode = (parentNode) => { + if (parentNode && parentNode.children && parentNode.children.length > 0) { + _openKeys.push(parentNode.key) + parentNode.children.forEach(node => { + getOpenNode(node) + }) + } + } + getOpenNode(appTrees[0]) + + let Keys = result.data.map(item => item.MenuID) + let _tree = this.getSelectTree(fromJS(appTrees).toJS(), Keys) + + + let _openkeys = [] + let _getOpenNode = (parentNode) => { + if (parentNode && parentNode.children && parentNode.children.length > 0) { + _openkeys.push(parentNode.key) + parentNode.children.forEach(node => { + _getOpenNode(node) + }) + } + } + _getOpenNode(_tree[0]) + + this.setState({ + loadingAppTree: false, + appInitCheckKeys: _initKeys, + appCheckedKeys: _checkedKeys, + appOpenKeys: _openKeys, + selectAppTrees: _tree, + selectAppOpenKeys: _openkeys + }) + } else { + this.setState({ + loadingAppTree: false }) notification.warning({ top: 92, @@ -334,10 +461,10 @@ if (selectRoleId === role.RoleID) return this.setState({ - selectRoleId: role.RoleID, - loadingTree: true + selectRoleId: role.RoleID }, () => { this.getSelectMenuList() + this.getSelectAppNodeList() }) } @@ -369,23 +496,13 @@ } /** - * @description 宸插垎閰嶄笌鏈垎閰嶅垏鎹� + * @description 鑺傜偣閫夋嫨浜嬩欢 */ - changeTab = (key) => { - const { selectRoleId } = this.state - + onAppCheck = (checkedKeys, info) => { this.setState({ - tabKey: key === 'selected' ? key : '', - loadingTree: true - }, () => { - if (selectRoleId) { - this.getSelectMenuList() - } else { - this.setState({ - selectMenuTrees: [], - loadingTree: false - }) - } + appCheckedKeys: checkedKeys, + appHalfCheckedKeys: info.halfCheckedKeys, + appInitCheckKeys: null }) } @@ -429,36 +546,88 @@ Api.getSystemConfig(param).then(result => { if (result.status) { - if (!window.GLOB.mainSystemApi) { - notification.success({ - top: 92, - message: '淇濆瓨鎴愬姛', - duration: 2 - }) - this.setState({ - submitloading: false, - loadingTree: true - }, () => { - this.getSelectMenuList() - }) - } else { + notification.success({ + top: 92, + message: '淇濆瓨鎴愬姛', + duration: 2 + }) + this.setState({ + submitloading: false + }, () => { + this.getSelectMenuList() + }) + if (window.GLOB.mainSystemApi) { Api.getLocalConfig(localParam).then(res => { - if (res.status) { - notification.success({ + if (!res.status) { + notification.warning({ top: 92, - message: '淇濆瓨鎴愬姛', - duration: 2 + message: res.message, + duration: 5 }) - this.setState({ - submitloading: false, - loadingTree: true - }, () => { - this.getSelectMenuList() - }) - } else { - this.setState({ - submitloading: false - }) + } + }) + } + } else { + this.setState({ + submitloading: false + }) + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + }) + } + + /** + * @description 鎻愪氦宸查�夌殑鏉冮檺 + */ + appRoleSubmit = () => { + const { selectApp, selectSubApp, appCheckedKeys, appHalfCheckedKeys, selectRoleId, appInitCheckKeys } = this.state + + let _keys = [] + + if (appInitCheckKeys) { + _keys = appInitCheckKeys + } else { + _keys = appCheckedKeys.concat(appHalfCheckedKeys) + } + + let param = { + func: 's_rolemenu_sub', + RoleID: selectRoleId, + TypeCharOne: selectApp.kei_no, + typename: selectSubApp.typename, + lang: selectSubApp.lang, + RoleMenu: _keys.map(key => { + return {MenuID: key} + }) + } + + let localParam = fromJS(param).toJS() + localParam.func = 's_rolemenu_sub_local' + + this.setState({ + submitloading: true + }) + + Api.getSystemConfig(param).then(result => { + if (result.status) { + notification.success({ + top: 92, + message: '淇濆瓨鎴愬姛', + duration: 2 + }) + this.setState({ + submitloading: false + }, () => { + this.getSelectAppNodeList() + }) + + if (window.GLOB.mainSystemApi) { + Api.getLocalConfig(localParam).then(res => { + if (!res.status) { notification.warning({ top: 92, message: res.message, @@ -489,25 +658,168 @@ loading: true, loadingTree: false, roleList: null, + filterRoleList: [], selectRoleId: '', mainMenus: null, menuTrees: null, checkedKeys: [], + appCheckedKeys: [], menuOpenKeys: [], selectMenuTrees: null, selectMenuOpenKeys: [], primarykey: '', - tabKey: '', submitloading: false, - initCheckKeys: null + initCheckKeys: null, + appInitCheckKeys: null, + activeKey: 'manage', + appTrees: null, + appOpenKeys: [], + applist: [], + selectApp: null, + selectSubApp: null, + selectAppTrees: null, + selectAppOpenKeys: [] }) this.getRoleList() this.getMainMenuList() + this.getAppList() + } + + filterRole = () => { + const { primarykey, roleList } = this.state + + let _roleList = [] + + if (roleList && roleList.length > 0) { + _roleList = roleList.filter(role => role.RoleName.toLowerCase().indexOf(primarykey.toLowerCase()) >= 0) + } + + this.setState({filterRoleList: _roleList}) + } + + getTreeList = () => { + const { selectApp, selectSubApp } = this.state + let param = { + func: 's_get_menus_roles_tree', + typecharone: selectApp.kei_no, + lang: selectSubApp.lang + } + + param.upid = md5(window.GLOB.appkey + selectApp.kei_no + selectSubApp.typename + selectSubApp.lang) + + this.setState({loadingAppTree: true}) + + Api.getCloudConfig(param).then(result => { + if (result.status) { + if (!result.data || result.data.length === 0) { + this.setState({loadingAppTree: false, appTrees: []}) + } else { + this.initTrees(result.data) + } + } else { + this.setState({loadingAppTree: false, appTrees: []}) + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + }) + } + + initTrees = (data) => { + let trees = [] + let map = new Map() + let _data = data.sort((a, b) => { + return a.sort - b.sort + }) + + _data.forEach(menu => { + if (menu.ParentID === 'top') { + trees.push({ + key: menu.MenuID, + title: menu.MenuName, + children: [] + }) + } else { + map.set(menu.MenuID, menu) + } + }) + + let reset = (m) => { + return m.map(n => { + [...map.keys()].forEach(key => { + if (map.get(key).ParentID === n.key) { + let c = map.get(key) + n.children.push({ + key: c.MenuID, + title: c.MenuName, + children: [] + }) + map.delete(key) + } + }) + if (n.children.length > 0) { + n.children = reset(n.children) + } + return n + }) + } + + trees = reset(trees) + + let expandedKeys = this.getExpandedKeys(trees, 0, []) + + this.setState({loadingAppTree: false, appTrees: trees, appOpenKeys: expandedKeys}, () => { + this.getSelectAppNodeList() + }) + } + + getExpandedKeys = (trees, i, keys) => { + if (i >= 3 || !trees[0]) return keys + + keys.push(trees[0].key) + + i++ + + if (trees[0].children && trees[0].children.length > 0) { + keys = this.getExpandedKeys(trees[0].children, i, keys) + } + + return keys + } + + changeType = (val) => { + this.setState({ + activeKey: val + }, () => { + this.getSelectMenuList() + this.getSelectAppNodeList() + }) + } + + changeApp = (val) => { + const { applist } = this.state + + let app = applist.filter(item => item.ID === val)[0] + + this.setState({selectApp: app, selectSubApp: null}) + } + + changeSubApp = (val) => { + const { selectApp } = this.state + + let subapp = selectApp.sublist.filter(item => item.ID === val)[0] + + this.setState({selectSubApp: subapp}, () => { + this.getTreeList() + }) } UNSAFE_componentWillMount () { this.getRoleList() this.getMainMenuList() + this.getAppList() } componentDidMount () { @@ -529,66 +841,134 @@ } render() { - const { roleList, loading, loadingTree, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state - - let _roleList = [] - - if (roleList && roleList.length > 0) { - _roleList = roleList.filter(role => role.RoleName.toLowerCase().indexOf(primarykey.toLowerCase()) >= 0) - } + const { activeKey, filterRoleList, applist, selectApp, selectSubApp, loading, loadingTree, loadingAppTree, primarykey, menuTrees, appTrees, checkedKeys, appCheckedKeys, menuOpenKeys, selectMenuTrees, selectAppTrees, selectRoleId, selectMenuOpenKeys, selectAppOpenKeys, submitloading, appOpenKeys } = this.state return ( <div className="rolemanage"> {loading && <Spin size="large" />} - <Row gutter={16}> - <Col span={5}> - <Card - className="role-list" - title={ - <span className="role-title"> - <Icon type="bank" /> - <span className="title">{this.state.dict['main.role.title']}</span> - <Search placeholder="" onSearch={value => this.setState({primarykey: value})} /> - </span> - } - bordered={false} - > - <Menu - onClick={this.handleClick} - mode="inline" - > - {_roleList.map((role, index) => - <Menu.Item key={index} onClick={() => this.changeRole(role)}>{role.RoleName}</Menu.Item> - )} - </Menu> - </Card> - </Col> - <Col span={19}> - <Tabs defaultActiveKey="all" tabBarExtraContent={!tabKey && selectRoleId ? <Button type="primary" loading={submitloading} onClick={this.roleSubmit}>鎻愪氦</Button> : null} onChange={this.changeTab}> - <TabPane tab="鑿滃崟鍒楄〃" key="all"> - {!loadingTree && menuTrees && menuTrees.length > 0 ? <Tree - checkable - selectable={false} - defaultExpandedKeys={menuOpenKeys} - autoExpandParent={true} - onCheck={this.onCheck} - checkedKeys={checkedKeys} + <Tabs activeKey={activeKey} type="card" onChange={this.changeType}> + <TabPane tab="绠$悊绯荤粺" key="manage"> + <Row gutter={16}> + <Col span={5}> + <Card + className="role-list" + title={ + <span className="role-title"> + <Icon type="bank" /> + <span className="title">瑙掕壊</span> + <Search placeholder="" value={primarykey} onChange={e => this.setState({primarykey: e.target.value})} onSearch={this.filterRole} /> + </span> + } + bordered={false} > - {this.renderTreeNodes(menuTrees)} - </Tree> : null} - {!loadingTree && (!menuTrees || menuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} - {loadingTree ? <Spin className="load-tree" /> : null} - </TabPane> - <TabPane tab="宸叉巿鏉冭彍鍗�" key="selected"> - {!loadingTree && selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> - {this.renderTreeNodes(selectMenuTrees)} - </DirectoryTree> : null} - {!loadingTree && (!selectMenuTrees || selectMenuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} - {loadingTree ? <Spin className="load-tree" /> : null} - </TabPane> - </Tabs> - </Col> - </Row> + <Menu selectedKeys={[selectRoleId]} mode="inline"> + {filterRoleList.map((role) => + <Menu.Item key={role.RoleID} onClick={() => this.changeRole(role)}>{role.RoleName}</Menu.Item> + )} + </Menu> + </Card> + </Col> + <Col span={19}> + <Tabs defaultActiveKey="all"> + <TabPane tab="鏉冮檺" key="all"> + {selectRoleId ? <Button className="submitBtn" type="primary" loading={submitloading} onClick={this.roleSubmit}>鎻愪氦</Button> : null} + {!loadingTree && menuTrees && menuTrees.length > 0 ? <Tree + checkable + selectable={false} + defaultExpandedKeys={menuOpenKeys} + autoExpandParent={true} + onCheck={this.onCheck} + checkedKeys={checkedKeys} + > + {this.renderTreeNodes(menuTrees)} + </Tree> : null} + {!loadingTree && (!menuTrees || menuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} + {loadingTree ? <Spin className="load-tree" /> : null} + </TabPane> + <TabPane tab="宸叉巿鏉�" key="selected"> + {!loadingTree && selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> + {this.renderTreeNodes(selectMenuTrees)} + </DirectoryTree> : null} + {!loadingTree && (!selectMenuTrees || selectMenuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} + {loadingTree ? <Spin className="load-tree" /> : null} + </TabPane> + </Tabs> + </Col> + </Row> + </TabPane> + <TabPane tab="搴旂敤" key="app"> + <div className="app-select"> + <div className="mk-form-item"> + <label>搴旂敤:</label> + <Select value={selectApp ? selectApp.ID : ''} onChange={this.changeApp}> + {applist.map(option => + <Select.Option key={option.ID} value={option.ID}>{option.remark}</Select.Option> + )} + </Select> + </div> + <div className="mk-form-item"> + <label>瀛愬簲鐢�:</label> + <Select value={selectSubApp ? selectSubApp.ID : ''} onChange={this.changeSubApp}> + {selectApp && selectApp.sublist.map(option => + <Select.Option key={option.ID} value={option.ID}>{`${option.typename}锛�${option.lang}锛塦}</Select.Option> + )} + </Select> + </div> + </div> + <Row gutter={16}> + <Col span={5}> + <Card + className="role-list" + title={ + <span className="role-title"> + <Icon type="bank" /> + <span className="title">瑙掕壊</span> + <Search placeholder="" value={primarykey} onChange={e => this.setState({primarykey: e.target.value})} onSearch={this.filterRole} /> + </span> + } + bordered={false} + > + <Menu selectedKeys={[selectRoleId]} mode="inline"> + {filterRoleList.map((role) => + <Menu.Item key={role.RoleID} onClick={() => this.changeRole(role)}>{role.RoleName}</Menu.Item> + )} + </Menu> + </Card> + </Col> + <Col span={19}> + <Tabs defaultActiveKey="all"> + <TabPane tab="鏉冮檺" key="all"> + {selectSubApp && selectRoleId ? <Button className="submitBtn" type="primary" loading={submitloading} onClick={this.appRoleSubmit}>鎻愪氦</Button> : null} + {selectSubApp ? <div> + {!loadingAppTree && appTrees && appTrees.length > 0 ? <Tree + checkable + selectable={false} + defaultExpandedKeys={appOpenKeys} + autoExpandParent={true} + onCheck={this.onAppCheck} + checkedKeys={appCheckedKeys} + > + {this.renderTreeNodes(appTrees)} + </Tree> : null} + {!loadingAppTree && (!appTrees || appTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} + {loadingAppTree ? <Spin className="load-tree" /> : null} + </div> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={'璇烽�夋嫨瀛愬簲鐢�'} />} + </TabPane> + <TabPane tab="宸叉巿鏉�" key="selected"> + {selectSubApp ? <div> + {!loadingAppTree && selectAppTrees && selectAppTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectAppOpenKeys}> + {this.renderTreeNodes(selectAppTrees)} + </DirectoryTree> : null} + {!loadingAppTree && (!selectAppTrees || selectAppTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} + {loadingAppTree ? <Spin className="load-tree" /> : null} + </div> : <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} description={'璇烽�夋嫨瀛愬簲鐢�'} />} + </TabPane> + </Tabs> + </Col> + </Row> + </TabPane> + </Tabs> + </div> ) } -- Gitblit v1.8.0