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