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

---
 src/templates/subtableconfig/index.jsx |  408 +++++++++++++++++++++++++---------------------------------
 1 files changed, 175 insertions(+), 233 deletions(-)

diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index beed453..19bfb12 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/src/templates/subtableconfig/index.jsx
@@ -1,16 +1,13 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import {connect} from 'react-redux'
 import { is, fromJS } from 'immutable'
 import { DndProvider } from 'react-dnd'
 import HTML5Backend from 'react-dnd-html5-backend'
 import { Button, Card, Modal, Collapse, notification, Spin, Switch, Tooltip, Col } from 'antd'
 import { QuestionCircleOutlined, RedoOutlined } from '@ant-design/icons'
-import moment from 'moment'
+// import moment from 'moment'
 
 import Api from '@/api'
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
 import Utils from '@/utils/utils.js'
 import { updateSubTable } from '@/utils/utils-update.js'
 
@@ -28,7 +25,7 @@
 const { confirm } = Modal
 
 const Versions = asyncComponent(() => import('@/menu/versions'))
-const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
+// const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
 const EditComponent = asyncComponent(() => import('@/templates/zshare/editcomponent'))
 const SettingComponent = asyncComponent(() => import('@/templates/sharecomponent/settingcomponent'))
 const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
@@ -50,7 +47,6 @@
   }
 
   state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,        // 瀛楀吀
     config: null,            // 椤甸潰閰嶇疆
     visible: false,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪锛屾ā鎬佹鏄剧ず鎺у埗
     menuloading: false,      // 鑿滃崟淇濆瓨涓�
@@ -62,10 +58,9 @@
     delActions: [],          // 鍒犻櫎鎸夐挳鍒楄〃
     copyActions: [],         // 澶嶅埗鎸夐挳缁�
     tabviews: [],            // 鎵�鏈夋爣绛鹃〉
-    thawButtons: [],         // 宸查�夋嫨瑕佽В鍐荤殑鎸夐挳
     activeKey: '0',          // 榛樿灞曞紑鍩烘湰淇℃伅
     chartview: null,         // 褰撳墠瑙嗗浘
-    openEdition: ''          // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
+    openEdition: '',         // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
   }
 
   /**
@@ -117,7 +112,7 @@
 
     this.setState({
       openEdition: editSubTab ? (editSubTab.open_edition || '') : (editTab.open_edition || ''),
-      chartview: _config.charts[0].uuid,
+      chartview: _config.charts ? _config.charts[0].uuid : '',
       originActions: _oriActions,
       config: _config,
       activeKey: _activeKey || '0',
@@ -132,6 +127,54 @@
    */
   componentDidMount () {
     this.reloadTab(false)
+    document.onkeydown = (event) => {
+      let e = event || window.event
+      let keyCode = e.keyCode || e.which || e.charCode
+      let preKey = ''
+
+      if (e.ctrlKey) {
+        preKey = 'ctrl'
+      }
+      if (e.shiftKey) {
+        preKey = 'shift'
+      } else if (e.altKey) {
+        preKey = 'alt'
+      }
+      
+      if (!preKey || !keyCode) return
+      
+      let _shortcut = `${preKey}+${keyCode}`
+
+      if (_shortcut === 'ctrl+83') {
+        let modals = document.querySelectorAll('.mk-pop-modal')
+        let msg = null
+        for (let i = 0; i < modals.length; i++) {
+          if (msg) {
+            break
+          }
+
+          let node = modals[i].querySelector('.mk-com-name')
+
+          if (node) {
+            msg = node.innerText
+          }
+        }
+        if (msg) {
+          notification.warning({
+            top: 92,
+            message: '璇蜂繚瀛�' + msg,
+            duration: 5
+          })
+          return false
+        }
+
+        let node = document.getElementById('save-config')
+        if (node && node.click) {
+          node.click()
+        }
+        return false
+      }
+    }
   }
 
   /**
@@ -191,6 +234,7 @@
     this.setState = () => {
       return
     }
+    document.onkeydown = () => {}
   }
 
   // 椤甸潰杩斿洖
@@ -239,7 +283,7 @@
    * @description 鏍囩椤典繚瀛�
    */
   submitConfig = () => {
-    const { delActions, thawButtons, openEdition } = this.state
+    const { delActions, openEdition } = this.state
     let _config = fromJS(this.state.config).toJS()
     let copyreg = /\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/ig
 
@@ -247,7 +291,7 @@
     if (!_config.tabName || !_config.tabNo) {
       notification.warning({
         top: 92,
-        message: this.state.dict['model.menu.basemsg'],
+        message: '璇峰畬鍠勮彍鍗曞熀鏈俊鎭紒',
         duration: 5
       })
       this.setState({activeKey: '0'})
@@ -275,6 +319,10 @@
       }
     }
 
