king
2020-03-03 e603c97dbe7a4f1dbd6445e00383ed651182e0fe
2020-03-03
43个文件已修改
2个文件已添加
955 ■■■■ 已修改文件
src/components/sidemenu/editthdmenu/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/en-US/comtable.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/locales/zh-CN/comtable.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/formtab/formgroup/index.jsx 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/formtab/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/managetable/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/tableshare/actionList/index.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/tableshare/mutilform/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/actionform/index.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/index.jsx 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/comtableconfig/settingform/index.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/actionform/index.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/dragelement/card.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/dragelement/index.jsx 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/groupform/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/index.jsx 92 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/index.scss 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/formtabconfig/settingform/index.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/groupform/index.jsx 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/modalconfig/settingform/index.jsx 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/actionform/index.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/index.jsx 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/index.scss 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/subtableconfig/settingform/index.jsx 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/colspanform/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/columnform/index.jsx 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/dragelement/index.jsx 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/formconfig.js 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/gridbtnform/index.jsx 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/pasteform/index.jsx 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/pasteform/index.scss 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/searchform/index.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/tabform/index.jsx 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycard/index.jsx 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycardexcelin/index.jsx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycardexcelout/index.jsx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/tableshare/verifycardprint/index.jsx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/ushare/modalform/index.jsx 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/loginform.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/sidemenu/editthdmenu/index.jsx
@@ -150,11 +150,14 @@
      Api.getSystemConfig(param).then(res => {
        if (res.status) {
          let _LongParam = res.LongParam && window.decodeURIComponent(window.atob(res.LongParam))
          try {
            _LongParam = JSON.parse(_LongParam)
          } catch (e) {
            _LongParam = ''
          let _LongParam = ''
          if (res.LongParam) {
            try {
              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _LongParam = ''
            }
          }
          _menu.LongParam = _LongParam
@@ -414,10 +417,10 @@
            let _config = ''
            if (result.LongParam) {
              try {
                _config = window.decodeURIComponent(window.atob(result.LongParam))
                _config = JSON.parse(_config)
                _config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                _config.type = 'user'
              } catch (e) {
                console.warn('Parse Failure')
                _config = ''
              }
            }
src/locales/en-US/comtable.js
@@ -222,6 +222,8 @@
  'header.form.func.print': '打印',
  'header.form.execMode': '执行方式',
  'header.form.thawbutton': '解冻按钮',
  'header.form.maxRows': '最大行数',
  'header.form.paste': '粘贴',
  'header.modal.form.edit': '表单-编辑',
  'header.modal.search.edit': '搜索条件-编辑',
  'header.modal.action.edit': '按钮-编辑',
src/locales/zh-CN/comtable.js
@@ -222,6 +222,8 @@
  'header.form.func.print': '打印',
  'header.form.execMode': '执行方式',
  'header.form.thawbutton': '解冻按钮',
  'header.form.maxRows': '最大行数',
  'header.form.paste': '粘贴',
  'header.modal.form.edit': '表单-编辑',
  'header.modal.search.edit': '搜索条件-编辑',
  'header.modal.action.edit': '按钮-编辑',
src/tabviews/commontable/index.jsx
@@ -81,9 +81,9 @@
      let config = ''
      try { // 配置信息解析
        config = window.decodeURIComponent(window.atob(result.LongParam))
        config = JSON.parse(config)
        config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
      } catch (e) {
        console.warn('Parse Failure')
        config = ''
      }
src/tabviews/formtab/formgroup/index.jsx
@@ -33,13 +33,65 @@
  }
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { datatype } = this.state
    if (nextProps.data && !is(fromJS(this.props.data), fromJS(nextProps.data))) {
      let _fieldsvalue = {}
      let _record = {}
      Object.keys(nextProps.data).forEach(key => {
        if (this.props.form.getFieldValue(key) !== undefined) {
          _fieldsvalue[key] = nextProps.data[key]
          if (datatype[key] === 'multiselect') {
            let _val = nextProps.data[key] ? nextProps.data[key].split(',').filter(Boolean) : []
            _fieldsvalue[key] = _val
          } else if (datatype[key] === 'date') {
            let _val = nextProps.data[key] ? nextProps.data[key] : null
            if (_val) {
              _val = moment(_val, 'YYYY-MM-DD')
            }
            _fieldsvalue[key] = _val
          } else if (datatype[key] === 'datemonth') {
            let _val = nextProps.data[key] ? nextProps.data[key] : null
            if (_val) {
              _val = moment(_val, 'YYYY-MM')
            }
            _fieldsvalue[key] = _val
          } else if (datatype[key] === 'datetime') {
            let _val = nextProps.data[key] ? nextProps.data[key] : null
            if (_val) {
              _val = moment(_val, 'YYYY-MM-DD HH:mm:ss')
            }
            _fieldsvalue[key] = _val
          } else if (datatype[key] === 'fileupload') {
            let _val = nextProps.data[key] ? nextProps.data[key] : ''
            if (_val) {
              try {
                _val = _val.split(',').map((url, index) => {
                  return {
                    uid: `${index}`,
                    name: url.slice(url.lastIndexOf('/') + 1),
                    status: 'done',
                    url: url,
                    origin: true
                  }
                })
              } catch {
                _val = []
              }
            } else {
              _val = []
            }
            _fieldsvalue[key] = _val
          } else {
            _fieldsvalue[key] = nextProps.data[key]
          }
        } else {
          _record[key] = nextProps.data[key]
        }
@@ -391,6 +443,7 @@
        )
      } else if (item.type === 'datetime') {
        let _initval = this.props.data ? this.props.data[item.field] : ''
        if (_initval && this.state.readin[item.field]) {
          _initval = moment(_initval, 'YYYY-MM-DD HH:mm:ss')
        } else {
@@ -475,7 +528,7 @@
                    message: formRule.textarea.message
                  }
                ]
              })(<TextArea autosize={{ minRows: 2, maxRows: 6 }} disabled={item.readonly === 'true'} />)}
              })(<TextArea autosize={{ minRows: 2, maxRows: item.maxRows || 6 }} disabled={item.readonly === 'true'} />)}
            </Form.Item>
          </Col>
        )
src/tabviews/formtab/index.jsx
@@ -67,9 +67,9 @@
      let config = ''
      try { // 配置信息解析
        config = window.decodeURIComponent(window.atob(result.LongParam))
        config = JSON.parse(config)
        config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
      } catch (e) {
        console.warn('Parse Failure')
        config = ''
      }
