From d87530a16ed85534432e3c60c644dc96d63f6f69 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 02 十二月 2021 17:20:02 +0800
Subject: [PATCH] Merge branch 'master' into bms

---
 src/assets/css/viewstyle.scss                                                    |   14 +
 src/views/design/header/index.jsx                                                |   56 ++--
 src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx |   13 
 src/menu/components/card/cardcellcomponent/index.jsx                             |   10 
 src/tabviews/zshare/topSearch/index.jsx                                          |   43 +++
 src/templates/formtabconfig/index.jsx                                            |   10 
 src/templates/zshare/verifycard/index.jsx                                        |  128 ++++++++---
 src/router/index.js                                                              |    3 
 src/menu/components/share/actioncomponent/index.jsx                              |   10 
 public/options.json                                                              |    2 
 src/tabviews/zshare/mutilform/mkSelect/index.jsx                                 |   30 ++
 src/menu/components/form/formaction/index.jsx                                    |   10 
 src/templates/sharecomponent/actioncomponent/index.jsx                           |   10 
 src/tabviews/custom/components/card/balcony/index.jsx                            |    2 
 src/templates/sharecomponent/actioncomponent/index.scss                          |    6 
 src/templates/zshare/customscript/index.jsx                                      |    9 
 src/views/appmanage/submutilform/index.jsx                                       |    2 
 src/views/mobdesign/index.jsx                                                    |   86 +++++++
 src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx             |  105 +-------
 src/templates/sharecomponent/actioncomponent/dragaction/card.jsx                 |    9 
 src/menu/datasource/verifycard/index.jsx                                         |    9 
 src/templates/zshare/verifycard/index.scss                                       |    3 
 src/views/login/index.jsx                                                        |   82 +++++++
 23 files changed, 460 insertions(+), 192 deletions(-)

diff --git a/public/options.json b/public/options.json
index 3a794e0..72f9117 100644
--- a/public/options.json
+++ b/public/options.json
@@ -10,7 +10,7 @@
   "defaultLang": "zh-CN",
   "WXAppID": "",
   "debugger": false,
-  "licenseKey": "",
+  "licenseKey": "7EFE13KIKKILIJ7C8CFC",
   "probation": "",
   "host": "http://bms-test.kresstools.cn",
   "service": "oc/"
diff --git a/src/assets/css/viewstyle.scss b/src/assets/css/viewstyle.scss
index fa3c6cf..83b2b59 100644
--- a/src/assets/css/viewstyle.scss
+++ b/src/assets/css/viewstyle.scss
@@ -438,6 +438,20 @@
       border-color: $color6;
     }
   }
+  .ant-carousel {
+    .slick-dots {
+      >li {
+        button {
+          background-color: $color3;
+        }
+      }
+      >li.slick-active {
+        button {
+          background-color: $color6;
+        }
+      }
+    }
+  }
 }
 
 body.hidden-split-line #root { // 鍘婚櫎鐧诲綍椤靛垎鍓茬嚎
diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 1d322fd..7686036 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -671,7 +671,15 @@
             maskClosable={false}
             okText={dict['model.submit']}
             onOk={this.verifySubmit}
-            onCancel={() => { this.setState({ profVisible: false }) }}
+            onCancel={() => {
+              if (this.verifyRef.handleCancel) {
+                this.verifyRef.handleCancel().then(() => {
+                  this.setState({ profVisible: false })
+                })
+              } else {
+                this.setState({ profVisible: false })
+              }
+            }}
             destroyOnClose
           >
             {card && !card.execMode && card.OpenType !== 'excelIn' && card.OpenType !== 'excelOut' ?
diff --git a/src/menu/components/form/formaction/index.jsx b/src/menu/components/form/formaction/index.jsx
index 86b5ce0..b3a1f9e 100644
--- a/src/menu/components/form/formaction/index.jsx
+++ b/src/menu/components/form/formaction/index.jsx
@@ -251,7 +251,15 @@
           maskClosable={false}
           okText={dict['model.submit']}
           onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ profVisible: false }) }}
+          onCancel={() => {
+            if (this.verifyRef.handleCancel) {
+              this.verifyRef.handleCancel().then(() => {
+                this.setState({ profVisible: false })
+              })
+            } else {
+              this.setState({ profVisible: false })
+            }
+          }}
           destroyOnClose
         >
           <VerifyCard
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index ea3fb0c..c7718dc 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -496,7 +496,15 @@
           maskClosable={false}
           okText={dict['model.submit']}
           onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ profVisible: false }) }}