+    if (_config.setting.doubleClick && _config.action.findIndex((item) => item.uuid === _config.setting.doubleClick) === -1) {
+      _config.setting.doubleClick = ''
+    }
+
     // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负false
     let result = this.verifyconfig(_config)
   
@@ -292,11 +340,11 @@
       })
     }
 
+    let _LongParam = ''
+
     // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝system 銆乽ser
     delete _config.type
     delete _config.isAdd
-
-    let _LongParam = ''
 
     try {
       _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_config)))
@@ -314,40 +362,41 @@
       return
     }
 
-    let btnParam = {
-      func: 'sPC_Button_AddUpt',
-      Type: 40,
-      ParentID: _config.uuid,
-      MenuNo: _config.tabNo,
-      Template: 'SubTable',
-      PageParam: '',
-      LongParam: '',
-      LText: []
-    }
+    // let btnParam = {
+    //   func: 'sPC_Button_AddUpt',
+    //   Type: 40,
+    //   ParentID: _config.uuid,
+    //   MenuNo: _config.tabNo,
+    //   Template: 'SubTable',
+    //   PageParam: '',
+    //   LongParam: '',
+    //   LText: []
+    // }
 
-    let btntabs = []
+    // let btntabs = []
 
-    _config.action.forEach((item, index) => {
-      if (item.OpenType === 'popview') {
-        btntabs.push(`select '${item.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`)
-      }
-      btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
-    })
+    // _config.action.forEach((item, index) => {
+    //   if (item.hidden === 'true') return
+    //   if (item.OpenType === 'popview') {
+    //     btntabs.push(`select '${item.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`)
+    //   }
+    //   btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
+    // })
 
-    btnParam.LText = btnParam.LText.join(' union all ')
-    btnParam.LText = Utils.formatOptions(btnParam.LText)
-    btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
+    // btnParam.LText = btnParam.LText.join(' union all ')
+    // btnParam.LText = Utils.formatOptions(btnParam.LText)
+    // btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    // btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
 
-    let tabParam = { // 娣诲姞鏍囩鎸夐挳tab椤�
-      func: 'sPC_sMenusTab_AddUpt',
-      MenuID: _config.uuid,
-      LText: btntabs.join(' union all ')
-    }
+    // let tabParam = { // 娣诲姞鏍囩鎸夐挳tab椤�
+    //   func: 'sPC_sMenusTab_AddUpt',
+    //   MenuID: _config.uuid,
+    //   LText: btntabs.join(' union all ')
+    // }
 
-    tabParam.LText = Utils.formatOptions(tabParam.LText)
-    tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-    tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
+    // tabParam.LText = Utils.formatOptions(tabParam.LText)
+    // tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    // tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
 
     let param = {
       func: 'sPC_Tab_AddUpt',
@@ -426,26 +475,7 @@
     }).then(resp => {
       if (resp === false) return
 
-      if (thawButtons.length > 0) {
-        let defers = thawButtons.map(item => {
-          return new Promise((resolve) => {
-            Api.getSystemConfig({
-              func: 'sPC_MainMenu_ReDel',
-              MenuID: item
-            }).then(res => {
-              if (res.status) {
-                resolve('')
-              } else {
-                resolve(res.message)
-              }
-            })
-          })
-        })
-
-        return Promise.all(defers)
-      } else {
-        return true
-      }
+      return true
     }).then(res => {
       if (res === true || res === false) return res
 
@@ -458,9 +488,6 @@
         })
         return false
       } else {
-        this.setState({
-          thawButtons: []
-        })
         return true
       }
     }).then(resp => {
@@ -477,8 +504,16 @@
               menuloading: false,
               menucloseloading: false
             })
-            this.submitAction(btnParam, tabParam)
+            notification.success({
+              top: 92,
+              message: '淇濆瓨鎴愬姛',
+              duration: 2
+            })
+            if (this.state.closeVisible) {
+              this.handleViewBack()
+            }
           })