src/tabviews/managetable/index.jsx
@@ -82,9 +82,9 @@
      let config = ''
      try { // 配置信息解析
        config = window.decodeURIComponent(window.atob(result.LongParam))
        config = JSON.parse(config)
        config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
      } catch (e) {
        console.warn('Parse Failure')
        config = ''
      }
src/tabviews/subtable/index.jsx
@@ -84,9 +84,9 @@
      let config = ''
      try { // 配置信息解析
        config = window.decodeURIComponent(window.atob(result.LongParam))
        config = JSON.parse(config)
        config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
      } catch (e) {
        console.warn('Parse Failure')
        config = ''
      }
src/tabviews/subtabtable/index.jsx
@@ -64,9 +64,9 @@
      let config = ''
      try { // 配置信息解析
        config = window.decodeURIComponent(window.atob(result.LongParam))
        config = JSON.parse(config)
        config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
      } catch (e) {
        console.warn('Parse Failure')
        config = ''
      }
src/tabviews/tableshare/actionList/index.jsx
@@ -722,6 +722,10 @@
        message: res.ErrMesg || this.props.dict['main.action.confirm.success'],
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res && res.ErrCode === 'Y') { // 执行成功
      Modal.success({
        title: res.ErrMesg || this.props.dict['main.action.confirm.success']
      })
    } else if (res && res.ErrCode === '-1') { // 完成后不提示
    // } else if (res.Relogin === 'true') { // 切换用户功能
@@ -818,10 +822,10 @@
        let _LongParam = ''
        if (res.status && res.LongParam) {
          _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
          try {
            _LongParam = JSON.parse(_LongParam)
            _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
          } catch (e) {
            console.warn('Parse Failure')
            _LongParam = ''
          }
        }
src/tabviews/tableshare/mutilform/index.jsx
@@ -549,7 +549,7 @@
                    message: formRule.input.formMessage.replace('@max', _max)
                  }
                ]
              })(<TextArea autosize={{ minRows: 2, maxRows: 6 }} disabled={item.readonly === 'true'} />)}
              })(<TextArea autosize={{ minRows: 2, maxRows: item.maxRows || 6 }} disabled={item.readonly === 'true'} />)}
            </Form.Item>
          </Col>
        )
src/templates/comtableconfig/actionform/index.jsx
@@ -9,11 +9,12 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object,    // 字典项
    setting: PropTypes.object, // 页面设置
    formlist: PropTypes.any,   // 表单信息
    card: PropTypes.any,       // 按钮信息
    tabs: PropTypes.array      // 所有标签页
    dict: PropTypes.object,      // 字典项
    setting: PropTypes.object,   // 页面设置
    formlist: PropTypes.any,     // 表单信息
    card: PropTypes.any,         // 按钮信息
    tabs: PropTypes.array,       // 所有标签页
    inputSubmit: PropTypes.any   // 回车提交事件
  }
  state = {
@@ -417,6 +418,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -467,7 +476,7 @@
                  },
                  ..._rules
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/comtableconfig/index.jsx
@@ -19,6 +19,7 @@
import TabForm from '@/templates/tableshare/tabform'
import SearchForm from '@/templates/tableshare/searchform'
import ColumnForm from '@/templates/tableshare/columnform'
import PasteForm from '@/templates/tableshare/pasteform'
import DragElement from '@/templates/tableshare/dragelement'
import ColspanForm from '@/templates/tableshare/colspanform'
import GridBtnForm from '@/templates/tableshare/gridbtnform'
@@ -612,9 +613,9 @@
              // 解析配置,修改模态框标题名称
              if (result.LongParam) {
                try {
                  _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                  _LongParam = JSON.parse(_LongParam)
                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                } catch (e) {
                  console.warn('Parse Failure')
                  _LongParam = ''
                }
              }
