From 265102e3b6c9865f0e9f1e035e7b1aba281dc8c1 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 03 十二月 2019 15:33:16 +0800
Subject: [PATCH] 2019-12-03

---
 src/views/login/loginform.jsx                     |   15 +-
 src/assets/css/minkeicon.css                      |    6 
 src/tabviews/datamanage/search/index.scss         |    3 
 src/tabviews/datamanage/table/index.jsx           |    2 
 src/templates/comtableconfig/index.jsx            |   22 ++-
 src/tabviews/datamanage/index.jsx                 |    6 
 src/locales/en-US/main.js                         |    1 
 src/locales/zh-CN/comtable.js                     |    2 
 src/tabviews/commontable/index.jsx                |   31 +++++
 src/tabviews/commontable/mainTable/index.jsx      |   58 +++++++++--
 src/tabviews/datamanage/action/index.scss         |    4 
 src/locales/en-US/comtable.js                     |    2 
 src/tabviews/commontable/mainSearch/index.scss    |    1 
 src/templates/comtableconfig/actionform/index.jsx |   67 ++++++++++++-
 public/index.html                                 |    4 
 src/locales/zh-CN/main.js                         |    1 
 src/tabviews/datamanage/search/index.jsx          |    2 
 src/templates/comtableconfig/source.jsx           |   12 ++
 src/templates/comtableconfig/index.scss           |    9 +
 src/tabviews/datamanage/action/index.jsx          |    4 
 src/views/login/index.scss                        |    5 
 package.json                                      |    2 
 src/tabviews/commontable/mainTable/index.scss     |   21 ++++
 src/tabviews/datamanage/table/index.scss          |    2 
 src/views/login/index.jsx                         |    5 
 25 files changed, 231 insertions(+), 56 deletions(-)

diff --git a/package.json b/package.json
index 53dddf9..0010623 100644
--- a/package.json
+++ b/package.json
@@ -158,5 +158,5 @@
       ]
     ]
   },
-  "homepage": "."
+  "homepage": "./build"
 }
diff --git a/public/index.html b/public/index.html
index 3396e4d..94431c0 100644
--- a/public/index.html
+++ b/public/index.html
@@ -6,9 +6,9 @@
     <meta name="viewport" content="width=device-width, initial-scale=1" />
     <meta name="theme-color" content="#000000" />
     <meta name="description" content="minkesoft" />
-    <link rel="apple-touch-icon" href="logo.png" />
     <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
-    <script src="./options.js"></script>
+    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo.png" />
+    <script src="%PUBLIC_URL%/options.js"></script>
     <title>MinkeSoft</title>
   </head>
   <body>
diff --git a/src/assets/css/minkeicon.css b/src/assets/css/minkeicon.css
index 6754a86..2199fdc 100644
--- a/src/assets/css/minkeicon.css
+++ b/src/assets/css/minkeicon.css
@@ -2,8 +2,8 @@
   font-family: 'anticonicon';
   src:  url('../font/minkeicon.eot?httt7e');
   src:  url('../font/minkeicon.eot?httt7e#iefix') format('embedded-opentype'),
-    url('../font/minkeicon.ttf?httt7e') format('truetype'),
-    url('../font/minkeicon.woff?httt7e') format('woff'),
+    /* url('../font/minkeicon.ttf?httt7e') format('truetype'),
+    url('../font/minkeicon.woff?httt7e') format('woff'), */
     url('../font/minkeicon.svg?httt7e#minkeicon') format('svg');
   font-weight: normal;
   font-style: normal;
