From 1dfd49b103e721f9bb63fd4d472b6fcc225d94a1 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 12 三月 2020 18:42:20 +0800
Subject: [PATCH] 2020-03-12

---
 src/tabviews/rolemanage/index.jsx |  288 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 271 insertions(+), 17 deletions(-)

diff --git a/src/tabviews/rolemanage/index.jsx b/src/tabviews/rolemanage/index.jsx
index 91b720c..d34b705 100644
--- a/src/tabviews/rolemanage/index.jsx
+++ b/src/tabviews/rolemanage/index.jsx
@@ -1,14 +1,18 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Card, Col, Row, Icon, Menu, notification, Spin, Input } from 'antd'
+import { Card, Col, Row, Icon, Menu, notification, Spin, Input, Tabs, Button, Tree } from 'antd'
 
 import Api from '@/api'
+import Utils from '@/utils/utils.js'
 import zhCN from '@/locales/zh-CN/role.js'
 import enUS from '@/locales/en-US/role.js'
 import './index.scss'
 
 const { Search } = Input
+const { TabPane } = Tabs
+const { TreeNode, DirectoryTree } = Tree
+let _checkedKeys = null
 
 export default class RoleManage extends Component {
   static propTpyes = {
@@ -18,9 +22,19 @@
 
   state = {
     dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    loadingview: true,
+    loading: true,
     roleList: null,
-    primarykey: ''
+    selectRoleId: '',
+    mainMenus: null,
+    menuTrees: null,
+    checkedKeys: [],
+    menuOpenKeys: [],
+    selectMenuTrees: null,
+    selectMenuOpenKeys: [],
+    primarykey: '',
+    tabKey: '',
+    submitloading: false,
+    initCheckKeys: null
   }
 
   getRoleList = async () => {
@@ -31,11 +45,12 @@
 
     if (result.status) {
       this.setState({
-        roleList: result.data
+        roleList: result.data,
+        loading: false
       })
     } else {
       this.setState({
-        loadingview: false
+        loading: false
       })
       notification.warning({
         top: 92,
@@ -45,17 +60,103 @@
     }
   }
 
-  getMenuList = async () => {
+  getMainMenuList = async () => {
     let param = {
       func: 's_rolemenu_get_FstMenu'
     }
     let result = await Api.getSystemConfig(param)
 
     if (result.status) {
-      
+      this.setState({
+        mainMenus: result.data.map(item => {
+          return {
+            title: item.MenuName,
+            key: item.MenuID,
+            children: []
+          }
+        })
+      }, () => {
+        this.getAllMenuList()
+      })
+    } else {
+      notification.warning({
+        top: 92,
+        message: result.message,
+        duration: 10
+      })
+    }
+  }
+
+  getAllMenuList = async () => {
+    const { selectRoleId, mainMenus, tabKey } = this.state
+
+    let param = {
+      func: 's_rolemenu_get_FunMenu',
+      RoleID: selectRoleId,
+      SelectedType: tabKey
+    }
+
+    let result = await Api.getSystemConfig(param)
+
+    if (result.status) {
+      let _tree = null
+      let _openKeys = []
+
+      let _state = {
+        loading: false
+      }
+
+      if (tabKey === '') {
+        let _mainMenuKeys = mainMenus.map(menu => menu.key)
+
+        _checkedKeys = []
+        let _checkMainKeys = [] // 閫変腑鐨勪竴绾ц彍鍗曪紝闇�鍒ゆ柇鏄惁鍚湁瀛愯彍鍗�
+        let _initCheckKeys = [] // 鍒濆閫変腑鐨勮彍鍗昳d
+        result.data.forEach(item => {
+          if (item.Selected !== 'true') return
+
+          if (!_mainMenuKeys.includes(item.MenuID)) {
+            _checkedKeys.push(item.MenuID)
+          } else {
+            _checkMainKeys.push(item.MenuID)
+          }
+          _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)
+        }
+
+        _tree.forEach(item => {
+          if (_checkMainKeys.includes(item.key) && !item.children) {
+            _checkedKeys.push(item.key)
+          }
+        })
+
+        _state.menuTrees = _tree
+        _state.initCheckKeys = _initCheckKeys
+        _state.checkedKeys = _checkedKeys
+        _state.menuOpenKeys = _openKeys
+      } else {
+        _tree = this.getTree(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)
     } else {
       this.setState({
-        loadingview: false
+        loading: false
       })
       notification.warning({
         top: 92,
@@ -65,13 +166,146 @@
     }
   }
 
-  changeRole = () => {
+  getOpenNode = (parentNode, keys) => {
+    if (parentNode.children) {
+      keys.push(parentNode.key)
+      parentNode.children.forEach(node => {
+        this.getOpenNode(node, keys)
+      })
+    }
+  }
 
+  getTree = (parents, options) => {
+    parents.forEach(parent => {
+      parent.children = []
+
+      options.forEach((option, index) => {
+        if (option.ParentID === parent.key) {
+          parent.children.push({
+            title: option.MenuName,
+            key: option.MenuID,
+            selected: option.Selected === 'true'
+          })
+        }
+      })
+      
+
+      if (parent.children.length === 0) {
+        parent.children = null
+      } else {
+        if (_checkedKeys && parent.selected) {
+          _checkedKeys = _checkedKeys.filter(key => key !== parent.key)
+        }
+        parent.children = this.getTree(parent.children, options)
+      }
+    })
+
+    return parents
+  }
+
+  changeRole = (role) => {
+    const { selectRoleId } = this.state
+
+    if (selectRoleId === role.RoleID) return
+
+    this.setState({
+      selectRoleId: role.RoleID,
+      menuTrees: null,
+      checkedKeys: [],
+      menuOpenKeys: [],
+      selectMenuTrees: null,
+      selectMenuOpenKeys: []
+    }, () => {
+      this.getAllMenuList()
+    })
+  }
+
+  renderTreeNodes = (data) => {
+    return data.map(item => {
+      if (item.children) {
+        return (
+          <TreeNode title={item.title} key={item.key} dataRef={item}>
+            {this.renderTreeNodes(item.children)}
+          </TreeNode>
+        )
+      }
+      return <TreeNode key={item.key} showIcon={true} {...item} isLeaf />
+    })
+  }
+
+  onCheck = (checkedKeys, info) => {
+    console.log(checkedKeys)
+    this.setState({
+      checkedKeys: checkedKeys,
+      halfCheckedKeys: info.halfCheckedKeys,
+      initCheckKeys: null
+    })
+  }
+
+  changeTab = (key) => {
+    const { menuTrees, selectMenuTrees } = this.state
+
+    this.setState({
+      tabKey: key === 'selected' ? key : ''
+    }, () => {
+      if ((key === 'selected' && !selectMenuTrees) || (key === 'all' && !menuTrees)) {
+        this.getAllMenuList()
+      }
+    })
+  }
+
+  roleSubmit = async () => {
+    const { checkedKeys, halfCheckedKeys, selectRoleId, initCheckKeys } = this.state
+
+    let _keys = []
+    
+    if (initCheckKeys) {
+      _keys = initCheckKeys
+    } else {
+      _keys = checkedKeys.concat(halfCheckedKeys)
+    }
+    
+    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)
+    }
+
+    this.setState({
+      submitloading: true
+    })
+
+    let result = await Api.getSystemConfig(param)
+
+    if (result.status) {
+      notification.success({
+        top: 92,
+        message: '淇濆瓨鎴愬姛',
+        duration: 2
+      })
+      this.setState({
+        submitloading: false,
+        selectMenuTrees: null,
+        selectMenuOpenKeys: []
+      })
+    } else {
+      notification.warning({
+        top: 92,
+        message: result.message,
+        duration: 10
+      })
+      this.setState({
+        submitloading: false
+      })
+    }
   }
 
   UNSAFE_componentWillMount () {
     this.getRoleList()
-    this.getMenuList()
+    this.getMainMenuList()
   }
 
   shouldComponentUpdate (nextProps, nextState) {
@@ -79,7 +313,7 @@
   }
 
   render() {
-    const { roleList, loadingview, primarykey } = this.state
+    const { roleList, loading, primarykey, menuTrees, checkedKeys, menuOpenKeys, selectMenuTrees, tabKey, selectRoleId, selectMenuOpenKeys, submitloading } = this.state
 
     let _roleList  = []
 
@@ -89,9 +323,9 @@
 
     return (
       <div className="rolemanage">
-        {loadingview && <Spin size="large" />}
+        {loading && <Spin size="large" />}
         <Row gutter={16}>
-          <Col span={6}>
+          <Col span={5}>
             <Card
               className="role-list"
               title={
@@ -113,10 +347,30 @@
               </Menu>
             </Card>
           </Col>
-          <Col span={18}>
-            <Card title="Card title" bordered={false}>
-              Card content
-            </Card>
+          <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
+                  checkable
+                  selectable={false}
+                  defaultExpandedKeys={menuOpenKeys}
+                  autoExpandParent={true}
+                  onCheck={this.onCheck}
+                  checkedKeys={checkedKeys}
+                >
+                  {this.renderTreeNodes(menuTrees)}
+                </Tree> : null}
+                {menuTrees && menuTrees.length === 0 ? <p className="nodata">鏈煡璇㈠埌鑿滃崟鍒楄〃</p> : null}
+                {!loading && !menuTrees ? <Spin className="load-tree" /> : null}
+              </TabPane>
+              <TabPane tab="宸叉巿鏉冭彍鍗�" key="selected">
+                {selectMenuTrees && selectMenuTrees.length > 0 ? <DirectoryTree multiple defaultExpandedKeys={selectMenuOpenKeys}>
+                  {this.renderTreeNodes(selectMenuTrees)}
+                </DirectoryTree> : null}
+                {selectMenuTrees && selectMenuTrees.length === 0 ? <p className="nodata">鏈煡璇㈠埌宸叉巿鏉冭彍鍗�</p> : null}
+                {!loading && !selectMenuTrees ? <Spin className="load-tree" /> : null}
+              </TabPane>
+            </Tabs>
           </Col>
         </Row>
       </div>

--
Gitblit v1.8.0