@@ -623,6 +624,7 @@
                  _LongParam.setting.title = res.label
                  _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
                } catch {
                  console.warn('Stringify Failure')
                  _LongParam = ''
                }
              } else {
@@ -669,9 +671,9 @@
              // 解析配置,修改模态框标题名称
              if (result.LongParam) {
                try {
                  _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                  _LongParam = JSON.parse(_LongParam)
                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                } catch (e) {
                  console.warn('Parse Failure')
                  _LongParam = ''
                }
              }
@@ -694,6 +696,7 @@
                  _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
                  _temp = 'FormTab'
                } catch {
                  console.warn('Stringify Failure')
                  _LongParam = ''
                }
              } else {
@@ -874,10 +877,10 @@
          }).then(res => {
            let _LongParam = ''
            if (res.status && res.LongParam) {
              _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
              try {
                _LongParam = JSON.parse(_LongParam)
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
@@ -1685,9 +1688,9 @@
        
                  if (result.LongParam) {
                    try {
                      _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                      _LongParam = JSON.parse(_LongParam)
                      _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                    } catch (e) {
                      console.warn('Parse Failure')
                      _LongParam = ''
                    }
                  }
@@ -1752,14 +1755,22 @@
        
        let tabParam = { // 添加菜单tab页
          func: 'sPC_sMenusTab_AddUpt',
          MenuID: menu.MenuID,
          LText: _config.tabs.map((item, index) => {
            return `select '${menu.MenuID}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`
          })
          MenuID: menu.MenuID
        }
        tabParam.LText = tabParam.LText.join(' union all ')
        tabParam.LText = Utils.formatOptions(tabParam.LText)
        let _LText = []
        let _index = 1
        _config.tabgroups.forEach(groupId => {
          _config[groupId].forEach(item => {
            _LText.push(`select '${menu.MenuID}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${_index * 10}' as Sort`)
            _index++
          })
        })
        _LText = _LText.join(' union all ')
        tabParam.LText = Utils.formatOptions(_LText)
        tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
        tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
  
@@ -1804,6 +1815,7 @@
                try {
                  _ParentParam = window.btoa(window.encodeURIComponent(JSON.stringify(item.card)))
                } catch (e) {
                  console.warn('Stringify Failure')
                  _ParentParam = null
                }
@@ -2027,10 +2039,10 @@
            if (result.LongParam) {
              let _subconfig = ''
              try {
                _subconfig = window.decodeURIComponent(window.atob(result.LongParam))
                _subconfig = JSON.parse(_subconfig)
                _subconfig = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                _temp = _subconfig.type
              } catch (e) {
                console.warn('Parse Failure')
                _subconfig = ''
              }
@@ -2054,6 +2066,7 @@
                  })
                  _subconfig = window.btoa(window.encodeURIComponent(JSON.stringify(_subconfig)))
                } catch {
                  console.warn('Stringify Failure')
                  _subconfig = ''
                }
@@ -2554,10 +2567,10 @@
            })
            let _LongParam = ''
            if (res.LongParam) {
              _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
              try {
                _LongParam = JSON.parse(_LongParam)
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
@@ -2740,6 +2753,7 @@
            try {
              _conf = JSON.parse(window.decodeURIComponent(window.atob(menu.ParentParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _conf = ''
            }
          }
@@ -2826,6 +2840,25 @@
      Api.getSystemConfig(_param)
    })
    this.props.handleView()
  }
  pasteSubmit = () => {
    this.pasteFormRef.handleConfirm().then(res => {
      if (res.copyType !== 'action') {
        notification.warning({
          top: 92,
          message: '配置信息格式错误!',
          duration: 10
        })
        return
      }
      this.setState({
        modaltype: ''
      }, () => {
        this.handleAction(res, 'copy')
      })
    })
  }
  render () {
@@ -2995,13 +3028,13 @@
                  placeholder={this.state.dict['header.form.search.placeholder']}
                />
              </div>
              <div className="action-list">
              <div className="action-list" id="action-list">
                <Tooltip placement="bottomLeft" overlayClassName="middle" title="在左侧工具栏《按钮》中,选择对应类型的按钮拖至此处添加,如选择按钮类型为表单、新标签页等含有配置页面的按钮,可在左侧工具栏-按钮-可配置按钮处,点击按钮完成相关配置。注:当设置按钮显示位置为表格时,显示列会增加操作列。">
                  <Icon type="question-circle" />
                </Tooltip>
                {/* <div className="thawbutton" title={this.state.dict['header.form.thawbutton']} onClick={this.handleThaw}>
                  <Icon type="unlock" />
                </div> */}
                <div className="copybutton" title={this.state.dict['header.form.paste']} onClick={() => {this.setState({modaltype: 'paste'})}}>
                  <Icon type="snippets" />
                </div>
                <DragElement
                  type="action"
                  list={this.state.config.action}
@@ -3073,6 +3106,7 @@
          <SearchForm
            dict={this.state.dict}
            card={this.state.card}
            inputSubmit={this.handleSubmit}
            optionLibs={this.state.optionLibs}
            formlist={this.state.formlist}
            wrappedComponentRef={(inst) => this.searchFormRef = inst}
@@ -3097,6 +3131,7 @@
            card={this.state.card}
            tabs={this.state.tabviews}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            setting={this.state.config.setting}
            wrappedComponentRef={(inst) => this.actionFormRef = inst}
          />
@@ -3114,6 +3149,7 @@
          <ColumnForm
            dict={this.state.dict}
            card={this.state.card}
            inputSubmit={this.handleSubmit}
            formlist={this.state.formlist}
            wrappedComponentRef={(inst) => this.columnFormRef = inst}
          />
@@ -3131,6 +3167,7 @@
          <ColspanForm
            dict={this.state.dict}
            card={this.state.card}
            inputSubmit={this.handleSubmit}
            columns={this.state.config.columns}
            wrappedComponentRef={(inst) => this.columnFormRef = inst}
          />
@@ -3147,6 +3184,7 @@
        >
          <GridBtnForm
            dict={this.state.dict}
            inputSubmit={this.handleSubmit}
            card={this.state.config.gridBtn}
            wrappedComponentRef={(inst) => this.gridBtnFormRef = inst}
          />
@@ -3163,10 +3201,11 @@
        >
          <TabForm
            type="tabs"
            tabs={this.state.tabviews}
            dict={this.state.dict}
            card={this.state.card}
            tabs={this.state.tabviews}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            wrappedComponentRef={(inst) => this.tabsFormRef = inst}
          />
        </Modal>
@@ -3261,6 +3300,7 @@
          <SettingForm
            dict={this.state.dict}
            menu={this.props.menu}
            inputSubmit={this.settingSave}
            data={this.state.config.setting}
            columns={this.state.config.columns}
            usefulFields={this.props.permFuncField}
@@ -3295,6 +3335,21 @@
          {!this.state.thawbtnlist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />}
          {this.state.thawbtnlist && <TransferForm ref="trawmenu" dict={this.state.dict} menulist={this.state.thawbtnlist}/>}
        </Modal>
        {/* 按钮配置信息粘贴复制 */}
        <Modal
          title={this.state.dict['header.form.paste']}
          visible={modaltype === 'paste'}
          width={600}
          maskClosable={false}
          onOk={this.pasteSubmit}
          onCancel={() => {this.setState({modaltype: ''})}}
          destroyOnClose
        >
          <PasteForm
            dict={this.state.dict}
            wrappedComponentRef={(inst) => this.pasteFormRef = inst}
          />
        </Modal>
        {this.state.loading && <Spin size="large" />}
      </div>
    )
src/templates/comtableconfig/index.scss
@@ -308,14 +308,15 @@
            display: inline-block;
          }
        }
        .thawbutton {
        .copybutton {
          position: absolute;
          right: 10px;
          top: 5px;
          z-index: 2;
          padding: 5px;
          cursor: pointer;
          i {
            font-size: 18px;
            font-size: 16px;
          }
        }
      }
