From a29d9d644a2a30e9ef4afcc6d728c20c218dc359 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 15 六月 2023 14:25:28 +0800
Subject: [PATCH] 2023-06-15

---
 src/templates/subtableconfig/index.jsx | 1314 +++++++++++++++++++++++++---------------------------------
 1 files changed, 571 insertions(+), 743 deletions(-)

diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index 1aeee63..19bfb12 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/src/templates/subtableconfig/index.jsx
@@ -1,25 +1,22 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import {connect} from 'react-redux'
 import { is, fromJS } from 'immutable'
 import { DndProvider } from 'react-dnd'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { Button, Card, Modal, Collapse, notification, Spin, Icon, Switch, Tooltip, Col } from 'antd'
-import moment from 'moment'
+import { Button, Card, Modal, Collapse, notification, Spin, Switch, Tooltip, Col } from 'antd'
+import { QuestionCircleOutlined, RedoOutlined } from '@ant-design/icons'
+// import moment from 'moment'
 
 import Api from '@/api'
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
 import Utils from '@/utils/utils.js'
-import { getSubMenuForm } from '@/templates/zshare/formconfig'
+import { updateSubTable } from '@/utils/utils-update.js'
 
 import asyncComponent from '@/utils/asyncComponent'
 import SearchComponent from '@/templates/sharecomponent/searchcomponent'
 import ActionComponent from '@/templates/sharecomponent/actioncomponent'
 import ColumnComponent from '@/templates/sharecomponent/columncomponent'
 
-import MenuForm from '@/templates/zshare/menuform'
-import EditComponent from '@/templates/zshare/editcomponent'
+import MenuForm from './menuform'
 import SourceElement from '@/templates/zshare/dragsource'
 import Source from './source'
 import './index.scss'
@@ -27,6 +24,9 @@
 const { Panel } = Collapse
 const { confirm } = Modal
 
+const Versions = asyncComponent(() => import('@/menu/versions'))
+// const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
+const EditComponent = asyncComponent(() => import('@/templates/zshare/editcomponent'))
 const SettingComponent = asyncComponent(() => import('@/templates/sharecomponent/settingcomponent'))
 const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
 const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