+          this.submitAction()
         } else {
           this.setState({
             menuloading: false,
@@ -497,131 +532,56 @@
   /**
    * @description 淇濆瓨鎴栦慨鏀硅彍鍗曟寜閽�
    */
-  submitAction = (btnParam, tabParam) => {
+  submitAction = () => {
     const { config } = this.state
 
-    new Promise(resolve => {
-      let deffers = []
+    let oriActions = []
+    this.state.originActions.forEach(item => {
+      let curBtn = config.action.filter(cell => item.curuuid === cell.uuid)[0] // 鏌ョ湅鍒濆鍖栨寜閽槸鍚﹀瓨鍦�
+      if (!curBtn) return
+      if (curBtn.OpenType !== item.prebtn.OpenType) return
+      if (curBtn.OpenType === 'funcbutton' && curBtn.execMode !== 'pop') return
 
-      if (tabParam.LText) {
-        let defer = new Promise(resolve => {
-          Api.getSystemConfig(tabParam).then(result => {
-            resolve(result)
-          })
-        })
-        deffers.push(defer)
-      }
-
-      if (btnParam.LText) {
-        let defer = new Promise(resolve => {
-          Api.getSystemConfig(btnParam).then(result => {
-            if (result.status) {
-              this.setState({ // 淇濆瓨鎴愬姛鍚庢竻绌哄鍒跺垪琛�
-                copyActions: []
-              })
-            }
-            resolve(result)
-          })
-        })
-        deffers.push(defer)
-      }
-
-      if (deffers.length === 0) {
-        resolve(true)
-      } else {
-        Promise.all(deffers).then(result => {
-          let error = false
-          result.forEach(res => {
-            if (!res.status) {
-              error = res
-            }
-          })
-
-          if (error) {
-            notification.warning({
-              top: 92,
-              message: error.message,
-              duration: 5
-            })
-            resolve(false)
-          } else {
-            resolve(true)
-          }
-        })
-      }
-    }).then(response => {
-      if (response === false) return response
-
-      let oriActions = []
-      this.state.originActions.forEach(item => {
-        let curBtn = config.action.filter(cell => item.curuuid === cell.uuid)[0] // 鏌ョ湅鍒濆鍖栨寜閽槸鍚﹀瓨鍦�
-        if (!curBtn) return
-        if (curBtn.OpenType !== item.prebtn.OpenType) return
-        if (curBtn.OpenType === 'funcbutton' && curBtn.execMode !== 'pop') return
-
-        oriActions.push({
-          prebtn: item.prebtn,
-          curBtn: curBtn
-        })
+      oriActions.push({
+        prebtn: item.prebtn,
+        curBtn: curBtn
       })
+    })
 
-      if (oriActions.length === 0) return 'true'
+    if (oriActions.length === 0) return
 
-      oriActions.forEach(action => {
-        Api.getSystemConfig({
-          func: 'sPC_Get_LongParam',
-          MenuID: action.prebtn ? action.prebtn.uuid : ''
-        }).then(result => {
-          if (result.status && result.LongParam) {
-            let _LongParam = ''
-  
-            if (result.LongParam) {
-              try {
-                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
-              } catch (e) {
-                console.warn('Parse Failure')
-                _LongParam = ''
-              }
-            }
+    oriActions.forEach(action => {
+      Api.getSystemConfig({
+        func: 'sPC_Get_LongParam',
+        MenuID: action.prebtn ? action.prebtn.uuid : ''
+      }).then(result => {
+        if (result.status && result.LongParam) {
+          let _LongParam = ''
 
-            if (_LongParam) {
-              let param = {
-                func: 'sPC_ButtonParam_AddUpt',
-                ParentID: config.uuid,
-                MenuID: action.curBtn.uuid,
-                MenuNo: config.tabNo,
-                Template: _LongParam.type,
-                MenuName: action.curBtn.label,
-                PageParam: JSON.stringify({Template: _LongParam.type}),
-                LongParam: result.LongParam
-              }
-              Api.getSystemConfig(param).then(() => {})
+          if (result.LongParam) {
+            try {
+              _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
+            } catch (e) {
+              console.warn('Parse Failure')
+              _LongParam = ''
             }
           }
-        })
-      })
-      return 'true'
-    }).then(response => {
-      if (response === 'true') {
-        notification.success({
-          top: 92,
-          message: '淇濆瓨鎴愬姛',
-          duration: 2
-        })
-        if (this.state.closeVisible) {
-          this.handleViewBack()
-        } else {
-          this.setState({
-            menuloading: false,
-            menucloseloading: false
-          })
+
+          if (_LongParam) {
+            let param = {
+              func: 'sPC_ButtonParam_AddUpt',
+              ParentID: config.uuid,
+              MenuID: action.curBtn.uuid,
+              MenuNo: config.tabNo,
+              Template: _LongParam.type,
+              MenuName: action.curBtn.label,
+              PageParam: JSON.stringify({Template: _LongParam.type}),
+              LongParam: result.LongParam
+            }
+            Api.getSystemConfig(param).then(() => {})
+          }
         }
-      } else {
-        this.setState({
-          menuloading: false,
-          menucloseloading: false
-        })
-      }
+      })
     })
   }
 
@@ -824,27 +784,7 @@
       }
     })
 
-    config.action && config.action.forEach((btn) => {
-      if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
-        let hascheck = false
-        btn.verify.scripts.forEach(item => {
-          if (item.status === 'false') return
-    
-          if (/\$check@|@check\$/ig.test(item.sql)) {
-            hascheck = true
-          }
-        })
-        if (hascheck) {
-          notification.warning({
-            top: 92,
-            message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
-            duration: 5
-          })
-        }
-      }
-    })
-
-    if ((config.setting.interType === 'system' || config.setting.requestMode === 'system') && config.setting.default === 'false' && config.setting.scripts && config.setting.scripts.filter(item => item.status !== 'false').length === 0) {
+    if (config.setting.interType === 'system' && config.setting.default === 'false' && config.setting.scripts && config.setting.scripts.filter(item => item.status !== 'false').length === 0) {
       return '鏁版嵁婧愪腑涓嶆墽琛岄粯璁ql锛屼笖鏈坊鍔犺嚜瀹氫箟鑴氭湰锛屼笉鍙惎鐢紒'
     } else if (config.setting.interType === 'custom' && config.setting.procMode !== 'inner' && config.setting.preScripts && config.setting.preScripts.filter(item => item.status !== 'false').length === 0) {
       return '鏁版嵁婧愭湭璁剧疆鍓嶇疆鑴氭湰锛屼笉鍙惎鐢紒'
@@ -868,7 +808,6 @@
    */
   updateConfig = (res) => {
     this.setState({
-      thawButtons: res.thawButtons,
       config: res.config
     })
   }
@@ -952,7 +891,7 @@
           config: null
         }, () => {
           this.setState({
-            chartview: _config.charts[0].uuid,
+            chartview: _config.charts ? _config.charts[0].uuid : '',
             config: _config,
             openEdition: res.open_edition || '',
             activeKey: '0',
@@ -987,7 +926,6 @@
               <Panel forceRender={true} header={'鏍囩鍩烘湰淇℃伅'} key="0" id="subtable-basedata">
                 {/* 鑿滃崟淇℃伅 */}
                 <MenuForm
-                  dict={this.state.dict}
                   config={config}
                   updatemenu={this.updateconfig}
                 />
@@ -999,7 +937,7 @@
                 />
               </Panel>
               {/* 鎼滅储鏉′欢娣诲姞 */}
-              <Panel header={this.state.dict['header.menu.search']} key="1">
+              <Panel header="鎼滅储" key="1">
                 <div className="search-element">
                   {Source.searchItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
@@ -1008,7 +946,7 @@
                 <FieldsComponent config={config} type="search" />
               </Panel>
               {/* 鎸夐挳娣诲姞 */}
-              <Panel header={this.state.dict['header.menu.action']} key="2">
+              <Panel header="鎸夐挳" key="2">
                 <div className="search-element">
                   {Source.actionItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
@@ -1020,7 +958,7 @@
                       <Tooltip placement="topLeft" title="鐐瑰嚮鎸夐挳锛屽彲瀹屾垚鎴栨煡鐪嬫寜閽厤缃俊鎭��">
                         <QuestionCircleOutlined className="mk-form-tip" />
                       </Tooltip>
-                      {this.state.dict['header.menu.action.configurable']}
+                      鎸夐挳閰嶇疆
                     </p> : null
                   }
                 </div>
@@ -1038,7 +976,7 @@
                 })}
               </Panel>
               {/* 娣诲姞鏄剧ず鍒� */}
-              <Panel header={this.state.dict['header.menu.column']} key="3">
+              <Panel header="鏄剧ず鍒�" key="3">
                 <div className="search-element">
                   {Source.columnItems.map((item, index) => {
                     return (<SourceElement key={index} content={item}/>)
@@ -1057,11 +995,11 @@
             } bordered={false} extra={
               <div>
                 <Versions MenuId={config.uuid} open_edition={openEdition} updateConfig={this.refreshConfig}/>
-                <ReplaceField type="table" config={config} updateConfig={this.updateconfig}/>
-                <EditComponent dict={this.state.dict} type="table" options={['search', 'form', 'action', 'columns']} config={config} MenuID={config.uuid} thawButtons={this.state.thawButtons} refresh={this.updateConfig}/>
+                {/* <ReplaceField type="table" config={config} updateConfig={this.updateconfig}/> */}
+                <EditComponent type="table" options={['search', 'form', 'action', 'columns']} config={config} refresh={this.updateConfig}/>
                 <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} />
-                <Button type="primary" onClick={this.submitConfig} loading={this.state.menuloading}>{this.state.dict['model.save']}</Button>
-                <Button onClick={this.cancelConfig}>{this.state.dict['model.back']}</Button>
+                <Button type="primary" id="save-config" onClick={this.submitConfig} loading={this.state.menuloading}>淇濆瓨</Button>
+                <Button onClick={this.cancelConfig}>杩斿洖</Button>
               </div>
             } style={{ width: '100%' }}>
               <SettingComponent
@@ -1074,12 +1012,12 @@
                 config={config}
                 updatesearch={this.updatesearch}
               />
-              <div className="chart-view" style={{position: 'relative'}}>
-                {/* 瑙嗗浘缁� 鏉冮檺 浼氬憳绛夌骇20+ */}
-                {this.props.memberLevel >= 20 ? <ChartGroupComponent
+              {config.charts ? <div className="chart-view" style={{position: 'relative'}}>
+                {/* 瑙嗗浘缁� 宸插純鐢� */}
+                <ChartGroupComponent
                   config={config}
                   updatechartgroup={this.updatechartgroup}
-                /> : null}
+                />
                 {config.charts.map(item => {
                   if (!config.expand && chartview !== item.uuid) return ''
 
@@ -1124,7 +1062,21 @@
                     )
                   }
                 })}
-              </div>
+              </div> : <>
+                <ActionComponent
+                  type="subtable"
+                  menu={{MenuID: config.uuid, MenuName: config.tabName, MenuNo: config.tabNo, fstMenuList: this.props.menu.fstMenuList}}
+                  config={config}
+                  tabs={this.state.tabviews}
+                  setSubConfig={this.setSubConfig}
+                  updateaction={this.updateaction}
+                />
+                <ColumnComponent
+                  config={config}
+                  menu={this.props.menu}
+                  updatecolumn={this.updateconfig}
+                />
+              </>}
             </Card>
           </div>
         </DndProvider>
@@ -1135,13 +1087,13 @@
           visible={this.state.closeVisible}
           onCancel={() => { this.setState({closeVisible: false}) }}
           footer={[
-            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>{this.state.dict['model.save']}</Button>,
-            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>{this.state.dict['model.notsave']}</Button>,
-            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>{this.state.dict['model.cancel']}</Button>
+            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>淇濆瓨</Button>,
+            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>涓嶄繚瀛�</Button>,
+            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>鍙栨秷</Button>
           ]}
           destroyOnClose
         >
-          {this.state.dict['header.menu.config.placeholder']}
+          閰嶇疆宸蹭慨鏀癸紝鏄惁淇濆瓨閰嶇疆淇℃伅锛�
         </Modal>
         {this.state.loading && <Spin size="large" />}
       </div>
@@ -1149,14 +1101,4 @@
   }
 }
 
-const mapStateToProps = (state) => {
-  return {
-    memberLevel: state.memberLevel
-  }
-}
-
-const mapDispatchToProps = () => {
-  return {}
-}
-
-export default connect(mapStateToProps, mapDispatchToProps)(SubTableConfig)
+export default SubTableConfig

--
Gitblit v1.8.0