@@ -494,7 +495,7 @@
      > .anticon-setting {
        position: absolute;
        font-size: 18px;
        right: 5px;
        right: 7px;
        top: 10px;
        padding: 10px;
        z-index: 1;
src/templates/comtableconfig/settingform/index.jsx
@@ -12,7 +12,8 @@
    menu: PropTypes.object,
    data: PropTypes.object,
    columns: PropTypes.array,
    usefulFields: PropTypes.array
    usefulFields: PropTypes.array,
    inputSubmit: PropTypes.any     // 回车提交事件
  }
  state = {
@@ -113,6 +114,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { data, dict, menu, usefulFields } = this.props
    const { getFieldDecorator } = this.props.form
@@ -149,7 +158,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
@@ -205,7 +214,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType === 'outer' ? <Col span={12}>
@@ -221,7 +230,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType !== 'outer' ? <Col span={12}>
@@ -242,7 +251,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType !== 'outer' ? <Col span={24} style={{paddingLeft: '7px'}}>
@@ -330,7 +339,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="ID asc, UID desc" autoComplete="off" />)}
              })(<Input placeholder="ID asc, UID desc" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/formtabconfig/actionform/index.jsx
@@ -9,10 +9,11 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object,  // 字典项
    formlist: PropTypes.any, // 表单信息
    card: PropTypes.any,     // 按钮信息
    tabs: PropTypes.array    // 所有标签页
    dict: PropTypes.object,      // 字典项
    formlist: PropTypes.any,     // 表单信息
    card: PropTypes.any,         // 按钮信息
    tabs: PropTypes.array,       // 所有标签页
    inputSubmit: PropTypes.any   // 回车提交事件
  }
  state = {
@@ -238,6 +239,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -288,7 +297,7 @@
                  },
                  ..._rules
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/formtabconfig/dragelement/card.jsx
@@ -8,7 +8,7 @@
const { MonthPicker } = DatePicker
const { TextArea } = Input
const Card = ({ id, type, cols, card, moveCard, findCard, editCard, delCard, profileCard, hasDrop }) => {
const Card = ({ id, type, cols, card, moveCard, findCard, editCard, delCard, profileCard, hasDrop, copyCard }) => {
  const originalIndex = findCard(id).index
  const [{ isDragging }, drag] = useDrag({
    item: { type: ItemTypes[type], id, originalIndex },
@@ -40,6 +40,10 @@
  
  const del = () => {
    delCard(id)
  }
  const copy = () => {
    copyCard(id)
  }
  
  const profile = () => {
@@ -91,6 +95,7 @@
            <div className={'ant-col ant-form-item-label ant-col-xs-24 ' + labelCol}>
              <label title={card.label}>{card.label}</label>
              <Icon className="edit" title="编辑" type="edit" onClick={edit} />
              <Icon className="edit copy" title="复制" type="copy" onClick={copy} />
              <Icon className="edit close" title="删除" type="close" onClick={del} />
            </div>
            <div className={'ant-col ant-form-item-control-wrapper ant-col-xs-24 ' + wrapCol}>
src/templates/formtabconfig/dragelement/index.jsx
@@ -40,6 +40,19 @@
    const { card } = findCard(id)
    handleMenu(card)
  }
  const copyCard = id => {
    const { card } = findCard(id)
    let _card = JSON.parse(JSON.stringify(card))
    _card.originUuid = _card.uuid
    _card.uuid = Utils.getuuid()
    _card.iscopy = true
    _card.focus = true
    handleMenu(_card)
  }
  
  const profileCard = id => {
    const { card } = findCard(id)
@@ -156,6 +169,7 @@
            moveCard={moveCard}
            editCard={editCard}
            delCard={delCard}
            copyCard={copyCard}
            findCard={findCard}
            hasDrop={hasDrop}
          />
src/templates/formtabconfig/groupform/index.jsx
@@ -8,9 +8,10 @@
class GroupForm extends Component {
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    group: PropTypes.object, // 字典项
    groups: PropTypes.array
    dict: PropTypes.object,     // 字典项
    group: PropTypes.object,    // 当前分组
    groups: PropTypes.array,    // 所有分组
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -68,6 +69,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { group, groups } = this.props
    const { getFieldDecorator } = this.props.form
@@ -99,7 +108,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off"/>)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/formtabconfig/index.jsx
@@ -371,7 +371,7 @@
  }
  handleSearch = (card) => {
    const {menu} = this.props
    const { menu } = this.props
    const { config } = this.state
    let _inputfields = []
    let _linkableFields = []
@@ -558,7 +558,7 @@
   */
  handleSubmit = () => {
    const { btnTab } = this.props
    const { config, modaltype, optionLibs } = this.state
    const { config, modaltype, optionLibs, card } = this.state
    if (modaltype === 'search') {
      this.modalFormRef.handleConfirm().then(res => {
@@ -583,19 +583,42 @@
            options: res.options
          })
        }
        let _groups = config.groups.map(group => {
          group.sublist = group.sublist.map(item => {
            if (item.uuid === res.uuid) {
              return res
            } else {
              return item
        let _groups = null
        if (card.iscopy) {
          _groups = config.groups.map(group => {
            let _index = null
            group.sublist.forEach((item, index) => {
              if (item.uuid === card.originUuid) {
                _index = index
              }
            })
            if (_index !== null) {
              group.sublist.splice(_index + 1, 0, res)
            }
            if (group.isDefault) {
              group.sublist = group.sublist.filter(item => !item.origin)
            }
            return group
          })
          if (group.isDefault) {
            group.sublist = group.sublist.filter(item => !item.origin)
          }
          return group
        })
        } else {
          _groups = config.groups.map(group => {
            group.sublist = group.sublist.map(item => {
              if (item.uuid === res.uuid) {
                return res
              } else {
                return item
              }
            })
            if (group.isDefault) {
              group.sublist = group.sublist.filter(item => !item.origin)
            }
            return group
          })
        }
        this.setState({
          config: {...config, groups: _groups},
@@ -711,10 +734,10 @@
          }).then(res => {
            let _LongParam = ''
            if (res.status && res.LongParam) {
              _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
              try {
                _LongParam = JSON.parse(_LongParam)
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
@@ -1373,9 +1396,9 @@
        
                  if (result.LongParam) {
                    try {
                      _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                      _LongParam = JSON.parse(_LongParam)
                      _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                    } catch (e) {
                      console.warn('Parse Failure')
                      _LongParam = ''
                    }
                  }
@@ -1441,13 +1464,23 @@
        
        let tabParam = { // 添加菜单tab页
          func: 'sPC_sMenusTab_AddUpt',
          MenuID: btnTab.uuid,
          LText: config.tabs.map((item, index) => {
            return `select '${btnTab.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`
          })
          MenuID: btnTab.uuid
        }
        tabParam.LText = tabParam.LText.join(' union all ')
        tabParam.LText = Utils.formatOptions(tabParam.LText)
        let _LText = []
        let _index = 1
        config.tabgroups.forEach(groupId => {
          config[groupId].forEach(item => {
            _LText.push(`select '${btnTab.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${_index * 10}' as Sort`)
            _index++
          })
        })
        _LText = _LText.join(' union all ')
        tabParam.LText = Utils.formatOptions(_LText)
        tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
        tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
  
@@ -1898,10 +1931,10 @@
              })
              let _LongParam = ''
              if (res.LongParam) {
                _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
                try {
                  _LongParam = JSON.parse(_LongParam)
                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
                } catch (e) {
                  console.warn('Parse Failure')
                  _LongParam = ''
                }
              }
@@ -2328,7 +2361,7 @@
        </DndProvider>
        {/* 编辑表单 */}
        <Modal
          title={this.state.dict['header.modal.form.edit']}
          title={this.state.card && this.state.card.iscopy ? this.state.dict['header.modal.form.copy'] : this.state.dict['header.modal.form.edit']}
          visible={modaltype === 'search'}
          width={700}
          maskClosable={false}
@@ -2340,6 +2373,7 @@
            dict={this.state.dict}
            card={this.state.card}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            optionLibs={this.state.optionLibs}
            wrappedComponentRef={(inst) => this.modalFormRef = inst}
          />
@@ -2364,6 +2398,7 @@
            card={this.state.card}
            tabs={this.state.tabviews}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            wrappedComponentRef={(inst) => this.actionFormRef = inst}
          />
        </Modal>
@@ -2383,6 +2418,7 @@
            card={this.state.card}
            tabs={this.state.tabviews}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            wrappedComponentRef={(inst) => this.tabsFormRef = inst}
          />
        </Modal>
@@ -2453,6 +2489,7 @@
            dict={this.state.dict}
            menu={this.props.menu}
            config={this.state.config}
            inputSubmit={this.settingSave}
            usefulFields={this.props.permFuncField}
            wrappedComponentRef={(inst) => this.settingRef = inst}
          />
@@ -2483,8 +2520,9 @@
        >
          <GroupForm
            groups={config.groups}
            group={this.state.editgroup}
            dict={this.state.dict}
            group={this.state.editgroup}
            inputSubmit={this.handleGroupSave}
            wrappedComponentRef={(inst) => this.groupRef = inst}
          />
        </Modal>
src/templates/formtabconfig/index.scss
@@ -255,7 +255,6 @@
              }
              .edit {
                position: absolute;
                // left: calc(34% - 100px);
                right: 100px;
                top: -5px;
                color: #1890ff;
@@ -263,9 +262,12 @@
                display: none;
              }
              .edit.close {
                // left: calc(34% - 80px);
                right: 80px;
                right: 60px;
                color: #ff4d4f;
              }
              .edit.copy {
                right: 80px;
                color: #26C281;
              }
            }
            .page-card:hover {
@@ -438,7 +440,7 @@
      > .anticon-setting {
        position: absolute;
        font-size: 18px;
        right: 5px;
        right: 7px;
        top: 10px;
        padding: 10px;
        z-index: 1;
src/templates/formtabconfig/settingform/index.jsx
@@ -11,7 +11,8 @@
    dict: PropTypes.object, // 字典项
    menu: PropTypes.object,
    config: PropTypes.object,
    usefulFields: PropTypes.array
    usefulFields: PropTypes.array,
    inputSubmit: PropTypes.any     // 回车提交事件
  }
  state = {
@@ -132,6 +133,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { dict, usefulFields, menu } = this.props
    const { getFieldDecorator } = this.props.form
@@ -168,7 +177,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
@@ -241,7 +250,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {datatype === 'query' && interType !== 'outer' ? <Col span={12}>
@@ -262,7 +271,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {datatype === 'query' && interType !== 'outer' ? <Col span={24}>
@@ -290,7 +299,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          <Col span={12}>
src/templates/modalconfig/groupform/index.jsx
@@ -10,7 +10,8 @@
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    group: PropTypes.object, // 字典项
    config: PropTypes.object
    config: PropTypes.object,
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -73,6 +74,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { group, config } = this.props
    const { getFieldDecorator } = this.props.form
@@ -104,7 +113,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off"/>)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/modalconfig/index.jsx
@@ -1213,8 +1213,8 @@
            dict={this.state.dict}
            card={this.state.card}
            formlist={this.state.formlist}
            optionLibs={this.state.optionLibs}
            inputSubmit={this.handleSubmit}
            optionLibs={this.state.optionLibs}
            wrappedComponentRef={(inst) => this.formRef = inst}
          />}
        </Modal>
@@ -1247,8 +1247,9 @@
          destroyOnClose
        >
          <SettingForm
            dict={this.state.dict}
            config={config}
            dict={this.state.dict}
            inputSubmit={this.settingSave}
            wrappedComponentRef={(inst) => this.settingRef = inst}
          />
        </Modal>
@@ -1278,8 +1279,9 @@
        >
          <GroupForm
            config={config}
            group={this.state.curgroup}
            dict={this.state.dict}
            group={this.state.curgroup}
            inputSubmit={this.handleGroupSave}
            wrappedComponentRef={(inst) => this.groupRef = inst}
          />
        </Modal>
src/templates/modalconfig/index.scss
@@ -285,7 +285,7 @@
      > .anticon-setting {
        position: absolute;
        font-size: 16px;
        right: 10px;
        right: 15px;
        top: 10px;
      }
    }
src/templates/modalconfig/settingform/index.jsx
@@ -6,8 +6,9 @@
class SettingForm extends Component {
  static propTpyes = {
    dict: PropTypes.object,  // 字典项
    config: PropTypes.object // 表单配置信息
    dict: PropTypes.object,     // 字典项
    config: PropTypes.object,   // 表单配置信息
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -52,6 +53,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { config, dict } = this.props
    const { fields } = this.state
@@ -81,7 +90,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off"/>)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/subtableconfig/actionform/index.jsx
@@ -9,11 +9,12 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object,    // 字典项
    setting: PropTypes.object, // 页面设置
    formlist: PropTypes.any,   // 表单信息
    card: PropTypes.any,       // 按钮信息
    tabs: PropTypes.array      // 所有标签页
    dict: PropTypes.object,      // 字典项
    setting: PropTypes.object,   // 页面设置
    formlist: PropTypes.any,     // 表单信息
    card: PropTypes.any,         // 按钮信息
    tabs: PropTypes.array,       // 所有标签页
    inputSubmit: PropTypes.any   // 回车提交事件
  }
  state = {
@@ -393,6 +394,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -442,7 +451,7 @@
                  },
                  ..._rules
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/subtableconfig/index.jsx
@@ -19,6 +19,7 @@
import SearchForm from '@/templates/tableshare/searchform'
import ColumnForm from '@/templates/tableshare/columnform'
import DragElement from '@/templates/tableshare/dragelement'
import PasteForm from '@/templates/tableshare/pasteform'
import ColspanForm from '@/templates/tableshare/colspanform'
import GridBtnForm from '@/templates/tableshare/gridbtnform'
import EditCard from '@/templates/tableshare/editcard'
@@ -489,9 +490,9 @@
              // 解析配置,修改模态框标题名称
              if (result.LongParam) {
                try {
                  _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                  _LongParam = JSON.parse(_LongParam)
                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                } catch (e) {
                  console.warn('Parse Failure')
                  _LongParam = ''
                }
              }
@@ -500,6 +501,7 @@
                  _LongParam.setting.title = res.label
                  _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
                } catch {
                  console.warn('Stringify Failure')
                  _LongParam = ''
                }
              } else {
@@ -657,10 +659,10 @@
          }).then(res => {
            let _LongParam = ''
            if (res.status && res.LongParam) {
              _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
              try {
                _LongParam = JSON.parse(_LongParam)
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
@@ -1381,9 +1383,9 @@
        
                  if (result.LongParam) {
                    try {
                      _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
                      _LongParam = JSON.parse(_LongParam)
                      _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
                    } catch (e) {
                      console.warn('Parse Failure')
                      _LongParam = ''
                    }
                  }
@@ -1475,6 +1477,7 @@
              try {
                _ParentParam = window.btoa(window.encodeURIComponent(JSON.stringify(item.card)))
              } catch (e) {
                console.warn('Stringify Failure')
                _ParentParam = null
              }
@@ -1643,10 +1646,10 @@
            let _LongParam = ''
  
            if (result.LongParam) {
              _LongParam = window.decodeURIComponent(window.atob(result.LongParam))
              try {
                _LongParam = JSON.parse(_LongParam)
                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
              } catch (e) {
                console.warn('Parse Failure')
                _LongParam = ''
              }
            }
@@ -2084,10 +2087,10 @@
              })
              let _LongParam = ''
              if (res.LongParam) {
                _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
                try {
                  _LongParam = JSON.parse(_LongParam)
                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
                } catch (e) {
                  console.warn('Parse Failure')
                  _LongParam = ''
                }
              }
@@ -2199,6 +2202,7 @@
            try {
              _conf = JSON.parse(window.decodeURIComponent(window.atob(menu.ParentParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _conf = ''
            }
          }
@@ -2251,6 +2255,32 @@
        thawBtnVisible: false
      })
    }
  }
  pasteSubmit = () => {
    this.pasteFormRef.handleConfirm().then(res => {
      if (res.copyType !== 'action') {
        notification.warning({
          top: 92,
          message: '配置信息格式错误!',
          duration: 10
        })
        return
      } else if (!['pop', 'prompt', 'exec', 'excelIn', 'excelOut', 'popview'].includes(res.OpenType)) {
        notification.warning({
          top: 92,
          message: '不支持此打开方式!',
          duration: 10
        })
        return
      }
      this.setState({
        modaltype: ''
      }, () => {
        this.handleAction(res, 'copy')
      })
    })
  }
  render () {
@@ -2398,6 +2428,9 @@
                <Tooltip placement="bottomLeft" overlayClassName="middle" title="在左侧工具栏《按钮》中,选择对应类型的按钮拖至此处添加,如选择按钮类型为表单、新标签页等含有配置页面的按钮,可在左侧工具栏-按钮-可配置按钮处,点击按钮完成相关配置。注:当设置按钮显示位置为表格时,显示列会增加操作列。">
                  <Icon type="question-circle" />
                </Tooltip>
                <div className="copybutton" title={this.state.dict['header.form.paste']} onClick={() => {this.setState({modaltype: 'paste'})}}>
                  <Icon type="snippets" />
                </div>
                <DragElement
                  type="action"
                  list={this.state.config.action}
@@ -2444,6 +2477,7 @@
            dict={this.state.dict}
            card={this.state.card}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            optionLibs={this.state.optionLibs}
            wrappedComponentRef={(inst) => this.searchFormRef = inst}
          />
@@ -2467,6 +2501,7 @@
            card={this.state.card}
            tabs={this.state.tabviews}
            formlist={this.state.formlist}
            inputSubmit={this.handleSubmit}
            setting={this.state.config.setting}
            wrappedComponentRef={(inst) => this.actionFormRef = inst}
          />
@@ -2484,6 +2519,7 @@
          <ColumnForm
            dict={this.state.dict}
            card={this.state.card}
            inputSubmit={this.handleSubmit}
            formlist={this.state.formlist}
            wrappedComponentRef={(inst) => this.columnFormRef = inst}
          />
@@ -2501,6 +2537,7 @@
          <ColspanForm
            dict={this.state.dict}
            card={this.state.card}
            inputSubmit={this.handleSubmit}
            columns={this.state.config.columns}
            wrappedComponentRef={(inst) => this.columnFormRef = inst}
          />
@@ -2517,6 +2554,7 @@
        >
          <GridBtnForm
            dict={this.state.dict}
            inputSubmit={this.handleSubmit}
            card={this.state.config.gridBtn}
            wrappedComponentRef={(inst) => this.gridBtnFormRef = inst}
          />
@@ -2604,6 +2642,7 @@
          <SettingForm
            dict={this.state.dict}
            tabId={this.state.config.uuid}
            inputSubmit={this.settingSave}
            data={this.state.config.setting}
            columns={this.state.config.columns}
            usefulFields={this.props.permFuncField}
@@ -2638,6 +2677,21 @@
          {!this.state.thawbtnlist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />}
          {this.state.thawbtnlist && <TransferForm ref="trawmenu" dict={this.state.dict} menulist={this.state.thawbtnlist}/>}
        </Modal>
        {/* 按钮配置信息粘贴复制 */}
        <Modal
          title={this.state.dict['header.form.paste']}
          visible={modaltype === 'paste'}
          width={600}
          maskClosable={false}
          onOk={this.pasteSubmit}
          onCancel={() => {this.setState({modaltype: ''})}}
          destroyOnClose
        >
          <PasteForm
            dict={this.state.dict}
            wrappedComponentRef={(inst) => this.pasteFormRef = inst}
          />
        </Modal>
        {this.state.loading && <Spin size="large" />}
      </div>
    )
src/templates/subtableconfig/index.scss
@@ -302,6 +302,17 @@
            display: inline-block;
          }
        }
        .copybutton {
          position: absolute;
          right: 10px;
          top: 5px;
          z-index: 2;
          padding: 5px;
          cursor: pointer;
          i {
            font-size: 16px;
          }
        }
      }
      .column-list {
        position: relative;
@@ -381,58 +392,10 @@
          }
        }
      }
      .tab-list {
        position: relative;
        padding: 30px 20px 0px;
        .ant-switch {
          position: absolute;
          right: 20px;
          top: 20px;
        }
        > .ant-row {
          min-height: 47px;
          .page-card {
            position: relative;
            padding: 0px;
            > div {
              padding: 12px 0px 0px;
              cursor: move;
            }
          }
          .ant-tabs-tab {
            .edit {
              position: absolute;
              left: 0;
              top: 0px;
              color: #1890ff;
              cursor: pointer;
              display: none;
            }
            .edit.close {
              left: 20px;
              color: #ff4d4f;
            }
          }
          .ant-tabs-bar {
            min-height: 55px;
          }
          .ant-tabs-tab:hover {
            .edit {
              display: inline-block;
            }
          }
        }
        > .anticon-setting {
          position: absolute;
          font-size: 18px;
          right: 15px;
          top: 30px;
        }
      }
      > .anticon-setting {
        position: absolute;
        font-size: 18px;
        right: 15px;
        right: 7px;
        top: 10px;
      }
    }
src/templates/subtableconfig/settingform/index.jsx
@@ -12,7 +12,8 @@
    tabId: PropTypes.string,
    data: PropTypes.object,
    columns: PropTypes.array,
    usefulFields: PropTypes.array
    usefulFields: PropTypes.array,
    inputSubmit: PropTypes.any     // 回车提交事件
  }
  state = {
@@ -115,6 +116,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { data, dict, tabId, usefulFields } = this.props
    const { getFieldDecorator } = this.props.form
@@ -151,7 +160,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
@@ -207,7 +216,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={this.state.interReadonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType === 'outer' ? <Col span={12}>
@@ -223,7 +232,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType !== 'outer' ? <Col span={12}>
@@ -244,7 +253,7 @@
                    message: formRule.func.maxMessage
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col> : null}
          {interType !== 'outer' ? <Col span={24}>
@@ -307,7 +316,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="ID asc, UID desc" autoComplete="off" />)}
              })(<Input placeholder="ID asc, UID desc" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/tableshare/colspanform/index.jsx
@@ -9,11 +9,8 @@
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    columns: PropTypes.array,
    card: PropTypes.any
  }
  state = {
    card: PropTypes.any,
    inputSubmit: PropTypes.any   // 回车提交事件
  }
  componentDidMount () {
@@ -56,6 +53,14 @@
    })
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const formItemLayout = {
@@ -85,7 +90,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" />)}
              })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
          <Col span={12}>
