From abf582fbe18c20ab4f01458a9209878c77fea9c0 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 15 一月 2020 18:59:52 +0800
Subject: [PATCH] 2020-01-15

---
 src/templates/subtableconfig/index.jsx | 1117 ++++++++++++++--------------------------------------------
 1 files changed, 277 insertions(+), 840 deletions(-)

diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index 1735682..e2196ff 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/src/templates/subtableconfig/index.jsx
@@ -6,7 +6,13 @@
 import HTML5Backend from 'react-dnd-html5-backend'
 import { Button, Card, Modal, Collapse, notification, Spin, Select, List, Icon, Empty, Switch, Tooltip } from 'antd'
 import moment from 'moment'
+
 import Api from '@/api'
+import zhCN from '@/locales/zh-CN/comtable.js'
+import enUS from '@/locales/en-US/comtable.js'
+import Utils from '@/utils/utils.js'
+import { getSearchForm, getActionForm, getColumnForm } from '@/templates/tableshare/formconfig'
+
 import ActionForm from './actionform'
 import SettingForm from './settingform'
 import SearchForm from '@/templates/tableshare/searchform'
@@ -18,9 +24,6 @@
 import VerifyCard from '@/templates/tableshare/verifycard'
 import MenuForm from '@/templates/tableshare/menuform'
 import SourceElement from '@/templates/tableshare/dragelement/source'
-import zhCN from '@/locales/zh-CN/comtable.js'
-import enUS from '@/locales/en-US/comtable.js'
-import Utils from '@/utils/utils.js'
 import Source from './source'
 import './index.scss'
 
@@ -50,10 +53,8 @@
     menuformlist: null,      // 鍩烘湰淇℃伅琛ㄥ崟瀛楁
     formlist: null,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪琛ㄥ崟瀛楁
     formtemp: '',            // 琛ㄥ崟绫诲瀷锛屾樉绀哄垪銆佹寜閽�佹悳绱㈡潯浠�
+    modaltype: '',           // 妯℃�佹绫诲瀷锛屾帶鍒舵ā鎬佹鏄剧ず
     card: null,              // 缂栬緫鍏冪礌
-    searchloading: false,    // 鎼滅储鏉′欢鍔犺浇涓�
-    actionloading: false,    // 鎸夐挳鍔犺浇涓�
-    columnsloading: false,   // 鏄剧ず鍒楀姞杞戒腑
     menuloading: false,      // 鑿滃崟淇濆瓨涓�
     menucloseloading: false, // 鑿滃崟鍏抽棴鏃讹紝閫夋嫨淇濆瓨
     loading: false,          // 鍔犺浇涓紝椤甸潰spin
@@ -64,6 +65,7 @@
     originConfig: null,      // 鍘熼厤缃�
     originActions: null,     // 鍘熷鎸夐挳淇℃伅锛屼娇鐢ㄥ凡鏈夌敤鎴锋ā鏉�
     delActions: [],          // 鍒犻櫎鎸夐挳鍒楄〃
+    copyActions: [],         // 澶嶅埗鎸夐挳缁�
     funcLoading: false,      // 瀛樺偍杩囩▼鍒涘缓涓�
     showColumnName: false,   // 鏄剧ず鍒楀瓧娈靛悕鎺у埗
     tabviews: [],            // 鎵�鏈夋爣绛鹃〉
@@ -267,682 +269,79 @@
     }
   }
 
+  /**
+   * @description 鍏冪礌娣诲姞鎴栨嫋鍔ㄦ椂椤哄簭鍙樺寲
+   */
   handleList = (type, list, card) => {
     const { config } = this.state
 
     if (list.length > config[type].length) {
       list = list.filter(item => !item.origin)
 
-      this.setState({
-        [type + 'loading']: true,
-        config: {...config, [type]: list }
-      }, () => {
-        // 鍒锋柊瀵瑰簲鐨勯厤缃俊鎭�
-        this.setState({
-          [type + 'loading']: false
-        })
-
-        if (type === 'search') {
-          this.handleSearch(card)
-        } else if (type === 'action') {
-          this.handleAction(card)
-        } else if (type === 'columns') {
-          this.handleColumn(card)
-        }
-      })
-    } else {
-      this.setState({config: {...config, [type]: list}})
+      if (type === 'search') {
+        this.handleSearch(card)
+      } else if (type === 'action') {
+        this.handleAction(card)
+      } else if (type === 'columns') {
+        this.handleColumn(card)
+      }
     }
+
+    this.setState({config: {...config, [type]: list}})
   }
 
