From e603c97dbe7a4f1dbd6445e00383ed651182e0fe Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 03 三月 2020 17:09:11 +0800
Subject: [PATCH] 2020-03-03

---
 src/tabviews/formtab/index.jsx                        |    4 
 src/views/login/loginform.jsx                         |    1 
 src/templates/tableshare/columnform/index.jsx         |   15 
 src/tabviews/formtab/formgroup/index.jsx              |   57 +++
 src/templates/formtabconfig/index.jsx                 |   92 ++++-
 src/templates/tableshare/pasteform/index.jsx          |   75 ++++
 src/templates/comtableconfig/index.jsx                |  101 ++++-
 src/templates/tableshare/gridbtnform/index.jsx        |   15 
 src/tabviews/tableshare/actionList/index.jsx          |    8 
 src/templates/formtabconfig/dragelement/index.jsx     |   14 
 src/templates/modalconfig/index.jsx                   |    8 
 src/templates/formtabconfig/groupform/index.jsx       |   17 
 src/templates/tableshare/pasteform/index.scss         |    7 
 src/templates/tableshare/tabform/index.jsx            |   26 
 src/tabviews/subtable/index.jsx                       |    4 
 src/templates/formtabconfig/dragelement/card.jsx      |    7 
 src/templates/tableshare/searchform/index.jsx         |   19 
 src/tabviews/subtabtable/index.jsx                    |    4 
 src/locales/zh-CN/comtable.js                         |    2 
 src/tabviews/commontable/index.jsx                    |    4 
 src/templates/subtableconfig/settingform/index.jsx    |   21 
 src/templates/tableshare/verifycard/index.jsx         |   22 +
 src/locales/en-US/comtable.js                         |    2 
 src/templates/formtabconfig/index.scss                |   10 
 src/templates/subtableconfig/actionform/index.jsx     |   21 
 src/tabviews/tableshare/mutilform/index.jsx           |    2 
 src/templates/comtableconfig/actionform/index.jsx     |   21 
 src/templates/modalconfig/index.scss                  |    2 
 src/templates/formtabconfig/settingform/index.jsx     |   19 
 src/templates/tableshare/dragelement/index.jsx        |   20 +
 src/templates/modalconfig/settingform/index.jsx       |   15 
 src/templates/tableshare/verifycardexcelout/index.jsx |   18 +
 src/templates/tableshare/verifycardprint/index.jsx    |   18 +
 src/tabviews/managetable/index.jsx                    |    4 
 src/components/sidemenu/editthdmenu/index.jsx         |   17 
 src/templates/formtabconfig/actionform/index.jsx      |   19 
 src/templates/subtableconfig/index.jsx                |   74 ++++
 src/templates/comtableconfig/settingform/index.jsx    |   21 
 src/templates/subtableconfig/index.scss               |   61 ---
 src/templates/tableshare/colspanform/index.jsx        |   17 
 src/templates/comtableconfig/index.scss               |    7 
 src/templates/modalconfig/groupform/index.jsx         |   13 
 src/templates/tableshare/verifycardexcelin/index.jsx  |   18 +
 src/templates/tableshare/formconfig.js                |    7 
 src/templates/ushare/modalform/index.jsx              |   26 +
 45 files changed, 726 insertions(+), 229 deletions(-)

diff --git a/src/components/sidemenu/editthdmenu/index.jsx b/src/components/sidemenu/editthdmenu/index.jsx
index eaf40a6..10f2c00 100644
--- a/src/components/sidemenu/editthdmenu/index.jsx
+++ b/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 = ''
               }
             }
diff --git a/src/locales/en-US/comtable.js b/src/locales/en-US/comtable.js
index c043eba..b54c62b 100644
--- a/src/locales/en-US/comtable.js
+++ b/src/locales/en-US/comtable.js
@@ -222,6 +222,8 @@
   'header.form.func.print': '鎵撳嵃',
   'header.form.execMode': '鎵ц鏂瑰紡',
   'header.form.thawbutton': '瑙e喕鎸夐挳',