src/templates/tableshare/columnform/index.jsx
@@ -6,9 +6,10 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    dict: PropTypes.object,     // 字典项
    formlist: PropTypes.any,
    card: PropTypes.any
    card: PropTypes.any,
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -99,6 +100,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -138,7 +147,7 @@
                  },
                  ...rules
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/tableshare/dragelement/index.jsx
@@ -48,12 +48,32 @@
  const copyCard = id => {
    const { card } = findCard(id)
    let copycard = JSON.parse(JSON.stringify(card))
    copycard.uuid = Utils.getuuid()
    copycard.origin = false
    copycard.label = copycard.label + '(copy)'
    copycard.focus = true
    copycard.originCard = card
    let _val = ''
    try {
      copycard.copyType = 'action'
      _val = window.btoa(window.encodeURIComponent(JSON.stringify(copycard)))
    } catch {
      console.warn('Stringify Failure')
      _val = ''
    }
    if (_val) {
      let oInput = document.createElement('input')
      oInput.value = _val
      document.body.appendChild(oInput)
      oInput.select()
      document.execCommand('Copy')
      document.body.removeChild(oInput)
    }
    copyElement(copycard)
  }
src/templates/tableshare/formconfig.js
@@ -1086,6 +1086,13 @@
      initVal: '',
      required: false,
      options: []
    },
    {
      type: 'number',
      key: 'maxRows',
      label: Formdict['header.form.maxRows'],
      initVal: card.maxRows || 6,
      required: false
    }
  ]
}
src/templates/tableshare/gridbtnform/index.jsx
@@ -6,8 +6,9 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object, // 字典项
    card: PropTypes.any
    dict: PropTypes.object,     // 字典项
    card: PropTypes.any,
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -75,6 +76,14 @@
    ]
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -95,7 +104,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/tableshare/pasteform/index.jsx
New file
@@ -0,0 +1,75 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input, notification } from 'antd'
import './index.scss'
const { TextArea } = Input
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object     // 字典项
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      this.props.form.validateFieldsAndScroll((err, values) => {
        if (!err) {
          let _config = values.config
          try {
            _config = JSON.parse(window.decodeURIComponent(window.atob(_config)))
          } catch (e) {
            notification.warning({
              top: 92,
              message: '解析错误',
              duration: 10
            })
            _config = ''
          }
          if (_config) {
            resolve(_config)
          }
        } else {
          reject(err)
        }
      })
    })
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 24 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 24 }
      }
    }
    return (
      <Form {...formItemLayout} className="config-paste-form">
        <Row gutter={24}>
          <Col span={24}>
            <Form.Item label="配置信息" className="textarea">
              {getFieldDecorator('config', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: this.props.dict['form.required.input'] + '配置信息!'
                  }
                ]
              })(<TextArea autosize={{ minRows: 4, maxRows: 8 }} />)}
            </Form.Item>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(MainSearch)