+  /**
+   * @description 鎼滅储鏉′欢缂栬緫锛岃幏鍙栨悳绱㈡潯浠惰〃鍗曚俊鎭�
+   */
   handleSearch = (card) => {
     this.setState({
-      visible: true,
-      formtemp: 'search',
-      modalTitle: '缂栬緫-鎼滅储鏉′欢',
+      modaltype: 'search',
       card: card,
-      formlist: [
-        {
-          type: 'text',
-          key: 'label',
-          label: this.state.dict['header.form.name'],
-          initVal: card.label,
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'field',
-          label: this.state.dict['header.form.field'],
-          initVal: card.field,
-          tooltip: '瀛楁鍚嶅彲浠ヤ娇鐢ㄩ�楀彿鍒嗛殧锛岃繘琛屽瀛楁缁煎悎鎼滅储锛屾敞锛氱患鍚堟悳绱粎鍦ㄦ枃鏈被鍨嬫椂鏈夋晥',
-          tooltipClass: 'middle',
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'select',
-          key: 'type',
-          label: this.state.dict['header.form.type'],
-          initVal: card.type,
-          required: true,
-          options: [{
-            value: 'text',
-            text: this.state.dict['header.form.text']
-          }, {
-            value: 'select',
-            text: this.state.dict['header.form.select']
-          }, {
-            value: 'multiselect',
-            text: this.state.dict['header.form.multiselect']
-          }, {
-            value: 'link',
-            text: this.state.dict['header.form.link']
-          }, {
-            value: 'date',
-            text: this.state.dict['header.form.dateday']
-          }, {
-            value: 'dateweek',
-            text: this.state.dict['header.form.dateweek']
-          }, {
-            value: 'datemonth',
-            text: this.state.dict['header.form.datemonth']
-          }, {
-            value: 'daterange',
-            text: this.state.dict['header.form.daterange']
-          }]
-        },
-        {
-          type: 'text',
-          key: 'initval',
-          label: this.state.dict['header.form.initval'],
-          initVal: card.initval,
-          required: false
-        },
-        {
-          type: 'radio',
-          key: 'resourceType',
-          label: this.state.dict['header.form.resourceType'],
-          initVal: card.resourceType || '0',
-          required: true,
-          options: [{
-            value: '0',
-            text: this.state.dict['header.form.custom']
-          }, {
-            value: '1',
-            text: this.state.dict['header.form.datasource']
-          }]
-        },
-        {
-          type: 'radio',
-          key: 'setAll',
-          label: this.state.dict['header.form.setAll'],
-          initVal: card.setAll || 'false',
-          options: [{
-            value: 'true',
-            text: this.state.dict['header.form.true']
-          }, {
-            value: 'false',
-            text: this.state.dict['header.form.false']
-          }]
-        },
-        {
-          type: 'textarea',
-          key: 'dataSource',
-          label: this.state.dict['header.form.datasource'],
-          initVal: card.dataSource || '',
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'options',
-          key: 'options',
-          label: '',
-          initVal: card.options || [],
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'linkField',
-          label: this.state.dict['header.form.linkField'],
-          initVal: card.linkField || '',
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'valueField',
-          label: this.state.dict['header.form.valueField'],
-          initVal: card.valueField || '',
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'valueText',
-          label: this.state.dict['header.form.valueText'],
-          initVal: card.valueText || '',
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'orderBy',
-          label: this.state.dict['header.form.orderBy'],
-          initVal: card.orderBy || '',
-          required: false,
-          readonly: false
-        },
-        {
-          type: 'select',
-          key: 'orderType',
-          label: this.state.dict['header.form.orderType'],
-          initVal: card.orderType || 'asc',
-          options: [{
-            value: 'asc',
-            text: this.state.dict['header.form.asc']
-          }, {
-            value: 'desc',
-            text: this.state.dict['header.form.desc']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'match',
-          label: this.state.dict['header.form.match'],
-          initVal: card.match || 'like',
-          required: true,
-          options: [{
-            value: 'like',
-            text: 'like'
-          }, {
-            value: 'equal',
-            text: 'equal'
-          }, {
-            value: 'greater',
-            text: '>'
-          }, {
-            value: 'less',
-            text: '<'
-          }, {
-            value: 'greaterequal',
-            text: '>='
-          }]
-        },
-        {
-          type: 'select',
-          key: 'display',
-          label: this.state.dict['header.form.display'],
-          initVal: card.display || 'dropdown',
-          required: true,
-          options: [{
-            value: 'dropdown',
-            text: this.state.dict['header.form.dropdown']
-          }, {
-            value: 'button',
-            text: this.state.dict['header.form.button']
-          }]
-        }
-      ]
+      formlist: getSearchForm(card)
     })
   }
 
+  /**
+   * @description 鎸夐挳缂栬緫锛岃幏鍙栨寜閽〃鍗曚俊鎭�
+   */
   handleAction = (card, type) => {
     let ableField = this.props.permFuncField.join(', ')
+    let functip = <div>
+      <p style={{marginBottom: '5px'}}>{this.state.dict['header.modal.func.innerface'].replace('@ableField', ableField)}</p>
+      <p>{this.state.dict['header.modal.func.outface']}</p>
+    </div>
+
     this.setState({
-      visible: true,
-      formtemp: 'action',
-      modalTitle: type === 'copy' ? '澶嶅埗-鎸夐挳' : '缂栬緫-鎸夐挳',
+      modaltype: type === 'copy' ? 'actionCopy' : 'actionEdit',
       card: card,
-      formlist: [
-        {
-          type: 'text',
-          key: 'label',
-          label: this.state.dict['header.form.name'],
-          initVal: card.label,
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'select',
-          key: 'OpenType',
-          label: this.state.dict['header.form.openType'],
-          initVal: card.OpenType,
-          required: true,
-          options: [{
-            value: 'pop',
-            text: this.state.dict['header.form.popform']
-          }, {
-            value: 'prompt',
-            text: this.state.dict['header.form.prompt']
-          }, {
-            value: 'exec',
-            text: this.state.dict['header.form.exec']
-          }, {
-            value: 'excelIn',
-            text: this.state.dict['header.form.excelIn']
-          }, {
-            value: 'excelOut',
-            text: this.state.dict['header.form.excelOut']
-          }, {
-            value: 'popview',
-            text: this.state.dict['header.form.popview']
-          }]
-        }, {
-          type: 'select',
-          key: 'tabType',
-          label: this.state.dict['header.form.tabType'],
-          initVal: card.tabType || 'SubTable',
-          required: true,
-          options: [{
-            value: 'SubTable',
-            text: this.state.dict['header.menu.tab.subtable']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'linkTab',
-          label: '鍏宠仈鏍囩',
-          initVal: card.linkTab || '',
-          required: false,
-          options: []
-        },
-        {
-          type: 'radio',
-          key: 'intertype',
-          label: this.state.dict['header.form.intertype'],
-          initVal: card.intertype,
-          required: true,
-          options: [{
-            value: 'inner',
-            text: this.state.dict['header.form.interface.inner']
-          }, {
-            value: 'outer',
-            text: this.state.dict['header.form.interface.outer']
-          }]
-        },
-        {
-          type: 'text',
-          key: 'innerFunc',
-          label: this.state.dict['header.form.innerFunc'],
-          initVal: card.innerFunc,
-          tooltip: <div>
-            <p>鍐呴儴鎺ュ彛: 鍙嚜瀹氫箟鏁版嵁澶勭悊鍑芥暟锛屽嚱鏁板悕绉伴渶浠ableField}绛夊瓧绗﹀紑濮嬶紱鏈缃椂浼氳皟鐢ㄧ郴缁熷嚱鏁帮紝浣跨敤绯荤粺鍑芥暟闇�瀹屽杽鏁版嵁婧愬強鎿嶄綔绫诲瀷;</p>
-            <p>澶栭儴鎺ュ彛: 鍙嚜瀹氫箟鏁版嵁澶勭悊鍑芥暟锛屾彁浜ゆ暟鎹粡杩囧唴閮ㄥ嚱鏁板鐞嗗悗锛屼紶鍏ュ閮ㄦ帴鍙o紝鏈缃椂锛屾暟鎹細鐩存帴浼犲叆澶栭儴鎺ュ彛銆�</p>
-          </div>,
-          fields: this.props.permFuncField,
-          tooltipClass: 'middle',
-          required: false,
-          readonly: false
-        },
-        {
-          type: 'radio',
-          key: 'sysInterface',
-          label: this.state.dict['header.form.sysInterface'],
-          initVal: card.sysInterface || 'false',
-          required: true,
-          options: [{
-            value: 'true',
-            text: this.state.dict['header.form.true']
-          }, {
-            value: 'false',
-            text: this.state.dict['header.form.false']
-          }]
-        },
-        {
-          type: 'text',
-          key: 'outerFunc',
-          label: this.state.dict['header.form.outerFunc'],
-          initVal: card.outerFunc,
-          required: false,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'interface',
-          label: this.state.dict['header.form.interface'],
-          initVal: card.sysInterface === 'true' ? (window.GLOB.mainSystemApi || window.GLOB.subSystemApi) : card.interface,
-          required: true,
-          readonly: card.sysInterface === 'true'
-        },
-        {
-          type: 'text',
-          key: 'callbackFunc',
-          label: this.state.dict['header.form.callbackFunc'],
-          initVal: card.callbackFunc,
-          required: false,
-          readonly: false
-        },
-        {
-          type: 'select',
-          key: 'position',
-          label: this.state.dict['header.form.position'],
-          initVal: card.position || 'toolbar',
-          required: true,
-          options: [{
-            value: 'toolbar',
-            text: this.state.dict['header.form.toolbar']
-          }, {
-            value: 'grid',
-            text: this.state.dict['header.form.grid']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'Ot',
-          label: this.state.dict['header.form.isRequired'],
-          initVal: card.Ot || 'requiredSgl',
-          required: true,
-          options: []
-        },
-        {
-          type: 'select',
-          key: 'execSuccess',
-          label: this.state.dict['header.form.execSuccess'],
-          initVal: card.execSuccess || 'never',
-          required: true,
-          options: [{
-            value: 'never',
-            text: this.state.dict['header.form.refresh.never']
-          }, {
-            value: 'grid',
-            text: this.state.dict['header.form.refresh.grid']
-          }, {
-            value: 'view',
-            text: this.state.dict['header.form.refresh.view']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'execError',
-          label: this.state.dict['header.form.execError'],
-          initVal: card.execError || 'never',
-          required: true,
-          options: [{
-            value: 'never',
-            text: this.state.dict['header.form.refresh.never']
-          }, {
-            value: 'grid',
-            text: this.state.dict['header.form.refresh.grid']
-          }, {
-            value: 'view',
-            text: this.state.dict['header.form.refresh.view']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'popClose',
-          label: this.state.dict['header.form.popClose'],
-          initVal: card.popClose || 'never',
-          required: true,
-          options: [{
-            value: 'never',
-            text: this.state.dict['header.form.refresh.never']
-          }, {
-            value: 'maingrid',
-            text: this.state.dict['header.form.refresh.maingrid']
-          }, {
-            value: 'subgrid',
-            text: this.state.dict['header.form.refresh.subgrid']
-          }]
-        },
-        {
-          type: 'select',
-          key: 'icon',
-          label: this.state.dict['header.form.icon'],
-          initVal: card.icon,
-          required: false,
-          options: []
-        },
-        {
-          type: 'select',
-          key: 'class',
-          label: this.state.dict['header.form.class'],
-          initVal: card.class,
-          required: false,
-          options: []
-        },
-        {
-          type: 'text',
-          key: 'sql',
-          label: this.state.dict['header.form.datasource'],
-          initVal: card.sql || this.state.config.setting.tableName || '',
-          tooltip: this.state.dict['header.form.actionhelp.datasource'],
-          required: false
-        },
-        {
-          type: 'select',
-          key: 'sqlType',
-          label: this.state.dict['header.form.action.type'],
-          initVal: card.sqlType || '',
-          tooltip: this.state.dict['header.form.actionhelp.sqlType'],
-          required: false,
-          options: []
-        }
-      ]
+      formlist: getActionForm(card, functip, this.state.config, this.props.permFuncField, 'subtable')
     })
   }
 
+  /**
+   * @description 鏄剧ず鍒椾笌鍚堝苟鍒楃紪杈戯紝鑾峰彇琛ㄥ崟淇℃伅
+   */
   handleColumn = (card) => {
     if (card.type !== 'colspan') {
       this.setState({
-        visible: true,
-        formtemp: 'columns',
-        modalTitle: '缂栬緫-鏄剧ず鍒�',
+        modaltype: 'columns',
         card: card,
-        formlist: [
-          {
-            type: 'text',
-            key: 'label',
-            label: this.state.dict['header.form.name'],
-            initVal: card.label,
-            required: true
-          },
-          {
-            type: 'text',
-            key: 'field',
-            label: this.state.dict['header.form.field'],
-            initVal: card.field,
-            required: true,
-            readonly: false
-          },
-          {
-            type: 'select',
-            key: 'type',
-            label: this.state.dict['header.form.type'],
-            initVal: card.type,
-            required: true,
-            options: [{
-              value: 'text',
-              text: this.state.dict['header.form.text']
-            }, {
-              value: 'picture',
-              text: this.state.dict['header.form.picture']
-            }, {
-              value: 'number',
-              text: this.state.dict['header.form.number']
-            }, {
-              value: 'textarea',
-              text: this.state.dict['header.form.textarea']
-            }]
-          },
-          {
-            type: 'select',
-            key: 'Align',
-            label: this.state.dict['header.form.align'],
-            initVal: card.Align,
-            required: true,
-            options: [{
-              value: 'left',
-              text: this.state.dict['header.form.alignLeft']
-            }, {
-              value: 'right',
-              text: this.state.dict['header.form.alignRight']
-            }, {
-              value: 'center',
-              text: this.state.dict['header.form.alignCenter']
-            }]
-          },
-          {
-            type: 'radio',
-            key: 'Hide',
-            label: this.state.dict['header.form.Hide'],
-            initVal: card.Hide,
-            required: true,
-            options: [{
-              value: 'true',
-              text: this.state.dict['header.form.true']
-            }, {
-              value: 'false',
-              text: this.state.dict['header.form.false']
-            }]
-          },
-          {
-            type: 'radio',
-            key: 'IsSort',
-            label: this.state.dict['header.form.IsSort'],
-            initVal: card.IsSort,
-            required: true,
-            options: [{
-              value: 'true',
-              text: this.state.dict['header.form.true']
-            }, {
-              value: 'false',
-              text: this.state.dict['header.form.false']
-            }]
-          },
-          {
-            type: 'number',
-            key: 'Width',
-            min: 1,
-            max: 1000,
-            decimal: 0,
-            label: this.state.dict['header.form.columnWidth'],
-            initVal: card.Width,
-            required: true
-          },
-          {
-            type: 'number',
-            key: 'decimal',
-            min: 0,
-            max: 18,
-            decimal: 0,
-            label: this.state.dict['header.form.decimal'],
-            initVal: card.decimal,
-            required: false
-          },
-          {
-            type: 'select',
-            key: 'format',
-            label: this.state.dict['header.form.format'],
-            initVal: card.format || '',
-            options: [{
-              value: '',
-              text: this.state.dict['header.form.empty']
-            }, {
-              value: 'thdSeparator',
-              text: this.state.dict['header.form.thdSeparator']
-            }],
-            required: false
-          },
-          {
-            type: 'text',
-            key: 'prefix',
-            label: this.state.dict['header.form.prefix'],
-            initVal: card.prefix || '',
-            required: false,
-            readonly: false
-          },
-          {
-            type: 'text',
-            key: 'postfix',
-            label: this.state.dict['header.form.postfix'],
-            initVal: card.postfix || '',
-            // tooltip: '鍚庣紑鍊艰缃负"\\n",琛ㄧず鎹㈣',
-            tooltipClass: 'middle',
-            required: false,
-            readonly: false
-          },
-          {
-            type: 'select',
-            key: 'match',
-            label: this.state.dict['header.form.match'],
-            initVal: card.match || '',
-            options: [{
-              value: '',
-              text: this.state.dict['header.form.empty']
-            }, {
-              value: '>',
-              text: '>'
-            }, {
-              value: '<',
-              text: '<'
-            }, {
-              value: '>=',
-              text: '>='
-            }, {
-              value: '<=',
-              text: '<='
-            }],
-            required: false
-          },
-          {
-            type: 'text',
-            key: 'matchVal',
-            min: -Infinity,
-            max: Infinity,
-            decimal: 0,
-            label: this.state.dict['header.form.matchVal'],
-            initVal: card.matchVal || '',
-            required: false,
-            readonly: false
-          },
-          {
-            type: 'select',
-            key: 'color',
-            label: this.state.dict['header.form.color'],
-            initVal: card.color || '',
-            options: [{
-              value: '',
-              text: this.state.dict['header.form.empty']
-            }, {
-              value: 'red',
-              text: '绾㈣壊锛堝唴瀹癸級'
-            }, {
-              value: 'redbg',
-              text: '绾㈣壊锛堣儗鏅級'
-            }, {
-              value: 'orange',
-              text: '姗欒壊锛堝唴瀹癸級'
-            }, {
-              value: 'orangebg',
-              text: '姗欒壊锛堣儗鏅級'
-            }, {
-              value: 'green',
-              text: '缁胯壊锛堝唴瀹癸級'
-            }, {
-              value: 'greenbg',
-              text: '缁胯壊锛堣儗鏅級'
-            }],
-            required: false
-          }
-        ]
+        formlist: getColumnForm(card)
       })
     } else {
       this.setState({
-        visible: true,
-        formtemp: 'columns',
+        modaltype: 'colspan',
         card: card
       })
     }
   }
 
+  /**
+   * @description 鎿嶄綔鍒楃紪杈�
+   */
   handleGridBtn = () => {
     this.setState({
-      visible: true,
-      formtemp: 'gridbtn',
-      modalTitle: '缂栬緫-鎿嶄綔鍒�',
+      modaltype: 'gridbtn'
     })
   }
 
@@ -953,14 +352,41 @@
    * 3銆佹坊鍔犳垨缂栬緫鍒楋紝淇濆瓨鏃讹紝濡傛寜閽綅缃缃负琛ㄦ牸锛屽垯淇敼鎿嶄綔鍒楁樉绀虹姸鎬�
    */
   handleSubmit = () => {
-    const { card } = this.state
-    let _config = JSON.parse(JSON.stringify(this.state.config))
+    const { card, config, modaltype } = this.state
 
-    if (this.state.formtemp !== 'gridbtn') {
-      this.formRef.handleConfirm().then(res => {
-        let isupdate = false
+    if (modaltype === 'search') {
+      this.searchFormRef.handleConfirm().then(res => {
+        let _search = config.search.map(item => {
+          if (item.uuid === res.uuid) {
+            return res
+          } else {
+            return item
+          }
+        })
+        _search = _search.filter(item => !item.origin)
 
-        if (res.type === 'action' && card.originCard && res.values.OpenType === 'pop') {
+        this.setState({
+          config: {...config, search: _search},
+          modaltype: ''
+        })
+      })
+    } else if (modaltype === 'actionEdit' || modaltype === 'actionCopy') {
+      this.actionFormRef.handleConfirm().then(res => {
+        let _action = config.action.map(item => {
+          if (item.uuid === res.uuid) {
+            return res
+          } else {
+            return item
+          }
+        })
+        _action = _action.filter(item => !item.origin)
+
+        if (modaltype === 'actionCopy') {
+          _action.push(res)
+        }
+
+        // 澶嶅埗鎸夐挳鍓嶅悗鐨嗕负琛ㄥ崟鏃讹紝澶嶅埗琛ㄥ崟閰嶇疆淇℃伅锛宨d瀛樹簬澶嶅埗鍒楄〃
+        if (res.OpenType === 'pop' && card.originCard && card.originCard.OpenType === 'pop') {
           Api.getSystemConfig({
             func: 'sPC_Get_LongParam',
             MenuID: card.originCard.uuid
@@ -968,11 +394,11 @@
             if (result.status && result.LongParam) {
               let param = {
                 func: 'sPC_ButtonParam_AddUpt',
-                ParentID: _config.uuid,
-                MenuID: res.values.uuid,
-                MenuNo: _config.tabNo,
+                ParentID: config.uuid,
+                MenuID: res.uuid,
+                MenuNo: config.tabNo,
                 Template: 'Modal',
-                MenuName: res.values.label,
+                MenuName: res.label,
                 PageParam: JSON.stringify({Template: 'Modal'}),
                 LongParam: result.LongParam
               }
@@ -983,73 +409,97 @@
                     message: response.message,
                     duration: 10
                   })
+                } else {
+                  this.setState({
+                    copyActions: [...this.state.copyActions, res.uuid]
+                  })
                 }
               })
             }
           })
         }
-  
-        _config[res.type] = _config[res.type].map(item => {
-          if (item.uuid === res.values.uuid) {
-            isupdate = true
-            return res.values
+
+        // 鍒ゆ柇鏄惁瀛樺湪鎿嶄綔鍒�
+        let _hasGridbtn = _action.filter(act => act.position === 'grid').length > 0
+        let _gridBtn = config.gridBtn
+
+        if (_gridBtn) {
+          _gridBtn.display = _hasGridbtn
+        } else {
+          _gridBtn = {
+            display: _hasGridbtn,
+            Align: 'center',
+            IsSort: 'false',
+            uuid: Utils.getuuid(),
+            label: this.state.dict['header.form.column.action'],
+            type: 'action',
+            style: 'button',
+            show: 'horizontal',
+            Width: 120
+          }
+        }
+
+        this.setState({
+          config: {...config, action: _action, gridBtn: _gridBtn},
+          modaltype: ''
+        })
+      })
+    } else if (modaltype === 'columns' || modaltype === 'colspan') {
+      this.columnFormRef.handleConfirm().then(res => {
+        let _columns = config.columns.map(item => {
+          if (item.uuid === res.uuid) {
+            return res
           } else {
             return item
           }
         })
-        _config[res.type] = _config[res.type].filter(item => !item.origin)
-  
-        if (!isupdate) { // 鎿嶄綔涓嶆槸淇敼锛屾坊鍔犲厓绱犺嚦鍒楄〃
-          _config[res.type].push(res.values)
-        }
-  
-        if (res.type === 'action') {
-          let gridbtn = _config.action.filter(act => act.position === 'grid')
-          let _display = false
-  
-          if (gridbtn.length > 0) {
-            _display = true
-          }
-  
-          if (_config.gridBtn) {
-            _config.gridBtn.display = _display
-          } else {
-            _config.gridBtn = {
-              display: _display,
-              Align: 'center',
-              IsSort: 'false',
-              uuid: Utils.getuuid(),
-              label: this.state.dict['header.form.column.action'],
-              type: 'action',
-              style: 'button',
-              show: 'horizontal',
-              Width: 120
-            }
-          }
-        }
-  
-        this.setState({
-          config: _config,
-          searchloading: true,
-          actionloading: true,
-          columnsloading: true,
-          visible: false
-        }, () => {
-          this.setState({
-            searchloading: false,
-            actionloading: false,
-            columnsloading: false,
-          })
-        })
-      })
-    } else {
-      this.formRef.handleConfirm().then(res => {
-        _config.gridBtn = res
+        _columns = _columns.filter(item => !item.origin)
 
         this.setState({
-          config: _config,
-          visible: false
+          config: {...config, columns: _columns},
+          modaltype: ''
         })
+      })
+    } else if (modaltype === 'gridbtn') {
+      this.gridBtnFormRef.handleConfirm().then(res => {
+        this.setState({
+          config: {...config, gridBtn: res},
+          modaltype: ''
+        })
+      })
+    }
+  }
+
+  /**
+   * @description 鍙栨秷淇濆瓨锛屽鏋滃厓绱犱负鏂版坊鍏冪礌锛屽垯浠庡簭鍒椾腑鍒犻櫎
+   */
+  editModalCancel = () => {
+    const { config, card, modaltype } = this.state
+
+    if (card.focus) {
+      let _config = null
+      if (modaltype === 'search') {
+        let _search = config.search.filter(item => item.uuid !== card.uuid)
+        _config = {...config, search: _search}
+      } else if (modaltype === 'actionEdit') {
+        let _action = config.action.filter(item => item.uuid !== card.uuid)
+        _config = {...config, action: _action}
+      } else if (modaltype === 'columns' || modaltype === 'colspan') {
+        let _columns = config.columns.filter(item => item.uuid !== card.uuid)
+        _config = {...config, columns: _columns}
+      } else {
+        _config = config
+      }
+
+      this.setState({
+        card: null,
+        config: _config,
+        modaltype: ''
+      })
+    } else {
+      this.setState({
+        card: null,
+        modaltype: ''
       })
     }
   }
@@ -1061,7 +511,7 @@
     let _config = JSON.parse(JSON.stringify(this.state.config))
 
     this.formRef.handleConfirm().then(res => {
-      let btn = res.values  // 鎸夐挳淇℃伅
+      let btn = res  // 鎸夐挳淇℃伅
       let newLText = ''     // 鍒涘缓瀛樺偍杩囩▼sql
       let DelText = ''      // 鍒犻櫎瀛樺偍杩囩▼sql
       let isExit = false    // 瀛樺偍杩囩▼鏄惁瀛樺湪
@@ -1311,10 +761,8 @@
           return
         }
 
-        let isupdate = false
         _config.action = _config.action.map(item => {
           if (item.uuid === btn.uuid) {
-            isupdate = true
             return btn
           } else {
             return item
@@ -1322,23 +770,14 @@
         })
         _config.action = _config.action.filter(item => !item.origin)
 
-
-        if (!isupdate) { // 鎿嶄綔涓嶆槸淇敼锛屾坊鍔犲厓绱犺嚦鍒楄〃
-          _config.action.push(btn)
-        }
-
-        let gridbtn = _config.action.filter(act => act.position === 'grid')
-        let _display = false
-
-        if (gridbtn.length > 0) {
-          _display = true
-        }
+        // 鍒ゆ柇鏄惁瀛樺湪鎿嶄綔鍒�
+        let _hasGridbtn = _config.action.filter(act => act.position === 'grid').length > 0
 
         if (_config.gridBtn) {
-          _config.gridBtn.display = _display
+          _config.gridBtn.display = _hasGridbtn
         } else {
           _config.gridBtn = {
-            display: _display,
+            display: _hasGridbtn,
             Align: 'center',
             IsSort: 'false',
             uuid: Utils.getuuid(),
@@ -1352,12 +791,7 @@
 
         this.setState({
           config: _config,
-          actionloading: true,
           funcLoading: false
-        }, () => {
-          this.setState({
-            actionloading: false
-          })
         })
       })
     })
@@ -1644,12 +1078,7 @@
     this.setState({
       profileVisible: false,
       config: config,
-      card: '',
-      actionloading: true
-    }, () => {
-      this.setState({
-        actionloading: false
-      })
+      card: ''
     })
   }
 
@@ -1735,21 +1164,11 @@
         if (response.status) {
           this.setState({
             config: _config,
-            originConfig: _config,
-            searchloading: true,
-            actionloading: true,
-            columnsloading: true
+            originConfig: _config
           }, () => {
             this.setState({
-              searchloading: false,
-              actionloading: false,
-              columnsloading: false
-            }, () => {
-
-              this.setState({
-                menuloading: false,
-                menucloseloading: false
-              })
+              menuloading: false,
+              menucloseloading: false
             })
             this.submitAction(btnParam)
           })
@@ -2255,11 +1674,6 @@
       this.setState({
         config: {...config, setting: res},
         settingVisible: false,
-        columnsloading: true
-      }, () => {
-        this.setState({
-          columnsloading: false
-        })
       })
     })
   }
@@ -2370,6 +1784,7 @@
   }
 
   render () {
+    const { modaltype } = this.state
     const configAction = this.state.config.action.filter(_action =>
       !_action.origin && (_action.OpenType === 'pop' || _action.OpenType === 'popview' || _action.OpenType === 'blank' || _action.OpenType === 'tab')
     )
@@ -2478,7 +1893,6 @@
             <Card title={'鏍囩锛堝瓙琛級椤甸潰閰嶇疆'} bordered={false} extra={
               <div>
                 <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={this.state.config.enabled} onChange={this.onEnabledChange} />
-                {/* <Button type="primary" onClick={this.changeTemplate}>{this.state.dict['header.menu.template.change']}</Button> */}
                 <Button type="primary" onClick={this.submitConfig} loading={this.state.menuloading}>{this.state.dict['header.save']}</Button>
                 <Button onClick={this.cancelConfig}>{this.state.dict['header.return']}</Button>
               </div>
@@ -2488,111 +1902,134 @@
                 <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃悳绱€�嬩腑锛岄�夋嫨瀵瑰簲鎼滅储妗嗘嫋鑷虫澶勬坊鍔狅紱鎴栫偣鍑绘寜閽�婃坊鍔犳悳绱㈡潯浠躲�嬫壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ��">
                   <Icon type="question-circle" />
                 </Tooltip>
-                {!this.state.searchloading ?
-                  <DragElement
-                    type="search"
-                    list={this.state.config.search}
-                    handleList={this.handleList}
-                    handleMenu={this.handleSearch}
-                    deleteMenu={this.deleteElement}
-                    placeholder={this.state.dict['header.form.search.placeholder']}
-                  /> : null
-                }
+                <DragElement
+                  type="search"
+                  list={this.state.config.search}
+                  handleList={this.handleList}
+                  handleMenu={this.handleSearch}
+                  deleteMenu={this.deleteElement}
+                  placeholder={this.state.dict['header.form.search.placeholder']}
+                />
               </div>
               <div className="action-list">
                 <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃寜閽�嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬寜閽嫋鑷虫澶勬坊鍔狅紝濡傞�夋嫨鎸夐挳绫诲瀷涓鸿〃鍗曘�佹柊鏍囩椤电瓑鍚湁閰嶇疆椤甸潰鐨勬寜閽紝鍙湪宸︿晶宸ュ叿鏍�-鎸夐挳-鍙厤缃寜閽锛岀偣鍑绘寜閽畬鎴愮浉鍏抽厤缃�傛敞锛氬綋璁剧疆鎸夐挳鏄剧ず浣嶇疆涓鸿〃鏍兼椂锛屾樉绀哄垪浼氬鍔犳搷浣滃垪銆�">
                   <Icon type="question-circle" />
                 </Tooltip>
-                {!this.state.actionloading ?
-                  <DragElement
-                    type="action"
-                    list={this.state.config.action}
-                    handleList={this.handleList}
-                    handleMenu={this.handleAction}
-                    copyElement={(val) => this.handleAction(val, 'copy')}
-                    deleteMenu={this.deleteElement}
-                    profileMenu={this.profileAction}
-                    placeholder={this.state.dict['header.form.action.placeholder']}
-                  /> : null
-                }
+                <DragElement
+                  type="action"
+                  list={this.state.config.action}
+                  handleList={this.handleList}
+                  handleMenu={this.handleAction}
+                  copyElement={(val) => this.handleAction(val, 'copy')}
+                  deleteMenu={this.deleteElement}
+                  profileMenu={this.profileAction}
+                  placeholder={this.state.dict['header.form.action.placeholder']}
+                />
               </div>
               <div className="column-list">
                 <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃樉绀哄垪銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬樉绀哄垪鎷栬嚦姝ゅ娣诲姞锛涙垨鐐瑰嚮銆婃坊鍔犳樉绀哄垪銆嬫寜閽壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ�傛敞锛氭坊鍔犲悎骞跺垪鏃讹紝闇�璁剧疆鍙�夊垪銆�">
                   <Icon type="question-circle" />
                 </Tooltip>
                 <Switch checkedChildren="寮�" unCheckedChildren="鍏�" defaultChecked={this.state.showColumnName} onChange={this.onColumnNameChange} />
-                {!this.state.columnsloading ?
-                  <DragElement
-                    type="columns"
-                    list={this.state.config.columns}
-                    setting={this.state.config.setting}
-                    gridBtn={this.state.config.gridBtn}
-                    handleList={this.handleList}
-                    handleMenu={this.handleColumn}
-                    deleteMenu={this.deleteElement}
-                    handleGridBtn={this.handleGridBtn}
-                    showfield={this.state.showColumnName}
-                    placeholder={this.state.dict['header.form.column.placeholder']}
-                  /> : null
-                }
+                <DragElement
+                  type="columns"
+                  list={this.state.config.columns}
+                  setting={this.state.config.setting}
+                  gridBtn={this.state.config.gridBtn}
+                  handleList={this.handleList}
+                  handleMenu={this.handleColumn}
+                  deleteMenu={this.deleteElement}
+                  handleGridBtn={this.handleGridBtn}
+                  showfield={this.state.showColumnName}
+                  placeholder={this.state.dict['header.form.column.placeholder']}
+                />
               </div>
             </Card>
           </div>
         </DndProvider>
-        {/* 缂栬緫鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪 */}
+        {/* 缂栬緫鎼滅储鏉′欢 */}
         <Modal
-          title={this.state.modalTitle}
-          visible={this.state.visible}
+          title={this.state.dict['header.modal.search.edit']}
+          visible={modaltype === 'search'}
           width={700}
-          onCancel={() => { this.setState({ visible: false }) }}
+          onOk={this.handleSubmit}
+          onCancel={this.editModalCancel}
+          destroyOnClose
+        >
+          <SearchForm
+            dict={this.state.dict}
+            card={this.state.card}
+            formlist={this.state.formlist}
+            wrappedComponentRef={(inst) => this.searchFormRef = inst}
+          />
+        </Modal>
+        {/* 缂栬緫鎸夐挳锛氬鍒躲�佺紪杈� */}
+        <Modal
+          title={modaltype === 'actionEdit' ? this.state.dict['header.modal.action.edit'] : this.state.dict['header.modal.action.copy']}
+          visible={modaltype === 'actionEdit' || modaltype === 'actionCopy'}
+          width={700}
+          onCancel={this.editModalCancel}
           footer={[
-            this.state.formtemp === 'action' ?
-            <Button key="delete" className="mk-btn mk-purple" onClick={this.creatFunc} loading={this.state.funcLoading}>{this.state.dict['header.menu.func.create']}</Button> : null,
-            <Button key="cancel" onClick={() => { this.setState({ visible: false }) }}>{this.state.dict['header.cancel']}</Button>,
+            modaltype === 'actionEdit' ? <Button key="delete" className="mk-btn mk-purple" onClick={this.creatFunc} loading={this.state.funcLoading}>{this.state.dict['header.menu.func.create']}</Button> : null,
+            <Button key="cancel" onClick={this.editModalCancel}>{this.state.dict['header.cancel']}</Button>,
             <Button key="confirm" type="primary" onClick={this.handleSubmit}>{this.state.dict['header.confirm']}</Button>
           ]}
           destroyOnClose
         >
-          {this.state.formtemp === 'search' ?
-            <SearchForm
-              dict={this.state.dict}
-              formlist={this.state.formlist}
-              card={this.state.card}
-              wrappedComponentRef={(inst) => this.formRef = inst}
-            /> : null
-          }
-          {this.state.formtemp === 'action' ?
-            <ActionForm
-              dict={this.state.dict}
-              card={this.state.card}
-              tabs={this.state.tabviews}
-              formlist={this.state.formlist}
-              wrappedComponentRef={(inst) => this.formRef = inst}
-            /> : null
-          }
-          {this.state.formtemp === 'columns' && this.state.card.type !== 'colspan' ?
-            <ColumnForm
-              dict={this.state.dict}
-              card={this.state.card}
-              formlist={this.state.formlist}
-              wrappedComponentRef={(inst) => this.formRef = inst}
-            /> : null
-          }
-          {this.state.formtemp === 'columns' && this.state.card.type === 'colspan' ?
-            <ColspanForm
-              dict={this.state.dict}
-              card={this.state.card}
-              columns={this.state.config.columns}
-              wrappedComponentRef={(inst) => this.formRef = inst}
-            /> : null
-          }
-          {this.state.formtemp === 'gridbtn' ?
-            <GridBtnForm
-              dict={this.state.dict}
-              card={this.state.config.gridBtn}
-              wrappedComponentRef={(inst) => this.formRef = inst}
-            /> : null
-          }
+          <ActionForm
+            dict={this.state.dict}
+            card={this.state.card}
+            tabs={this.state.tabviews}
+            formlist={this.state.formlist}
+            wrappedComponentRef={(inst) => this.actionFormRef = inst}
+          />
+        </Modal>
+        {/* 鏄剧ず鍒楃紪杈� */}
+        <Modal
+          title={this.state.dict['header.modal.column.edit']}
+          visible={modaltype === 'columns'}
+          width={700}
+          onOk={this.handleSubmit}
+          onCancel={this.editModalCancel}
+          destroyOnClose
+        >
+          <ColumnForm
+            dict={this.state.dict}
+            card={this.state.card}
+            formlist={this.state.formlist}
+            wrappedComponentRef={(inst) => this.columnFormRef = inst}
+          />
+        </Modal>
+        {/* 鍚堝苟鍒楃紪杈� */}
+        <Modal
+          title={this.state.dict['header.modal.colspan.edit']}
+          visible={modaltype === 'colspan'}
+          width={700}
+          onOk={this.handleSubmit}
+          onCancel={this.editModalCancel}
+          destroyOnClose
+        >
+          <ColspanForm
+            dict={this.state.dict}
+            card={this.state.card}
+            columns={this.state.config.columns}
+            wrappedComponentRef={(inst) => this.columnFormRef = inst}
+          />
+        </Modal>
+        {/* 鎿嶄綔鍒楃紪杈� */}
+        <Modal
+          title={this.state.dict['header.modal.gridbtn.edit']}
+          visible={modaltype === 'gridbtn'}
+          width={700}
+          onOk={this.handleSubmit}
+          onCancel={this.editModalCancel}
+          destroyOnClose
+        >
+          <GridBtnForm
+            dict={this.state.dict}
+            card={this.state.config.gridBtn}
+            wrappedComponentRef={(inst) => this.gridBtnFormRef = inst}
+          />
         </Modal>
         {/* 鏍规嵁瀛楁鍚嶆坊鍔犳樉绀哄垪鍙婃悳绱㈡潯浠� */}
         <Modal

--
Gitblit v1.8.0