@@ -37,7 +37,6 @@
 class SubTableConfig extends Component {
   static propTpyes = {
     menu: PropTypes.any,
-    optionLibs: PropTypes.any,
     editTab: PropTypes.any,
     tabConfig: PropTypes.any,
     editSubTab: PropTypes.any,
@@ -48,13 +47,8 @@
   }
 
   state = {
-    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,        // 瀛楀吀
     config: null,            // 椤甸潰閰嶇疆
     visible: false,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪锛屾ā鎬佹鏄剧ず鎺у埗
-    tableFields: [],         // 宸查�夎〃瀛楁闆�
-    fields: null,            // 鎼滅储鏉′欢鍙婃樉绀哄垪锛屽彲閫夊瓧娈�
-    menuformlist: null,      // 鍩烘湰淇℃伅琛ㄥ崟瀛楁
-    formlist: null,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪琛ㄥ崟瀛楁
     menuloading: false,      // 鑿滃崟淇濆瓨涓�
     menucloseloading: false, // 鑿滃崟鍏抽棴鏃讹紝閫夋嫨淇濆瓨
     loading: false,          // 鍔犺浇涓紝椤甸潰spin
@@ -64,12 +58,9 @@
     delActions: [],          // 鍒犻櫎鎸夐挳鍒楄〃
     copyActions: [],         // 澶嶅埗鎸夐挳缁�
     tabviews: [],            // 鎵�鏈夋爣绛鹃〉
-    optionLibs: null,        // 鑷畾涔変笅鎷夐�夐」搴�
-    thawButtons: [],         // 宸查�夋嫨瑕佽В鍐荤殑鎸夐挳
     activeKey: '0',          // 榛樿灞曞紑鍩烘湰淇℃伅
     chartview: null,         // 褰撳墠瑙嗗浘
-    pasteContent: null,      // 绮樿创鍐呭
-    openEdition: ''          // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
+    openEdition: '',         // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
   }
 
   /**
@@ -78,33 +69,17 @@
    * 2銆佽缃搷浣滅被鍨嬨�佸師濮嬭彍鍗曚俊鎭紙姣忔淇濆瓨鍚庨噸缃級銆佸凡浣跨敤琛ㄥ強鍩烘湰淇℃伅琛ㄥ崟
    */
   UNSAFE_componentWillMount () {
-    const { config, editTab, editSubTab, optionLibs } = this.props
+    const { config, editTab, editSubTab } = this.props
 
     let _config = null
 
     if (!config) {
-      _config = JSON.parse(JSON.stringify(Source.baseConfig))
+      _config = fromJS(Source.baseConfig).toJS()
       _config.uuid = editSubTab ? editSubTab.linkTab : editTab.linkTab
       _config.tabName = editSubTab ? editSubTab.label : editTab.label
       _config.isAdd = true
     } else {
-      _config = JSON.parse(JSON.stringify(config))
-
-      _config.search.forEach(item => {
-        if (
-          (item.type === 'select' || item.type === 'multiselect' || item.type === 'link') &&
-          item.resourceType === '0' &&
-          item.options && item.options.length > 0
-        ) {
-          optionLibs.set(_config.uuid + item.uuid, {
-            uuid: _config.uuid + item.uuid,
-            label: item.label,
-            parname: _config.tabName,
-            type: 'search',
-            options: item.options
-          })
-        }
-      })
+      _config = fromJS(config).toJS()
     }
     
     let _oriActions = []
@@ -112,9 +87,14 @@
     if (_config.type === 'user') {
       _config.action = _config.action.map(item => {
         let uuid = Utils.getuuid()
+
+        if (item.linkTab) {
+          item.linkTab = ''
+        }
+
         if (item.OpenType === 'pop') { // 鍚湁瀛愰厤缃」鐨勬寜閽�
           _oriActions.push({
-            prebtn: JSON.parse(JSON.stringify(item)),
+            prebtn: fromJS(item).toJS(),
             curuuid: uuid,
             Template: 'Modal'
           })
@@ -127,66 +107,16 @@
 
     let _activeKey =  editSubTab ? editSubTab.activeKey : editTab.activeKey
 
-    if (!_config.version || _config.version < '1.0') {
-      // 閰嶇疆榛樿鍊硷紝鍏煎
-      _config.version = '1.0'
-      
-      // 鍏煎鍥捐〃
-      if (!_config.charts) {
-        _config.expand = false
-        _config.charts = [{
-          uuid: Utils.getuuid(),
-          label: '',
-          title: '',
-          chartType: 'table',
-          icon: 'table',
-          Hide: 'false',
-          blacklist: []
-        }]
-      } else {
-        _config.charts.forEach(card => {
-          if (card.chartType === 'card') {
-            card.details = card.details.map(_cell => {
-              if (!_cell.fontSize) {
-                _cell.fontSize = 14
-              }
-              if (!_cell.width) {
-                _cell.width = 100
-              } else if (_cell.width === 'helf') {
-                _cell.width = 50
-              } else if (_cell.width === 'third') {
-                _cell.width = 33
-              }
-        
-              if (_cell.bold === 'true') {
-                _cell.fontWeight = 'normal'
-              }
-
-              if (!_cell.height) {
-                _cell.height = 1
-              }
-
-              return _cell
-            })
-
-            if (card.widthType === 'ratio' && card.avatar && card.avatar.widthType !== 'ratio') {
-              card.avatar.widthType = 'ratio'
-              card.avatar.width = 32
-            }
-          }
-        })
-      }
-    }
+    // 鐗堟湰鍏煎
+    _config = updateSubTable(_config)
 
     this.setState({
       openEdition: editSubTab ? (editSubTab.open_edition || '') : (editTab.open_edition || ''),
-      chartview: _config.charts[0].uuid,
+      chartview: _config.charts ? _config.charts[0].uuid : '',
       originActions: _oriActions,
-      optionLibs: optionLibs,
       config: _config,
       activeKey: _activeKey || '0',
-      originConfig: _config,
-      menuformlist: getSubMenuForm(_config)
+      originConfig: fromJS(_config).toJS(),
     })
   }
 
@@ -197,6 +127,54 @@
    */
   componentDidMount () {
     this.reloadTab(false)
+    document.onkeydown = (event) => {
+      let e = event || window.event
+      let keyCode = e.keyCode || e.which || e.charCode
+      let preKey = ''
+
+      if (e.ctrlKey) {
+        preKey = 'ctrl'
+      }
+      if (e.shiftKey) {
+        preKey = 'shift'
+      } else if (e.altKey) {
+        preKey = 'alt'
+      }
+      
+      if (!preKey || !keyCode) return
+      
+      let _shortcut = `${preKey}+${keyCode}`
+
+      if (_shortcut === 'ctrl+83') {
+        let modals = document.querySelectorAll('.mk-pop-modal')
+        let msg = null
+        for (let i = 0; i < modals.length; i++) {
+          if (msg) {
+            break
+          }
+
+          let node = modals[i].querySelector('.mk-com-name')
+
+          if (node) {
+            msg = node.innerText
+          }
+        }
+        if (msg) {
+          notification.warning({
+            top: 92,
+            message: '璇蜂繚瀛�' + msg,
+            duration: 5
+          })
+          return false
+        }
+
+        let node = document.getElementById('save-config')
+        if (node && node.click) {
+          node.click()
+        }
+        return false
+      }
+    }
   }
 
   /**
@@ -256,6 +234,7 @@
     this.setState = () => {
       return
     }
+    document.onkeydown = () => {}
   }
 
   // 椤甸潰杩斿洖
@@ -267,7 +246,7 @@
     if (editSubTab) {
       _subconfig = tabConfig
       if (editTab.hasOwnProperty('OpenType')) {
-        _tabview = editTab.tabType
+        _tabview = editTab.tabType || 'SubTable'
       } else {
         _tabview = editTab.type
       }
@@ -278,7 +257,6 @@
 
     let param = {
       editMenu: menu,
-      optionLibs: this.state.optionLibs,
       editTab: editSubTab ? editTab : null,
       tabConfig: null,
       editSubTab: null,
@@ -305,391 +283,179 @@
    * @description 鏍囩椤典繚瀛�
    */
   submitConfig = () => {
-    const { delActions, thawButtons, originConfig, openEdition } = this.state
-    let config = JSON.parse(JSON.stringify(this.state.config))
+    const { delActions, openEdition } = this.state
+    let _config = fromJS(this.state.config).toJS()
     let copyreg = /\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/ig
 
-    this.menuformRef.handleConfirm().then(res => {
-      if (copyreg.test(res.MenuNo) || copyreg.test(res.MenuName)) {
-        notification.warning({
-          top: 92,
-          message: '璇蜂慨鏀规爣绛惧悕绉板拰鏍囩鍙傛暟锛屼笉鍙互鏃堕棿鏍煎紡 YYYY-MM-DD HH:mm:ss 缁撳熬锛�',
-          duration: 5
-        })
-        return
-      }
-
-      if (originConfig.isAdd) {
-        if (config.search[0] && config.search[0].origin) {
-          config.search = config.search.filter(item => !item.origin)
-        }
-        if (config.action[0] && config.action[0].origin) {
-          config.action = config.action.filter(item => !item.origin)
-        }
-        if (config.columns[0] && config.columns[0].origin) {
-          config.columns = config.columns.filter(item => !item.origin)
-        }
-      }
-
-      let _LongParam = ''
-      let _config = {...config, tabName: res.MenuName, tabNo: res.MenuNo, Remark: res.Remark}
-
-      // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负false
-      let result = this.verifyconfig(_config)
-    
-      if (result !== true) {
-        _config.enabled = false
-      }
-
-      _config.funcs = []
-
-      _config.funcs.push({
-        type: 'view',
-        subtype: 'view',
-        uuid: _config.uuid,
-        intertype: _config.setting.interType || 'inner',
-        interface: _config.setting.interface || '',
-        tableName: _config.setting.tableName || '',
-        innerFunc: _config.setting.innerFunc || '',
-        outerFunc: _config.setting.outerFunc || ''
-      })
-
-      _config.action.forEach(item => {
-        let tablename = item.OpenType === 'excelIn' ? (item.sheet || '') : (item.sql || '')
-
-        if (item.OpenType === 'excelOut' && item.intertype === 'inner' && !item.innerFunc) {
-          tablename = _config.setting.tableName || ''
-        }
-
-        if (item.OpenType === 'popview') {
-          _config.funcs.push({
-            type: 'tab',
-            subtype: 'btn',
-            uuid: item.uuid,
-            label: item.label,
-            linkTab: item.linkTab
-          })
-        } else {
-          _config.funcs.push({
-            type: 'button',
-            subtype: 'btn',
-            uuid: item.uuid,
-            label: item.label,
-            tableName: tablename,
-            intertype: item.intertype,
-            interface: item.interface || '',
-            innerFunc: item.innerFunc || '',
-            outerFunc: item.outerFunc || '',
-            callbackFunc: item.callbackFunc || ''
-          })
-        }
-      })
-
-      if (this.state.closeVisible) { // 鏄剧ず鍏抽棴瀵硅瘽妗嗘椂锛屾ā鎬佹涓繚瀛樻寜閽紝鏄剧ず淇濆瓨涓姸鎬�
-        this.setState({
-          menucloseloading: true
-        })
-      } else {
-        this.setState({
-          menuloading: true
-        })
-      }
-
-      new Promise(resolve => {
-        let deffers = []
-        _config.funcs.forEach(item => {
-          if (item.type === 'tab') {
-            let deffer = new Promise(resolve => {
-              Api.getSystemConfig({
-                func: 'sPC_Get_LongParam',
-                MenuID: item.linkTab
-              }).then(result => {
-                if (result.status && result.LongParam) {
-                  let _LongParam = ''
-        
-                  if (result.LongParam) {
-                    try {
-                      _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
-                    } catch (e) {
-                      console.warn('Parse Failure')
-                      _LongParam = ''
-                    }
-                  }
-      
-                  if (_LongParam) {
-                    item.menuNo = _LongParam.tabNo
-                    item.subfuncs = _LongParam.funcs || []
-                  }
-                }
-                resolve()
-              })
-            })
-
-            deffers.push(deffer)
-          }
-        })
-
-        if (deffers.length === 0) {
-          resolve()
-        } else {
-          Promise.all(deffers).then(() => {
-            resolve()
-          })
-        }
-      }).then(() => {
-
-        // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝system 銆乽ser
-        delete _config.type
-        delete _config.isAdd
-
-        try {
-          _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_config)))
-        } catch (e) {
-          notification.warning({
-            top: 92,
-            message: '缂栬瘧閿欒',
-            duration: 5
-          })
-
-          this.setState({
-            menucloseloading: false,
-            menuloading: false
-          })
-          return
-        }
-  
-        let btnParam = {
-          func: 'sPC_Button_AddUpt',
-          Type: 40,
-          ParentID: _config.uuid,
-          MenuNo: res.MenuNo,
-          Template: 'SubTable',
-          PageParam: '',
-          LongParam: '',
-          LText: []
-        }
-
-        let btntabs = []
-
-        config.action.forEach((item, index) => {
-          if (item.OpenType === 'popview') {
-            btntabs.push(`select '${item.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`)
-          }
-          btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
-        })
-  
-        btnParam.LText = btnParam.LText.join(' union all ')
-        btnParam.LText = Utils.formatOptions(btnParam.LText)
-        btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-        btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
-
-        let tabParam = { // 娣诲姞鏍囩鎸夐挳tab椤�
-          func: 'sPC_sMenusTab_AddUpt',
-          MenuID: _config.uuid,
-          LText: btntabs.join(' union all ')
-        }
-
-        tabParam.LText = Utils.formatOptions(tabParam.LText)
-        tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-        tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
-  
-        let param = {
-          func: 'sPC_Tab_AddUpt',
-          MenuID: _config.uuid,
-          MenuNo: res.MenuNo,
-          Template: 'SubTable',
-          MenuName: res.MenuName,
-          Remark: res.Remark,
-          Sort: 0,
-          PageParam: JSON.stringify({Template: 'SubTable'}),
-          LongParam: _LongParam
-        }
-
-        if (openEdition) {
-          param.open_edition = openEdition
-        }
-
-        // 鏈夋寜閽垨鏍囩鍒犻櫎鏃讹紝鍏堣繘琛屽垹闄ゆ搷浣�
-        // 鍒犻櫎鎴愬姛鍚庯紝淇濆瓨椤甸潰閰嶇疆
-        new Promise(resolve => {
-          if (delActions.length > 0) {
-            let deffers = delActions.map(item => {
-              let _param = {
-                func: 'sPC_MainMenu_Del',
-                MenuID: item.card.uuid
-              }
-
-              let _ParentParam = null
-
-              try {
-                _ParentParam = window.btoa(window.encodeURIComponent(JSON.stringify(item.card)))
-              } catch (e) {
-                console.warn('Stringify Failure')
-                _ParentParam = null
-              }
-
-              if (_ParentParam) { // 鍒犻櫎鎸夐挳鏃讹紝淇濆瓨鎸夐挳閰嶇疆淇℃伅锛岀敤浜庢仮澶嶆寜閽�
-                _param.ParentParam = _ParentParam
-              }
-
-              return new Promise(resolve => {
-                Api.getSystemConfig(_param).then(response => {
-                  resolve(response)
-                })
-              })
-            })
-            Promise.all(deffers).then(result => {
-              let error = null
-              result.forEach(response => {
-                if (!response.status) {
-                  error = response
-                }
-              })
-    
-              if (error) {
-                this.setState({
-                  menuloading: false,
-                  menucloseloading: false
-                })
-                notification.warning({
-                  top: 92,
-                  message: error.message,
-                  duration: 5
-                })
-                resolve(false)
-              } else {
-                this.setState({
-                  delActions: []
-                })
-                resolve(true)
-              }
-            })
-          } else if (delActions.length === 0) {
-            resolve(true)
-          }
-        }).then(resp => {
-          if (resp === false) return
-
-          if (thawButtons.length > 0) {
-            let defers = thawButtons.map(item => {
-              return new Promise((resolve) => {
-                Api.getSystemConfig({
-                  func: 'sPC_MainMenu_ReDel',
-                  MenuID: item
-                }).then(res => {
-                  if (res.status) {
-                    resolve('')
-                  } else {
-                    resolve(res.message)
-                  }
-                })
-              })
-            })
-
-            return Promise.all(defers)
-          } else {
-            return true
-          }
-        }).then(res => {
-          if (res === true || res === false) return res
-
-          let msg = res.filter(Boolean)[0]
-          if (msg) {
-            notification.warning({
-              top: 92,
-              message: msg,
-              duration: 5
-            })
-            return false
-          } else {
-            this.setState({
-              thawButtons: []
-            })
-            return true
-          }
-        }).then(resp => {
-          if (resp === false) return
-  
-          Api.getSystemConfig(param).then(response => {
-            if (response.status) {
-              this.setState({
-                openEdition: response.open_edition || '',
-                config: _config,
-                originConfig: _config
-              }, () => {
-                this.setState({
-                  menuloading: false,
-                  menucloseloading: false
-                })
-                this.submitAction(btnParam, tabParam)
-              })
-            } else {
-              this.setState({
-                menuloading: false,
-                menucloseloading: false
-              })
-              notification.warning({
-                top: 92,
-                message: response.message,
-                duration: 5
-              })
-            }
-          })
-        })
-      })
-    }, () => {
+    // 鍩烘湰淇℃伅楠岃瘉
+    if (!_config.tabName || !_config.tabNo) {
       notification.warning({
         top: 92,
-        message: this.state.dict['header.menu.basemsg'],
+        message: '璇峰畬鍠勮彍鍗曞熀鏈俊鎭紒',
         duration: 5
       })
-    })
-  }
+      this.setState({activeKey: '0'})
+      return
+    }
 
-  /**
-   * @description 淇濆瓨鎴栦慨鏀硅彍鍗曟寜閽�
-   */
-  submitAction = (btnParam, tabParam) => {
-    const { config } = this.state
+    if (copyreg.test(_config.tabNo) || copyreg.test(_config.tabName)) {
+      notification.warning({
+        top: 92,
+        message: '姝ゆ爣绛句负澶嶅埗鏍囩锛岃淇敼鏍囩鍚嶇О鍜屾爣绛惧弬鏁帮紝涓嶅彲浠ユ椂闂存牸寮� YYYY-MM-DD HH:mm:ss 缁撳熬锛�',
+        duration: 5
+      })
+      return
+    }
 
+    if (_config.isAdd) {
+      if (_config.search[0] && _config.search[0].origin) {
+        _config.search = _config.search.filter(item => !item.origin)
+      }
+      if (_config.action[0] && _config.action[0].origin) {
+        _config.action = _config.action.filter(item => !item.origin)
+      }
+      if (_config.columns[0] && _config.columns[0].origin) {
+        _config.columns = _config.columns.filter(item => !item.origin)
+      }
+    }
+
+    if (_config.setting.doubleClick && _config.action.findIndex((item) => item.uuid === _config.setting.doubleClick) === -1) {
+      _config.setting.doubleClick = ''
+    }
+
+    // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负false
+    let result = this.verifyconfig(_config)
+  
+    if (result !== true) {
+      _config.enabled = false
+    }
+
+    if (this.state.closeVisible) { // 鏄剧ず鍏抽棴瀵硅瘽妗嗘椂锛屾ā鎬佹涓繚瀛樻寜閽紝鏄剧ず淇濆瓨涓姸鎬�
+      this.setState({
+        menucloseloading: true
+      })
+    } else {
+      this.setState({
+        menuloading: true
+      })
+    }
+
+    let _LongParam = ''
+
+    // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝system 銆乽ser
+    delete _config.type
+    delete _config.isAdd
+
+    try {
+      _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_config)))
+    } catch (e) {
+      notification.warning({
+        top: 92,
+        message: '缂栬瘧閿欒',
+        duration: 5
+      })
+
+      this.setState({
+        menucloseloading: false,
+        menuloading: false
+      })
+      return
+    }
+
+    // let btnParam = {
+    //   func: 'sPC_Button_AddUpt',
+    //   Type: 40,
+    //   ParentID: _config.uuid,
+    //   MenuNo: _config.tabNo,
+    //   Template: 'SubTable',
+    //   PageParam: '',
+    //   LongParam: '',
+    //   LText: []
+    // }
+
+    // let btntabs = []
+
+    // _config.action.forEach((item, index) => {
+    //   if (item.hidden === 'true') return
+    //   if (item.OpenType === 'popview') {
+    //     btntabs.push(`select '${item.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`)
+    //   }
+    //   btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
+    // })
+
+    // btnParam.LText = btnParam.LText.join(' union all ')
+    // btnParam.LText = Utils.formatOptions(btnParam.LText)
+    // btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    // btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
+
+    // let tabParam = { // 娣诲姞鏍囩鎸夐挳tab椤�
+    //   func: 'sPC_sMenusTab_AddUpt',
+    //   MenuID: _config.uuid,
+    //   LText: btntabs.join(' union all ')
+    // }
+
+    // tabParam.LText = Utils.formatOptions(tabParam.LText)
+    // tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    // tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
+
+    let param = {
+      func: 'sPC_Tab_AddUpt',
+      MenuID: _config.uuid,
+      MenuNo: _config.tabNo,
+      Template: 'SubTable',
+      MenuName: _config.tabName,
+      Remark: _config.Remark,
+      Sort: 0,
+      PageParam: JSON.stringify({Template: 'SubTable'}),
+      LongParam: _LongParam
+    }
+
+    if (openEdition) {
+      param.open_edition = openEdition
+    }
+
+    // 鏈夋寜閽垨鏍囩鍒犻櫎鏃讹紝鍏堣繘琛屽垹闄ゆ搷浣�
+    // 鍒犻櫎鎴愬姛鍚庯紝淇濆瓨椤甸潰閰嶇疆
     new Promise(resolve => {
-      let deffers = []
+      if (delActions.length > 0) {
+        let deffers = delActions.map(item => {
+          let _param = {
+            func: 'sPC_MainMenu_Del',
+            MenuID: item.card.uuid
+          }
 
-      if (tabParam.LText) {
-        let defer = new Promise(resolve => {
-          Api.getSystemConfig(tabParam).then(result => {
-            resolve(result)
+          let _ParentParam = null
+
+          try {
+            _ParentParam = window.btoa(window.encodeURIComponent(JSON.stringify(item.card)))
+          } catch (e) {
+            console.warn('Stringify Failure')
+            _ParentParam = null
+          }
+
+          if (_ParentParam) { // 鍒犻櫎鎸夐挳鏃讹紝淇濆瓨鎸夐挳閰嶇疆淇℃伅锛岀敤浜庢仮澶嶆寜閽�
+            _param.ParentParam = _ParentParam
+          }
+
+          return new Promise(resolve => {
+            Api.getSystemConfig(_param).then(response => {
+              resolve(response)
+            })
           })
         })
-        deffers.push(defer)
-      }
-
-      if (btnParam.LText) {
-        let defer = new Promise(resolve => {
-          Api.getSystemConfig(btnParam).then(result => {
-            if (result.status) {
-              this.setState({ // 淇濆瓨鎴愬姛鍚庢竻绌哄鍒跺垪琛�
-                copyActions: []
-              })
-            }
-            resolve(result)
-          })
-        })
-        deffers.push(defer)
-      }
-
-      if (deffers.length === 0) {
-        resolve(true)
-      } else {
         Promise.all(deffers).then(result => {
-          let error = false
-          result.forEach(res => {
-            if (!res.status) {
-              error = res
+          let error = null
+          result.forEach(response => {
+            if (!response.status) {
+              error = response
             }
           })
 
           if (error) {
+            this.setState({
+              menuloading: false,
+              menucloseloading: false
+            })
             notification.warning({
               top: 92,
               message: error.message,
@@ -697,82 +463,125 @@
             })
             resolve(false)
           } else {
+            this.setState({
+              delActions: []
+            })
             resolve(true)
           }
         })
+      } else if (delActions.length === 0) {
+        resolve(true)
       }
-    }).then(response => {
-      if (response === false) return response
+    }).then(resp => {
+      if (resp === false) return
 
-      let oriActions = []
-      this.state.originActions.forEach(item => {
-        let curBtn = config.action.filter(cell => item.curuuid === cell.uuid)[0] // 鏌ョ湅鍒濆鍖栨寜閽槸鍚﹀瓨鍦�
-        if (!curBtn) return
-        if (curBtn.OpenType !== item.prebtn.OpenType) return
+      return true
+    }).then(res => {
+      if (res === true || res === false) return res
 
-        oriActions.push({
-          prebtn: item.prebtn,
-          curBtn: curBtn
-        })
-      })
-
-      if (oriActions.length === 0) return 'true'
-
-      oriActions.forEach(action => {
-        Api.getSystemConfig({
-          func: 'sPC_Get_LongParam',
-          MenuID: action.prebtn ? action.prebtn.uuid : ''
-        }).then(result => {
-          if (result.status && result.LongParam) {
-            let _LongParam = ''
-  
-            if (result.LongParam) {
-              try {
-                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
-              } catch (e) {
-                console.warn('Parse Failure')
-                _LongParam = ''
-              }
-            }
-
-            if (_LongParam) {
-              let param = {
-                func: 'sPC_ButtonParam_AddUpt',
-                ParentID: config.uuid,
-                MenuID: action.curBtn.uuid,
-                MenuNo: config.tabNo,
-                Template: _LongParam.type,
-                MenuName: action.curBtn.label,
-                PageParam: JSON.stringify({Template: _LongParam.type}),
-                LongParam: result.LongParam
-              }
-              Api.getSystemConfig(param).then(() => {})
-            }
-          }
-        })
-      })
-      return 'true'
-    }).then(response => {
-      if (response === 'true') {
-        notification.success({
+      let msg = res.filter(Boolean)[0]
+      if (msg) {
+        notification.warning({
           top: 92,
-          message: '淇濆瓨鎴愬姛',
-          duration: 2
+          message: msg,
+          duration: 5
         })
-        if (this.state.closeVisible) {
-          this.handleViewBack()
+        return false
+      } else {
+        return true
+      }
+    }).then(resp => {
+      if (resp === false) return
+
+      Api.getSystemConfig(param).then(response => {
+        if (response.status) {
+          this.setState({
+            openEdition: response.open_edition || '',
+            config: _config,
+            originConfig: fromJS(_config).toJS()
+          }, () => {
+            this.setState({
+              menuloading: false,
+              menucloseloading: false
+            })
+            notification.success({
+              top: 92,
+              message: '淇濆瓨鎴愬姛',
+              duration: 2
+            })
+            if (this.state.closeVisible) {
+              this.handleViewBack()
+            }
+          })
+          this.submitAction()
         } else {
           this.setState({
             menuloading: false,
             menucloseloading: false
           })
+          notification.warning({
+            top: 92,
+            message: response.message,
+            duration: 5
+          })
         }
-      } else {
-        this.setState({
-          menuloading: false,
-          menucloseloading: false
-        })
-      }
+      })
+    })
+  }
+
+  /**
+   * @description 淇濆瓨鎴栦慨鏀硅彍鍗曟寜閽�
+   */
+  submitAction = () => {
+    const { config } = this.state
+
+    let oriActions = []
+    this.state.originActions.forEach(item => {
+      let curBtn = config.action.filter(cell => item.curuuid === cell.uuid)[0] // 鏌ョ湅鍒濆鍖栨寜閽槸鍚﹀瓨鍦�
+      if (!curBtn) return
+      if (curBtn.OpenType !== item.prebtn.OpenType) return
+      if (curBtn.OpenType === 'funcbutton' && curBtn.execMode !== 'pop') return
+
+      oriActions.push({
+        prebtn: item.prebtn,
+        curBtn: curBtn
+      })
+    })
+
+    if (oriActions.length === 0) return
+
+    oriActions.forEach(action => {
+      Api.getSystemConfig({
+        func: 'sPC_Get_LongParam',
+        MenuID: action.prebtn ? action.prebtn.uuid : ''
+      }).then(result => {
+        if (result.status && result.LongParam) {
+          let _LongParam = ''
+
+          if (result.LongParam) {
+            try {
+              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
+            } catch (e) {
+              console.warn('Parse Failure')
+              _LongParam = ''
+            }
+          }
+
+          if (_LongParam) {
+            let param = {
+              func: 'sPC_ButtonParam_AddUpt',
+              ParentID: config.uuid,
+              MenuID: action.curBtn.uuid,
+              MenuNo: config.tabNo,
+              Template: _LongParam.type,
+              MenuName: action.curBtn.label,
+              PageParam: JSON.stringify({Template: _LongParam.type}),
+              LongParam: result.LongParam
+            }
+            Api.getSystemConfig(param).then(() => {})
+          }
+        }
+      })
     })
   }
 
@@ -784,29 +593,19 @@
     if (originConfig.isAdd) {
       confirm({
         content: '鑿滃崟灏氭湭鎻愪氦锛岀‘瀹氭斁寮冧繚瀛樺悧锛�',
-        okText: this.state.dict['model.confirm'],
-        cancelText: this.state.dict['header.cancel'],
         onOk() {
           _this.handleViewBack()
         },
         onCancel() {}
       })
     } else {
-      this.menuformRef.handleConfirm().then(res => {
-        let _config = {...config, tabName: res.MenuName, tabNo: res.MenuNo, Remark: res.Remark}
-
-        if (!is(fromJS(originConfig), fromJS(_config))) {
-          this.setState({
-            closeVisible: true
-          })
-        } else {
-          this.handleViewBack()
-        }
-      }, () => {
+      if (!is(fromJS(originConfig), fromJS(config))) {
         this.setState({
           closeVisible: true
         })
-      })
+      } else {
+        this.handleViewBack()
+      }
     }
   }
 
@@ -824,103 +623,101 @@
         duration: 5
       })
     } else {
-      this.menuformRef.handleConfirm().then(res => {
-        let _config = {...config, tabName: res.MenuName, tabNo: res.MenuNo, Remark: res.Remark}
-
-        if (!is(fromJS(originConfig), fromJS(_config))) {
-          notification.warning({
-            top: 92,
-            message: '鑿滃崟閰嶇疆宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
-            duration: 5
-          })
-        } else {
-          this.setState({
-            loading: true
-          })
-
-          // 瀛愯彍鍗曚俊鎭獙璇侀�氳繃鍚庯紝璺宠浆瀛愭寜閽厤缃〉闈�
-          let _view = ''
-          let _subtab = editSubTab
-
-          if (btn.OpenType === 'pop') {
-            _view = 'Modal'             // 琛ㄥ崟椤甸潰
-          } else if (btn.OpenType === 'popview') {
-            _view = btn.tabType        // 鏂板脊绐楁爣绛炬ā鏉�
-            _subtab = btn
-          }
-
-          if (editSubTab) {
-            editSubTab.activeKey = activeKey
-            editSubTab.open_edition = openEdition  // 鏇存柊鐗堟湰鍙�
-          } else {
-            editTab.activeKey = activeKey
-            editTab.open_edition = openEdition     // 鏇存柊鐗堟湰鍙�
-          }
-
-          let param = {
-            editMenu: menu,
-            optionLibs: this.state.optionLibs,
-            editTab: editTab,
-            tabConfig: editSubTab ? tabConfig : originConfig,
-            editSubTab: _subtab,
-            subTabConfig: editSubTab ? originConfig : null,
-            btnTab: btnTab,
-            btnTabConfig: btnTabConfig,
-            editAction: btn,
-            subConfig: '',
-            tabview: _view
-          }
-
-          Api.getSystemConfig({
-            func: 'sPC_Get_LongParam',
-            MenuID: btn.OpenType === 'popview' ? btn.linkTab : btn.uuid
-          }).then(res => {
-            if (res.status) {
-              this.setState({
-                loading: false
-              })
-              let _LongParam = ''
-              if (res.LongParam) {
-                try {
-                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
-                } catch (e) {
-                  console.warn('Parse Failure')
-                  _LongParam = ''
-                }
-              }
-
-              if (_LongParam && param.tabview === 'Modal' && _LongParam.type === 'Modal') {
-                param.subConfig = _LongParam
-              } else if (_LongParam && param.tabview === 'SubTable' && _LongParam.Template === 'SubTable') {
-                param.subConfig = _LongParam
-              }
-
-              if (param.editAction) {
-                param.editAction.open_edition = res.open_edition || ''
-              } else if (param.editSubTab) {
-                param.editSubTab.open_edition = res.open_edition || ''
-              }
-
-              this.props.handleView(param)
-            } else {
-              this.setState({
-                loading: false
-              })
-              notification.warning({
-                top: 92,
-                message: res.message,
-                duration: 5
-              })
-            }
-          })
-        }
-      }, () => {
+      if (!is(fromJS(originConfig), fromJS(config))) {
         notification.warning({
           top: 92,
-          message: '鑿滃崟鍩烘湰淇℃伅宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
+          message: '鑿滃崟閰嶇疆宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
           duration: 5
         })
-      })
+      } else {
+        // 瀛愯彍鍗曚俊鎭獙璇侀�氳繃鍚庯紝璺宠浆瀛愭寜閽厤缃〉闈�
+        let _view = ''
+        let _subtab = editSubTab
+
+        if (btn.OpenType === 'pop' || btn.execMode === 'pop') {
+          _view = 'Modal'      // 琛ㄥ崟椤甸潰
+        } else if (btn.OpenType === 'popview') {
+          _view = 'SubTable'   // 鏂板脊绐楁爣绛炬ā鏉� tabType 灞炴�у凡鍘婚櫎
+          _subtab = btn
+
+          if (editSubTab) {
+            notification.warning({
+              top: 92,
+              message: '寮圭獥(鏍囩)涓笉鏀寔姝ゆ寜閽墦寮�鏂瑰紡锛�',
+              duration: 5
+            })
+            return
+          }
+        }
+
+        if (editSubTab) {
+          editSubTab.activeKey = activeKey
+          editSubTab.open_edition = openEdition  // 鏇存柊鐗堟湰鍙�
+        } else {
+          editTab.activeKey = activeKey
+          editTab.open_edition = openEdition     // 鏇存柊鐗堟湰鍙�
+        }
+
+        let param = {
+          editMenu: menu,
+          editTab: editTab,
+          tabConfig: editSubTab ? tabConfig : originConfig,
+          editSubTab: _subtab,
+          subTabConfig: editSubTab ? originConfig : null,
+          btnTab: btnTab,
+          btnTabConfig: btnTabConfig,
+          editAction: btn,
+          subConfig: '',
+          tabview: _view
+        }
+
+        this.setState({
+          loading: true
+        })
+
+        Api.getSystemConfig({
+          func: 'sPC_Get_LongParam',
+          MenuID: btn.OpenType === 'popview' ? btn.linkTab : btn.uuid
+        }).then(res => {
+          if (res.status) {
+            this.setState({
+              loading: false
+            })
+            let _LongParam = ''
+            if (res.LongParam) {
+              try {
+                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+              } catch (e) {
+                console.warn('Parse Failure')
+                _LongParam = ''
+              }
+            }
+
+            if (_LongParam && param.tabview === 'Modal' && _LongParam.type === 'Modal') {
+              param.subConfig = _LongParam
+            } else if (_LongParam && param.tabview === 'SubTable' && _LongParam.Template === 'SubTable') {
+              param.subConfig = _LongParam
+            }
+
+            if (param.editAction) {
+              param.editAction.open_edition = res.open_edition || ''
+            } else if (param.editSubTab) {
+              param.editSubTab.open_edition = res.open_edition || ''
+            }
+
+            this.props.handleView(param)
+          } else {
+            this.setState({
+              loading: false
+            })
+            notification.warning({
+              top: 92,
+              message: res.message,
+              duration: 5
+            })
+          }
+        })
+      }
     }
   }
 
@@ -951,62 +748,77 @@
    * @description 鏍¢獙閰嶇疆淇℃伅鐨勫悎娉曟��
    */
   verifyconfig = (config) => {
-    let charterr = ''
-    config.charts.forEach(chart => {
-      if (!charterr && ['line', 'bar', 'pie'].includes(chart.chartType) && !chart.Xaxis) {
-        charterr = '鍥捐〃' + (chart.title ? '銆�' + chart.title + '銆�' : '') + '鍧愭爣杞存湭璁剧疆锛屼笉鍙惎鐢紒'
-      }
-    })
-
     let hasKey = false
+    let chartcols = []
     config.columns.forEach(col => {
+      if (col.field) {
+        chartcols.push(col.field)
+      }
       if (config.setting.primaryKey === col.field) {
         hasKey = true
       }
     })
 
-    if (config.setting.interType === 'inner' && !config.setting.innerFunc && config.setting.default !== 'false' && !config.setting.dataresource) {
-      return '鑿滃崟灏氭湭璁剧疆鏁版嵁婧愶紝涓嶅彲鍚敤锛�'
+    let chartError = ''
+    config.charts && config.charts.forEach((chart, index) => {
+      if (chartError) return
+      if (chart.Hide === 'true') return
+      if (!['line', 'bar', 'pie'].includes(chart.chartType)) return
+
+      if (!chart.Xaxis) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && (!chart.Yaxis || chart.Yaxis.length === 0)) { // query 鏌ヨ鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chart.InfoType || !chart.InfoValue)) { // statistics 缁熻鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (chart.chartType === 'pie' && !chart.Yaxis) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (!chartcols.includes(chart.Xaxis)) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (chart.chartType === 'pie' && !chartcols.includes(chart.Yaxis)) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chartcols.includes(chart.InfoType) || !chartcols.includes(chart.InfoValue))) { // statistics 缁熻鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && chart.Yaxis.filter(yaxis => !chartcols.includes(yaxis)).length > 0) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      }
+    })
+
+    if (config.setting.interType === 'system' && config.setting.default === 'false' && config.setting.scripts && config.setting.scripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愪腑涓嶆墽琛岄粯璁ql锛屼笖鏈坊鍔犺嚜瀹氫箟鑴氭湰锛屼笉鍙惎鐢紒'
+    } else if (config.setting.interType === 'custom' && config.setting.procMode !== 'inner' && config.setting.preScripts && config.setting.preScripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愭湭璁剧疆鍓嶇疆鑴氭湰锛屼笉鍙惎鐢紒'
+    } else if (config.setting.interType === 'custom' && config.setting.callbackType === 'script' && config.setting.cbScripts && config.setting.cbScripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愭湭璁剧疆鍥炶皟鑴氭湰锛屼笉鍙惎鐢紒'
     } else if (!config.setting.primaryKey) {
-      return '鑿滃崟灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒'
+      return '灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒'
+    }  else if (config.columns.length === 0) {
+      return '灏氭湭璁剧疆鏄剧ず鍒楋紝涓嶅彲鍚敤锛�'
     } else if (!hasKey) {
       return '鏄剧ず鍒椾腑涓嶅瓨鍦ㄤ富閿瓧娈碉紝涓嶅彲鍚敤锛�'
-    } else if (charterr) {
-      return charterr
+    } else if (chartError) {
+      return chartError
     } else {
       return true
     }
   }
 
   /**
-   * @description 缂栬緫鍔熻兘瀹屾垚鏇存柊锛屽寘鎷В鍐绘寜閽�佺矘璐淬�佹浛鎹㈢瓑
+   * @description 缂栬緫鍔熻兘瀹屾垚鏇存柊锛屽寘鎷В鍐绘寜閽瓑
    */
   updateConfig = (res) => {
-    if (res.type === 'thaw') {
-      this.setState({
-        thawButtons: res.thawButtons,
-        config: res.config
-      })
-    } else if (res.type === 'paste') {
-      this.setState({
-        pasteContent: res.content
-      }, () => {
-        this.setState({
-          pasteContent: null
-        })
-      })
-    }
+    this.setState({
+      config: res.config
+    })
   }
 
   /**
    * @description 鏇存柊鎼滅储鏉′欢閰嶇疆淇℃伅
    */
-  updatesearch = (config, options) => {
-    const { optionLibs } = this.state
+  updatesearch = (config) => {
 
     this.setState({
-      config: config,
-      optionLibs: options || optionLibs
+      config: config
     })
   }
 
@@ -1041,70 +853,100 @@
       chartview: _chartview
     })
   }
+
   
-  /**
-   * @description 鏇存柊甯哥敤琛ㄤ俊鎭紝蹇嵎娣诲姞鍚庢洿鏂伴厤缃俊鎭�
-   */
-  updatetable = (config, fields) => {
-    const { tableFields } = this.state
+  refreshConfig = () => {
+    const { config } = this.props
+    
+    let param = {
+      func: 'sPC_Get_LongParam',
+      MenuID: config.uuid
+    }
 
-    this.setState({
-      config: config,
-      tableFields: fields ? fields : tableFields
-    })
-  }
+    Api.getSystemConfig(param).then(res => {
+      if (res.status) {
+        let _config = ''
+        if (res.LongParam) {
+          try {
+            _config = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+          } catch (e) {
+            console.warn('Parse Failure')
+            _config = ''
+          }
+        }
 
-  /**
-   * @description 鎵归噺娣诲姞锛屾洿鏂伴厤缃俊鎭�
-   */
-  updatefield = (config) => {
-    this.setState({
-      config: config
+        if (!_config) {
+          notification.warning({
+            top: 92,
+            message: '鏈幏鍙栧埌閰嶇疆淇℃伅锛�',
+            duration: 5
+          })
+          return
+        }
+
+        // 鐗堟湰鍏煎
+        _config = updateSubTable(_config)
+
+        this.setState({
+          config: null
+        }, () => {
+          this.setState({
+            chartview: _config.charts ? _config.charts[0].uuid : '',
+            config: _config,
+            openEdition: res.open_edition || '',
+            activeKey: '0',
+            originActions: [],
+            originConfig: fromJS(_config).toJS()
+          })
+        })
+      } else {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+      }
     })
   }
 
   render () {
-    const { activeKey, config, chartview } = this.state
+    const { activeKey, config, chartview, openEdition } = this.state
 
-    const confActions = config.action.filter(_action => !_action.origin && ['pop', 'popview', 'blank', 'tab'].includes(_action.OpenType))
+    if (!config) return null
+
+    const confActions = config.action.filter(_action => !_action.origin && (['pop', 'popview'].includes(_action.OpenType) || (_action.OpenType === 'funcbutton' && _action.execMode === 'pop')))
 
     return (
       <div className="model-subtable-board">
         <DndProvider backend={HTML5Backend}>
           {/* 宸ュ叿鏍� */}
           <div className="tools">
-            <Collapse accordion defaultActiveKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
+            <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
               {/* 鍩烘湰淇℃伅 */}
               <Panel forceRender={true} header={'鏍囩鍩烘湰淇℃伅'} key="0" id="subtable-basedata">
                 {/* 鑿滃崟淇℃伅 */}
                 <MenuForm
-                  dict={this.state.dict}
-                  formlist={this.state.menuformlist}
-                  wrappedComponentRef={(inst) => this.menuformRef = inst}
+                  config={config}
+                  updatemenu={this.updateconfig}
                 />
                 {/* 琛ㄥ悕娣诲姞 */}
                 <TableComponent
                   config={config}
                   containerId="subtable-basedata"
-                  updatetable={this.updatetable}
+                  updatetable={this.updateconfig}
                 />
               </Panel>
               {/* 鎼滅储鏉′欢娣诲姞 */}
-              <Panel header={this.state.dict['header.menu.search']} key="1">
+              <Panel header="鎼滅储" key="1">
                 <div className="search-element">
                   {Source.searchItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
-                <FieldsComponent
-                  config={config}
-                  type="search"
-                  tableFields={this.state.tableFields}
-                  updatefield={this.updatefield}
-                />
+                <FieldsComponent config={config} type="search" />
               </Panel>
               {/* 鎸夐挳娣诲姞 */}
-              <Panel header={this.state.dict['header.menu.action']} key="2">
+              <Panel header="鎸夐挳" key="2">
                 <div className="search-element">
                   {Source.actionItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
@@ -1114,9 +956,9 @@
                   {confActions.length > 0 ?
                     <p className="config-btn-title">
                       <Tooltip placement="topLeft" title="鐐瑰嚮鎸夐挳锛屽彲瀹屾垚鎴栨煡鐪嬫寜閽厤缃俊鎭��">
-                        <Icon type="question-circle" />
+                        <QuestionCircleOutlined className="mk-form-tip" />
                       </Tooltip>
-                      {this.state.dict['header.menu.action.configurable']}
+                      鎸夐挳閰嶇疆
                     </p> : null
                   }
                 </div>
@@ -1134,18 +976,13 @@
                 })}
               </Panel>
               {/* 娣诲姞鏄剧ず鍒� */}
-              <Panel header={this.state.dict['header.menu.column']} key="3">
+              <Panel header="鏄剧ず鍒�" key="3">
                 <div className="search-element">
                   {Source.columnItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
-                <FieldsComponent
-                  config={config}
-                  type="columns"
-                  tableFields={this.state.tableFields}
-                  updatefield={this.updatefield}
-                />
+                <FieldsComponent config={config} type="columns" />
               </Panel>
             </Collapse>
           </div>
@@ -1153,40 +990,34 @@
             <Card title={
               <div>
                 鏍囩锛堝瓙琛級椤甸潰閰嶇疆 
-                <Icon type="redo" style={{marginLeft: '10px'}} title="鍒锋柊鏍囩鍒楄〃" onClick={() => this.reloadTab(true)} />
+                <RedoOutlined style={{marginLeft: '10px'}} title="鍒锋柊鏍囩鍒楄〃" onClick={() => this.reloadTab(true)} />
               </div>
             } bordered={false} extra={
               <div>
-                <EditComponent dict={this.state.dict} type="subtable" config={this.state.config} thawButtons={this.state.thawButtons} refresh={this.updateConfig}/>
-                <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={this.state.config.enabled} onChange={this.onEnabledChange} />
-                <Button type="primary" onClick={this.submitConfig} loading={this.state.menuloading}>{this.state.dict['header.save']}</Button>
-                <Button onClick={this.cancelConfig}>{this.state.dict['header.return']}</Button>
+                <Versions MenuId={config.uuid} open_edition={openEdition} updateConfig={this.refreshConfig}/>
+                {/* <ReplaceField type="table" config={config} updateConfig={this.updateconfig}/> */}
+                <EditComponent type="table" options={['search', 'form', 'action', 'columns']} config={config} refresh={this.updateConfig}/>
+                <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} />
+                <Button type="primary" id="save-config" onClick={this.submitConfig} loading={this.state.menuloading}>淇濆瓨</Button>
+                <Button onClick={this.cancelConfig}>杩斿洖</Button>
               </div>
             } style={{ width: '100%' }}>
               <SettingComponent
-                type="subtable"
                 config={config}
                 mainsearch={!this.props.editSubTab && this.props.editTab.mainsearch ? this.props.editTab.mainsearch : ''}
                 MenuID={config.uuid}
-                menuformRef={this.menuformRef}
-                permFuncField={this.props.permFuncField}
                 updatesetting={this.updateconfig}
               />
               <SearchComponent
-                menu={{MenuID: config.uuid, MenuName: config.tabName}}
                 config={config}
-                pasteContent={this.state.pasteContent}
-                sysRoles={this.props.sysRoles}
-                optionLibs={this.state.optionLibs}
                 updatesearch={this.updatesearch}
               />
-              <div className="chart-view" style={{position: 'relative'}}>
-                {/* 瑙嗗浘缁� 鏉冮檺 浼氬憳绛夌骇20+ */}
-                {this.props.memberLevel >= 20 ? <ChartGroupComponent
+              {config.charts ? <div className="chart-view" style={{position: 'relative'}}>
+                {/* 瑙嗗浘缁� 宸插純鐢� */}
+                <ChartGroupComponent
                   config={config}
-                  sysRoles={this.props.sysRoles}
                   updatechartgroup={this.updatechartgroup}
-                /> : null}
+                />
                 {config.charts.map(item => {
                   if (!config.expand && chartview !== item.uuid) return ''
 
@@ -1196,20 +1027,15 @@
                         {config.charts.length > 1 ? <p className="chart-title">{item.title}</p> : null}
                         <ActionComponent
                           type="subtable"
-                          menu={{MenuID: config.uuid, MenuName: config.tabName, MenuNo: config.tabNo}}
+                          menu={{MenuID: config.uuid, MenuName: config.tabName, MenuNo: config.tabNo, fstMenuList: this.props.menu.fstMenuList}}
                           config={config}
                           tabs={this.state.tabviews}
-                          menuformRef={this.menuformRef}
-                          pasteContent={this.state.pasteContent}
-                          usefulFields={this.props.permFuncField}
                           setSubConfig={this.setSubConfig}
                           updateaction={this.updateaction}
                         />
                         <ColumnComponent
                           config={config}
                           menu={this.props.menu}
-                          sysRoles={this.props.sysRoles}
-                          pasteContent={this.state.pasteContent}
                           updatecolumn={this.updateconfig}
                         />
                       </Col>
@@ -1236,7 +1062,21 @@
                     )
                   }
                 })}
-              </div>
+              </div> : <>
+                <ActionComponent
+                  type="subtable"
+                  menu={{MenuID: config.uuid, MenuName: config.tabName, MenuNo: config.tabNo, fstMenuList: this.props.menu.fstMenuList}}
+                  config={config}
+                  tabs={this.state.tabviews}
+                  setSubConfig={this.setSubConfig}
+                  updateaction={this.updateaction}
+                />
+                <ColumnComponent
+                  config={config}
+                  menu={this.props.menu}
+                  updatecolumn={this.updateconfig}
+                />
+              </>}
             </Card>
           </div>
         </DndProvider>
@@ -1247,13 +1087,13 @@
           visible={this.state.closeVisible}
           onCancel={() => { this.setState({closeVisible: false}) }}
           footer={[
-            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>{this.state.dict['header.save']}</Button>,
-            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>{this.state.dict['header.notsave']}</Button>,
-            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>{this.state.dict['header.cancel']}</Button>
+            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>淇濆瓨</Button>,
+            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>涓嶄繚瀛�</Button>,
+            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>鍙栨秷</Button>
           ]}
           destroyOnClose
         >
-          {this.state.dict['header.menu.config.placeholder']}
+          閰嶇疆宸蹭慨鏀癸紝鏄惁淇濆瓨閰嶇疆淇℃伅锛�
         </Modal>
         {this.state.loading && <Spin size="large" />}
       </div>
@@ -1261,16 +1101,4 @@
   }
 }
 
-const mapStateToProps = (state) => {
-  return {
-    sysRoles: state.sysRoles,
-    permFuncField: state.permFuncField,
-    memberLevel: state.memberLevel
-  }
-}
-
-const mapDispatchToProps = () => {
-  return {}
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(SubTableConfig)
+export default SubTableConfig

--
Gitblit v1.8.0