src/templates/tableshare/pasteform/index.scss
New file
@@ -0,0 +1,7 @@
.config-paste-form {
  min-height: 150px;
  .ant-form-item-label {
    text-align: left;
  }
}
src/templates/tableshare/searchform/index.jsx
@@ -9,10 +9,11 @@
class MainSearch extends Component {
  static propTpyes = {
    dict: PropTypes.object,    // 字典项
    formlist: PropTypes.any,   // 表单
    optionLibs: PropTypes.any, // 自定义下拉集
    card: PropTypes.object     // 搜索条件信息
    dict: PropTypes.object,     // 字典项
    formlist: PropTypes.any,    // 表单
    optionLibs: PropTypes.any,  // 自定义下拉集
    card: PropTypes.object,     // 搜索条件信息
    inputSubmit: PropTypes.any  // 回车提交事件
  }
  state = {
@@ -214,6 +215,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -254,7 +263,7 @@
                  },
                  ...rules
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/tableshare/tabform/index.jsx
@@ -8,11 +8,12 @@
class MainTab extends Component {
  static propTpyes = {
    tabs: PropTypes.array,   // 类型
    type: PropTypes.string,  // 类型
    dict: PropTypes.object,  // 字典项
    formlist: PropTypes.any, // 表单
    card: PropTypes.object   // 标签页信息
    tabs: PropTypes.array,       // 可关联标签集
    type: PropTypes.string,      // 类型
    dict: PropTypes.object,      // 字典项
    formlist: PropTypes.any,     // 表单
    card: PropTypes.object,      // 标签页信息
    inputSubmit: PropTypes.any   // 回车提交事件
  }
  state = {
@@ -26,10 +27,8 @@
    const { formlist } = this.props
    let type = formlist.filter(cell => cell.key === 'type')[0].initVal
    // let _initval = formlist.filter(cell => cell.key === 'linkTab')[0].initVal
    let _tabs = this.props.tabs.filter(tab => tab.type === type)
    // let initTab = _tabs.filter(tab => tab.uuid === _initval)[0]
    this.setState({
      formlist: formlist.map(item => {
@@ -41,9 +40,6 @@
            },
            ..._tabs
          ]
          // if (!initTab) {
          //   item.initVal = ''
          // }
        }
        return item
@@ -101,6 +97,14 @@
    }
  }
  handleSubmit = (e) => {
    e.preventDefault()
    if (this.props.inputSubmit) {
      this.props.inputSubmit()
    }
  }
  getFields() {
    const { getFieldDecorator } = this.props.form
    const fields = []
@@ -124,7 +128,7 @@
                    message: formRule.input.message
                  }
                ]
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} />)}
              })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)}
            </Form.Item>
          </Col>
        )
