king
2023-07-13 d941738da5fae4e27488b09933e76cdce2c50fe9
2023-07-13
7个文件已修改
2个文件已添加
1550 ■■■■■ 已修改文件
src/menu/pastecontroller/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/mutilform/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/updatetable/index.jsx 49 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/treepageconfig/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/treepageconfig/updatetable/index.jsx 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils-custom.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basedesign/index.jsx 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basedesign/updateFormTab/index.jsx 1358 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basedesign/updateFormTab/index.scss 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/pastecontroller/index.jsx
@@ -21,7 +21,7 @@
  resetconfig = (item, appType) => {
    if (item.type === 'tabs') {
      item.uuid = MenuUtils.getuuid()
      item.setting.name = item.setting.name + MenuUtils.getSignName()
      item.setting.name = (item.setting.name || '') + MenuUtils.getSignName()
      item.name = item.setting.name
      item.subtabs.forEach(tab => {
@@ -38,7 +38,7 @@
      })
    } else if (item.type === 'group') {
      item.uuid = MenuUtils.getuuid()
      item.setting.name = item.setting.name + MenuUtils.getSignName()
      item.setting.name = (item.setting.name || '') + MenuUtils.getSignName()
      item.name = item.setting.name
      item.components = item.components.map(cell => {
@@ -67,6 +67,10 @@
    }
    this.pasteFormRef.handleConfirm().then(res => {
      if (res.copyType === 'basetable') {
        res.copyType = 'normaltable'
        res.subtype = 'normaltable'
      }
      if (!options.includes(res.copyType)) {
        notification.warning({
          top: 92,
src/tabviews/zshare/mutilform/index.jsx
@@ -89,6 +89,7 @@
        } else {
          supvals.push('')
        }
        supvals = Array.from(new Set(supvals))
        controlFields[item.supField] = controlFields[item.supField] || []
        controlFields[item.supField].push({field: item.field, values: supvals})
      }
src/templates/comtableconfig/updatetable/index.jsx
@@ -110,7 +110,11 @@
    let _tbs = []
    if (config.tabgroups && config.tabgroups.length > 0) {
      config.tabgroups.forEach(m => {
        if (!m.sublist || m.sublist.length === 0) return
        if (!m.sublist) return
        m.sublist = m.sublist.filter(c => !!c.linkTab)
        if (m.sublist.length === 0) return
        let tabs = {
          uuid: Utils.getuuid(),
@@ -119,7 +123,7 @@
          setting: {},
          style: {},
          subtabs: m.sublist.map(n => {
            let tab = { uuid: Utils.getuuid(), label: n.label, icon: n.icon, permission: 'false', components: [
            let tab = { uuid: Utils.getuuid(), label: n.label, icon: n.icon, permission: 'true', components: [
              {
                uuid: Utils.getuuid(),
                linkTab: n.linkTab,
@@ -187,11 +191,29 @@
          }
        })
        let supIds = []
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              tab.components[0] = this.getTable(menus[tab.components[0].linkTab], tab.components[0], errors, formActions, popActions, oldtabs)
              supIds.push([item.uuid, tab.uuid, tab.components[0].uuid])
              return tab
            })
          }
          return item
        })
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              if (tab.components[0].setting.supModule && tab.components[0].setting.supModule.length === 1) {
                supIds.forEach(ids => {
                  if (ids[2] === tab.components[0].setting.supModule[0]) {
                    tab.components[0].setting.supModule = ids
                  }
                })
              }
              return tab
            })
          }
@@ -790,7 +812,7 @@
      action: [],
      subtype: 'basetable',
      setting: { useMSearch: newCon.useMSearch },
      wrap: {},
      wrap: {name: newCon.name},
      style: {},
      headerStyle: {},
      columns: [],
@@ -819,7 +841,11 @@
    let lineMarks = []
    config.columns.forEach(col => {
      if (col.type === 'colspan') {
        _colspan.push(...col.subfield.split(', '))
        if (col.subfield) {
          _colspan.push(...col.subfield.split(', '))
        } else if (col.sublist && col.sublist.length > 0) {
          _colspan.push(...col.sublist)
        }
      }
      if (!col.field) return
@@ -890,7 +916,7 @@
        if (_colspan.includes(col.field)) {
          _col.Hide = 'true'
        }
        _col.uuid = Utils.getuuid()
        _card.cols.push(_col)
      }
@@ -901,14 +927,21 @@
          label: col.label,
          marks: [],
          isSub: false,
          uuid: col.uuid,
          uuid: Utils.getuuid(),
          blacklist: []
        }
        let _subs = []
        if (col.subfield) {
          _subs = col.subfield.split(', ')
        } else if (col.sublist) {
          _subs = col.sublist
        }
        if (col.unfold === 'true') {
          ucol.type = 'colspan'
          ucol.subcols = []
          col.subfield.split(', ').forEach(sub => {
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = fromJS(_cols[sub]).toJS()
              _col.Hide = 'false'
@@ -928,7 +961,7 @@
          ucol.elements = []
          ucol.style = {paddingTop: '12px', paddingLeft: '8px', paddingBottom: '12px', paddingRight: '8px'}
          col.subfield.split(', ').forEach(sub => {
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = {
                copyable: 'false',
src/templates/treepageconfig/index.jsx
@@ -73,7 +73,7 @@
    _config.MenuID = menu.MenuID || ''
    // 配置默认值,兼容
    _config.Template = 'TreePage'
    // _config.Template = 'TreePage'
    _config.easyCode = _config.easyCode || ''
    
    if (_config.type === 'user') {
src/templates/treepageconfig/updatetable/index.jsx
@@ -149,7 +149,11 @@
    let _tbs = []
    if (config.tabgroups && config.tabgroups.length > 0) {
      config.tabgroups.forEach((m, i) => {
        if (!m.sublist || m.sublist.length === 0) return
        if (!m.sublist) return
        m.sublist = m.sublist.filter(c => !!c.linkTab)
        if (m.sublist.length === 0) return
        let tabs = {
          uuid: Utils.getuuid(),
@@ -179,7 +183,7 @@
              }
            }
            let tab = { uuid: Utils.getuuid(), controlVal: level, label: n.label, icon: n.icon, permission: 'false', components: [
            let tab = { uuid: Utils.getuuid(), controlVal: level, label: n.label, icon: n.icon, permission: 'true', components: [
              {
                uuid: Utils.getuuid(),
                linkTab: n.linkTab,
@@ -247,11 +251,28 @@
          }
        })
        let supIds = []
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              tab.components[0] = this.getTable(menus[tab.components[0].linkTab], tab.components[0], errors, formActions, popActions, oldtabs)
              supIds.push([item.uuid, tab.uuid, tab.components[0].uuid])
              return tab
            })
          }
          return item
        })
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              if (tab.components[0].setting.supModule && tab.components[0].setting.supModule.length === 1) {
                supIds.forEach(ids => {
                  if (ids[2] === tab.components[0].setting.supModule[0]) {
                    tab.components[0].setting.supModule = ids
                  }
                })
              }
              return tab
            })
          }
@@ -833,7 +854,7 @@
      action: [],
      subtype: 'normaltable',
      setting: { useMSearch: 'false', sync: 'false', onload: 'true' },
      wrap: {},
      wrap: {name: newCon.name},
      style: {},
      headerStyle: {},
      columns: [],
@@ -862,7 +883,11 @@
    let lineMarks = []
    config.columns.forEach(col => {
      if (col.type === 'colspan') {
        _colspan.push(...col.subfield.split(', '))
        if (col.subfield) {
          _colspan.push(...col.subfield.split(', '))
        } else if (col.sublist && col.sublist.length > 0) {
          _colspan.push(...col.sublist)
        }
      }
      if (!col.field) return
@@ -933,7 +958,7 @@
        if (_colspan.includes(col.field)) {
          _col.Hide = 'true'
        }
        _col.uuid = Utils.getuuid()
        _card.cols.push(_col)
      }
@@ -944,14 +969,20 @@
          label: col.label,
          marks: [],
          isSub: false,
          uuid: col.uuid,
          uuid: Utils.getuuid(),
          blacklist: []
        }
        let _subs = []
        if (col.subfield) {
          _subs = col.subfield.split(', ')
        } else if (col.sublist) {
          _subs = col.sublist
        }
        if (col.unfold === 'true') {
          ucol.type = 'colspan'
          ucol.subcols = []
          col.subfield.split(', ').forEach(sub => {
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = fromJS(_cols[sub]).toJS()
              _col.Hide = 'false'
@@ -971,7 +1002,7 @@
          ucol.elements = []
          ucol.style = {paddingTop: '12px', paddingLeft: '8px', paddingBottom: '12px', paddingRight: '8px'}
          col.subfield.split(', ').forEach(sub => {
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = {
                copyable: 'false',
src/utils/utils-custom.js
@@ -702,13 +702,13 @@
    // 重置组件名称
    let sign = this.getSignName()
    if (item.plot) { // 图表
      item.plot.name = item.plot.name + sign
      item.plot.name = (item.plot.name || '') + sign
      item.name = item.plot.name
    } else if (item.wrap) { // 通用
      item.wrap.name = item.wrap.name + sign
      item.wrap.name = (item.wrap.name || '') + sign
      item.name = item.wrap.name
    } else if (item.setting) { // 分组、标签页等
      item.setting.name = item.setting.name + sign
      item.setting.name = (item.setting.name || '') + sign
      item.name = item.setting.name
    }
src/views/basedesign/index.jsx
@@ -16,6 +16,7 @@
const TreePageConfig = asyncLoadComponent(() => import('@/templates/treepageconfig'))
const ModalConfig = asyncLoadComponent(() => import('@/templates/modalconfig'))
const SubTable = asyncLoadComponent(() => import('@/templates/subtableconfig'))
const UpdateFormTab = asyncLoadComponent(() => import('./updateFormTab'))
document.body.className = ''
sessionStorage.setItem('isEditState', 'true')
@@ -186,49 +187,57 @@
  }
  render () {
    const { loading } = this.state
    const { loading, editMenu, subConfig, btnTab } = this.state
    return (
      <div className="mk-base-design-wrap">
        <ConfigProvider locale={_locale}>
          <Header/>
          {this.state.tabview === 'TreePage' ?
            <TreePageConfig
              menu={this.state.editMenu}
              reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'CommonTable' ?
            <ComTableConfig
              menu={this.state.editMenu}
              menu={editMenu}
              reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'Modal' ?
            <ModalConfig
              menu={this.state.editMenu}
              editTab={this.state.editTab}
              tabConfig={this.state.tabConfig}
              editSubTab={this.state.editSubTab}
              subTabConfig={this.state.subTabConfig}
              btnTab={this.state.btnTab}
              btnTabConfig={this.state.btnTabConfig}
              editAction={this.state.editAction}
              subConfig={this.state.subConfig}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'SubTable' ?
            <SubTable
              menu={this.state.editMenu}
              menu={editMenu}
              editTab={this.state.editTab}
              editSubTab={this.state.editSubTab}
              tabConfig={this.state.tabConfig}
              btnTab={this.state.btnTab}
              btnTab={btnTab}
              btnTabConfig={this.state.btnTabConfig}
              config={this.state.subConfig}
              config={subConfig}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'Modal' ?
            <ModalConfig
              menu={editMenu}
              editTab={this.state.editTab}
              tabConfig={this.state.tabConfig}
              editSubTab={this.state.editSubTab}
              subTabConfig={this.state.subTabConfig}
              btnTab={btnTab}
              btnTabConfig={this.state.btnTabConfig}
              editAction={this.state.editAction}
              subConfig={subConfig}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'TreePage' ?
            <TreePageConfig
              menu={editMenu}
              reloadmenu={() => {localStorage.setItem('menuUpdate', new Date().getTime())}}
              handleView={this.handleView}
            /> : null
          }
          {this.state.tabview === 'FormTab' ?
            <UpdateFormTab
              menu={editMenu}
              btnTab={btnTab}
              config={subConfig}
              handleView={this.handleView}
            /> : null
          }
src/views/basedesign/updateFormTab/index.jsx
New file
@@ -0,0 +1,1358 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Modal, Button, notification } from 'antd'
import moment from 'moment'
import md5 from 'md5'
import { colorTransform } from '@/utils/option.js'
import { getTables } from '@/utils/utils-custom.js'
import Api from '@/api'
import Utils from '@/utils/utils.js'
import './index.scss'
const { confirm } = Modal
class UpdateTable extends Component {
  static propTpyes = {
    config: PropTypes.object
  }
  state = {}
  delButtons = []
  baseMsg = {}
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  trigger = () => {
    const { config, menu, btnTab } = this.props
    const _this = this
    if (!config || !menu || !menu.LongParam) {
      notification.warning({
        top: 92,
        message: '未获取到菜单配置!',
        duration: 5
      })
      return
    }
    let _config = fromJS(config).toJS()
    if (menu.LongParam.setting) {
      _config.setting.primaryKey = menu.LongParam.setting.primaryKey
    }
    if (!_config.tabgroups) {
      _config.tabgroups = [{ uuid: 'tabs', sublist: [] }]
    } else if (typeof(_config.tabgroups[0]) === 'string') {
      let _tabgroups = []
      _config.tabgroups.forEach(groupId => {
        let _group = {
          uuid: groupId,
          sublist: fromJS(_config[groupId]).toJS()
        }
        delete _config[groupId]
        _tabgroups.push(_group)
      })
      _config.tabgroups = _tabgroups
    }
    _config.action = _config.action.map(item => {
      if (item.intertype === 'inner' && !item.innerFunc) {
        item.intertype = 'system'
      }
      return item
    })
    _config.btnId = btnTab.uuid
    _config.btnName = btnTab.label
    confirm({
      title: '确定升级当前菜单吗?',
      content: '',
      onOk() {
        return new Promise(resolve => {
          _this.execUpdate(resolve, _config)
        })
      },
      onCancel() {}
    })
  }
  execUpdate = (_resolve, config) => {
    const { menu } = this.props
    this.delButtons = []
    this.baseMsg = {
      fstMenuId: config.fstMenuId,
      parentId: config.ParentId,
      MenuName: config.MenuName,
      MenuNo: config.MenuNo,
    }
    let MenuID = md5(menu.MenuID + config.btnId)
    let _config = {
      version: 1.0,
      uuid: MenuID,
      MenuID: MenuID,
      fstMenuId: menu.fstMenuId,
      parentId: menu.ParentId,
      Template: 'CustomPage',
      easyCode: '',
      enabled: false,
      MenuName: menu.MenuName + '-' + config.btnName,
      MenuNo: menu.MenuNo + '_' + MenuID.substr(-4),
      OpenType: 'newtab',
      tables: config.tables || [],
      urlFields: [],
      hidden: 'true',
      Remark: '',
      components: [],
      viewType: 'menu',
      style: { backgroundColor: '#ffffff', paddingTop: '16px', paddingBottom: '80px', paddingLeft: '16px', paddingRight: '16px'},
    }
    let formActions = []
    let popActions = []
    let errors = []
    let mainF = {
      uuid: Utils.getuuid(),
      type: 'form',
      format: 'object',   // 组件属性 - 数据格式
      pageable: false,    // 组件属性 - 是否可分页
      switchable: false,  // 组件属性 - 数据是否可切换
      width: 24,
      name: '主表单',
      subtype: 'simpleform',
      setting: { interType: 'system' },
      wrap: { name: '主表单', width: 24, datatype: 'static', enable: 'true', closeEnable: 'true' },
      style: { marginLeft: '0px', marginRight: '0px', marginTop: '8px', marginBottom: '8px' },
      headerStyle: { fontSize: '16px', borderBottomWidth: '1px', borderBottomColor: '#e8e8e8' },
      columns: [],
      scripts: [],
      subcards: []
    }
    let card = {
      uuid: Utils.getuuid(),
      setting: {title: '', align: 'left_right', enable: 'true'},
      style: {},
      fields: [],
      subButton: {label: '确定', type: 'submit', reload: 'false', sql: '', Ot: 'notRequired', enable: 'true', style: {backgroundColor: 'rgba(255, 255, 255, 1)', color: 'rgba(24, 144, 255, 1)', paddingLeft: '20px', paddingRight: '20px', paddingTop: '5px', paddingBottom: '5px', borderColor: 'rgba(24, 144, 255, 1)', borderWidth: '1px'}},
      closeButton: {label: '关闭', type: 'close', enable: 'true', style: { color: 'rgba(245, 34, 45, 1)', paddingTop: '5px', paddingRight: '20px', marginLeft: '20px', backgroundColor: '#ffffff', borderColor: 'rgba(245, 34, 45, 1)', paddingLeft: '20px', borderWidth: '1px', paddingBottom: '5px'}},
    }
    let btn = config.action[0]
    card.subButton.intertype = btn.intertype
    card.subButton.innerFunc = btn.innerFunc || ''
    card.subButton.execSuccess = btn.execSuccess || 'never'
    card.subButton.execError = btn.execError || 'never'
    if (btn.intertype === 'outer') {
      card.subButton.procMode = btn.innerFunc ? 'inner' : 'none'
      card.subButton.sysInterface = btn.sysInterface || 'false'
      card.subButton.interface = btn.interface || ''
      card.subButton.outerFunc = btn.outerFunc || ''
      card.subButton.callbackFunc = btn.callbackFunc || ''
      card.subButton.callbackType = btn.callbackFunc ? 'func' : 'none'
    } else if (btn.intertype === 'system') {
      card.subButton.sqlType = btn.sqlType || ''
      card.subButton.sql = btn.sql || ''
      card.subButton.verify = btn.verify || null
    }
    if (config.setting.datatype === 'query') {
      mainF.wrap.datatype = 'dynamic'
      mainF.setting = {
        interType: config.setting.interType || 'system',
        innerFunc: config.setting.innerFunc || '',
        outerFunc: config.setting.outerFunc || '',
        interface: config.setting.interface || '',
        dataresource: config.setting.dataresource || '',
        sysInterface: config.setting.sysInterface || 'false',
        order: '',
        primaryKey: config.setting.primaryKey || 'ID',
        tableName: menu.LongParam.setting.tableName || '',
        supModule: ['empty'],
        sync: 'false',
        onload: 'true'
      }
      if (mainF.setting.interType === 'inner' && !mainF.setting.innerFunc) {
        mainF.setting.interType = 'system'
      }
      card.subButton.Ot = 'requiredSgl'
    }
    config.groups.forEach(group => {
      if (!group.isDefault) {
        card.fields.push({
          uuid: Utils.getuuid(),
          label: group.label,
          span: 24,
          type: 'split'
        })
      }
      group.sublist.forEach(item => {
        item.labelwidth = 33.3
        item.span = 12
        if (item.type === 'textarea' && config.setting.cols === '2') {
          item.labelwidth = 16.2
          item.span = 24
        }
        card.fields.push(item)
      })
    })
    let _ids = []
    card.fields.forEach(item => {
      if (item.field) {
        _ids.push(item.field.toLowerCase())
        if (item.type === 'number') {
          mainF.columns.push({
            datatype: `decimal(18,${item.decimal === 0 ? 0 : (item.decimal || 2)})`,
            field: item.field,
            decimal: item.decimal || 0,
            label: item.label,
            type: 'number',
            uuid: Utils.getuuid()
          })
        } else {
          mainF.columns.push({
            datatype: `Nvarchar(${item.fieldlength || 50})`,
            field: item.field,
            fieldlength: 50,
            label: item.label,
            type: 'text',
            uuid: Utils.getuuid()
          })
        }
      }
    })
    mainF.subcards.push(card)
    let oldtabs = {
      mainTable: mainF.uuid
    }
    if (mainF.wrap.datatype === 'dynamic') {
      let primaryKey = mainF.setting.primaryKey.toLowerCase()
      if (!_ids.includes(primaryKey)) {
        mainF.columns.push({
          datatype: `Nvarchar(50)`,
          field: mainF.setting.primaryKey,
          fieldlength: 50,
          label: mainF.setting.primaryKey,
          type: 'text',
          uuid: Utils.getuuid()
        })
      }
    } else {
      oldtabs.mainTable = 'empty'
    }
    _config.components.push(mainF)
    let _tbs = []
    if (config.tabgroups && config.tabgroups.length > 0) {
      config.tabgroups.forEach((m, i) => {
        if (!m.sublist) return
        m.sublist = m.sublist.filter(c => !!c.linkTab)
        if (m.sublist.length === 0) return
        let tabs = {
          uuid: Utils.getuuid(),
          type: 'tabs',
          subtype: 'tabs',
          name: '标签组' + (i + 1),
          width: 24,
          setting: {name: '标签组' + (i + 1), width: 24, position: 'top'},
          style: {},
          subtabs: m.sublist.map(n => {
            let tab = { uuid: Utils.getuuid(), label: n.label, icon: n.icon, permission: 'false', components: [
              {
                uuid: Utils.getuuid(),
                linkTab: n.linkTab,
                name: n.label,
                useMSearch: 'false',
                supModule: n.supMenu || '',
                equalTab: n.equalTab && n.equalTab.length > 0 ? n.equalTab[0] : ''
              }
            ]}
            this.delButtons.push(n.linkTab)
            oldtabs[n.uuid] = tab.components[0].uuid
            _tbs.push(tab.components[0])
            return tab
          })
        }
        _config.components.push(tabs)
      })
    }
    if (_tbs.length > 0) {
      let defers = _tbs.map((item, i) => {
        return new Promise((resolve) => {
          setTimeout(() => {
            Api.getSystemConfig({
              func: 'sPC_Get_LongParam',
              MenuID: item.linkTab
            }).then(res => {
              if (res.status) {
                let _LongParam = ''
                if (res.LongParam) {
                  try {
                    _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
                  } catch (e) {
                    console.warn('Parse Failure')
                    _LongParam = ''
                  }
                }
                if (_LongParam) {
                  _LongParam.uuid = item.linkTab
                  resolve(_LongParam)
                } else {
                  resolve({uuid: item.linkTab, $empty: true})
                }
              } else {
                notification.warning({
                  top: 92,
                  message: res.message,
                  duration: 5
                })
                resolve({uuid: item.linkTab, $empty: true})
              }
            })
          }, i * 50)
        })
      })
      Promise.all(defers).then(res => {
        let menus = {}
        res.forEach(item => {
          if (item && !item.$empty) {
            menus[item.uuid] = item
          }
        })
        let supIds = []
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              tab.components[0] = this.getTable(menus[tab.components[0].linkTab], tab.components[0], errors, formActions, popActions, oldtabs)
              supIds.push([item.uuid, tab.uuid, tab.components[0].uuid])
              return tab
            })
          }
          return item
        })
        _config.components = _config.components.map(item => {
          if (item.type === 'tabs') {
            item.subtabs = item.subtabs.map(tab => {
              if (tab.components[0].setting.supModule && tab.components[0].setting.supModule.length === 1) {
                supIds.forEach(ids => {
                  if (ids[2] === tab.components[0].setting.supModule[0]) {
                    tab.components[0].setting.supModule = ids
                  }
                })
              }
              return tab
            })
          }
          return item
        })
        this.setPopView(_resolve, _config, formActions, popActions, errors)
      })
    } else {
      this.setPopView(_resolve, _config, formActions, popActions, errors)
    }
  }
  setPopView = (_resolve, _config, formActions, popActions, errors) => {
    if (popActions.length > 0) {
      let defers = popActions.map((item, i) => {
        return new Promise((resolve) => {
          setTimeout(() => {
            Api.getSystemConfig({
              func: 'sPC_Get_LongParam',
              MenuID: item.linkTab
            }).then(res => {
              if (res.status) {
                let _LongParam = ''
                if (res.LongParam) {
                  try {
                    _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
                  } catch (e) {
                    console.warn('Parse Failure')
                    _LongParam = ''
                  }
                }
                if (_LongParam) {
                  _LongParam.uuid = item.uuid
                  resolve(_LongParam)
                } else {
                  resolve({uuid: item.uuid, $empty: true})
                }
              } else {
                notification.warning({
                  top: 92,
                  message: res.message,
                  duration: 5
                })
                resolve({uuid: item.uuid, $empty: true})
              }
            })
          }, i * 50)
        })
      })
      Promise.all(defers).then(res => {
        let menus = {}
        res.forEach(item => {
          if (item && !item.$empty) {
            menus[item.uuid] = item
          }
        })
        _config.components.forEach(item => {
          if (item.type === 'tabs') {
            item.subtabs.forEach(tab => {
              tab.components[0].action.forEach(btn => {
                if (btn.OpenType === 'popview') {
                  if (menus[btn.uuid]) {
                    let mainTb = {name: '主表', uuid: Utils.getuuid(), useMSearch: 'false'}
                    btn.config = {
                      uuid: btn.uuid,
                      MenuID: btn.uuid,
                      ParentId: tab.components[0].uuid,
                      MenuName: btn.label,
                      tables: _config.tables || [],
                      Template: 'CustomPage',
                      components: [this.getTable(menus[btn.uuid], mainTb, errors, formActions)],
                      viewType: 'popview',
                      style: { backgroundColor: '#ffffff', backgroundImage: '', paddingTop: '16px', paddingBottom: '40px', paddingLeft: '16px', paddingRight: '16px' }
                    }
                    btn.config.enabled = this.setEnabled(btn.config)
                  } else {
                    errors.push(tab.label + '中按钮《' + btn.label + '》配置信息丢失')
                  }
                }
              })
              tab.components[0].cols.forEach(col => {
                if (col.type !== 'custom') return
                col.elements.forEach(btn => {
                  if (btn.eleType !== 'button') return
                  if (btn.OpenType === 'popview') {
                    if (menus[btn.uuid]) {
                      let mainTb = {name: '主表', uuid: Utils.getuuid(), useMSearch: 'false'}
                      btn.config = {
                        uuid: btn.uuid,
                        MenuID: btn.uuid,
                        ParentId: tab.components[0].uuid,
                        MenuName: btn.label,
                        tables: _config.tables || [],
                        Template: 'CustomPage',
                        components: [this.getTable(menus[btn.uuid], mainTb, errors, formActions)],
                        viewType: 'popview',
                        style: { backgroundColor: '#ffffff', backgroundImage: '', paddingTop: '16px', paddingBottom: '40px', paddingLeft: '16px', paddingRight: '16px' }
                      }
                      btn.config.enabled = this.setEnabled(btn.config)
                    } else {
                      errors.push(tab.label + '中按钮《' + btn.label + '》配置信息丢失')
                    }
                  }
                })
              })
            })
          } else if (item.type !== 'form') {
            item.action.forEach(btn => {
              if (btn.OpenType === 'popview') {
                if (menus[btn.uuid]) {
                  let mainTb = {name: '主表', uuid: Utils.getuuid(), useMSearch: 'false'}
                  btn.config = {
                    uuid: btn.uuid,
                    MenuID: btn.uuid,
                    ParentId: item.uuid,
                    MenuName: btn.label,
                    tables: _config.tables || [],
                    Template: 'CustomPage',
                    components: [this.getTable(menus[btn.uuid], mainTb, errors, formActions)],
                    viewType: 'popview',
                    style: { backgroundColor: '#ffffff', backgroundImage: '', paddingTop: '16px', paddingBottom: '40px', paddingLeft: '16px', paddingRight: '16px' }
                  }
                  btn.config.enabled = this.setEnabled(btn.config)
                } else {
                  errors.push('主表中按钮《' + btn.label + '》配置信息丢失')
                }
              }
            })
            item.cols.forEach(col => {
              if (col.type !== 'custom') return
              col.elements.forEach(btn => {
                if (btn.eleType !== 'button') return
                if (btn.OpenType === 'popview') {
                  if (menus[btn.uuid]) {
                    let mainTb = {name: '主表', uuid: Utils.getuuid(), useMSearch: 'false'}
                    btn.config = {
                      uuid: btn.uuid,
                      MenuID: btn.uuid,
                      ParentId: item.uuid,
                      MenuName: btn.label,
                      tables: _config.tables || [],
                      Template: 'CustomPage',
                      components: [this.getTable(menus[btn.uuid], mainTb, errors, formActions)],
                      viewType: 'popview',
                      style: { backgroundColor: '#ffffff', backgroundImage: '', paddingTop: '16px', paddingBottom: '40px', paddingLeft: '16px', paddingRight: '16px' }
                    }
                    btn.config.enabled = this.setEnabled(btn.config)
                  } else {
                    errors.push('主表中按钮《' + btn.label + '》配置信息丢失')
                  }
                }
              })
            })
          }
        })
        this.setPopForm(_resolve, _config, formActions, errors)
      })
    } else {
      this.setPopForm(_resolve, _config, formActions, errors)
    }
  }
  setEnabled = (config) => {
    let enabled = true
    config.components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          if (tab.components[0].errors.length > 0) {
            enabled = false
          }
        })
      } else {
        if (item.errors.length > 0) {
          enabled = false
        }
      }
    })
    return enabled
  }
  setPopForm = (_resolve, _config, formActions, errors) => {
    if (formActions.length > 0) {
      let defers = formActions.map((item, i) => {
        return new Promise((resolve) => {
          setTimeout(() => {
            Api.getSystemConfig({
              func: 'sPC_Get_LongParam',
              MenuID: item.origin
            }).then(res => {
              if (res.status) {
                let _LongParam = ''
                if (res.LongParam) {
                  try {
                    _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
                  } catch (e) {
                    console.warn('Parse Failure')
                    _LongParam = ''
                  }
                }
                if (_LongParam) {
                  _LongParam.uuid = item.uuid
                  resolve(_LongParam)
                } else {
                  resolve({uuid: item.uuid, $empty: true})
                }
              } else {
                notification.warning({
                  top: 92,
                  message: res.message,
                  duration: 5
                })
                resolve({uuid: item.uuid, $empty: true})
              }
            })
          }, i * 50)
        })
      })
      Promise.all(defers).then(res => {
        let menus = {}
        res.forEach(item => {
          if (item && !item.$empty) {
            menus[item.uuid] = item
          }
        })
        _config.components.forEach(item => {
          if (item.type === 'tabs') {
            item.subtabs.forEach(tab => {
              tab.components[0].action.forEach(btn => {
                if (btn.OpenType === 'popview' && btn.config && btn.config.components[0]) {
                  this.setTbForm(btn.config.components[0], menus, errors, tab.components[0].name + '-' + btn.label)
                } else if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
                  if (menus[btn.uuid]) {
                    btn.modal = {
                      setting: menus[btn.uuid].setting,
                      tables: [],
                      groups: [],
                      fields: menus[btn.uuid].fields || []
                    }
                  } else {
                    errors.push(tab.label + '中按钮《' + btn.label + '》配置信息丢失')
                  }
                }
              })
              tab.components[0].cols.forEach(col => {
                if (col.type !== 'custom') return
                col.elements.forEach(btn => {
                  if (btn.eleType !== 'button') return
                  if (btn.OpenType === 'popview' && btn.config && btn.config.components[0]) {
                    this.setTbForm(btn.config.components[0], menus, errors, tab.components[0].name + '-' + btn.label)
                  } else if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
                    if (menus[btn.uuid]) {
                      btn.modal = {
                        setting: menus[btn.uuid].setting,
                        tables: [],
                        groups: [],
                        fields: menus[btn.uuid].fields || []
                      }
                    } else {
                      errors.push(tab.label + '中按钮《' + btn.label + '》配置信息丢失')
                    }
                  }
                })
              })
            })
          } else if (item.type !== 'form') {
            item.action.forEach(btn => {
              if (btn.OpenType === 'popview' && btn.config && btn.config.components[0]) {
                this.setTbForm(btn.config.components[0], menus, errors, item.name + '-' + btn.label)
              } else if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
                if (menus[btn.uuid]) {
                  btn.modal = {
                    setting: menus[btn.uuid].setting,
                    tables: [],
                    groups: [],
                    fields: menus[btn.uuid].fields || []
                  }
                } else {
                  errors.push('主表中按钮《' + btn.label + '》配置信息丢失')
                }
              }
            })
            item.cols.forEach(col => {
              if (col.type !== 'custom') return
              col.elements.forEach(btn => {
                if (btn.eleType !== 'button') return
                if (btn.OpenType === 'popview' && btn.config && btn.config.components[0]) {
                  this.setTbForm(btn.config.components[0], menus, errors, item.name + '-' + btn.label)
                } else if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
                  if (menus[btn.uuid]) {
                    btn.modal = {
                      setting: menus[btn.uuid].setting,
                      tables: [],
                      groups: [],
                      fields: menus[btn.uuid].fields || []
                    }
                  } else {
                    errors.push('主表中按钮《' + btn.label + '》配置信息丢失')
                  }
                }
              })
            })
          }
        })
        this.saveConfig(_resolve, _config, errors)
      })
    } else {
      this.saveConfig(_resolve, _config, errors)
    }
  }
  setTbForm = (item, menus, errors, name) => {
    item.action.forEach(btn => {
      if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
        if (menus[btn.uuid]) {
          btn.modal = {
            setting: menus[btn.uuid].setting,
            tables: [],
            groups: [],
            fields: menus[btn.uuid].fields || []
          }
        } else {
          errors.push(name + '中按钮《' + btn.label + '》配置信息丢失')
        }
      }
    })
    item.cols.forEach(col => {
      if (col.type !== 'custom') return
      col.elements.forEach(btn => {
        if (btn.eleType !== 'button') return
        if (btn.OpenType === 'pop' || (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop')) {
          if (menus[btn.uuid]) {
            btn.modal = {
              setting: menus[btn.uuid].setting,
              tables: [],
              groups: [],
              fields: menus[btn.uuid].fields || []
            }
          } else {
            errors.push(name + '中按钮《' + btn.label + '》配置信息丢失')
          }
        }
      })
    })
  }
  saveConfig = (_resolve, _config, errors) => {
    let err = errors.join(';')
    if (err) {
      notification.warning({
        top: 92,
        message: err,
        duration: 5
      })
    }
    this.saveNewMenu(_resolve, _config)
  }
  saveNewMenu = (_resolve, _config) => {
    _config.components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          tab.components[0].action.forEach(btn => {
            if (btn.OpenType === 'popview' && btn.config) {
              btn.config.$tables = getTables(btn.config.components[0])
            }
          })
          tab.components[0].cols.forEach(col => {
            if (col.type !== 'custom') return
            col.elements.forEach(btn => {
              if (btn.eleType !== 'button') return
              if (btn.OpenType === 'popview' && btn.config) {
                btn.config.$tables = getTables(btn.config.components[0])
              }
            })
          })
          tab.components[0].$tables = getTables(tab.components[0])
        })
      } else {
        item.$tables = getTables(item)
      }
    })
    this.submitConfig(_resolve, _config)
  }
  checkBtns = (card) => {
    card.action.forEach(cell => {
      if (cell.hidden === 'true') return
      if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
        if (!cell.modal || cell.modal.fields.length === 0) {
          card.errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
        }
      } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
        card.errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
      } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
        card.errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
      }
    })
    card.cols.forEach(col => {
      if (col.type !== 'custom') return
      col.elements.forEach(cell => {
        if (cell.hidden === 'true' || cell.eleType !== 'button') return
        if (cell.OpenType === 'pop' || (cell.OpenType === 'funcbutton' && cell.execMode === 'pop')) {
          if (!cell.modal || cell.modal.fields.length === 0) {
            card.errors.push({ level: 0, detail: `按钮“${cell.label}”中表单尚未添加`})
          }
        } else if (cell.OpenType === 'excelIn' && (!cell.verify || !cell.verify.sheet || !cell.verify.columns || cell.verify.columns.length === 0)) {
          card.errors.push({ level: 0, detail: `按钮“${cell.label}”中导入列未设置!`})
        } else if (cell.OpenType === 'excelOut' && (!cell.verify || !cell.verify.columns || cell.verify.columns.length === 0)) {
          card.errors.push({ level: 0, detail: `按钮“${cell.label}”中导出列未设置!`})
        }
      })
    })
  }
  submitConfig = (_resolve, config) => {
    let tbs = []
    config.components.forEach(item => {
      if (item.type === 'tabs') {
        item.subtabs.forEach(tab => {
          if (tab.components[0].$tables) {
            tbs.push(...tab.components[0].$tables)
          }
          this.checkBtns(tab.components[0])
        })
      } else {
        if (item.$tables) {
          tbs.push(...item.$tables)
        }
      }
    })
    let arr = []
    tbs = tbs.filter(tb => {
      let _tb = tb.toLowerCase()
      if (arr.includes(_tb)) return false
      arr.push(_tb)
      return true
    })
    tbs.sort()
    if (tbs.length && sessionStorage.getItem('mk_tb_names')) {
      let names = sessionStorage.getItem('mk_tb_names')
      tbs = tbs.filter(tb => names.indexOf(',' + tb.toLowerCase() + ',') > -1)
    }
    tbs = tbs.map(tb => `'${tb}'`).join(';')
    let key = md5(config.uuid + tbs.toLowerCase())
    let urlparam = {
      FstId: config.fstMenuId,
      ParentId: config.parentId,
      MenuID: config.uuid,
      MenuName: config.MenuName,
      MenuNo: config.MenuNo,
      EasyCode: config.easyCode,
      type: 'admin',
      OpenType: config.OpenType,
      PageParam: {Template: 'CustomPage', OpenType: 'newtab', hidden: config.hidden},
      MenuType: 'custom'
    }
    let url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
    config.tbkey = key
    let param = {
      func: 'sPC_TrdMenu_AddUpt',
      FstID: config.fstMenuId || '',
      SndID: config.parentId,
      ParentID: config.parentId,
      MenuID: config.uuid,
      MenuNo: config.MenuNo || '',
      EasyCode: config.easyCode || '',
      Template: 'CustomPage',
      MenuName: config.MenuName || '',
      PageParam: JSON.stringify({Template: 'CustomPage', OpenType: config.OpenType, hidden: config.hidden}),
      open_edition: '',
      debug_md5: key,
      debug_url: url,
      debug_list: window.btoa(tbs),
      LongParam: window.btoa(window.encodeURIComponent(JSON.stringify(config)))
    }
    param.LText = Utils.formatOptions(param.LText)
    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
    Api.getSystemConfig(param).then(res => {
      _resolve()
      if (res.status) {
        // if (this.delButtons.length > 0) {
        //   Api.getSystemConfig({
        //     func: 'sPC_MainMenu_Del',
        //     up_type: 'Y',
        //     MenuID: this.delButtons.join(',')
        //   })
        // }
        delete urlparam.type
        let _param = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
        window.open(window.location.href.split('#')[0] + `#/menudesign/${_param}`)
      } else {
        notification.warning({
          top: 92,
          message: res.message,
          duration: 5
        })
      }
    })
  }
  getTable = (config, newCon, errors, formActions, popActions, oldtabs) => {
    let _card = {
      uuid: newCon.uuid,
      type: 'table',
      name: newCon.name,
      format: 'array',
      pageable: true,
      switchable: true,
      search: [],
      action: [],
      subtype: 'normaltable',
      setting: { useMSearch: 'false', sync: 'false', onload: 'true' },
      wrap: {name: newCon.name},
      style: {},
      headerStyle: {},
      columns: [],
      cols: [],
      scripts: []
    }
    if (!config) {
      errors.push(newCon.name + '配置信息丢失')
      return _card
    }
    if (oldtabs && newCon.supModule && oldtabs[newCon.supModule]) {
      _card.setting.supModule = [oldtabs[newCon.supModule]]
    } else {
      _card.setting.supModule = ['empty']
    }
    _card.search = config.search.map(item => {
      item.uuid = Utils.getuuid()
      return item
    })
    let _cols = {}
    let _colspan = []
    let lineMarks = []
    config.columns.forEach(col => {
      if (col.type === 'colspan') {
        if (col.subfield) {
          _colspan.push(...col.subfield.split(', '))
        } else if (col.sublist && col.sublist.length > 0) {
          _colspan.push(...col.sublist)
        }
      }
      if (!col.field) return
      let _col = fromJS(col).toJS()
      if (_col.marks) {
        _col.marks = []
        col.marks.forEach(m => {
          if (m.signType === 'card') return
          let field = []
          field.push(m.field)
          field.push(m.contrastType)
          if (m.contrastField) {
            field.push(m.contrastField)
          }
          let color = '#1890ff'
          if (m.color && m.color[1]) {
            color = colorTransform[m.color[1]]
          }
          let signType = ['font']
          if (m.signType === 'background') {
            signType = ['background']
          } else if (m.signType === 'icon') {
            if (m.position === 'back') {
              signType = ['iconback']
            } else {
              signType = ['iconfront']
            }
            signType.push(m.iconType)
            signType.push(m.icon)
          }
          if (m.signType === 'line') {
            lineMarks.push({
              $index: lineMarks.length + 1,
              uuid: Utils.getuuid(),
              field: field,
              color: color,
              contrastValue: m.contrastValue || '',
              match: m.match,
              signType: ['background']
            })
          } else {
            _col.marks.push({
              $index: _col.marks.length + 1,
              uuid: Utils.getuuid(),
              field: field,
              color: color,
              contrastValue: m.contrastValue || '',
              match: m.match,
              signType: signType
            })
          }
        })
      }
      _cols[col.field] = _col
    })
    config.columns.forEach(col => {
      if (col.type === 'index') {
        col.uuid = Utils.getuuid()
        _card.cols.push(fromJS(col).toJS())
      } else if (col.field && _cols[col.field]) {
        let _col = fromJS(_cols[col.field]).toJS()
        if (_colspan.includes(col.field)) {
          _col.Hide = 'true'
        }
        _col.uuid = Utils.getuuid()
        _card.cols.push(_col)
      }
      if (col.type === 'colspan') {
        let ucol = {
          Align: col.Align,
          Hide: col.Hide,
          label: col.label,
          marks: [],
          isSub: false,
          uuid: Utils.getuuid(),
          blacklist: []
        }
        let _subs = []
        if (col.subfield) {
          _subs = col.subfield.split(', ')
        } else if (col.sublist) {
          _subs = col.sublist
        }
        if (col.unfold === 'true') {
          ucol.type = 'colspan'
          ucol.subcols = []
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = fromJS(_cols[sub]).toJS()
              _col.Hide = 'false'
              _col.isSub = true
              _col.uuid = Utils.getuuid()
              ucol.subcols.push(_col)
            }
          })
          if (ucol.subcols.length > 0) {
            _card.cols.push(ucol)
          }
        } else {
          ucol.Width = 120
          ucol.type = 'custom'
          ucol.elements = []
          ucol.style = {paddingTop: '12px', paddingLeft: '8px', paddingBottom: '12px', paddingRight: '8px'}
          _subs.forEach(sub => {
            if (_cols[sub]) {
              let _col = {
                copyable: 'false',
                datatype: 'dynamic',
                eleType: _cols[sub].type !== 'number' ? 'text' : 'number',
                field: sub,
                height: '',
                innerHeight: 'auto',
                marks: _cols[sub].marks || null,
                noValue: 'show',
                prefix: _cols[sub].prefix || '',
                postfix: _cols[sub].postfix || '',
                style: {},
                width: 24,
                uuid: Utils.getuuid()
              }
              ucol.elements.push(_col)
            }
          })
          if (ucol.elements.length > 0) {
            _card.cols.push(ucol)
          }
        }
      }
    })
    _card.lineMarks = lineMarks
    _card.columns = []
    _card.absFields = []
    _card.cols.forEach(col => {
      if (!col.field) return
      if (['text', 'picture', 'video', 'textarea'].includes(col.type)) {
        _card.columns.push({
          datatype: `Nvarchar(${col.fieldlength || 50})`,
          field: col.field,
          fieldlength: col.fieldlength || 50,
          label: col.label,
          type: 'text',
          uuid: Utils.getuuid()
        })
      } else if (col.type === 'link') {
        _card.columns.push({
          datatype: `Nvarchar(${col.fieldlength || 50})`,
          field: col.field,
          fieldlength: col.fieldlength || 50,
          label: col.label,
          type: 'text',
          uuid: Utils.getuuid()
        })
        if (col.nameField) {
          _card.columns.push({
            datatype: `Nvarchar(${col.fieldlength || 50})`,
            field: col.nameField,
            fieldlength: col.fieldlength || 50,
            label: col.label + '(名称)',
            type: 'text',
            uuid: Utils.getuuid() + 'name'
          })
        }
      } else if (col.type === 'number') {
        _card.columns.push({
          datatype: `Decimal(18,${col.decimal || 0})`,
          field: col.field,
          decimal: col.decimal || 0,
          label: col.label,
          type: 'number',
          uuid: Utils.getuuid()
        })
        if (col.format === 'abs') {
          _card.absFields.push(col.field)
        }
      }
    })
    if (_card.absFields.length) {
      _card.absFields = Array.from(new Set(_card.absFields))
    } else {
      _card.absFields = null
    }
    let colbtns = []
    let colors = { primary: '#1890ff', yellow: '#c49f47', orange: 'orange', danger: '#ff4d4f', green: '#26C281', dgreen: '#32c5d2', purple: '#8E44AD', cyan: '#13c2c2', gray: '#E7E7EF', default: 'rgba(0, 0, 0, 0.65)' }
    let uuids = {}
    config.action.forEach(btn => {
      let _c = btn.class ? btn.class.replace('border-', '') : ''
      let color = colors[_c] || '#1890ff'
      let _btn = fromJS(btn).toJS()
      delete _btn.position
      delete _btn.linkTab
      if (_btn.intertype === 'inner' && !_btn.innerFunc) {
        _btn.intertype = 'system'
      }
      if ((_btn.intertype === 'outer' || _btn.intertype === 'custom') && !_btn.procMode) { // 兼容外部函数直传类型
        _btn.procMode = !_btn.innerFunc ? 'none' : 'inner'
      }
      if (_btn.funcType === 'print' && _btn.execMode) {
        _btn.OpenType = 'funcbutton'
      } else if (_btn.OpenType === 'blank') {
        _btn.OpenType = 'tab'
      }
      this.delButtons.push(btn.uuid)
      _btn.show = 'button'
      if (_btn.execSuccess === 'equaltab') {
        _btn.execSuccess = 'grid'
        _btn.syncComponent = []
        if (newCon.equalTab && oldtabs && oldtabs[newCon.equalTab]) {
          _btn.syncComponent.push(oldtabs[newCon.equalTab])
        }
      } else if (_btn.execSuccess === 'maingrid') {
        _btn.execSuccess = 'mainline'
      }
      if (_btn.execError === 'equaltab') {
        _btn.execError = 'grid'
      } else if (_btn.execError === 'maingrid') {
        _btn.execError = 'mainline'
      }
      if (_btn.popClose === 'equaltab') {
        _btn.popClose = 'grid'
        _btn.syncComponent = []
        if (newCon.equalTab && oldtabs && oldtabs[newCon.equalTab]) {
          _btn.syncComponent.push(oldtabs[newCon.equalTab])
        }
      } else if (_btn.popClose === 'maingrid') {
        _btn.popClose = 'mainline'
      }
      if (_btn.OpenType === 'pop' || (_btn.OpenType === 'funcbutton' && _btn.funcType === 'print' && _btn.execMode === 'pop')) {
        formActions.push({origin: btn.uuid, uuid: _btn.uuid, name: newCon.name, label: btn.label})
      } else if (_btn.OpenType === 'popview') {
        if (!popActions) return
        popActions.push({origin: btn.uuid, linkTab: btn.linkTab || '', uuid: _btn.uuid, name: newCon.name, label: btn.label})
      } else if (_btn.OpenType === 'tab') {
        if (btn.tabTemplate === 'FormTab') {
          errors.push(newCon.name + '中按钮《' + btn.label + '》不在支持')
          return
        } else if (!btn.linkmenu || btn.linkmenu.length !== 3) {
          errors.push(newCon.name + '中按钮《' + btn.label + '》不在支持')
          return
        }
      }
      uuids[btn.uuid] = true
      if (_btn.tabType === 'CommonTable' || _btn.tabType === 'SubTable') {
        _btn.tabType = 'BaseTable'
      }
      if (btn.position === 'grid') {
        _btn.eleType = 'button'
        _btn.width = 24
        _btn.style = {color: color, backgroundColor: 'transparent', borderColor: 'transparent'}
        colbtns.push(_btn)
      } else {
        if (btn.class === 'default') {
          _btn.style = {color: 'rgba(0, 0, 0, 0.65)', backgroundColor: '#fff', borderColor: '#d9d9d9', marginRight: '15px'}
        } else if (btn.class.indexOf('border') > -1) {
          _btn.style = {color: color, backgroundColor: '#fff', borderColor: color, marginRight: '15px'}
        } else {
          _btn.style = {color: btn.class === 'gray' ? 'rgba(0, 0, 0, 0.65)' : '#fff', backgroundColor: color, borderColor: color, marginRight: '15px'}
        }
        _card.action.push(_btn)
      }
    })
    if (colbtns.length > 0) {
      _card.cols.push({
        Align: 'left',
        label: '操作',
        marks: [],
        isSub: false,
        uuid: Utils.getuuid(),
        type: 'custom',
        Width: 120,
        elements: colbtns,
        style: {paddingTop: '12px', paddingLeft: '8px', paddingBottom: '12px', paddingRight: '8px'}
      })
    }
    let sets = ['tableName', 'interType', 'sysInterface', 'innerFunc', 'interface', 'proInterface', 'outerFunc', 'dataresource', ['queryType', 'query'], 'primaryKey', 'order', ['laypage', 'true'], ['pageSize', 10], ['onload', 'true']]
    let wraps = ['tableType', ['bordered', 'true'], 'actionfixed', ['size', 'middle'], ['selected', 'false'], ['tableMode', 'compatible'], ['mask', 'show'], ['borderColor', '#e8e8e8'], 'height', 'controlField', 'controlVal']
    _card.scripts = config.setting.scripts || []
    sets.forEach(n => {
      if (n === 'interType') {
        if (!['system', 'inner', 'outer'].includes(config.setting.interType)) {
          _card.setting.interType = 'system'
        } else if (config.setting.interType === 'inner' && !config.setting.innerFunc) {
          _card.setting.interType = 'system'
        } else {
          _card.setting.interType = config.setting.interType
        }
      } else if (typeof(n) === 'string') {
        _card.setting[n] = config.setting[n] || ''
      } else {
        _card.setting[n[0]] = config.setting[n[0]] || n[1]
      }
    })
    wraps.forEach(w => {
      if (typeof(w) === 'string') {
        _card.wrap[w] = config.setting[w] || ''
      } else {
        _card.wrap[w[0]] = config.setting[w[0]] || w[1]
      }
    })
    _card.wrap.doubleClick = config.setting.doubleClick || ''
    if (_card.wrap.doubleClick && !uuids[_card.wrap.doubleClick]) {
      _card.wrap.doubleClick = ''
    }
    _card.setting.execute = config.setting.default || 'true'
    _card.errors = []
    let columns = _card.columns.map(c => c.field)
    if (_card.setting.interType === 'system' && _card.setting.execute !== 'false' && !_card.setting.dataresource) {
      _card.errors.push({ level: 0, detail: '未设置数据源!'})
    } else if (_card.setting.interType === 'system' && _card.setting.execute === 'false' && _card.scripts.filter(script => script.status !== 'false').length === 0) {
      _card.errors.push({ level: 0, detail: '数据源中无可用脚本!'})
    } else if (!_card.setting.primaryKey) {
      _card.errors.push({ level: 0, detail: '未设置主键!'})
    } else if (!columns.includes(_card.setting.primaryKey)) {
      _card.errors.push({ level: 0, detail: '主键已失效!'})
    } else if (!_card.setting.supModule) {
      _card.errors.push({ level: 0, detail: '未设置上级组件!'})
    }
    return _card
  }
  handleViewBack = () => {
    const { menu } = this.props
    let param = {
      editMenu: menu,
      editTab: null,
      tabConfig: null,
      editSubTab: null,
      subTabConfig: null,
      btnTab: null,
      btnTabConfig: null,
      editAction: null,
      subConfig: null,
      tabview: menu.LongParam.Template
    }
    this.props.handleView(param)
  }
  render() {
    return (
      <div className="formtab-update">
        <div className="tip">表单标签页不在支持查看及编辑,请点击升级按钮创建新菜单。注:创建成功后请在原菜单中修改关联按钮绑定新菜单。</div>
        <div className="buttons">
          <Button className="mk-border-purple" onClick={this.trigger}>升级</Button>
          <Button onClick={this.handleViewBack}>返回</Button>
        </div>
      </div>
    )
  }
}
export default UpdateTable
src/views/basedesign/updateFormTab/index.scss
New file
@@ -0,0 +1,18 @@
.formtab-update {
  position: absolute;
  top: 40%;
  left: 50%;
  transform: translate(-50%, 0px);
  .tip {
    width: 400px;
    line-height: 25px;
    margin-bottom: 20px;
  }
  .buttons {
    text-align: center;
    .mk-border-purple {
      margin-right: 15px;
    }
  }
}