+  'header.form.maxRows': '鏈�澶ц鏁�',
+  'header.form.paste': '绮樿创',
   'header.modal.form.edit': '琛ㄥ崟-缂栬緫',
   'header.modal.search.edit': '鎼滅储鏉′欢-缂栬緫',
   'header.modal.action.edit': '鎸夐挳-缂栬緫',
diff --git a/src/locales/zh-CN/comtable.js b/src/locales/zh-CN/comtable.js
index bd04879..7069ce7 100644
--- a/src/locales/zh-CN/comtable.js
+++ b/src/locales/zh-CN/comtable.js
@@ -222,6 +222,8 @@
   'header.form.func.print': '鎵撳嵃',
   'header.form.execMode': '鎵ц鏂瑰紡',
   'header.form.thawbutton': '瑙e喕鎸夐挳',
+  'header.form.maxRows': '鏈�澶ц鏁�',
+  'header.form.paste': '绮樿创',
   'header.modal.form.edit': '琛ㄥ崟-缂栬緫',
   'header.modal.search.edit': '鎼滅储鏉′欢-缂栬緫',
   'header.modal.action.edit': '鎸夐挳-缂栬緫',
diff --git a/src/tabviews/commontable/index.jsx b/src/tabviews/commontable/index.jsx
index 704f247..dbdb145 100644
--- a/src/tabviews/commontable/index.jsx
+++ b/src/tabviews/commontable/index.jsx
@@ -81,9 +81,9 @@
       let config = ''
 
       try { // 閰嶇疆淇℃伅瑙f瀽
-        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 = ''
       }
 
diff --git a/src/tabviews/formtab/formgroup/index.jsx b/src/tabviews/formtab/formgroup/index.jsx
index 06f6a5a..96d7240 100644
--- a/src/tabviews/formtab/formgroup/index.jsx
+++ b/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>
         )
diff --git a/src/tabviews/formtab/index.jsx b/src/tabviews/formtab/index.jsx
index 1ffd69f..0e02983 100644
--- a/src/tabviews/formtab/index.jsx
+++ b/src/tabviews/formtab/index.jsx
@@ -67,9 +67,9 @@
       let config = ''
 
       try { // 閰嶇疆淇℃伅瑙f瀽
-        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 = ''
       }
 
diff --git a/src/tabviews/managetable/index.jsx b/src/tabviews/managetable/index.jsx
index 89a9c42..5f2cdf3 100644
--- a/src/tabviews/managetable/index.jsx
+++ b/src/tabviews/managetable/index.jsx
@@ -82,9 +82,9 @@
       let config = ''
 
       try { // 閰嶇疆淇℃伅瑙f瀽
-        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 = ''
       }
 
diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index 77b92a6..7c4d767 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -84,9 +84,9 @@
       let config = ''
 
       try { // 閰嶇疆淇℃伅瑙f瀽
-        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 = ''
       }
 
diff --git a/src/tabviews/subtabtable/index.jsx b/src/tabviews/subtabtable/index.jsx
index 7a24d89..cafcb9f 100644
--- a/src/tabviews/subtabtable/index.jsx
+++ b/src/tabviews/subtabtable/index.jsx
@@ -64,9 +64,9 @@
       let config = ''
 
       try { // 閰嶇疆淇℃伅瑙f瀽
-        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 = ''
       }
 
diff --git a/src/tabviews/tableshare/actionList/index.jsx b/src/tabviews/tableshare/actionList/index.jsx
index 4a49773..8e2e4a1 100644
--- a/src/tabviews/tableshare/actionList/index.jsx
+++ b/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 = ''
           }
         }
diff --git a/src/tabviews/tableshare/mutilform/index.jsx b/src/tabviews/tableshare/mutilform/index.jsx
index b3f3e45..0fa09e1 100644
--- a/src/tabviews/tableshare/mutilform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/comtableconfig/actionform/index.jsx b/src/templates/comtableconfig/actionform/index.jsx
index bc36764..92a7802 100644
--- a/src/templates/comtableconfig/actionform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/comtableconfig/index.jsx b/src/templates/comtableconfig/index.jsx
index 4710693..7fb6751 100644
--- a/src/templates/comtableconfig/index.jsx
+++ b/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 @@
               // 瑙f瀽閰嶇疆锛屼慨鏀规ā鎬佹鏍囬鍚嶇О
               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 @@
               // 瑙f瀽閰嶇疆锛屼慨鏀规ā鎬佹鏍囬鍚嶇О
               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>
     )