+          onCancel={() => {
+            if (this.verifyRef.handleCancel) {
+              this.verifyRef.handleCancel().then(() => {
+                this.setState({ profVisible: false })
+              })
+            } else {
+              this.setState({ profVisible: false })
+            }
+          }}
           destroyOnClose
         >
           {card && !card.execMode && card.OpenType !== 'excelIn' && card.OpenType !== 'excelOut' ?
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index e21bfda..095b693 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -2,6 +2,7 @@
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
 import { Form, Tabs, Popconfirm, Icon, notification, Modal, Typography, Spin, message } from 'antd'
+import { StopOutlined, CheckCircleOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -117,15 +118,15 @@
         width: '13%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
diff --git a/src/router/index.js b/src/router/index.js
index 65d856c..78c75a3 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -84,8 +84,9 @@
     let _s = md5('mksoft' + moment().format('YYYYMMDD'))
     let isauth = authCode && authCode.includes(_s)
     let key = md5(window.GLOB.appId + 'minke_software' + window.GLOB.appkey).toUpperCase().substr(-6)
+    let key1 = window.GLOB.licenseKey ? window.GLOB.licenseKey.substring(0, 6) : ''
 
-    if (window.GLOB.licenseKey === key) {
+    if (key1 === key) {
       isauth = true
     }
 
diff --git a/src/tabviews/custom/components/card/balcony/index.jsx b/src/tabviews/custom/components/card/balcony/index.jsx
index 8f0c7e6..72ad28f 100644
--- a/src/tabviews/custom/components/card/balcony/index.jsx
+++ b/src/tabviews/custom/components/card/balcony/index.jsx
@@ -100,7 +100,7 @@
       config: _config,
       arr_field: _config.columns.map(col => col.field).join(','),
     }, () => {
-      if (_config.wrap.datatype !== 'static' && _config.setting && _config.setting.sync !== 'true' && _config.setting.onload === 'true') {
+      if (_config.wrap.datatype !== 'static' && _config.setting && _config.setting.sync !== 'true') {
         this.loadData()
       }
     })
diff --git a/src/tabviews/zshare/mutilform/mkSelect/index.jsx b/src/tabviews/zshare/mutilform/mkSelect/index.jsx
index 192ddd4..86ff5c5 100644
--- a/src/tabviews/zshare/mutilform/mkSelect/index.jsx
+++ b/src/tabviews/zshare/mutilform/mkSelect/index.jsx
@@ -17,6 +17,19 @@
       } else {
         value = []
       }
+    } else if (value) {
+      let option = null
+      if (config.setAll === 'true') {
+        option= config.oriOptions[1]
+      } else {
+        option= config.oriOptions[0]
+      }
+      if (typeof(value) === 'string' && option && typeof(option.value) === 'number') {
+        value = +value
+        if (isNaN(value)) {
+          value = config.initval
+        }
+      }
     }
 
     this.state = {
@@ -40,7 +53,7 @@
   }
 
   UNSAFE_componentWillReceiveProps (nextProps) {
-    const { config } = this.state
+    const { config, value } = this.state
 
     if (!is(fromJS(config.oriOptions), fromJS(nextProps.config.oriOptions))) {
       this.setState({
@@ -52,6 +65,21 @@
         this.setState({
           value: nextProps.config.initval,
         })
+      } else {
+        let option = null
+        if (config.setAll === 'true') {
+          option= nextProps.config.oriOptions[1]
+        } else {
+          option= nextProps.config.oriOptions[0]
+        }
+        if (option && typeof(option.value) === 'number') {
+          let val = +value
+          if (!isNaN(val)) {
+            this.setState({
+              value: val
+            })
+          }
+        }
       }
     }
   }
diff --git a/src/tabviews/zshare/topSearch/index.jsx b/src/tabviews/zshare/topSearch/index.jsx
index 4a2ad50..cbb6432 100644
--- a/src/tabviews/zshare/topSearch/index.jsx
+++ b/src/tabviews/zshare/topSearch/index.jsx
@@ -520,9 +520,16 @@
       this.props.form.validateFields((err, values) => {
         if (err) return
   
-        let searches = this.getFieldsValues(values)
+        let { searches, error } = this.getFieldsValues(values)
   
-        if (this.state.hasReqFields) {
+        if (error) {
+          notification.warning({
+            top: 92,
+            message: error,
+            duration: 3
+          })
+          return
+        } else if (this.state.hasReqFields) {
           let requireFields = searches.filter(item => item.required && item.value === '')
           if (requireFields.length > 0) {
             let labels = requireFields.map(item => item.label)
@@ -580,6 +587,7 @@
 
     // 鑾峰彇鎼滅储鏉′欢鍊�
     let search = []
+    let error = null
     searchlist.forEach(item => {
       if (item.type === 'group') {
         search.push({
@@ -601,10 +609,37 @@
         })
       } else {
         let type = item.type
+        let val = values[item.field] !== undefined ? values[item.field] : ''
+
         if (type === 'multiselect' || (type === 'checkcard' && item.multiple === 'true')) {
           type = 'multi'
+        } else if (type === 'text' && !error) {
+          if (/'/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鑻辨枃鐘舵�佺殑鍗曞紩鍙枫�俙
+          } else if (/(^|\s)select\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梥elect銆俙
+          } else if (/\sfrom(\s|\()/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梖rom銆俙
+          } else if (/(^|\s)insert\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梚nsert銆俙
+          } else if (/(^|\s)delete\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梔elete銆俙
+          } else if (/(^|\s)update\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梪pdate銆俙
+          } else if (/(^|\s)where\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梬here銆俙
+          } else if (/(^|\s)drop\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梔rop銆俙
+          } else if (/(^|\s)exec\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梕xec銆俙
+          } else if (/(^|\s)truncate\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梩runcate銆俙
+          } else if (/(^|\s)while\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梬hile銆俙
+          } else if (/(^|\s)for\s/ig.test(val)) {
+            error = `鎼滅储鏉′欢${item.label}涓紝涓嶅彲浣跨敤鍏抽敭瀛梖or銆俙
+          }
         }
-        let val = values[item.field] !== undefined ? values[item.field] : ''
 
         if (typeof(val) === 'string') {
           val = val.replace(/(^\s*|\s*$)/ig, '')
@@ -622,7 +657,7 @@
       }
     })
 
-    return search
+    return {searches: search, error}
   }
 
   handleOk = (values) => {
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index fbe82e8..ae8ce10 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/src/templates/formtabconfig/index.jsx
@@ -2019,7 +2019,15 @@
           maskClosable={false}
           okText={this.state.dict['model.submit']}
           onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ profileVisible: false }) }}
+          onCancel={() => {
+            if (this.verifyRef.handleCancel) {
+              this.verifyRef.handleCancel().then(() => {
+                this.setState({ profileVisible: false })
+              })
+            } else {
+              this.setState({ profileVisible: false })
+            }
+          }}
           destroyOnClose
         >
           <VerifyCard
diff --git a/src/templates/sharecomponent/actioncomponent/dragaction/card.jsx b/src/templates/sharecomponent/actioncomponent/dragaction/card.jsx
index 7f983f0..6fde75c 100644
--- a/src/templates/sharecomponent/actioncomponent/dragaction/card.jsx
+++ b/src/templates/sharecomponent/actioncomponent/dragaction/card.jsx
@@ -28,10 +28,17 @@
   const opacity = isDragging ? 0 : 1
 
   let hasProfile = false
+  let forbidSql = false
   if (['pop', 'prompt', 'exec'].includes(card.OpenType)) {
     hasProfile = true
+    if (card.verify && card.verify.default === 'false') {
+      forbidSql = true
+    }
   } else if (card.OpenType === 'excelIn' || card.OpenType === 'excelOut') {
     hasProfile = true
+    if (card.verify && card.verify.default === 'false') {
+      forbidSql = true
+    }
   } else if (card.funcType === 'print') {
     hasProfile = true
   }
@@ -53,7 +60,7 @@
             key={card.uuid}
             onDoubleClick={() => doubleClickCard(id)}
           >
-            {card.label}{card.position === 'grid' && <Icon type="table" />}
+            {card.label}{card.position === 'grid' && <Icon type="table" />}{forbidSql && <Icon type="disconnect" />}
           </Button>
         </div>
       </div>
diff --git a/src/templates/sharecomponent/actioncomponent/index.jsx b/src/templates/sharecomponent/actioncomponent/index.jsx
index f1b2953..635027e 100644
--- a/src/templates/sharecomponent/actioncomponent/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/index.jsx
@@ -912,7 +912,15 @@
           maskClosable={false}
           okText={dict['model.submit']}
           onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ profVisible: false }) }}
+          onCancel={() => {
+            if (this.verifyRef.handleCancel) {
+              this.verifyRef.handleCancel().then(() => {
+                this.setState({ profVisible: false })
+              })
+            } else {
+              this.setState({ profVisible: false })
+            }
+          }}
           destroyOnClose
         >
           {card && !card.execMode && card.OpenType !== 'excelIn' && card.OpenType !== 'excelOut' ?
diff --git a/src/templates/sharecomponent/actioncomponent/index.scss b/src/templates/sharecomponent/actioncomponent/index.scss
index 6a0e1f5..cfa9c43 100644
--- a/src/templates/sharecomponent/actioncomponent/index.scss
+++ b/src/templates/sharecomponent/actioncomponent/index.scss
@@ -23,6 +23,12 @@
         right: 1px;
         bottom: 0px;
       }
+      .anticon-disconnect {
+        font-size: 10px;
+        position: absolute;
+        right: 1px;
+        top: 0px;
+      }
     }
   }
 }
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
index 1fef86d..1328845 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/index.jsx
@@ -1,8 +1,8 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
-import { Form, Tabs, Row, Col, Input, Button, Table, Popconfirm, Icon, Tooltip, notification, Modal, message, InputNumber, Radio, Typography } from 'antd'
-import { QuestionCircleOutlined } from '@ant-design/icons'
+import { Form, Tabs, Row, Col, Input, Button, Popconfirm, Icon, Tooltip, notification, Modal, message, InputNumber, Radio, Typography } from 'antd'
+import { QuestionCircleOutlined, StopOutlined, CheckCircleOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -153,15 +153,15 @@
         inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
@@ -189,15 +189,13 @@
         dataIndex: 'position',
         width: '10%',
         render: (text, record) => {
-          let _text = ''
-          if (record.position === 'front') {
-            _text = 'sql鍓�'
-          } else if (record.position === 'init') {
-            _text = '鍒濆鍖�'
+          if (record.position === 'init') {
+            return <span style={{color: 'orange'}}>鍒濆鍖�</span>
+          } else if (record.position === 'front') {
+            return <span style={{color: '#26C281'}}>sql鍓�</span>
           } else {
-            _text = 'sql鍚�'
+            return <span style={{color: '#1890ff'}}>sql鍚�</span>
           }
-          return _text
         }
       },
       {
@@ -206,28 +204,26 @@
         width: '10%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
       {
         title: '鎿嶄綔',
         align: 'center',
-        width: '20%',
+        width: '140px',
         dataIndex: 'operation',
         render: (text, record) =>
-          (<div>
+          (<div style={{textAlign: 'center'}}>
             <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record, 'scripts')} style={{color: '#1890ff'}}><Icon type="edit" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.up']} onClick={() => this.handleUpDown(record, 'scripts', 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span>
-            <span className="operation-btn" title={this.props.dict['header.form.down']} onClick={() => this.handleUpDown(record, 'scripts', 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span>
             <span className="operation-btn" title={this.props.dict['header.form.status.change']} onClick={() => this.handleStatus(record, 'scripts')} style={{color: '#8E44AD'}}><Icon type="swap" /></span>
             <Popconfirm
               overlayClassName="popover-confirm"
@@ -587,68 +583,6 @@
     })
   }
 
-  handleUpDown = (record, type, direction) => {
-    let verify = JSON.parse(JSON.stringify(this.state.verify))
-    let index = 0
-
-    if (type === 'columns') {
-      verify.columns = verify.columns.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.columns.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.columns.splice(index - 1, 0, record)
-      } else {
-        verify.columns.splice(index + 1, 0, record)
-      }
-    } else if (type === 'unique') {
-      verify.uniques = verify.uniques.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.uniques.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.uniques.splice(index - 1, 0, record)
-      } else {
-        verify.uniques.splice(index + 1, 0, record)
-      }
-    } else if (type === 'scripts') {
-      verify.scripts = verify.scripts.filter((item, i) => {
-        if (item.uuid === record.uuid) {
-          index = i
-        }
-
-        return item.uuid !== record.uuid
-      })
-      if ((index === 0 && direction === 'up') || (index === verify.scripts.length && direction === 'down')) {
-        return
-      }
-
-      if (direction === 'up') {
-        verify.scripts.splice(index - 1, 0, record)
-      } else {
-        verify.scripts.splice(index + 1, 0, record)
-      }
-    }
-
-    this.setState({
-      verify: verify
-    })
-  }
-
   handleConfirm = () => {
     const { verify } = this.state
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
@@ -878,14 +812,15 @@
               scriptsChange={this.scriptsChange}
               wrappedComponentRef={(inst) => this.scriptsForm = inst}
             />
-            <Table
+            <EditTable actions={['move']} data={verify.scripts} columns={scriptsColumns} onChange={(scripts) => {this.setState({verify: {...verify, scripts}})}}/>
+            {/* <Table
               bordered
               rowKey="uuid"
               className="custom-table"
               dataSource={verify.scripts}
               columns={scriptsColumns}
               pagination={false}
-            />
+            /> */}
           </TabPane> : null}
           <TabPane tab="淇℃伅鎻愮ず" key="tip">
             <Form {...formItemLayout}>
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
index d1ed393..41dce62 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
@@ -2,6 +2,7 @@
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
 import { Form, Row, Col, Icon, Button, notification, Select, Popconfirm, Typography, Modal, Radio } from 'antd'
+import { StopOutlined, CheckCircleOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Utils from '@/utils/utils.js'
@@ -55,9 +56,9 @@
         width: '13%',
         render: (text, record) => {
           if (record.position === 'front') {
-            return 'sql鍓�'
+            return <span style={{color: '#26C281'}}>sql鍓�</span>
           } else {
-            return 'sql鍚�'
+            return <span style={{color: '#1890ff'}}>sql鍚�</span>
           }
         }
       },
@@ -67,15 +68,15 @@
         width: '12%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
diff --git a/src/templates/zshare/customscript/index.jsx b/src/templates/zshare/customscript/index.jsx
index 9b211ba..bf6ddb4 100644
--- a/src/templates/zshare/customscript/index.jsx
+++ b/src/templates/zshare/customscript/index.jsx
@@ -2,6 +2,7 @@
 import PropTypes from 'prop-types'
 import { fromJS } from 'immutable'
 import { Form, Row, Col, Icon, Button, notification, Select, Popconfirm, Typography } from 'antd'
+import { StopOutlined, CheckCircleOutlined } from '@ant-design/icons'
 import moment from 'moment'
 
 import Utils from '@/utils/utils.js'
@@ -54,15 +55,15 @@
         width: '12%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" />
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
diff --git a/src/templates/zshare/verifycard/index.jsx b/src/templates/zshare/verifycard/index.jsx
index 94e8755..9d42d79 100644
--- a/src/templates/zshare/verifycard/index.jsx
+++ b/src/templates/zshare/verifycard/index.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { fromJS } from 'immutable'
+import { is, fromJS } from 'immutable'
 import { Form, Tabs, Row, Col, Radio, Button, Select, Popconfirm, notification, Modal, message, InputNumber, Tooltip, Typography } from 'antd'
 import { QuestionCircleOutlined, CheckCircleOutlined, StopOutlined, EditOutlined, SwapOutlined, DeleteOutlined } from '@ant-design/icons'
 import moment from 'moment'
@@ -97,15 +97,15 @@
         inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       }
@@ -133,15 +133,15 @@
         inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
@@ -207,15 +207,15 @@
         inputType: 'switch',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       }
@@ -228,7 +228,7 @@
         render: (text) => {
           let title = text.match(/^\s*\/\*.+\*\//)
           title = title && title[0] ? title[0] : ''
-          text = title ? text.replace(title, '') : text
+          // text = title ? text.replace(title, '') : text
 
           return (
             <div>
@@ -259,15 +259,15 @@
         width: '9%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
@@ -298,7 +298,7 @@
         render: (text) => {
           let title = text.match(/^\s*\/\*.+\*\//)
           title = title && title[0] ? title[0] : ''
-          text = title ? text.replace(title, '') : text
+          // text = title ? text.replace(title, '') : text
 
           return (
             <div>
@@ -314,11 +314,11 @@
         width: '10%',
         render: (text, record) => {
           if (record.position === 'init') {
-            return '鍒濆鍖�'
+            return <span style={{color: 'orange'}}>鍒濆鍖�</span>
           } else if (record.position === 'front') {
-            return 'sql鍓�'
+            return <span style={{color: '#26C281'}}>sql鍓�</span>
           } else {
-            return 'sql鍚�'
+            return <span style={{color: '#1890ff'}}>sql鍚�</span>
           }
         }
       },
@@ -328,22 +328,22 @@
         width: '10%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
       {
         title: '鎿嶄綔',
         align: 'center',
-        width: '20%',
+        width: '140px',
         dataIndex: 'operation',
         render: (text, record) =>
           (<div style={{textAlign: 'center'}}>
@@ -367,7 +367,7 @@
         render: (text) => {
           let title = text.match(/^\s*\/\*.+\*\//)
           title = title && title[0] ? title[0] : ''
-          text = title ? text.replace(title, '') : text
+          // text = title ? text.replace(title, '') : text
 
           return (
             <div>
@@ -383,9 +383,9 @@
         width: '10%',
         render: (text, record) => {
           if (record.position === 'front') {
-            return 'sql鍓�'
+            return <span style={{color: '#26C281'}}>sql鍓�</span>
           } else {
-            return 'sql鍚�'
+            return <span style={{color: '#1890ff'}}>sql鍚�</span>
           }
         }
       },
@@ -395,15 +395,15 @@
         width: '10%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
@@ -496,15 +496,15 @@
         width: '8%',
         render: (text, record) => record.status === 'false' ?
           (
-            <div>
+            <div style={{color: '#ff4d4f'}}>
               {this.props.dict['model.status.forbidden']}
-              <StopOutlined style={{marginLeft: '5px', color: '#ff4d4f'}} />
+              <StopOutlined style={{marginLeft: '5px'}} />
             </div>
           ) :
           (
-            <div>
+            <div style={{color: '#26C281'}}>
               {this.props.dict['model.status.open']}
-              <CheckCircleOutlined style={{marginLeft: '5px', color: '#52c41a'}}/>
+              <CheckCircleOutlined style={{marginLeft: '5px'}}/>
             </div>
           )
       },
@@ -573,9 +573,20 @@
       })
     }
 
+    _verify.customverifys.forEach((item, i) => {
+      item.$index = i + 1
+    })
+    _verify.scripts.forEach((item, i) => {
+      item.$index = i + 1
+    })
+    _verify.cbScripts.forEach((item, i) => {
+      item.$index = i + 1
+    })
+
     this.setState({
       setting: config.setting || {},
-      verify: _verify
+      verify: _verify,
+      oriVerify: fromJS(_verify).toJS()
     })
 
     if (config.Template !== 'FormTab' && (card.intertype === 'inner' || card.intertype === 'outer')) { // 鍐呴儴鎴栧閮ㄦ帴鍙�
@@ -1398,6 +1409,45 @@
     })
   }
 
+  handleCancel = () => {
+    const { verify, oriVerify } = this.state
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    return new Promise((resolve, reject) => {
+      let msg = ''
+      if (this.customForm && this.customForm.state.editItem) {
+        msg = '鑷畾涔夐獙璇�'
+      } else if (this.customForm && this.customForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.customForm.props.form.getFieldValue('sql'))) {
+        msg = '鑷畾涔夐獙璇�'
+      } else if (this.orderForm && this.orderForm.state.editItem) {
+        msg = '鍗曞彿鐢熸垚'
+      } else if (this.scriptsForm && this.scriptsForm.state.editItem) {
+        msg = '鑷畾涔夎剼鏈�'
+      } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) {
+        msg = '鑷畾涔夎剼鏈�'
+      }
+
+      if (!is(fromJS(verify), fromJS(oriVerify))) {
+        confirm({
+          content: '楠岃瘉淇℃伅宸蹭慨鏀癸紝纭畾鍙栨秷鍚楋紵',
+          onOk() {
+            resolve()
+          },
+          onCancel() {}
+        })
+      } else if (msg) {
+        confirm({
+          content: msg + '鏈繚瀛橈紝纭畾鍙栨秷鍚楋紵',
+          onOk() {
+            resolve()
+          },
+          onCancel() {}
+        })
+      } else {
+        resolve()
+      }
+    })
+  }
+
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
    */
diff --git a/src/templates/zshare/verifycard/index.scss b/src/templates/zshare/verifycard/index.scss
index 9fc9d9e..d3dab25 100644
--- a/src/templates/zshare/verifycard/index.scss
+++ b/src/templates/zshare/verifycard/index.scss
@@ -69,4 +69,7 @@
     padding: 0 5px;
     cursor: pointer;
   }
+  .operation-btn:not(:first-child) {
+    margin-left: 5px;
+  }
 }
\ No newline at end of file
diff --git a/src/views/appmanage/submutilform/index.jsx b/src/views/appmanage/submutilform/index.jsx
index e782e76..96b98d8 100644
--- a/src/views/appmanage/submutilform/index.jsx
+++ b/src/views/appmanage/submutilform/index.jsx
@@ -158,7 +158,7 @@
           </Col>
           {typename !== 'pc' ? <Col span={12}>
             <Form.Item label={
-              <Tooltip placement="topLeft" title="浣跨敤鍏紬鍙锋巿鏉冪櫥褰曟椂锛屾槸鍚﹂渶瑕佺粦瀹氱敤鎴枫��">
+              <Tooltip placement="topLeft" title="浣跨敤鍏紬鍙锋巿鏉冪櫥褰曟垨浣跨敤灏忕▼搴忔椂锛屾槸鍚﹂渶瑕佺粦瀹氱敤鎴枫��">
                 <QuestionCircleOutlined className="mk-form-tip" />
                 鐢ㄦ埛缁戝畾
               </Tooltip>
diff --git a/src/views/design/header/index.jsx b/src/views/design/header/index.jsx
index cf0d77c..fbb0c7b 100644
--- a/src/views/design/header/index.jsx
+++ b/src/views/design/header/index.jsx
@@ -241,34 +241,36 @@
 
   componentDidMount () {
     if (window.GLOB.systemType !== 'production') {
-      Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => {
-        if (res.status) {
-          let _permFuncField = []
-          let _sysRoles = []
-
-          if (res.Roles && res.Roles.length > 0) {
-            _sysRoles = res.Roles.map(role => {
-              return {
-                uuid: Utils.getuuid(),
-                value: role.RoleID,
-                text: role.RoleName
-              }
-            })
+      setTimeout(() => {
+        Api.getSystemConfig({func: 'sPC_Get_Roles_sModular'}).then(res => {
+          if (res.status) {
+            let _permFuncField = []
+            let _sysRoles = []
+  
+            if (res.Roles && res.Roles.length > 0) {
+              _sysRoles = res.Roles.map(role => {
+                return {
+                  uuid: Utils.getuuid(),
+                  value: role.RoleID,
+                  text: role.RoleName
+                }
+              })
+            }
+  
+            if (res.sModular && res.sModular.length > 0) {
+              res.sModular.forEach(field => {
+                if (field.ModularNo) {
+                  _permFuncField.push(field.ModularNo)
+                }
+              })
+              _permFuncField = _permFuncField.sort()
+            }
+  
+            sessionStorage.setItem('sysRoles', JSON.stringify(_sysRoles))
+            sessionStorage.setItem('permFuncField', JSON.stringify(_permFuncField))
           }
-
-          if (res.sModular && res.sModular.length > 0) {
-            res.sModular.forEach(field => {
-              if (field.ModularNo) {
-                _permFuncField.push(field.ModularNo)
-              }
-            })
-            _permFuncField = _permFuncField.sort()
-          }
-
-          sessionStorage.setItem('sysRoles', JSON.stringify(_sysRoles))
-          sessionStorage.setItem('permFuncField', JSON.stringify(_permFuncField))
-        }
-      })
+        })
+      }, 50)
     } else if (window.GLOB.systemType === 'production') {
       this.props.resetEditLevel('HS')
       this.props.modifyMainMenu({
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 8eaa080..79278be 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -337,16 +337,85 @@
     let _s = md5('mksoft' + moment().format('YYYYMMDD'))
     authCode = authCode ? authCode.split(',') : []
     let index = authCode.findIndex(key => key === _s)
+    let license = false
 
-    let key = md5(window.GLOB.appId + 'minke_software' + window.GLOB.appkey).toUpperCase().substr(-6)
+    if (window.GLOB.licenseKey) {
+      if (window.GLOB.licenseKey.length !== 20) {
+        Modal.warning({
+          title: `鏈湴鎺堟潈鐮佸凡澶辨晥锛岃鑱旂郴绠$悊鍛樸�俙,
+          okText: '鐭ラ亾浜�'
+        })
+      } else {
+        let key = md5(window.GLOB.appId + 'minke_software' + window.GLOB.appkey).toUpperCase().substr(-6)
+  
+        let key1 = window.GLOB.licenseKey.substring(0, 6)
+        let key2 = window.GLOB.licenseKey.substring(6, 14)
+        let key3 = window.GLOB.licenseKey.substring(14)
+        let key4 = md5(key1 + key2).toUpperCase().substr(-6)
+  
+        if (key === key1 && key3 === key4) {
+          let last = window.GLOB.appkey[window.GLOB.appkey.length - 1]
+          let offset = 0
+          let keys = {}
+      
+          if (!isNaN(+last)) {
+            offset = (10 - last) % 10
+          } else {
+            last = last.charCodeAt() - 65
+            offset = (30 - last) % 10
+          }
+      
+          for (let i = 0; i < 26; i++) {
+            let char = String.fromCharCode(65 + i)
+            keys[char] = (offset + i) % 10
+          }
+  
+          let lictime = +key2.replace(/[A-Z]/ig, (s) => {
+            return keys[s]
+          })
+          let curtime = +moment().format('YYYYMMDD')
+          let licday = lictime - curtime
+          let _mindUrl = window.location.href.split('#')[0] + 'notMind'
 
-    if (index > -1 || window.GLOB.licenseKey === key) {
+          if (licday < 0 || isNaN(licday)) {
+            Modal.warning({
+              title: '鏈湴鎺堟潈鐮佸凡澶辨晥锛岃鑱旂郴绠$悊鍛樸��',
+              okText: '鐭ラ亾浜�'
+            })
+          } else if (licday > 20) {
+            license = true
+            localStorage.removeItem(_mindUrl)
+          } else {
+            license = true
+  
+            if (localStorage.getItem(_mindUrl) !== 'false') {
+              Modal.confirm({
+                title: `璺濈鎺堟潈鍒版湡杩樺墿${licday}澶╋紝璇疯仈绯荤鐞嗗憳銆俙,
+                okText: '涓嶅湪鎻愰啋',
+                cancelText: '鍏抽棴',
+                onOk() {
+                  localStorage.setItem(_mindUrl, 'false')
+                },
+                onCancel() {},
+              })
+            }
+          }
+        } else {
+          Modal.warning({
+            title: '鏈湴鎺堟潈鐮佸凡澶辨晥锛岃鑱旂郴绠$悊鍛樸��',
+            okText: '鐭ラ亾浜�'
+          })
+        }
+      }
+    }
+
+    if ((!window.GLOB.licenseKey && index > -1) || license) {
       this.setState({
         auth: true
       })
     }
 
-    if (window.GLOB.licenseKey !== key && (index === -1 || index > 5)) {
+    if (!window.GLOB.licenseKey && (index === -1 || index > 5)) {
       let _appId = window.GLOB.appId
   
       if (options.sysType === 'cloud') { // 浜戠浣跨敤绯荤粺閰嶇疆appid
@@ -399,6 +468,13 @@
             this.setState({
               auth: true
             })
+
+            if (res.warning_day && res.warning_day < 20) {
+              Modal.warning({
+                title: `璺濈鎺堟潈鍒版湡杩樺墿${res.warning_day}澶╋紝璇疯仈绯荤鐞嗗憳銆俙,
+                okText: '鐭ラ亾浜�'
+              })
+            }
           } else {
             localStorage.removeItem(_authUrl)
             this.setState({
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 0de7b33..d4474f5 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -734,14 +734,6 @@
                 title: cell.label,
               })
             })
-            card.backElements && card.backElements.forEach(cell => {
-              if (cell.eleType !== 'button') return
-              this.checkBtn(cell)
-              m.children.push({
-                key: cell.uuid,
-                title: cell.label,
-              })
-            })
           })
         } else if (item.type === 'carousel' || item.type === 'timeline') {
           item.subcards.forEach(card => {
@@ -835,10 +827,86 @@
   }
 
   getMiniStyle = (config) => {
-    console.log(config)
+    config.miniStyle = this.transferStyle(config.style)
+
+    let traversal = (components) => {
+      return components.map(item => {
+        if (item.style) {
+          item.miniStyle = this.transferStyle(item.style)
+        }
+        if (item.headerStyle) {
+          item.miniHeaderStyle = this.transferStyle(item.headerStyle)
+        }
+
+        if (item.action && item.action.length > 0) {
+          item.action = item.action.map(btn => {
+            btn.miniStyle = this.transferStyle(btn.style)
+            return btn
+          })
+        }
+
+        if (item.type === 'tabs') {
+          item.subtabs.forEach(tab => {
+            tab.components = traversal(tab.components)
+          })
+        } else if (item.type === 'group') {
+          item.components = traversal(item.components)
+        } else if (['card', 'carousel', 'timeline'].includes(item.type) || (item.type === 'table' && item.subtype === 'tablecard')) {
+          item.subcards.forEach(card => {
+            card.miniStyle = this.transferStyle(card.style)
+            card.elements = card.elements.map(cell => {
+              cell.miniStyle = this.transferStyle(cell.style)
+              return cell
+            })
+          })
+        } else if (item.type === 'balcony') {
+          item.elements && item.elements.forEach(cell => {
+            cell.miniStyle = this.transferStyle(cell.style)
+          })
+        } else if (item.type === 'menubar') {
+          item.subMenus = item.subMenus.map(menu => {
+            menu.miniStyle = this.transferStyle(menu.style)
+            return menu
+          })
+        } else if (item.type === 'table' && item.subtype === 'normaltable') {
+          let getCols = (cols) => {
+            return cols.map(col => {
+              if (col.type === 'colspan') {
+                col.subcols = getCols(col.subcols || [])
+              } else if (col.type === 'custom' || col.type === 'action') {
+                col.elements = col.elements.map(cell => {
+                  cell.miniStyle = this.transferStyle(cell.style)
+                  return cell
+                })
+              }
+  
+              return col
+            })
+          }
+          
+          item.cols = getCols(item.cols)
+        }
+
+        return item
+      })
+    }
+
+    config.components = traversal(config.components)
+
     return config
   }
 
+  transferStyle = (style = {}) => {
+    let _style = ''
+    Object.keys(style).forEach(key => {
+      if (['hShadow', 'vShadow', 'shadowBlur', 'shadowColor'].includes(key)) return
+      if (!style[key]) return
+      _style += `${key.replace(/[A-Z]/g, m => '-' + m.toLowerCase())}:${style[key]};`
+    })
+
+    return _style
+  }
+
   submitConfig = () => {
     let config = fromJS(this.state.config).toJS()
 

--
Gitblit v1.8.0