From 3b103caa6bfc9ed410e67156c3ca1785bf1cecc9 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 19 八月 2022 01:15:31 +0800
Subject: [PATCH] 2022-08-19

---
 src/components/tabview/index.jsx |  475 +++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 271 insertions(+), 204 deletions(-)

diff --git a/src/components/tabview/index.jsx b/src/components/tabview/index.jsx
index ed5a8b2..1f95394 100644
--- a/src/components/tabview/index.jsx
+++ b/src/components/tabview/index.jsx
@@ -1,180 +1,79 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import {connect} from 'react-redux'
-import { is, fromJS } from 'immutable'
-import {Tabs, Icon, Button, ConfigProvider, message, BackTop} from 'antd'
-import {modifyTabview, toggleIsiframe} from '@/store/action'
-// import asyncComponent from '@/utils/asyncComponent'
-import asyncComponent from '@/utils/asyncLoadComponent'
-import NotFount from '@/components/404'
-import enUS from 'antd/es/locale/en_US'
-import zhCN from 'antd/es/locale/zh_CN'
-import mzhCN from '@/locales/zh-CN/main.js'
-import menUS from '@/locales/en-US/main.js'
+import { fromJS } from 'immutable'
+import {Tabs, BackTop, notification} from 'antd'
+import { RedoOutlined, CloseOutlined } from '@ant-design/icons'
 import moment from 'moment'
 import 'moment/locale/zh-cn'
+
+import { initActionPermission } from '@/store/action'
+import asyncComponent from '@/utils/asyncLoadComponent'
+import NotFount from '@/components/404'
+import options from '@/store/options.js'
+import MKEmitter from '@/utils/events.js'
+import Api from '@/api'
 import './index.scss'
 
+const Home = asyncComponent(() => import('@/tabviews/home'))
+const CustomPage = asyncComponent(() => import('@/tabviews/custom'))
+const CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
+// const BaseTable = asyncComponent(() => import('@/tabviews/basetable'))
+const CalendarPage = asyncComponent(() => import('@/tabviews/calendar'))
+const TreePage = asyncComponent(() => import('@/tabviews/treepage'))
+const VerupTable = asyncComponent(() => import('@/tabviews/verupmanage'))
+const ScriptTable = asyncComponent(() => import('@/tabviews/scriptmanage'))
+const TabManage = asyncComponent(() => import('@/tabviews/tabmanage'))
+const Iframe = asyncComponent(() => import('@/tabviews/iframe'))
+const RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
+const FormTab = asyncComponent(() => import('@/tabviews/formtab'))
 
-let Comps = {}
-let service = window.GLOB.service ? (/\/$/.test(window.GLOB.service) ? window.GLOB.service : window.GLOB.service + '/') : ''
+let service = ''
 
 if (process.env.NODE_ENV === 'production') {
-  service = document.location.origin + '/' + service + 'zh-CN/'
+  service = document.location.origin + '/' + window.GLOB.service + 'zh-CN/'
 } else {
-  service = 'http://qingqiumarket.cn/' + service + 'zh-CN/'
+  service = window.GLOB.location + '/' + window.GLOB.service + 'zh-CN/'
 }
 