diff --git a/src/templates/comtableconfig/index.scss b/src/templates/comtableconfig/index.scss
index d1a0239..064a25d 100644
--- a/src/templates/comtableconfig/index.scss
+++ b/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;
diff --git a/src/templates/comtableconfig/settingform/index.jsx b/src/templates/comtableconfig/settingform/index.jsx
index 33c6b40..84d451b 100644
--- a/src/templates/comtableconfig/settingform/index.jsx
+++ b/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}>
diff --git a/src/templates/formtabconfig/actionform/index.jsx b/src/templates/formtabconfig/actionform/index.jsx
index bb9b201..c1ed1b0 100644
--- a/src/templates/formtabconfig/actionform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/formtabconfig/dragelement/card.jsx b/src/templates/formtabconfig/dragelement/card.jsx
index 9bf2c1f..00f0036 100644
--- a/src/templates/formtabconfig/dragelement/card.jsx
+++ b/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}>
diff --git a/src/templates/formtabconfig/dragelement/index.jsx b/src/templates/formtabconfig/dragelement/index.jsx
index 1b0d594..337f491 100644
--- a/src/templates/formtabconfig/dragelement/index.jsx
+++ b/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}
           />
diff --git a/src/templates/formtabconfig/groupform/index.jsx b/src/templates/formtabconfig/groupform/index.jsx
index 139ba52..4689d8e 100644
--- a/src/templates/formtabconfig/groupform/index.jsx
+++ b/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}>
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index 31b1c27..0f47aef 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/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>
diff --git a/src/templates/formtabconfig/index.scss b/src/templates/formtabconfig/index.scss
index fea4310..04cf656 100644
--- a/src/templates/formtabconfig/index.scss
+++ b/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;
diff --git a/src/templates/formtabconfig/settingform/index.jsx b/src/templates/formtabconfig/settingform/index.jsx
index 2d163bd..7dafe72 100644
--- a/src/templates/formtabconfig/settingform/index.jsx
+++ b/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}>
diff --git a/src/templates/modalconfig/groupform/index.jsx b/src/templates/modalconfig/groupform/index.jsx
index 3fedb7b..426ba3c 100644
--- a/src/templates/modalconfig/groupform/index.jsx
+++ b/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}>
diff --git a/src/templates/modalconfig/index.jsx b/src/templates/modalconfig/index.jsx
index 62b8d6a..803641a 100644
--- a/src/templates/modalconfig/index.jsx
+++ b/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>
diff --git a/src/templates/modalconfig/index.scss b/src/templates/modalconfig/index.scss
index 2970012..c29a540 100644
--- a/src/templates/modalconfig/index.scss
+++ b/src/templates/modalconfig/index.scss
@@ -285,7 +285,7 @@
       > .anticon-setting {
         position: absolute;
         font-size: 16px;
-        right: 10px;
+        right: 15px;
         top: 10px;
       }
     }
diff --git a/src/templates/modalconfig/settingform/index.jsx b/src/templates/modalconfig/settingform/index.jsx
index d1d0e58..f019104 100644
--- a/src/templates/modalconfig/settingform/index.jsx
+++ b/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}>
diff --git a/src/templates/subtableconfig/actionform/index.jsx b/src/templates/subtableconfig/actionform/index.jsx
index 415be65..1e1c9e9 100644
--- a/src/templates/subtableconfig/actionform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index e5e7ccd..6cc9aab 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/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 @@
               // 瑙f瀽閰嶇疆锛屼慨鏀规ā鎬佹鏍囬鍚嶇О
               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>
     )
diff --git a/src/templates/subtableconfig/index.scss b/src/templates/subtableconfig/index.scss
index a144c1d..989b573 100644
--- a/src/templates/subtableconfig/index.scss
+++ b/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;
       }
     }
