From 3b43ee5ead5f625d532150afceddcf1b481b823d Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期五, 29 五月 2020 00:09:36 +0800 Subject: [PATCH] 2020-05-29 --- src/tabviews/rolemanage/index.jsx | 307 +++++++++++++++++++++++++++++--------------------- 1 files changed, 176 insertions(+), 131 deletions(-) diff --git a/src/tabviews/rolemanage/index.jsx b/src/tabviews/rolemanage/index.jsx index d09ffbe..8262f33 100644 --- a/src/tabviews/rolemanage/index.jsx +++ b/src/tabviews/rolemanage/index.jsx @@ -12,8 +12,8 @@ const { Search } = Input const { TabPane } = Tabs const { TreeNode, DirectoryTree } = Tree -let checkedKeysMap = null -let linkMap = null + +let linkMap = new Map() let selectMap = null export default class RoleManage extends Component { @@ -25,6 +25,7 @@ state = { dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, loading: true, + loadingTree: false, roleList: null, selectRoleId: '', mainMenus: null, @@ -39,6 +40,9 @@ initCheckKeys: null } + /** + * @description 鑾峰彇瑙掕壊鍒楄〃 + */ getRoleList = async () => { let param = { func: 's_rolemenu_get_list' @@ -47,13 +51,9 @@ if (result.status) { this.setState({ - roleList: result.data, - loading: false + roleList: result.data }) } else { - this.setState({ - loading: false - }) notification.warning({ top: 92, message: result.message, @@ -62,6 +62,9 @@ } } + /** + * @description 鑾峰彇涓�绾ц彍鍗曪紝鐢ㄤ簬鏋勫缓缁撴瀯鏍� + */ getMainMenuList = async () => { let param = { func: 's_rolemenu_get_FstMenu' @@ -70,6 +73,8 @@ if (result.status) { this.setState({ + loadingTree: true, + loading: false, mainMenus: result.data.map(item => { return { title: item.MenuName, @@ -82,6 +87,9 @@ this.getAllMenuList() }) } else { + this.setState({ + loading: false + }) notification.warning({ top: 92, message: result.message, @@ -90,6 +98,9 @@ } } + /** + * @description 鑾峰彇鎵�鏈夎彍鍗曡妭鐐癸紝褰㈡垚鏉冮檺鏍� + */ getAllMenuList = async () => { const { selectRoleId, mainMenus, tabKey } = this.state @@ -102,54 +113,22 @@ let result = await Api.getSystemConfig(param) if (result.status) { - let _tree = null let _openKeys = [] - - let _state = { - loading: false + // MenuID锛堣彍鍗旾d锛夈�丮enuName锛堣彍鍗曞悕绉帮級銆丱nlySelf锛堝�间负true锛岃〃绀轰笁绾ц彍鍗曪紝澧炲姞-浠呴〉闈級銆乀ype锛堣彍鍗曠骇鍒級 + // ParentID锛堢埗绾d锛夈�丼elected锛堟槸鍚﹂�変腑-宸插け鏁堬級銆乀abs锛� 鏍囩绫诲瀷锛夈�乀ypeCharOne 鑿滃崟绫诲瀷PC鎴栧叾浠� + let _tree = this.getTree(fromJS(mainMenus).toJS(), result.data) + if (_tree[0]) { + this.getOpenNode(_tree[0], _openKeys) } - if (tabKey === '') { - let _initCheckKeys = [] // 鍒濆閫変腑鐨勮彍鍗昳d - checkedKeysMap = new Map() - linkMap = new Map() - selectMap = new Map() - - result.data.forEach(item => { - if (item.Selected !== 'true') return - - checkedKeysMap.set(item.MenuID, true) - _initCheckKeys.push(item.MenuID) - }) - - _initCheckKeys = Array.from(new Set(_initCheckKeys)) - - _tree = this.getTree(JSON.parse(JSON.stringify(mainMenus)), result.data) - - if (_tree[0]) { - this.getOpenNode(_tree[0], _openKeys) - } - - _state.menuTrees = _tree - _state.initCheckKeys = _initCheckKeys - _state.checkedKeys = Array.from(checkedKeysMap.keys()) - _state.menuOpenKeys = _openKeys - } else { - _tree = this.getSelectTree(JSON.parse(JSON.stringify(mainMenus)), result.data) - _tree = _tree.filter(node => node.children) - - if (_tree[0]) { - this.getOpenNode(_tree[0], _openKeys) - } - - _state.selectMenuTrees = _tree - _state.selectMenuOpenKeys = _openKeys - } - - this.setState(_state) + this.setState({ + loadingTree: false, + menuTrees: _tree, + menuOpenKeys: _openKeys + }) } else { this.setState({ - loading: false + loadingTree: false }) notification.warning({ top: 92, @@ -159,6 +138,69 @@ } } + /** + * @description 閫夋嫨瑙掕壊涓斿瓨鍦ㄦ潈闄愭爲鏃讹紝鑾峰彇宸插垎閰嶇粨鏋� + */ + getSelectMenuList = async () => { + const { selectRoleId, menuTrees, tabKey } = this.state + if (!menuTrees) return + + let param = { + func: 's_rolemenu_get_Menulist', + RoleID: selectRoleId + } + + 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)) + + selectMap = new Map() + this.getCheckedKeys(fromJS(menuTrees).toJS(), _initKeys) + + if (menuTrees[0]) { + 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]) { + this.getOpenNode(_tree[0], _openKeys) + } + + this.setState({ + loadingTree: false, + selectMenuTrees: _tree, + selectMenuOpenKeys: _openKeys + }) + } + } else { + this.setState({ + loadingTree: false + }) + notification.warning({ + top: 92, + message: result.message, + duration: 5 + }) + } + } + + /** + * @description 鑾峰彇灞曞紑鑺傜偣 + */ getOpenNode = (parentNode, keys) => { if (parentNode.children) { keys.push(parentNode.key) @@ -168,100 +210,105 @@ } } + /** + * @description 鑾峰彇鏉冮檺鍒嗛厤鏍� + */ getTree = (parents, options) => { parents.forEach(parent => { parent.children = [] + // 娣诲姞鑿滃崟鐨勫瓙鍏冪礌 options.forEach(option => { if (option.ParentID === parent.key) { parent.children.push({ title: option.MenuName, key: option.MenuID, - selected: parent.selected && option.Selected === 'true', addSelf: option.OnlySelf === 'true', tabs: option.Tabs }) } }) - if (parent.children.length === 0) { parent.children = null + // 閽堝鏍囩锛岀敓鎴愭柊鐨刬d锛屽苟淇濆瓨鍏宠仈鍏崇郴锛堟爣绛句笉鍞竴锛� if (parent.tabs) { let _uuid = Utils.getuuid() linkMap.set(_uuid, parent.key) - if (parent.selected) { - checkedKeysMap.set(_uuid, true) - checkedKeysMap.delete(parent.key) - - selectMap.set(_uuid, parent.key) - } - + parent.originKey = parent.key parent.key = _uuid } } else { - if (parent.selected) { - checkedKeysMap.delete(parent.key) - } + // 涓夌骇鑿滃崟鍒涘缓瀛愰」 if (parent.addSelf) { let _uuid = Utils.getuuid() linkMap.set(_uuid, parent.key) - - if (parent.selected) { - checkedKeysMap.set(_uuid, true) - } + parent.subKey = _uuid parent.children.unshift({ title: parent.title + '(浠呴〉闈�)', key: _uuid, + isSubView: true }) } + // 閽堝鏍囩锛岀敓鎴愭柊鐨刬d锛屽苟淇濆瓨鍏宠仈鍏崇郴锛堟爣绛句笉鍞竴锛� if (parent.tabs) { let _uuid = Utils.getuuid() linkMap.set(_uuid, parent.key) - - if (parent.selected) { - selectMap.set(_uuid, parent.key) - } - + + parent.originKey = parent.key parent.key = _uuid } parent.children = this.getTree(parent.children, options) } }) - return parents } - getSelectTree = (parents, options) => { + /** + * @description 鑾峰彇宸查�夋嫨鐨勮妭鐐� + */ + getCheckedKeys = (parents, initKeys) => { parents.forEach(parent => { - parent.children = [] - - options.forEach(option => { - if (option.ParentID === parent.key) { - parent.children.push({ - title: option.MenuName, - key: option.MenuID, - tabs: option.Tabs - }) + if ((parent.originKey && initKeys.indexOf(parent.originKey) > -1) || initKeys.indexOf(parent.key) > -1) { + if (parent.children) { + if (parent.subKey) { + selectMap.set(parent.subKey, true) + } + this.getCheckedKeys(parent.children, initKeys) + } else { + selectMap.set(parent.key, true) } - }) - - - parent.key = Utils.getuuid() - if (parent.children.length === 0) { - parent.children = null - } else { - parent.children = this.getSelectTree(parent.children, options) } }) - - return parents } + /** + * @description 鐢熸垚宸插垎閰嶆潈闄愮殑缁撴瀯鏍� + */ + getSelectTree = (parents, options) => { + return parents.filter(parent => { + if ((parent.originKey && options.indexOf(parent.originKey) > -1) || options.indexOf(parent.key) > -1) { + if (parent.children) { + parent.children = this.getSelectTree(parent.children, options) + if (parent.children.length === 0) { + parent.children = null + } + } + return true + } else if (parent.isSubView) { + return true + } + return false + }) + } + + /** + * @description 瑙掕壊鍒囨崲 + */ changeRole = (role) => { const { selectRoleId } = this.state @@ -269,16 +316,15 @@ this.setState({ selectRoleId: role.RoleID, - menuTrees: null, - checkedKeys: [], - menuOpenKeys: [], - selectMenuTrees: null, - selectMenuOpenKeys: [] + loadingTree: true }, () => { - this.getAllMenuList() + this.getSelectMenuList() }) } + /** + * @description 鑾峰彇鏍戣妭鐐� + */ renderTreeNodes = (data) => { return data.map(item => { if (item.children) { @@ -292,6 +338,9 @@ }) } + /** + * @description 鑺傜偣閫夋嫨浜嬩欢 + */ onCheck = (checkedKeys, info) => { this.setState({ checkedKeys: checkedKeys, @@ -300,18 +349,30 @@ }) } + /** + * @description 宸插垎閰嶄笌鏈垎閰嶅垏鎹� + */ changeTab = (key) => { - const { menuTrees, selectMenuTrees } = this.state + const { selectRoleId } = this.state this.setState({ - tabKey: key === 'selected' ? key : '' + tabKey: key === 'selected' ? key : '', + loadingTree: true }, () => { - if ((key === 'selected' && !selectMenuTrees) || (key === 'all' && !menuTrees)) { - this.getAllMenuList() + if (selectRoleId) { + this.getSelectMenuList() + } else { + this.setState({ + selectMenuTrees: [], + loadingTree: false + }) } }) } + /** + * @description 鎻愪氦宸查�夌殑鏉冮檺 + */ roleSubmit = async () => { const { checkedKeys, halfCheckedKeys, selectRoleId, initCheckKeys } = this.state @@ -328,25 +389,13 @@ _keys.push(key) } }) - _cKeys = new Map(_cKeys.map(key => [key, true])) - _keys = new Map(_keys.map(key => [key, true])) - Array.from(selectMap.keys()).forEach(key => { - if (!_cKeys.has(key)) { - _keys.delete(selectMap.get(key)) - } - }) - - _keys = Array.from(_keys.keys()) + _keys = Array.from(new Set(_keys)) } - - // let _LText = _keys.map(key => `select '${key}' as MenuID`) - // _LText = _LText.join(' union all ') let param = { func: 's_rolemenu_sub', RoleID: selectRoleId, - // LText: Utils.formatOptions(_LText) RoleMenu: _keys.map(key => { return {MenuID: key} }) @@ -366,22 +415,18 @@ }) this.setState({ submitloading: false, - menuTrees: null, - checkedKeys: [], - menuOpenKeys: [], - selectMenuTrees: null, - selectMenuOpenKeys: [] + loadingTree: true }, () => { - this.getAllMenuList() + this.getSelectMenuList() }) } else { + this.setState({ + submitloading: false + }) notification.warning({ top: 92, message: result.message, duration: 5 - }) - this.setState({ - submitloading: false }) } } @@ -405,7 +450,7 @@ } render() { - const { roleList, loading, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state + const { roleList, loading, loadingTree, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state let _roleList = [] @@ -442,7 +487,7 @@ <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"> - {menuTrees && menuTrees.length > 0 ? <Tree + {!loadingTree && menuTrees && menuTrees.length > 0 ? <Tree checkable selectable={false} defaultExpandedKeys={menuOpenKeys} @@ -452,15 +497,15 @@ > {this.renderTreeNodes(menuTrees)} </Tree> : null} - {menuTrees && menuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} - {!loading && !menuTrees ? <Spin className="load-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"> - {selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> + {!loadingTree && selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}> {this.renderTreeNodes(selectMenuTrees)} </DirectoryTree> : null} - {selectMenuTrees && selectMenuTrees.length === 0 ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} - {!loading && !selectMenuTrees ? <Spin className="load-tree" /> : null} + {!loadingTree && (!selectMenuTrees || selectMenuTrees.length === 0) ? <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} /> : null} + {loadingTree ? <Spin className="load-tree" /> : null} </TabPane> </Tabs> </Col> -- Gitblit v1.8.0