src/templates/tableshare/verifycard/index.jsx
@@ -423,10 +423,10 @@
        if (res.status) {
          let _LongParam = ''
          if (res.LongParam) {
            _LongParam = window.decodeURIComponent(window.atob(res.LongParam))
            try {
              _LongParam = JSON.parse(_LongParam)
              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
            } catch (e) {
              console.warn('Parse Failure')
              _LongParam = ''
            }
          }
@@ -953,6 +953,10 @@
        message: '执行成功!',
        duration: 2
      })
    } else if (errorType === 'Y') {
      Modal.success({
        title: '执行成功!'
      })
    } else if (errorType === 'F') {
      notification.error({
        className: 'notification-custom-error',
@@ -1148,8 +1152,10 @@
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                    <span className="errorval"> Y </span>
                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                      查看
                    </Button>
                  </Form.Item>
                </Col>
              </Row>
@@ -1203,6 +1209,14 @@
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                  </Form.Item>
                </Col>
              </Row>
            </Form>
          </TabPane>
        </Tabs>
src/templates/tableshare/verifycardexcelin/index.jsx
@@ -400,6 +400,10 @@
        message: '执行成功!',
        duration: 2
      })
    } else if (errorType === 'Y') {
      Modal.success({
        title: '执行成功!'
      })
    } else if (errorType === 'F') {
      notification.error({
        className: 'notification-custom-error',
@@ -539,8 +543,10 @@
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                    <span className="errorval"> Y </span>
                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                      查看
                    </Button>
                  </Form.Item>
                </Col>
              </Row>
@@ -594,6 +600,14 @@
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                  </Form.Item>
                </Col>
              </Row>
            </Form>
          </TabPane>
        </Tabs>
src/templates/tableshare/verifycardexcelout/index.jsx
@@ -147,6 +147,10 @@
        message: '执行成功!',
        duration: 2
      })
    } else if (errorType === 'Y') {
      Modal.success({
        title: '执行成功!'
      })
    } else if (errorType === 'F') {
      notification.error({
        className: 'notification-custom-error',
@@ -228,8 +232,10 @@
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                    <span className="errorval"> Y </span>
                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                      查看
                    </Button>
                  </Form.Item>
                </Col>
              </Row>
@@ -283,6 +289,14 @@
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                  </Form.Item>
                </Col>
              </Row>
            </Form>
          </TabPane>
        </Tabs>
src/templates/tableshare/verifycardprint/index.jsx
@@ -102,6 +102,10 @@
        message: '执行成功!',
        duration: 2
      })
    } else if (errorType === 'Y') {
      Modal.success({
        title: '执行成功!'
      })
    } else if (errorType === 'F') {
      notification.error({
        className: 'notification-custom-error',
@@ -243,8 +247,10 @@
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                    <span className="errorval"> Y </span>
                    <Button onClick={() => {this.showError('Y')}} type="primary" size="small">
                      查看
                    </Button>
                  </Form.Item>
                </Col>
              </Row>
@@ -298,6 +304,14 @@
                  </Form.Item>
                </Col>
              </Row>
              <Row gutter={24}>
                <Col offset={6} span={6}>
                  <Form.Item label={'提示编码'}>
                    <span className="errorval"> -1 </span>
                    不提示
                  </Form.Item>
                </Col>
              </Row>
            </Form>
          </TabPane>
        </Tabs>
src/templates/ushare/modalform/index.jsx
@@ -61,7 +61,7 @@
    } else if (type === 'fileupload') {
      _options = ['label', 'field', 'type', 'readonly', 'required', 'readin', 'fieldlength']
    } else if (type === 'textarea') {
      _options = [..._options, 'fieldlength']
      _options = [..._options, 'fieldlength', 'maxRows']
    } else if (type === 'text') {
      _options = [..._options, 'fieldlength', 'regular']
    }
@@ -132,7 +132,7 @@
      } else if (value === 'fileupload') {
        _options = ['label', 'field', 'type', 'readonly', 'required', 'readin', 'fieldlength']
      } else if (value === 'textarea') {
        _options = [..._options, 'fieldlength']
        _options = [..._options, 'fieldlength', 'maxRows']
      } else if (value === 'text') {
        _options = [..._options, 'fieldlength', 'regular']
      }
@@ -325,7 +325,7 @@
                      message: this.props.dict['form.required.input'] + item.label + '!'
                    }
                  ]
                })(<InputNumber min={0} max={18} precision={0} onPressEnter={this.handleSubmit} />)}
                })(<InputNumber min={0} max={18} precision={0} />)}
              </Form.Item>
            </Col>
          )