diff --git a/src/templates/subtableconfig/settingform/index.jsx b/src/templates/subtableconfig/settingform/index.jsx
index 8b4cc1b..0754355 100644
--- a/src/templates/subtableconfig/settingform/index.jsx
+++ b/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}>
diff --git a/src/templates/tableshare/colspanform/index.jsx b/src/templates/tableshare/colspanform/index.jsx
index 11a6ed7..2a5ee0d 100644
--- a/src/templates/tableshare/colspanform/index.jsx
+++ b/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}>
diff --git a/src/templates/tableshare/columnform/index.jsx b/src/templates/tableshare/columnform/index.jsx
index acd1c18..16991dc 100644
--- a/src/templates/tableshare/columnform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/tableshare/dragelement/index.jsx b/src/templates/tableshare/dragelement/index.jsx
index 12a0f89..7737c7a 100644
--- a/src/templates/tableshare/dragelement/index.jsx
+++ b/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)
   }
diff --git a/src/templates/tableshare/formconfig.js b/src/templates/tableshare/formconfig.js
index 41a2b46..1f790b1 100644
--- a/src/templates/tableshare/formconfig.js
+++ b/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
     }
   ]
 }
\ No newline at end of file
diff --git a/src/templates/tableshare/gridbtnform/index.jsx b/src/templates/tableshare/gridbtnform/index.jsx
index a1bb535..f904918 100644
--- a/src/templates/tableshare/gridbtnform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/tableshare/pasteform/index.jsx b/src/templates/tableshare/pasteform/index.jsx
new file mode 100644
index 0000000..7cdfc58
--- /dev/null
+++ b/src/templates/tableshare/pasteform/index.jsx
@@ -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: '瑙f瀽閿欒',
+              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)
\ No newline at end of file
diff --git a/src/templates/tableshare/pasteform/index.scss b/src/templates/tableshare/pasteform/index.scss
new file mode 100644
index 0000000..4c3aea9
--- /dev/null
+++ b/src/templates/tableshare/pasteform/index.scss
@@ -0,0 +1,7 @@
+.config-paste-form {
+  min-height: 150px;
+
+  .ant-form-item-label {
+    text-align: left;
+  }
+}
\ No newline at end of file
diff --git a/src/templates/tableshare/searchform/index.jsx b/src/templates/tableshare/searchform/index.jsx
index 1e3d35d..51a0c5b 100644
--- a/src/templates/tableshare/searchform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/tableshare/tabform/index.jsx b/src/templates/tableshare/tabform/index.jsx
index c09e01c..64b356a 100644
--- a/src/templates/tableshare/tabform/index.jsx
+++ b/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>
         )
diff --git a/src/templates/tableshare/verifycard/index.jsx b/src/templates/tableshare/verifycard/index.jsx
index c93912e..6ad62f0 100644
--- a/src/templates/tableshare/verifycard/index.jsx
+++ b/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>
diff --git a/src/templates/tableshare/verifycardexcelin/index.jsx b/src/templates/tableshare/verifycardexcelin/index.jsx
index 7c57b0d..d31432a 100644
--- a/src/templates/tableshare/verifycardexcelin/index.jsx
+++ b/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>
diff --git a/src/templates/tableshare/verifycardexcelout/index.jsx b/src/templates/tableshare/verifycardexcelout/index.jsx
index 66a8e26..24186f6 100644
--- a/src/templates/tableshare/verifycardexcelout/index.jsx
+++ b/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>
diff --git a/src/templates/tableshare/verifycardprint/index.jsx b/src/templates/tableshare/verifycardprint/index.jsx
index 07956b3..484761d 100644
--- a/src/templates/tableshare/verifycardprint/index.jsx
+++ b/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>
diff --git a/src/templates/ushare/modalform/index.jsx b/src/templates/ushare/modalform/index.jsx
index 9771c0b..2e94ac3 100644
--- a/src/templates/ushare/modalform/index.jsx
+++ b/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>
           )
diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx
index 0b47002..7540a4a 100644
--- a/src/views/login/loginform.jsx
+++ b/src/views/login/loginform.jsx
@@ -62,6 +62,7 @@
       try {
         _user = JSON.parse(window.decodeURIComponent(window.atob(_user)))
       } catch {
+        console.warn('Parse Failure')
         _user = ''
       }
     }

--
Gitblit v1.8.0