@@ -13,7 +13,7 @@
 [class^="anticon-"], [class*=" anticon-"] {
   /* use !important to prevent issues with browser extensions that change fonts */
   font-family: 'anticonicon' !important;
-  speak: none;
+  /* speak: none; */
   font-style: normal;
   font-weight: normal;
   font-variant: normal;
diff --git a/src/locales/en-US/comtable.js b/src/locales/en-US/comtable.js
index 49ea82b..041f45d 100644
--- a/src/locales/en-US/comtable.js
+++ b/src/locales/en-US/comtable.js
@@ -70,6 +70,8 @@
   'header.form.popform': '寮圭獥锛堣〃鍗曪級',
   'header.form.popview': '寮圭獥锛堥〉闈級',
   'header.form.tab': '鏂版爣绛鹃〉',
+  'header.form.excelIn': 'Excel瀵煎叆',
+  'header.form.excelOut': 'Excel瀵煎嚭',
   'header.form.newpage': '鏂伴〉闈�',
   'header.form.newpage.inner': '鏂伴〉闈紙鍐呴儴锛�',
   'header.form.newpage.outer': '鏂伴〉闈紙澶栭儴锛�',
diff --git a/src/locales/en-US/main.js b/src/locales/en-US/main.js
index 42097e4..404b8bf 100644
--- a/src/locales/en-US/main.js
+++ b/src/locales/en-US/main.js
@@ -16,6 +16,7 @@
   'main.action.primarykey.required': 'Primary key not set!',
   'main.action.primarykey.repetition': 'There are multiple primary keys!',
   'main.action.primarykey.repetitionbid': 'There are multiple BID!',
+  'main.column.operation': '鎿嶄綔',
   'form.required.input': 'Please input ',
   'form.required.select': 'Please select '
 }
\ No newline at end of file
diff --git a/src/locales/zh-CN/comtable.js b/src/locales/zh-CN/comtable.js
index 4fa55f7..2a5e95c 100644
--- a/src/locales/zh-CN/comtable.js
+++ b/src/locales/zh-CN/comtable.js
@@ -70,6 +70,8 @@
   'header.form.popform': '寮圭獥锛堣〃鍗曪級',
   'header.form.popview': '寮圭獥锛堥〉闈級',
   'header.form.tab': '鏂版爣绛鹃〉',
+  'header.form.excelIn': 'Excel瀵煎叆',
+  'header.form.excelOut': 'Excel瀵煎嚭',
   'header.form.newpage': '鏂伴〉闈�',
   'header.form.newpage.inner': '鏂伴〉闈紙鍐呴儴锛�',
   'header.form.newpage.outer': '鏂伴〉闈紙澶栭儴锛�',
diff --git a/src/locales/zh-CN/main.js b/src/locales/zh-CN/main.js
index aa3cd16..d5d3dd5 100644
--- a/src/locales/zh-CN/main.js
+++ b/src/locales/zh-CN/main.js
@@ -17,6 +17,7 @@
   'main.action.primarykey.required': '鏈缃富閿紒',
   'main.action.primarykey.repetition': '瀛樺湪澶氫釜涓婚敭锛�',
   'main.action.primarykey.repetitionbid': '瀛樺湪澶氫釜BID锛�',
+  'main.column.operation': '鎿嶄綔',
   'form.required.input': '璇疯緭鍏�',
   'form.required.select': '璇烽�夋嫨'
 }
\ No newline at end of file
diff --git a/src/tabviews/commontable/index.jsx b/src/tabviews/commontable/index.jsx
index f20d6af..d092828 100644
--- a/src/tabviews/commontable/index.jsx
+++ b/src/tabviews/commontable/index.jsx
@@ -102,11 +102,27 @@
         }
       })
 