-class Header extends Component {
+class TabViews extends Component {
   static propTpyes = {
-    collapse: PropTypes.bool,
-    tabviews: PropTypes.array // 鏍囩椤垫暟缁�
+    collapse: PropTypes.bool
   }
 
   state = {
+    activeId: '',
     tabviews: null, // 鏍囩闆�
     iFrameHeight: 0,
-    dict: (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') ? mzhCN : menUS,
-    locale: (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS
   }
 
-  handleTabview (e, menu) {
-    e.stopPropagation()
-    // 鍏抽棴tab椤碉紝閲嶆柊閫夋嫨鏄剧ず椤�
-    let tabs = JSON.parse(JSON.stringify(this.state.tabviews))
-    tabs = tabs.filter(tab => {
-      return tab.MenuID !== menu.MenuID
+  // 鍏抽棴tab椤碉紝閲嶆柊閫夋嫨鏄剧ず椤�
+  closeTabView = (id) => {
+    let tabs = fromJS(this.state.tabviews).toJS()
+    let index = -1
+
+    tabs = tabs.filter((tab, i) => {
+      if (tab.MenuID === id) {
+        index = i
+        return false
+      } else {
+        return true
+      }
     })
     
-    if (menu.selected) {
-      tabs[0] && (tabs[0].selected = true)
-    }
-
-    this.props.modifyTabview(tabs)
-  }
-
-  changeTab (e, menu) {
-    e.stopPropagation()
-    // 绐楀彛鍒囨崲
-    let tabs = JSON.parse(JSON.stringify(this.state.tabviews))
-    tabs = tabs.map(tab => {
-      tab.selected = false
-
-      if (tab.MenuID === menu.MenuID) {
-        tab.selected = true
+    if (index > -1) {
+      let activeId = ''
+      if (id !== this.state.activeId) {
+        activeId = this.state.activeId
+      } else if (index > 0) {
+        activeId = tabs[index - 1].MenuID || ''
+      } else if (tabs[index]) {
+        activeId = tabs[index].MenuID || ''
       }
 
-      return tab
-    })
-
-    this.setState({
-      tabviews: tabs
-    })
-
-    this.props.modifyTabview(tabs)
-  }
-
-  selectcomponent (view) {
-    // 鏍规嵁tab椤典腑鑿滃崟淇℃伅锛岄�夋嫨鎵�闇�鐨勭粍浠�
-    if (view.type === 'Home') {
-      return (<Comps.Home MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
-    } else if (view.type === 'CommonTable') {
-      return (<Comps.CommonTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
-    } else if (view.type === 'DataManage') {
-      return (<Comps.DataManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
-    } else if (view.type === 'RolePermission') {
-      return (<Comps.RoleManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
-    } else if (view.type === 'TabForm') {
-      return (<Comps.TabForm MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
-    } else if (view.type === 'FormTab') {
-      return (<Comps.FormTab MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
-    } else if (view.type === 'iframe') {
-      return (<Comps.Iframe key={view.MenuID} title={view.MenuName} MenuName={view.MenuName} url={service + view.LinkUrl}/>)
-    } else {
-      return (<NotFount key={view.MenuID} />)
-    }
-  }
-
-  resetWindow (view) {
-    // 绐楀彛鍦╥frame涓庢櫘閫氶〉闈㈠垏鎹㈡椂锛屼慨鏀瑰乏渚ц彍鍗曟爮鏍峰紡
-    if (!view) return
-    let _isiframe = this.props.isiframe
-    if (view && view.type === 'iframe') {
-      _isiframe = true
-    } else {
-      _isiframe = false
-    }
-
-    if (_isiframe !== this.props.isiframe) {
-      this.props.toggleIsiframe(_isiframe)
-    }
-  }
-
-  copyMenuNo = (e) => {
-    e.stopPropagation()
-    let oInput = document.createElement('input')
-    oInput.value = e.target.dataset.menuno || ''
-    document.body.appendChild(oInput)
-    oInput.select()
-    document.execCommand('Copy')
-    oInput.className = 'oInput'
-    oInput.style.display = 'none'
-    message.success(this.state.dict['main.copy.success'])
-  }
-
-  UNSAFE_componentWillMount () {
-    if (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') {
-      moment.locale('zh-cn')
-    } else {
-      moment.locale('en')
-    }
-    this.setState({
-      tabviews: this.props.tabviews
-    })
-  }
-
-  componentDidMount () {
-    let home = {
-      MenuID: '1576117946681plembmkk9akkv8sn0vtdfdsfaf',
-      MenuName: '棣栭〉',
-      MenuNo: 'MESOrderDetailMwe',
-      PageParam: {},
-      id: 1,
-      selected: true,
-      src: '',
-      text: '棣栭〉',
-      type: 'Home'
-    }
-    this.props.modifyTabview([home])
-  }
-
-  UNSAFE_componentWillReceiveProps (nextProps) {
-    if (nextProps.tabviews && !is(fromJS(this.state.tabviews), fromJS(nextProps.tabviews))) {
-      // tab绐楀彛椤靛鍔犳垨鍒犻櫎
-      if (nextProps.tabviews.length > this.state.tabviews.length) {
-        // 鏌ョ湅鏂皌ab椤甸渶瑕佺粍浠舵槸鍚﹀姞杞�
-        let MenuIDs = this.state.tabviews.map(tab => {return tab.MenuID})
-        let newtab = nextProps.tabviews.filter(tab => !MenuIDs.includes(tab.MenuID))[0]
-        if (!Comps.Home && newtab.type === 'Home') {
-          Comps.Home = asyncComponent(() => import('@/tabviews/home'))
-        } else if (!Comps.CommonTable && newtab.type === 'CommonTable') {
-          Comps.CommonTable = asyncComponent(() => import('@/tabviews/commontable'))
-        } else if (!Comps.Iframe && newtab.type === 'iframe') {
-          Comps.Iframe = asyncComponent(() => import('@/tabviews/iframe'))
-        } else if (!Comps.DataManage && newtab.type === 'DataManage') {
-          Comps.DataManage = asyncComponent(() => import('@/tabviews/datamanage'))
-        } else if (!Comps.RoleManage && newtab.type === 'RolePermission') {
-          Comps.RoleManage = asyncComponent(() => import('@/tabviews/rolemanage'))
-        } else if (!Comps.TabForm && newtab.type === 'TabForm') {
-          Comps.TabForm = asyncComponent(() => import('@/tabviews/tabform'))
-        } else if (!Comps.TabForm && newtab.type === 'FormTab') {
-          Comps.FormTab = asyncComponent(() => import('@/tabviews/formtab'))
-        }
-      }
-
-      // 淇濆瓨淇敼鏍囩闆�
       this.setState({
-        tabviews: nextProps.tabviews
+        activeId,
+        tabviews: tabs
       })
 
       let node = document.getElementById('root').parentNode.parentNode
@@ -184,60 +83,231 @@
     }
   }
 
-  // shouldComponentUpdate(nextProps, nextState) {
-  //   return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
-  // }
+  refreshTabview = (e, menu) => {
+    e.stopPropagation()
+    window.GLOB.CacheMap = new Map()
+
+    if (options.sysType === 'local' && window.GLOB.systemType !== 'production') {
+      let roledefer = new Promise(resolve => {
+        Api.getSystemConfig({
+          func: 's_Get_TrdMenu_Role',
+          edition_type: 'A',
+          pro_sys: ''
+        }).then(result => {
+          if (!result) return
+          if (!result.status) {
+            notification.error({
+              top: 92,
+              message: result.message,
+              duration: 10
+            })
+          } else {
+            let _permAction = {loaded: true} // 鎸夐挳鏉冮檺
+    
+            if (result.UserRoles_Menu) {
+              result.UserRoles_Menu.forEach(menu => {
+                if (!menu.MenuID) return
+                _permAction[menu.MenuID] = true
+              })
+            }
+  
+            this.props.initActionPermission(_permAction)
+          }
+
+          resolve()
+        })
+      })
+  
+      // 鑾峰彇涓昏彍鍗曞弬鏁�
+      let menudefer = new Promise(resolve => {
+        Api.getAppVersion().then(() => {
+          resolve()
+        }, () => {
+          resolve()
+        })
+      })
+      
+      Promise.all([roledefer, menudefer]).then(() => {
+        MKEmitter.emit('reloadMenuView', menu.MenuID)
+      })
+    } else {
+      MKEmitter.emit('reloadMenuView', menu.MenuID)
+    }
+  }
+
+  modifyTabs = (tab, type, fixed) => {
+    const { tabviews, activeId } = this.state
+
+    if (type === 'plus' && fixed) {
+      let _tabs = tabviews.filter(item => item.MenuID !== tab.MenuID)
+      let index = _tabs.findIndex(item => item.MenuID === activeId)
+
+      this.setState({
+        tabviews: _tabs
+      }, () => {
+        if (index > -1) {
+          _tabs.splice(index + 1, 0, tab)
+        } else {
+          _tabs.push(tab)
+        }
+        this.setState({
+          tabviews: _tabs,
+          activeId: tab.MenuID
+        })
+      })
+    } else if (type === 'plus') {
+      if (tabviews.findIndex(item => item.MenuID === tab.MenuID) > -1) {
+        let _tabs = tabviews.filter(item => item.MenuID !== tab.MenuID)
+        this.setState({
+          tabviews: _tabs
+        }, () => {
+          this.setState({
+            tabviews: [..._tabs, tab],
+            activeId: tab.MenuID
+          })
+        })
+      } else {
+        this.setState({
+          tabviews: [...tabviews, tab],
+          activeId: tab.MenuID
+        })
+      }
+    } else if (type === 'replace') {
+      this.setState({
+        tabviews: tab ? [tab] : [],
+        activeId: tab ? tab.MenuID : ''
+      })
+    }
+
+    let node = document.getElementById('root').parentNode.parentNode
+    if (node) {
+      node.scrollTop = 0
+    }
+  }
+
+  changeTab = (e, menu) => {
+    e.stopPropagation()
+    // 绐楀彛鍒囨崲
+    
+    this.setState({
+      activeId: menu.MenuID || ''
+    }, () => {
+      MKEmitter.emit('resetActiveMenu', menu.MenuID || '')
+    })
+  }
+
+  selectcomponent = (view) => {
+    // 鏍规嵁tab椤典腑鑿滃崟淇℃伅锛岄�夋嫨鎵�闇�鐨勭粍浠�
+    if (view.type === 'Home') {
+      return (<Home MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'CommonTable' || view.type === 'ManageTable') {
+      return (<CommonTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    // } else if (view.type === 'BaseTable') {
+    //   return (<BaseTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'CustomPage') {
+      return (<CustomPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'TreePage') {
+      return (<TreePage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'CalendarPage') {
+      return (<CalendarPage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'VerupTable') {
+      return (<VerupTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'ScriptTable') {
+      return (<ScriptTable MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'TabManage') {
+      return (<TabManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'RolePermission') {
+      return (<RoleManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'appRolePermission') {
+      return (<RoleManage MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID}/>)
+    } else if (view.type === 'FormTab') {
+      return (<FormTab MenuNo={view.MenuNo} MenuID={view.MenuID} MenuName={view.MenuName} key={view.MenuID} param={view.param}/>)
+    } else if (view.type === 'iframe') {
+      return (<Iframe key={view.MenuID} MenuID={view.MenuID} MenuNo={view.MenuNo} title={view.MenuName} MenuName={view.MenuName} url={service + view.LinkUrl}/>)
+    } else {
+      return (<NotFount key={view.MenuID} />)
+    }
+  }
+
+  UNSAFE_componentWillMount () {
+    if (!sessionStorage.getItem('lang') || sessionStorage.getItem('lang') === 'zh-CN') {
+      moment.locale('zh-cn')
+    } else {
+      moment.locale('en')
+    }
+
+    if (sessionStorage.getItem('isEditState') !== 'true') {
+      this.setState({
+        activeId: 'home_page_id',
+        tabviews: [{
+          MenuID: 'home_page_id',
+          MenuName: '棣栭〉',
+          type: 'Home'
+        }]
+      })
+    } else {
+      this.setState({
+        activeId: '',
+        tabviews: []
+      })
+    }
+  }
+
+  componentDidMount () {
+    MKEmitter.addListener('modifyTabs', this.modifyTabs)
+    MKEmitter.addListener('closeTabView', this.closeTabView)
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    MKEmitter.removeListener('modifyTabs', this.modifyTabs)
+    MKEmitter.removeListener('closeTabView', this.closeTabView)
+  }
 
   render () {
-    const { tabviews } = this.state
-    let view = tabviews.filter(tab => tab.selected)[0]
-    this.resetWindow(view)
-    let selectedTabId = view ? view.MenuID : ''
+    const { tabviews, activeId } = this.state
 
     return (
-      <section className={'flex-container content-box' + (this.props.collapse ? ' collapsed' : '')}>
-        <ConfigProvider locale={this.state.locale}>
-          <div className="content-header">
-            {tabviews && tabviews.length > 0 &&
-              <Tabs activeKey={selectedTabId}>
-                {tabviews.map(view => {
-                  return (
-                    <Tabs.TabPane
-                      className="test"
-                      tab={
-                        <span className="tab-control">
-                          <span className="tab-name" onClick={(e) => {this.changeTab(e, view)}}>
-                            {view.MenuName}
-                          </span>
-                          {view.type !== 'Home' ? <Icon type="close" onClick={(e) => {this.handleTabview(e, view)}}/> : null}
+      <section id="mk-tabview-wrap" className={'mk-tabview-wrap' + (this.props.collapse ? ' collapsed' : '') + (tabviews && tabviews.length > 0 ? ' hastab' : '')}>
+        <div className="content-header">
+          {tabviews && tabviews.length > 0 &&
+            <Tabs activeKey={activeId}>
+              {tabviews.map((view, index) => {
+                return (
+                  <Tabs.TabPane
+                    tab={
+                      <span className="tab-control">
+                        <RedoOutlined onClick={(e) => {this.refreshTabview(e, view)}}/>
+                        <span className="tab-name" onClick={(e) => {this.changeTab(e, view)}}>
+                          {view.MenuName}
                         </span>
-                      }
-                      key={view.MenuID}
-                    >
-                      {this.selectcomponent(view)}
-                      {view.type !== 'CommonTable' ?
-                        <Button
-                          icon="copy"
-                          shape="circle"
-                          className={'main-copy ' + (view.type === 'iframe' ? 'ifr-copy' : '')}
-                          data-menuno={view.MenuNo}
-                          onClick={this.copyMenuNo}
-                        /> : null
-                      }
-                      <BackTop>
-                        <div className="ant-back-top">
-                          <div className="ant-back-top-content">
-                            <div className="ant-back-top-icon"></div>
-                          </div>
+                        {view.type !== 'Home' ?
+                          <CloseOutlined onClick={(e) => {e.stopPropagation();this.closeTabView(view.MenuID)}}/> : null
+                        }
+                      </span>
+                    }
+                    key={view.MenuID}
+                  >
+                    {this.selectcomponent(view)}
+                    <BackTop>
+                      <div className="ant-back-top">
+                        <div className="ant-back-top-content">
+                          <div className="ant-back-top-icon"></div>
                         </div>
-                      </BackTop>
-                    </Tabs.TabPane>
-                  )
-                })}
-              </Tabs>
-            }
-          </div>
-        </ConfigProvider>
+                      </div>
+                    </BackTop>
+                    {/* {options.sysType === 'local' && window.GLOB.systemType !== 'production' ? <div className="mk-water-mark">娴嬭瘯绯荤粺</div> : null} */}
+                  </Tabs.TabPane>
+                )
+              })}
+            </Tabs>
+          }
+        </div>
       </section>
     )
   }
@@ -245,17 +315,14 @@
 
 const mapStateToProps = (state) => {
   return {
-    tabviews: state.tabviews,
     collapse: state.collapse,
-    isiframe: state.isiframe
   }
 }
 
 const mapDispatchToProps = (dispatch) => {
   return {
-    modifyTabview: (tabviews) => dispatch(modifyTabview(tabviews)),
-    toggleIsiframe: (isiframe) => dispatch(toggleIsiframe(isiframe))
+    initActionPermission: (permAction) => dispatch(initActionPermission(permAction))
   }
 }
 
-export default connect(mapStateToProps, mapDispatchToProps)(Header)
\ No newline at end of file
+export default connect(mapStateToProps, mapDispatchToProps)(TabViews)
\ No newline at end of file

--
Gitblit v1.8.0