@@ -341,7 +341,23 @@
                      message: this.props.dict['form.required.input'] + item.label + '!'
                    }
                  ]
                })(<InputNumber min={1} precision={0} onPressEnter={this.handleSubmit} />)}
                })(<InputNumber min={1} precision={0} />)}
              </Form.Item>
            </Col>
          )
        } else if (item.key === 'maxRows') {
          fields.push(
            <Col span={12} key={index}>
              <Form.Item label={item.label}>
                {getFieldDecorator(item.key, {
                  initialValue: item.initVal,
                  rules: [
                    {
                      required: !!item.required,
                      message: this.props.dict['form.required.input'] + item.label + '!'
                    }
                  ]
                })(<InputNumber min={2} max={100} precision={0} />)}
              </Form.Item>
            </Col>
          )
@@ -357,7 +373,7 @@
                      message: this.props.dict['form.required.input'] + item.label + '!'
                    }
                  ]
                })(<InputNumber onPressEnter={this.handleSubmit} />)}
                })(<InputNumber />)}
              </Form.Item>
            </Col>
          )
src/views/login/loginform.jsx
@@ -62,6 +62,7 @@
      try {
        _user = JSON.parse(window.decodeURIComponent(window.atob(_user)))
      } catch {
        console.warn('Parse Failure')
        _user = ''
      }
    }