+      let _actions = config.action.filter(item => item.position === 'toolbar')
+      let _operation = config.action.filter(item => item.position === 'grid')
+
+      if (_operation.length > 0) {
+        _columns.push({
+          Align: 'center',
+          uuid: Utils.getuuid(),
+          IsSort: 'false',
+          Width: 120,
+          type: 'operation',
+          style: 'button',
+          label: this.state.dict['main.column.operation'],
+          operations: _operation
+        })
+      }
+
       this.setState({
         config: config,
         setting: config.setting,
         searchlist: config.search,
-        actions: config.action,
+        actions: _actions,
         columns: _columns,
         arr_field: _arrField.join(','),
         search: _search ? 'where (' + _search + ')' : '',
@@ -210,8 +226,7 @@
 
     let LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderColumn} ${orderType}) as rows from ${setting.dataresource} ${search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
     let DateCount = `select count(1) as total from ${setting.dataresource} ${search}`
-    console.log(LText)
-    console.log(DateCount)
+
     param.LText = Utils.formatOptions(LText)
     param.DateCount = Utils.formatOptions(DateCount)
     let result = await Api.genericInterface(param)
@@ -226,6 +241,16 @@
       })
     } else {
       this.setState({
+        data: [1,2,3,4,5,6,7,8,9,10].map((item, index) => {
+          let cell = {}
+          this.state.config.columns.forEach(column => {
+            if (!column.field) return
+            cell[column.field] = 'test' + item
+          })
+          cell.key = index
+          return cell
+        }),
+        total: 329,
         loading: false
       })
       notification.error({
diff --git a/src/tabviews/commontable/mainSearch/index.scss b/src/tabviews/commontable/mainSearch/index.scss
index d3c9e05..703756e 100644
--- a/src/tabviews/commontable/mainSearch/index.scss
+++ b/src/tabviews/commontable/mainSearch/index.scss
@@ -10,6 +10,7 @@
   }
   .ant-form-item-label {
     width: 100px;
+    text-overflow: ellipsis;
   }
   .daterange .ant-calendar-picker-input {
     padding: 4px 20px 4px 5px;
diff --git a/src/tabviews/commontable/mainTable/index.jsx b/src/tabviews/commontable/mainTable/index.jsx
index 92f7b68..b17fb94 100644
--- a/src/tabviews/commontable/mainTable/index.jsx
+++ b/src/tabviews/commontable/mainTable/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 // import { is, fromJS } from 'immutable'
-import { Table, message, Affix } from 'antd'
+import { Table, message, Affix, Button } from 'antd'
 import './index.scss'
 
 export default class MainTable extends Component {
@@ -38,15 +38,16 @@
         sorter: item.field && item.IsSort === 'true',
         width: item.Width || 120,
         render: (text, record) => {
-          let content = ''
-          if (item.field) {
-            content = record[item.field] || ''
-          }
-          return (
-            <div className="content" style={{ minWidth: (item.Width || 120) + 'px' }}>
-              {content}
-            </div>
-          )
+          return this.getContent(item, record)
+          // let content = ''
+          // if (item.field) {
+          //   content = record[item.field] || ''
+          // }
+          // return (
+          //   <div className="content" style={{ minWidth: (item.Width || 120) + 'px' }}>
+          //     {content}
+          //   </div>
+          // )
         }
       }
       _columns.push(cell)
@@ -56,6 +57,43 @@
     this.setState({columns: _columns})
   }
 
+  getContent = (item, record) => {
+    if (item.type === 'operation') {
+      return (
+        <div className={item.style} style={{ minWidth: (item.Width || 120) + 'px' }}>
+          {item.operations.map(btn => {
+            return <Button
+              className={'mk-btn mk-' + btn.class}
+              icon={btn.icon}
+              key={btn.uuid}
+              onClick={(e) => {this.actionTrigger(e, btn, record)}}
+            >{btn.label}</Button>
+          })}
+        </div>
+      )
+    } else {
+      let content = ''
+      if (item.field) {
+        content = record[item.field] || ''
+      }
+      return (
+        // <div className="content" style={{ minWidth: (item.Width || 120) + 'px' }}>
+        <div>
+          <div className={'background'}></div>
+          <div className="content" style={{ minWidth: (item.Width || 120) + 'px' }}>
+            {content}
+          </div>
+        </div>
+      )
+    }
+  }
+
+  actionTrigger = (e, btn, record) => {
+    e.stopPropagation()
+    console.log(btn)
+    console.log(record)
+  }
+
   copycontent = (e, content) => {
     // 琛ㄦ牸涓唴瀹瑰鍒�
     e.stopPropagation()
diff --git a/src/tabviews/commontable/mainTable/index.scss b/src/tabviews/commontable/mainTable/index.scss
index 2556ca0..510e56b 100644
--- a/src/tabviews/commontable/mainTable/index.scss
+++ b/src/tabviews/commontable/mainTable/index.scss
@@ -11,6 +11,14 @@
       min-width: 60px;
       max-width: 60px;
     }
+    // .ant-table-tbody > tr td:not(.ant-table-selection-column) {
+    //   padding: 0!important;
+    // }
+    // .ant-table-tbody > tr td .content {
+    //   padding: 12px 8px;
+    //   height: 100%;
+    //   background: lightblue;
+    // }
     .ant-table-tbody > tr.ant-table-row-selected td {
       background-color: #c4ebfd;
     }
@@ -34,7 +42,20 @@
         border-right: 0;
       }
       .ant-table-tbody > tr > td.ant-table-column-has-actions {
+        position: relative;
+        .background {
+          position: absolute;
+          top: 0px;
+          left: 0px;
+          right: 0px;
+          bottom: 0px;
+        }
+        .background.lightblue {
+          background: lightblue;
+        }
         .content {
+          position: relative;
+          z-index: 1;
           word-wrap: break-word;
           word-break: break-word;
         }
diff --git a/src/tabviews/datamanage/modules/action/index.jsx b/src/tabviews/datamanage/action/index.jsx
similarity index 98%
rename from src/tabviews/datamanage/modules/action/index.jsx
rename to src/tabviews/datamanage/action/index.jsx
index 83dfd8f..871db03 100644
--- a/src/tabviews/datamanage/modules/action/index.jsx
+++ b/src/tabviews/datamanage/action/index.jsx
@@ -313,7 +313,7 @@
     }
     return (
       <Modal
-        wrapClassName='action-modal'
+        wrapClassName='datamanage-action-modal'
         title={this.state.execAction.MenuName || ''}
         visible={this.state.visible}
         width={document.body.clientWidth * this.state.execAction.PopWidth}
@@ -401,7 +401,7 @@
   render() {
     return (
       <Affix offsetTop={48}>
-        <div className="button-list" id={this.props.MenuNo + 'mainaction'}>
+        <div className="datamanage-button-list" id={this.props.MenuNo + 'mainaction'}>
           {this.props.actions.map((item, index) => {
             return (
               <Button
diff --git a/src/tabviews/datamanage/modules/action/index.scss b/src/tabviews/datamanage/action/index.scss
similarity index 94%
rename from src/tabviews/datamanage/modules/action/index.scss
rename to src/tabviews/datamanage/action/index.scss
index d5333a3..e57aa6f 100644
--- a/src/tabviews/datamanage/modules/action/index.scss
+++ b/src/tabviews/datamanage/action/index.scss
@@ -1,4 +1,4 @@
-.button-list {
+.datamanage-button-list {
   padding: 10px 20px 5px;
   background: #ffffff;
   button {
@@ -10,7 +10,7 @@
   }
 }
 // 璁剧疆妯℃�佹鏍峰紡锛岃瀹氭渶澶ф渶灏忛珮搴︼紝閲嶇疆婊氬姩鏉�
-.action-modal {
+.datamanage-action-modal {
   .ant-modal {
     max-width: 95vw;
   }
diff --git a/src/tabviews/datamanage/index.jsx b/src/tabviews/datamanage/index.jsx
index dea5447..49bdb4b 100644
--- a/src/tabviews/datamanage/index.jsx
+++ b/src/tabviews/datamanage/index.jsx
@@ -6,9 +6,9 @@
 import MutilForm from '@/components/mutilform'
 import {refreshTabView} from '@/store/action'
 import Api from '@/api'
-import DataSearch from './modules/search'
-import DataAction from './modules/action'
-import DataTable from './modules/table'
+import DataSearch from './search'
+import DataAction from './action'
+import DataTable from './table'
 import Loading from '@/components/loading'
 import zhCN from '@/locales/zh-CN/main.js'
 import enUS from '@/locales/en-US/main.js'
diff --git a/src/tabviews/datamanage/modules/search/index.jsx b/src/tabviews/datamanage/search/index.jsx
similarity index 98%
rename from src/tabviews/datamanage/modules/search/index.jsx
rename to src/tabviews/datamanage/search/index.jsx
index ca0d657..138ad05 100644
--- a/src/tabviews/datamanage/modules/search/index.jsx
+++ b/src/tabviews/datamanage/search/index.jsx
@@ -186,7 +186,7 @@
 
   render() {
     return (
-      <Form className="ant-advanced-search-form main-search" onSubmit={this.handleSearch}>
+      <Form className="ant-advanced-search-form datamanage-search" onSubmit={this.handleSearch}>
         <Row gutter={24}>{this.getFields()}</Row>
       </Form>
     )
diff --git a/src/tabviews/datamanage/modules/search/index.scss b/src/tabviews/datamanage/search/index.scss
similarity index 75%
rename from src/tabviews/datamanage/modules/search/index.scss
rename to src/tabviews/datamanage/search/index.scss
index 34418e4..91cf85c 100644
--- a/src/tabviews/datamanage/modules/search/index.scss
+++ b/src/tabviews/datamanage/search/index.scss
@@ -1,4 +1,4 @@
-.ant-advanced-search-form.main-search {
+.ant-advanced-search-form.datamanage-search {
   padding: 0px 24px 20px;
   border-bottom: 1px solid #d9d9d9;
   .ant-form-item {
@@ -10,5 +10,6 @@
   }
   .ant-form-item-label {
     width: 100px;
+    text-overflow: ellipsis;
   }
 }
\ No newline at end of file
diff --git a/src/tabviews/datamanage/modules/table/index.jsx b/src/tabviews/datamanage/table/index.jsx
similarity index 98%
rename from src/tabviews/datamanage/modules/table/index.jsx
rename to src/tabviews/datamanage/table/index.jsx
index ff79406..b49715f 100644
--- a/src/tabviews/datamanage/modules/table/index.jsx
+++ b/src/tabviews/datamanage/table/index.jsx
@@ -117,7 +117,7 @@
       }
     }
     return (
-      <div className="main-table">
+      <div className="datamanage-table">
         {this.state.fixed && <Affix offsetTop={105} className="fix-header">
           <Table
             bordered={true}
diff --git a/src/tabviews/datamanage/modules/table/index.scss b/src/tabviews/datamanage/table/index.scss
similarity index 98%
rename from src/tabviews/datamanage/modules/table/index.scss
rename to src/tabviews/datamanage/table/index.scss
index 39babb8..17d535f 100644
--- a/src/tabviews/datamanage/modules/table/index.scss
+++ b/src/tabviews/datamanage/table/index.scss
@@ -1,4 +1,4 @@
-.main-table {
+.datamanage-table {
   padding: 0 20px 110px;
   table {
     max-width: 100%;
diff --git a/src/templates/comtableconfig/actionform/index.jsx b/src/templates/comtableconfig/actionform/index.jsx
index c9c3d81..3ab322e 100644
--- a/src/templates/comtableconfig/actionform/index.jsx
+++ b/src/templates/comtableconfig/actionform/index.jsx
@@ -68,6 +68,7 @@
     formlist: null,
     openType: null,
     interType: null,
+    position: null,
     reqOptionSgl: [{
       MenuID: 'requiredSgl',
       text: this.props.dict['header.form.requiredSgl']
@@ -91,13 +92,21 @@
     }, {
       MenuID: 'requiredOnce',
       text: this.props.dict['header.form.requiredOnce']
-    }]
+    }],
+    // [{
+    //   MenuID: 'toolbar',
+    //   text: this.state.dict['header.form.toolbar']
+    // }, {
+    //   MenuID: 'grid',
+    //   text: this.state.dict['header.form.grid']
+    // }]
   }
 
   
   UNSAFE_componentWillMount () {
     let _opentype = this.props.formlist.filter(form => form.key === 'OpenType')[0].initVal
     let _intertype = this.props.formlist.filter(form => form.key === 'intertype')[0].initVal
+    let _position = this.props.formlist.filter(form => form.key === 'position')[0].initVal
     let _options = null
     if (_opentype === 'innerpage') { // 鏂伴〉闈紙鍐呴儴锛夛紝鍙�夋ā鏉�
       _options = ['label', 'Ot', 'OpenType', 'pageTemplate', 'icon', 'class', 'position']
@@ -105,9 +114,15 @@
       _options = ['label', 'Ot', 'OpenType', 'url', 'icon', 'class', 'position']
     } else if (_opentype === 'blank' || _opentype === 'tab' || _opentype === 'popview') {
       _options = ['label', 'Ot', 'OpenType', 'icon', 'class', 'position']
+    } else if (_opentype === 'excelIn' || _opentype === 'excelOut') {
+      if (_intertype === 'outer') {
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'icon', 'class', 'execSuccess', 'execError', 'method']
+      } else {
+        _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'icon', 'class', 'execSuccess', 'execError', 'sql']
+      }
     } else {
       if (_intertype === 'outer') {
-      _options = ['label', 'position', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'Ot', 'icon', 'class', 'execSuccess', 'execError', 'method']
+        _options = ['label', 'position', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'Ot', 'icon', 'class', 'execSuccess', 'execError', 'method']
       } else {
         _options = ['label', 'position', 'OpenType', 'intertype', 'innerFunc', 'Ot', 'icon', 'class', 'execSuccess', 'execError', 'sql']
       }
@@ -115,13 +130,14 @@
     this.setState({
       openType: _opentype,
       interType: _intertype,
+      position: _position,
       formlist: this.props.formlist.map(item => {
         if (item.key === 'class') {
           item.options = btnClasses
         } else if (item.key === 'icon') {
           item.options = btnIcons
         } else if (item.key === 'Ot') {
-          if (_opentype === 'innerpage') {
+          if (_opentype === 'innerpage' || _position === 'grid') {
             item.options = this.state.reqOptionSgl
           } else if (['outerpage', 'blank', 'tab', 'pop', 'popview'].includes(_opentype)) {
             item.options = this.state.reqOptions
@@ -135,6 +151,7 @@
     })
   }
 
+  // 鎵撳紑鏂瑰紡鎴栨樉绀轰綅缃彉鍖�
   openTypeChange = (key, value) => {
     if (key === 'OpenType') {
       let _options = null
@@ -144,6 +161,12 @@
         _options = ['label', 'Ot', 'OpenType', 'url', 'icon', 'class', 'position']
       } else if (value === 'blank' || value === 'tab' || value === 'popview') {
         _options = ['label', 'Ot', 'OpenType', 'icon', 'class', 'position']
+      } else if (value === 'excelIn' || value === 'excelOut') {
+        if (this.state.interType === 'outer') {
+          _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'interface', 'outerFunc', 'callbackFunc', 'icon', 'class', 'execSuccess', 'execError', 'method']
+        } else {
+          _options = ['label', 'OpenType', 'intertype', 'innerFunc', 'icon', 'class', 'execSuccess', 'execError', 'sql']
+        }
       } else {
         if (this.state.interType === 'inner') {
           _options = ['label', 'position', 'OpenType', 'intertype', 'innerFunc', 'Ot', 'icon', 'class', 'execSuccess', 'execError', 'sql']
@@ -161,7 +184,7 @@
             }
           }
           if (item.key === 'Ot') {
-            if (value === 'innerpage') {
+            if (value === 'innerpage' || this.state.position === 'grid') {
               item.options = this.state.reqOptionSgl
               item.initVal = 'requiredSgl'
               item.hidden = true
@@ -176,8 +199,37 @@
           return item
         })
       }, () => {
-        if (!['innerpage', 'outerpage', 'blank', 'tab', 'pop', 'popview'].includes(value)) return
+        if (['excelIn', 'excelOut'].includes(value)) return
 
+        this.setState({
+          formlist: this.state.formlist.map(item => {
+            if (item.key === 'Ot') {
+              item.hidden = false
+            }
+            return item
+          })
+        })
+      })
+    } else if (key === 'position') {
+      this.setState({
+        position: value,
+        formlist: this.state.formlist.map(item => {
+          if (item.key === 'Ot') {
+            if (this.state.openType === 'innerpage' || value === 'grid') {
+              item.options = this.state.reqOptionSgl
+              item.initVal = 'requiredSgl'
+              item.hidden = true
+            } else if (['outerpage', 'blank', 'tab', 'pop', 'popview'].includes(this.state.openType)) {
+              item.options = this.state.reqOptions
+              item.initVal = 'requiredSgl'
+              item.hidden = true
+            } else {
+              item.options = this.state.reqOptionsMutil
+            }
+          }
+          return item
+        })
+      }, () => {
         this.setState({
           formlist: this.state.formlist.map(item => {
             if (item.key === 'Ot') {
@@ -309,6 +361,11 @@
           values.id = this.props.card.id
           values.uuid = this.props.card.uuid
 
+          if (values.OpenType === 'excelIn' || values.OpenType === 'excelOut') {
+            values.position = 'toolbar'
+            values.Ot = 'notRequired'
+          }
+
           if (values.innerFunc === '' && values.sql === '') {
             notification.warning({
               top: 92,
diff --git a/src/templates/comtableconfig/index.jsx b/src/templates/comtableconfig/index.jsx
index b4c1cd9..97e9a88 100644
--- a/src/templates/comtableconfig/index.jsx
+++ b/src/templates/comtableconfig/index.jsx
@@ -479,6 +479,12 @@
             MenuID: 'tab',
             text: this.state.dict['header.form.tab']
           }, {
+            MenuID: 'excelIn',
+            text: this.state.dict['header.form.excelIn']
+          }, {
+            MenuID: 'excelOut',
+            text: this.state.dict['header.form.excelOut']
+          }, {
             MenuID: 'blank',
             text: this.state.dict['header.form.blank']
           }, {
@@ -543,14 +549,6 @@
           readonly: false
         },
         {
-          type: 'select',
-          key: 'Ot',
-          label: this.state.dict['header.form.isRequired'],
-          initVal: card.Ot || 'requiredSgl',
-          required: true,
-          options: []
-        },
-        {
           type: 'text',
           key: 'callbackFunc',
           label: this.state.dict['header.form.callbackFunc'],
@@ -574,6 +572,14 @@
         },
         {
           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',
diff --git a/src/templates/comtableconfig/index.scss b/src/templates/comtableconfig/index.scss
index f2e117c..c7a4b83 100644
--- a/src/templates/comtableconfig/index.scss
+++ b/src/templates/comtableconfig/index.scss
@@ -13,7 +13,8 @@
     background: #ffffff;
     border-right: 1px solid #d9d9d9;
     height: 100%;
-    overflow-y: auto;
+    overflow-y: hidden;
+    // overflow-y: auto;
     padding-bottom: 30px;
     .ant-collapse-item {
       position: relative;
@@ -28,6 +29,8 @@
     .ant-collapse-header {
       padding: 11px 16px 10px 40px;
       border-bottom: 1px solid #d9d9d9;
+      background: #1890ff;
+      color: #ffffff;
     }
     .ant-collapse-content-box {
       .ant-form-item {
@@ -85,7 +88,9 @@
       }
     }
   }
-  
+  .tools:hover {
+    overflow-y: auto;
+  }
   .tools::-webkit-scrollbar {
     width: 7px;
   }
diff --git a/src/templates/comtableconfig/source.jsx b/src/templates/comtableconfig/source.jsx
index 16c294a..edd1705 100644
--- a/src/templates/comtableconfig/source.jsx
+++ b/src/templates/comtableconfig/source.jsx
@@ -283,6 +283,18 @@
     },
     {
       type: 'action',
+      label: CommonDict['header.form.excelIn'],
+      subType: 'excelIn',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['header.form.excelOut'],
+      subType: 'excelOut',
+      url: ''
+    },
+    {
+      type: 'action',
       label: CommonDict['header.form.blank'],
       subType: 'blank',
       url: ''
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index d2a148c..b1cbfa0 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -8,7 +8,8 @@
 import options from '@/store/options.js'
 import Utils from '@/utils/utils.js'
 import asyncComponent from '@/utils/asyncComponent'
-import logourl from '../../assets/img/login-logo.png'
+import logourl from '@/assets/img/login-logo.png'
+import loginbg from '@/assets/img/loginbg.jpg'
 import './index.scss'
 
 const LoginForm = asyncComponent(() => import('./loginform'))
@@ -122,7 +123,7 @@
         <div className="logo">
           <img src={logourl} alt=""/>
         </div>
-        <div className="login-middle">
+        <div className="login-middle" style={{background: 'url(' + loginbg + ')'}}>
           <LoginForm
             dict={this.state.dict}
             auth={this.state.auth}
diff --git a/src/views/login/index.scss b/src/views/login/index.scss
index 2ea7d07..70a4965 100644
--- a/src/views/login/index.scss
+++ b/src/views/login/index.scss
@@ -13,7 +13,7 @@
   .login-middle {
     height: calc(100vh - 194px);
     min-height: 420px;
-    background: url('../../assets/img/loginbg.jpg');
+    // background: url('../../assets/img/loginbg.jpg');
     background-size: cover;
     background-position: center center;
     border-bottom: 2px solid #06b4f7;
@@ -85,6 +85,9 @@
       .ant-btn {
         font-size: 18px;
       }
+      .anticon-eye {
+        color: #1890ff;
+      }
     }
   }
   .login-bottom {
diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx
index b3398ca..8dea33d 100644
--- a/src/views/login/loginform.jsx
+++ b/src/views/login/loginform.jsx
@@ -76,15 +76,14 @@
         </Form.Item>
         <Form.Item>
           {getFieldDecorator('password', {
-            rules: [{ required: true, message: this.props.dict['login.password.empty'] }],
             initialValue: localStorage.getItem('password') || '',
-          })(
-            <Input
-              prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}
-              type="password"
-              placeholder={this.props.dict['login.password']}
-            />,
-          )}
+            rules: [
+              {
+                required: true,
+                message: this.props.dict['login.password.empty'],
+              }
+            ]
+          })(<Input.Password placeholder={this.props.dict['login.password']} prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} />)}
         </Form.Item>
         <Form.Item className="minline">
           {getFieldDecorator('remember', {

--
Gitblit v1.8.0