From d074bedd5c2834113fe0c4ed5a3c78ec905681c3 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 10 九月 2021 16:02:57 +0800
Subject: [PATCH] 2021-09-10

---
 src/components/normalform/modalform/mkCheckbox/index.scss |    0 
 src/components/normalform/modalform/mkInput/index.jsx     |    2 
 src/pc/components/navbar/normal-navbar/index.jsx          |   17 +
 src/tabviews/custom/components/card/prop-card/index.scss  |    2 
 src/mob/components/navbar/normal-navbar/index.jsx         |   17 +
 src/components/normalform/modalform/index.jsx             |   17 +
 src/menu/components/editor/braft-editor/options.jsx       |    7 
 src/menu/components/card/data-card/options.jsx            |    6 
 src/menu/components/share/actioncomponent/formconfig.jsx  |   25 +-
 src/components/normalform/modalform/mkRadio/index.jsx     |    2 
 src/pc/components/login/normal-login/index.jsx            |   17 +
 src/pc/components/login/normal-login/options.jsx          |  123 +++++++++++++
 /dev/null                                                 |   19 --
 src/components/normalform/modalform/mkCheckbox/index.jsx  |   46 +++++
 src/mob/components/navbar/normal-navbar/options.jsx       |   45 +++++
 src/pc/components/navbar/normal-navbar/options.jsx        |  118 +++++++++++++
 src/views/mobdesign/index.scss                            |    4 
 src/views/pcdesign/index.scss                             |    4 
 src/tabviews/custom/components/card/balcony/index.jsx     |    2 
 src/views/menudesign/index.scss                           |    3 
 src/tabviews/custom/components/card/data-card/index.scss  |    2 
 src/utils/utils.js                                        |    5 
 src/assets/css/main.scss                                  |    3 
 src/components/normalform/modalform/mkSelect/index.jsx    |    4 
 24 files changed, 443 insertions(+), 47 deletions(-)

diff --git a/src/assets/css/main.scss b/src/assets/css/main.scss
index 9c1486d..c1e2533 100644
--- a/src/assets/css/main.scss
+++ b/src/assets/css/main.scss
@@ -38,6 +38,9 @@
 html, body {
   width: 100%;
   font-size: 14px;
+  // .ant-table, .ant-dropdown {
+  //   color: rgba(0, 0, 0, 0.85);
+  // }
 }
 #root {
   height: 100%;
diff --git a/src/components/normalform/modalform/index.jsx b/src/components/normalform/modalform/index.jsx
index e0927dc..99658a4 100644
--- a/src/components/normalform/modalform/index.jsx
+++ b/src/components/normalform/modalform/index.jsx
@@ -12,6 +12,7 @@
 const { TextArea } = Input
 
 const MKRadio = asyncComponent(() => import('./mkRadio'))
+const MKCheckbox = asyncComponent(() => import('./mkCheckbox'))
 const StyleInput = asyncComponent(() => import('./styleInput'))
 const MKFileUpload = asyncComponent(() => import('@/tabviews/zshare/fileupload'))
 const MKColor = asyncComponent(() => import('@/tabviews/zshare/mutilform/mkColor'))
@@ -158,7 +159,19 @@
 
         current.controlFields.forEach(cell => {
           let m = map.get(cell.field)
-          m.hidden = current.hidden || !cell.values.includes(val)
+
+          if (current.hidden) {
+            m.hidden = true
+          } else if (current.type === 'checkbox') {
+            let vals = [...val, ...cell.values]
+            if (vals.length !== new Set(vals).size) {
+              m.hidden = false
+            } else {
+              m.hidden = true
+            }
+          } else {
+            m.hidden = !cell.values.includes(val)
+          }
 
           if (m.hidden) {
             m.initval = this.record[m.field]
@@ -209,6 +222,8 @@
         content = (<StyleInput config={item} onChange={(val) => this.recordChange({[item.field]: val})}/>)
       } else if (item.type === 'radio') {
         content = (<MKRadio config={item} onChange={(val, other) => this.recordChange({[item.field]: val, ...other}, item)}/>)
+      } else if (item.type === 'checkbox') {
+        content = (<MKCheckbox config={item} onChange={(val) => this.recordChange({[item.field]: val}, item)}/>)
       } else if (item.type === 'fileupload') {
         content = (<MKFileUpload config={item} onChange={(val) => this.recordChange({[item.field]: val})} />)
       } else if (item.type === 'cascader') {
diff --git a/src/components/normalform/modalform/mkCheckbox/index.jsx b/src/components/normalform/modalform/mkCheckbox/index.jsx
new file mode 100644
index 0000000..934eece
--- /dev/null
+++ b/src/components/normalform/modalform/mkCheckbox/index.jsx
@@ -0,0 +1,46 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Checkbox } from 'antd'
+
+import './index.scss'
+
+class MKCheckbox extends Component {
+  static propTpyes = {
+    config: PropTypes.object,
+    onChange: PropTypes.func
+  }
+
+  state = {
+    value: this.props.config.initval,
+    config: fromJS(this.props.config).toJS(),
+    options: fromJS(this.props.config.options).toJS(),
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+  }
+
+  onChange = (value) => {
+    this.setState({value})
+    this.props.onChange(value)
+  }
+
+  render() {
+    const { value, options } = this.state
+
+    return (
+      <Checkbox.Group defaultValue={value} onChange={this.onChange}>
+        {options.map(option => <Checkbox key={option.value} title={option.label} disabled={option.disabled} value={option.value}>{option.label}</Checkbox>)}
+      </Checkbox.Group>
+    )
+  }
+}
+
+export default MKCheckbox
\ No newline at end of file
diff --git a/src/components/normalform/modalform/mkCheckbox/index.scss b/src/components/normalform/modalform/mkCheckbox/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/components/normalform/modalform/mkCheckbox/index.scss
diff --git a/src/components/normalform/modalform/mkInput/index.jsx b/src/components/normalform/modalform/mkInput/index.jsx
index 2df60f7..74165f9 100644
--- a/src/components/normalform/modalform/mkInput/index.jsx
+++ b/src/components/normalform/modalform/mkInput/index.jsx
@@ -64,7 +64,7 @@
     const { config } = this.props
     const { value } = this.state
 
-    return <Input ref={this.inputRef} placeholder={config.placeholder || ''} value={value} autoComplete="off" onChange={this.handleChange} onPressEnter={this.props.onSubmit} />
+    return <Input ref={this.inputRef} readOnly={config.readOnly} placeholder={config.placeholder || ''} value={value} autoComplete="off" onChange={this.handleChange} onPressEnter={this.props.onSubmit} />
   }
 }
 
diff --git a/src/components/normalform/modalform/mkRadio/index.jsx b/src/components/normalform/modalform/mkRadio/index.jsx
index 9b2ec9e..c14b111 100644
--- a/src/components/normalform/modalform/mkRadio/index.jsx
+++ b/src/components/normalform/modalform/mkRadio/index.jsx
@@ -85,7 +85,7 @@
 
     return (
       <Radio.Group style={{whiteSpace: 'nowrap'}} value={value} onChange={this.onChange}>
-        {options.map(option => <Radio key={option.value} value={option.value}>{option.label}</Radio>)}
+        {options.map(option => <Radio key={option.value} disabled={option.disabled} value={option.value}>{option.label}</Radio>)}
       </Radio.Group>
     )
   }
diff --git a/src/components/normalform/modalform/mkSelect/index.jsx b/src/components/normalform/modalform/mkSelect/index.jsx
index 6fe6b33..c5c6ad4 100644
--- a/src/components/normalform/modalform/mkSelect/index.jsx
+++ b/src/components/normalform/modalform/mkSelect/index.jsx
@@ -117,7 +117,7 @@
           onChange={(val) => val === undefined && this.selectChange('')}
         >
           {options.map(option =>
-            <Select.Option key={option.value || option.field} value={option.value || option.field}>{option.label || option.text}</Select.Option>
+            <Select.Option key={option.value || option.field} disabled={option.disabled} value={option.value || option.field}>{option.label || option.text}</Select.Option>
           )}
         </Select>
       )
@@ -130,7 +130,7 @@
         onChange={this.mutilselectChange}
       >
         {options.map(option =>
-          <Select.Option key={option.value} value={option.value}>{option.label || option.text}</Select.Option>
+          <Select.Option key={option.value} disabled={option.disabled} value={option.value}>{option.label || option.text}</Select.Option>
         )}
       </Select>)
     }
diff --git a/src/menu/components/card/data-card/options.jsx b/src/menu/components/card/data-card/options.jsx
index 82a507f..fd03a9b 100644
--- a/src/menu/components/card/data-card/options.jsx
+++ b/src/menu/components/card/data-card/options.jsx
@@ -84,7 +84,7 @@
       options: [
         {value: '', label: '涓嶅彲閫�'},
         {value: 'radio', label: '鍗曢��'},
-        {value: 'checkbox', label: '澶氶��', forbid: subtype === 'propcard'},
+        {value: 'checkbox', label: '澶氶��', disabled: subtype === 'propcard'},
       ],
       controlFields: [
         {field: 'checkAll', values: ['checkbox']},
@@ -101,7 +101,7 @@
       options: [
         {value: 'false', label: '鏃�'},
         {value: 'init', label: '鍒濆鍖�'},
-        {value: 'always', label: '鏁版嵁鍔犺浇', forbid: subtype === 'propcard'},
+        {value: 'always', label: '鏁版嵁鍔犺浇', disabled: subtype === 'propcard'},
       ]
     },
     {
@@ -178,7 +178,7 @@
   ]
 
   return cardWrapForm.map(item => {
-    if (['pagestyle', 'cardType', 'selected'].includes(item.field)) {
+    if (['pagestyle'].includes(item.field)) {
       item.options = item.options.filter(option => !option.forbid)
     }
 
diff --git a/src/menu/components/editor/braft-editor/options.jsx b/src/menu/components/editor/braft-editor/options.jsx
index c3f6c06..7f53cc7 100644
--- a/src/menu/components/editor/braft-editor/options.jsx
+++ b/src/menu/components/editor/braft-editor/options.jsx
@@ -18,6 +18,13 @@
   const cardWrapForm = [
     {
       type: 'text',
+      field: 'title',
+      label: '鏍囬',
+      initval: wrap.title || '',
+      required: false
+    },
+    {
+      type: 'text',
       field: 'name',
       label: '缁勪欢鍚嶇О',
       initval: wrap.name || '',
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 6eb2dad..d55d7ec 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -61,16 +61,6 @@
   ]
   
   if (isApp) {
-    pageTemps = [
-      // { value: 'page', text: '鑿滃崟' },
-      { value: 'linkpage', text: '鍏宠仈鑿滃崟' },
-      { value: 'billprint', text: '鍗曟嵁鎵撳嵃' },
-      { value: 'pay', text: Formdict['model.pay'] },
-      { value: 'custom', text: '閾炬帴' }
-    ]
-    funTypes = [
-      { value: 'changeuser', text: Formdict['header.form.func.changeuser'] },
-    ]
     appMenus = sessionStorage.getItem('appMenus')
     if (appMenus) {
       try {
@@ -87,10 +77,23 @@
       funTypes = [
         { value: 'mkBinding', text: '寮�閫氭壂鐮佺櫥褰�' },
         { value: 'mkUnBinding', text: '鐢ㄦ埛瑙g粦' },
-        // { value: 'scan', text: '鎵竴鎵�' },
         { value: 'reAuth', text: '閲嶆柊鎺堟潈' },
       ]
+      pageTemps = [
+        { value: 'linkpage', text: '鍏宠仈鑿滃崟' },
+        // { value: 'pay', text: Formdict['model.pay'] },
+        { value: 'custom', text: '閾炬帴' }
+      ]
     } else {
+      pageTemps = [
+        { value: 'linkpage', text: '鍏宠仈鑿滃崟' },
+        { value: 'billprint', text: '鍗曟嵁鎵撳嵃' },
+        { value: 'pay', text: Formdict['model.pay'] },
+        { value: 'custom', text: '閾炬帴' }
+      ]
+      funTypes = [
+        { value: 'changeuser', text: Formdict['header.form.func.changeuser'] },
+      ]
       opentypes = opentypes.filter(item => item.value !== 'tab')
     }
   }
diff --git a/src/mob/components/navbar/normal-navbar/index.jsx b/src/mob/components/navbar/normal-navbar/index.jsx
index 0d38e64..eb23343 100644
--- a/src/mob/components/navbar/normal-navbar/index.jsx
+++ b/src/mob/components/navbar/normal-navbar/index.jsx
@@ -8,9 +8,10 @@
 import MKEmitter from '@/utils/events.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
+import getWrapForm from './options'
 import './index.scss'
 
-const WrapComponent = asyncIconComponent(() => import('./wrapsetting'))
+const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
 const MenuComponent = asyncIconComponent(() => import('./menusetting'))
 const SettingComponent = asyncIconComponent(() => import('@/menu/datasource'))
 
@@ -141,6 +142,16 @@
     }
   }
 
+  getWrapForms = () => {
+    const { wrap } = this.state.card
+
+    return getWrapForm(wrap)
+  }
+
+  updateWrap = (res) => {
+    this.updateComponent({...this.state.card, wrap: res})
+  }
+
   render() {
     const { card } = this.state
 
@@ -152,7 +163,9 @@
         <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
             <MenuComponent config={card} updateConfig={this.updateComponent} />
-            <WrapComponent config={card} updateConfig={this.updateComponent} />
+            <NormalForm title="鑿滃崟鏍忚缃�" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
+              <Icon type="edit" style={{color: '#1890ff'}} title="缂栬緫"/>
+            </NormalForm>
             <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" />
             <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} />
             {card.wrap.datatype !== 'static' ? <SettingComponent config={card} updateConfig={this.updateComponent} /> : null}
diff --git a/src/mob/components/navbar/normal-navbar/options.jsx b/src/mob/components/navbar/normal-navbar/options.jsx
new file mode 100644
index 0000000..2a7ebc2
--- /dev/null
+++ b/src/mob/components/navbar/normal-navbar/options.jsx
@@ -0,0 +1,45 @@
+/**
+ * @description Wrap琛ㄥ崟閰嶇疆淇℃伅
+ */
+export default function (wrap) {
+  const wrapForm = [
+    {
+      type: 'text',
+      field: 'name',
+      label: '瀵艰埅鏍忓悕绉�',
+      initval: wrap.name || '',
+      required: true
+    },
+    {
+      type: 'text',
+      field: 'MenuNo',
+      label: '鑿滃崟鍙傛暟',
+      initval: wrap.MenuNo || '',
+      required: true
+    },
+    {
+      type: 'radio',
+      field: 'datatype',
+      label: '鏁版嵁鏉ユ簮',
+      initval: wrap.datatype || 'static',
+      tooltip: '閫夋嫨闈欐�佸�硷紝鏃犻渶閰嶇疆鏁版嵁婧愩��',
+      required: false,
+      options: [
+        {value: 'dynamic', label: '鍔ㄦ��'},
+        {value: 'static', label: '闈欐��'},
+      ]
+    },
+    {
+      type: 'number',
+      field: 'height',
+      label: '楂樺害',
+      initval: wrap.height || 50,
+      min: 30,
+      max: 200,
+      precision: 0,
+      required: true
+    }
+  ]
+
+  return wrapForm
+} 
\ No newline at end of file
diff --git a/src/mob/components/navbar/normal-navbar/wrapsetting/index.jsx b/src/mob/components/navbar/normal-navbar/wrapsetting/index.jsx
deleted file mode 100644
index a6785d0..0000000
--- a/src/mob/components/navbar/normal-navbar/wrapsetting/index.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Icon, Modal } from 'antd'
-
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
-import SettingForm from './settingform'
-import './index.scss'
-
-class DataSource extends Component {
-  static propTpyes = {
-    config: PropTypes.any,
-    updateConfig: PropTypes.func
-  }
-
-  state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    visible: false,
-    wrap: null
-  }
-
-  UNSAFE_componentWillMount () {
-    const { config } = this.props
-
-    this.setState({wrap: fromJS(config.wrap).toJS()})
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  editDataSource = () => {
-    this.setState({
-      visible: true
-    })
-  }
-
-  verifySubmit = () => {
-    const { config } = this.props
-
-    this.verifyRef.handleConfirm().then(res => {
-
-      this.setState({
-        wrap: res,
-        visible: false
-      })
-      this.props.updateConfig({...config, wrap: res})
-    })
-  }
-
-  render () {
-    const { visible, dict, wrap } = this.state
-
-    return (
-      <div className="model-menu-setting-wrap">
-        <Icon type="edit" title="缂栬緫" onClick={() => this.editDataSource()} />
-        <Modal
-          wrapClassName="popview-modal"
-          title="鑿滃崟鏍忚缃�"
-          visible={visible}
-          width={800}
-          maskClosable={false}
-          okText={dict['model.submit']}
-          onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ visible: false }) }}
-          destroyOnClose
-        >
-          <SettingForm
-            dict={dict}
-            wrap={wrap}
-            inputSubmit={this.verifySubmit}
-            wrappedComponentRef={(inst) => this.verifyRef = inst}
-          />
-        </Modal>
-      </div>
-    )
-  }
-}
-
-export default DataSource
\ No newline at end of file
diff --git a/src/mob/components/navbar/normal-navbar/wrapsetting/index.scss b/src/mob/components/navbar/normal-navbar/wrapsetting/index.scss
deleted file mode 100644
index 04372e6..0000000
--- a/src/mob/components/navbar/normal-navbar/wrapsetting/index.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-.model-menu-setting-wrap {
-  display: inline-block;
-
-  >.anticon-edit {
-    color: #1890ff;
-  }
-}
\ No newline at end of file
diff --git a/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx b/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx
deleted file mode 100644
index debd0d8..0000000
--- a/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { Form, Row, Col, Input, InputNumber, Tooltip, Icon, Radio } from 'antd'
-
-import './index.scss'
-
-class SettingForm extends Component {
-  static propTpyes = {
-    dict: PropTypes.object,      // 瀛楀吀椤�
-    wrap: PropTypes.object,      // 鏁版嵁婧愰厤缃�
-    inputSubmit: PropTypes.func  // 鍥炶溅浜嬩欢
-  }
-
-  state = {}
-
-  handleConfirm = () => {
-    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
-    return new Promise((resolve, reject) => {
-      this.props.form.validateFieldsAndScroll((err, values) => {
-        if (!err) {
-          resolve(values)
-        } else {
-          reject(err)
-        }
-      })
-    })
-  }
-
-  handleSubmit = (e) => {
-    e.preventDefault()
-
-    if (this.props.inputSubmit) {
-      this.props.inputSubmit()
-    }
-  }
-
-  render() {
-    const { wrap } = this.props
-    const { getFieldDecorator } = this.props.form
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 8 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 16 }
-      }
-    }
-
-    return (
-      <div className="model-menu-setting-form">
-        <Form {...formItemLayout}>
-          <Row gutter={24}>
-            <Col span={12}>
-              <Form.Item label="瀵艰埅鏍忓悕绉�">
-                {getFieldDecorator('name', {
-                  initialValue: wrap.name,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '瀵艰埅鏍忓悕绉�!'
-                    }
-                  ]
-                })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="鑿滃崟鍙傛暟">
-                {getFieldDecorator('MenuNo', {
-                  initialValue: wrap.MenuNo,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '鑿滃崟鍙傛暟!'
-                    }
-                  ]
-                })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="閫夋嫨闈欐�佸�硷紝鏃犻渶閰嶇疆鏁版嵁婧愩��">
-                  <Icon type="question-circle" />
-                  鏁版嵁鏉ユ簮
-                </Tooltip>
-              }>
-                {getFieldDecorator('datatype', {
-                  initialValue: wrap.datatype || 'static'
-                })(
-                  <Radio.Group>
-                    <Radio value="dynamic">鍔ㄦ��</Radio>
-                    <Radio value="static">闈欐��</Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="楂樺害">
-                {getFieldDecorator('height', {
-                  initialValue: wrap.height || 50,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '楂樺害!'
-                    }
-                  ]
-                })(<InputNumber min={30} max={200} precision={0} onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-          </Row>
-        </Form>
-      </div>
-    )
-  }
-}
-
-export default Form.create()(SettingForm)
\ No newline at end of file
diff --git a/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.scss b/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.scss
deleted file mode 100644
index 159130b..0000000
--- a/src/mob/components/navbar/normal-navbar/wrapsetting/settingform/index.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.model-menu-setting-form {
-  position: relative;
-
-  .anticon-question-circle {
-    color: #c49f47;
-    margin-right: 3px;
-  }
-  .ant-input-number {
-    width: 100%;
-  }
-}
\ No newline at end of file
diff --git a/src/pc/components/login/normal-login/index.jsx b/src/pc/components/login/normal-login/index.jsx
index 74ec83e..bd48443 100644
--- a/src/pc/components/login/normal-login/index.jsx
+++ b/src/pc/components/login/normal-login/index.jsx
@@ -10,10 +10,11 @@
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import { resetStyle } from '@/utils/utils-custom.js'
+import getWrapForm from './options'
 import './index.scss'
 
 const LoginForm = asyncComponent(() => import('./loginform'))
-const WrapComponent = asyncIconComponent(() => import('../wrapsetting'))
+const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
 
 class PropCardEditComponent extends Component {
   static propTpyes = {
@@ -141,6 +142,16 @@
     }
   }
 
+  getWrapForms = () => {
+    const { wrap } = this.state.card
+
+    return getWrapForm(wrap)
+  }
+
+  updateWrap = (res) => {
+    this.updateComponent({...this.state.card, wrap: res})
+  }
+
   render() {
     const { card, dict } = this.state
     let style = resetStyle(card.style)
@@ -159,7 +170,9 @@
       <div className="login-edit-box" style={style} onClick={this.clickComponent} id={card.uuid}>
         <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
           <div className="mk-popover-control">
-            <WrapComponent config={card} updateConfig={this.updateComponent} />
+            <NormalForm title="鐧诲綍璁剧疆" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
+              <Icon type="edit" style={{color: '#1890ff'}} title="缂栬緫"/>
+            </NormalForm>
             <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" />
             <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} />
           </div>
diff --git a/src/pc/components/login/normal-login/options.jsx b/src/pc/components/login/normal-login/options.jsx
new file mode 100644
index 0000000..c423354
--- /dev/null
+++ b/src/pc/components/login/normal-login/options.jsx
@@ -0,0 +1,123 @@
+/**
+ * @description Wrap琛ㄥ崟閰嶇疆淇℃伅
+ */
+export default function (wrap) {
+  let appType = sessionStorage.getItem('appType')
+  let menulist = sessionStorage.getItem('appMenus')
+  if (menulist) {
+    try {
+      menulist = JSON.parse(menulist)
+    } catch (e) {
+      menulist = []
+    }
+  } else {
+    menulist = []
+  }
+
+  let msgTemps = sessionStorage.getItem('msgTemplate')
+
+  if (msgTemps) {
+    try {
+      msgTemps = JSON.parse(msgTemps)
+      msgTemps = msgTemps.map(item => {
+        item.value = item.ID
+        item.label = item.SignName + ' - ' + item.TemplateCode
+        return item
+      })
+    } catch (e) {
+      msgTemps = []
+    }
+  } else {
+    msgTemps = []
+  }
+
+  const wrapForm = [
+    {
+      type: 'text',
+      field: 'name',
+      label: '缁勪欢鍚嶇О',
+      initval: wrap.name || '',
+      tooltip: '鐢ㄤ簬缁勪欢闂寸殑鍖哄垎銆�',
+      required: true
+    },
+    {
+      type: 'checkbox',
+      field: 'loginWays',
+      label: '鐧诲綍鏂瑰紡',
+      initval: wrap.loginWays || [],
+      required: true,
+      options: [
+        { label: '璐﹀彿', value: 'uname_pwd' },
+        { label: '鐭俊', value: 'sms_vcode' },
+        { label: '鎵爜', value: 'app_scan', disabled: appType === 'mob' },
+      ],
+      controlFields: [
+        {field: 'tempId', values: ['sms_vcode']}
+      ]
+    },
+    {
+      type: 'number',
+      field: 'width',
+      label: '瀹藉害',
+      initval: wrap.width || 24,
+      tooltip: '鏍呮牸甯冨眬锛屾瘡琛岀瓑鍒嗕负24鍒椼��',
+      min: 1,
+      max: 24,
+      precision: 0,
+      required: true
+    },
+    {
+      type: 'number',
+      field: 'maxWidth',
+      label: '鏈�澶у搴�',
+      initval: wrap.maxWidth || '',
+      tooltip: '鐧诲綍妗嗙殑鏈�澶у搴﹀�笺��',
+      min: 100,
+      max: 2000,
+      precision: 0,
+      required: false
+    },
+    {
+      type: 'styleInput',
+      field: 'height',
+      label: '楂樺害',
+      initval: wrap.height || '',
+      tooltip: '缁勪欢鍗犵敤鐨勬渶灏忛珮搴︼紝鐢ㄤ簬椤甸潰甯冨眬銆�',
+      required: false,
+      options: ['px', 'vh', 'vw', '%']
+    },
+    {
+      type: 'radio',
+      field: 'link',
+      label: '閾炬帴',
+      initval: wrap.link || 'menu',
+      required: false,
+      options: [
+        {value: 'menu', label: '鑿滃崟'},
+        {value: 'linkmenu', label: '鍏宠仈鑿滃崟'},
+      ],
+      controlFields: [
+        {field: 'linkmenu', values: ['linkmenu']}
+      ]
+    },
+    {
+      type: 'select',
+      field: 'linkmenu',
+      label: '鍏宠仈鑿滃崟',
+      initval: wrap.linkmenu || '',
+      required: true,
+      options: menulist
+    },
+    {
+      type: 'select', // $楠岃瘉鐮�$  $mob$  $send_type$
+      field: 'tempId',
+      label: '鐭俊妯℃澘',
+      initval: wrap.tempId || '',
+      tooltip: '鐭俊妯℃澘鍙湪绠$悊绯荤粺 HS-濂囦簯鐭俊妯℃澘 澶勬坊鍔犮��',
+      required: true,
+      options: msgTemps
+    }
+  ]
+
+  return wrapForm
+} 
\ No newline at end of file
diff --git a/src/pc/components/login/wrapsetting/index.jsx b/src/pc/components/login/wrapsetting/index.jsx
deleted file mode 100644
index 9c0ac72..0000000
--- a/src/pc/components/login/wrapsetting/index.jsx
+++ /dev/null
@@ -1,81 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Icon, Modal } from 'antd'
-
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
-import SettingForm from './settingform'
-import './index.scss'
-
-class DataSource extends Component {
-  static propTpyes = {
-    config: PropTypes.any,
-    updateConfig: PropTypes.func
-  }
-
-  state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    visible: false,
-    wrap: null
-  }
-
-  UNSAFE_componentWillMount () {
-    const { config } = this.props
-
-    this.setState({wrap: fromJS(config.wrap).toJS()})
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  editDataSource = () => {
-    this.setState({
-      visible: true
-    })
-  }
-
-  verifySubmit = () => {
-    const { config } = this.props
-
-    this.verifyRef.handleConfirm().then(res => {
-
-      this.setState({
-        wrap: res,
-        visible: false
-      })
-      this.props.updateConfig({...config, wrap: res})
-    })
-  }
-
-  render () {
-    const { visible, dict, wrap } = this.state
-
-    return (
-      <div className="model-menu-setting-wrap">
-        <Icon type="edit" title="缂栬緫" onClick={() => this.editDataSource()} />
-        <Modal
-          wrapClassName="popview-modal"
-          title="鐧诲綍璁剧疆"
-          visible={visible}
-          width={800}
-          maskClosable={false}
-          okText={dict['model.submit']}
-          onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ visible: false }) }}
-          destroyOnClose
-        >
-          <SettingForm
-            dict={dict}
-            wrap={wrap}
-            inputSubmit={this.verifySubmit}
-            wrappedComponentRef={(inst) => this.verifyRef = inst}
-          />
-        </Modal>
-      </div>
-    )
-  }
-}
-
-export default DataSource
\ No newline at end of file
diff --git a/src/pc/components/login/wrapsetting/index.scss b/src/pc/components/login/wrapsetting/index.scss
deleted file mode 100644
index 04372e6..0000000
--- a/src/pc/components/login/wrapsetting/index.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-.model-menu-setting-wrap {
-  display: inline-block;
-
-  >.anticon-edit {
-    color: #1890ff;
-  }
-}
\ No newline at end of file
diff --git a/src/pc/components/login/wrapsetting/settingform/index.jsx b/src/pc/components/login/wrapsetting/settingform/index.jsx
deleted file mode 100644
index a5eeeda..0000000
--- a/src/pc/components/login/wrapsetting/settingform/index.jsx
+++ /dev/null
@@ -1,242 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { Form, Row, Col, Input, Tooltip, Icon, InputNumber, Select, Checkbox, notification, Radio } from 'antd'
-
-import StyleInput from '@/menu/stylecontroller/styleInput'
-import './index.scss'
-
-class SettingForm extends Component {
-  static propTpyes = {
-    dict: PropTypes.object,      // 瀛楀吀椤�
-    wrap: PropTypes.object,      // 鏁版嵁婧愰厤缃�
-    inputSubmit: PropTypes.func  // 鍥炶溅浜嬩欢
-  }
-
-  state = {
-    msgTemps: [],
-    appMenus: [],
-    link: this.props.wrap.link || 'menu'
-  }
-
-  UNSAFE_componentWillMount () {
-    let msgTemps = sessionStorage.getItem('msgTemplate')
-
-    if (msgTemps) {
-      try {
-        msgTemps = JSON.parse(msgTemps)
-      } catch (e) {
-        msgTemps = []
-      }
-    } else {
-      msgTemps = []
-    }
-
-    let appMenus = sessionStorage.getItem('appMenus')
-    if (appMenus) {
-      try {
-        appMenus = JSON.parse(appMenus)
-      } catch (e) {
-        appMenus = []
-      }
-    } else {
-      appMenus = []
-    }
-
-    this.setState({msgTemps, appMenus})
-  }
-
-  handleConfirm = () => {
-    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
-    return new Promise((resolve, reject) => {
-      this.props.form.validateFieldsAndScroll((err, values) => {
-        if (!err) {
-          if (values.loginWays.includes('sms_vcode') && !values.tempId) {
-            notification.warning({
-              top: 92,
-              message: '浣跨敤鐭俊楠岃瘉鐮佺櫥褰曟椂锛岄渶瑕侀�夋嫨鐭俊妯℃澘锛�',
-              duration: 5
-            })
-            return
-          }
-          resolve(values)
-        } else {
-          reject(err)
-        }
-      })
-    })
-  }
-
-  handleSubmit = (e) => {
-    e.preventDefault()
-
-    if (this.props.inputSubmit) {
-      this.props.inputSubmit()
-    }
-  }
-
-  render() {
-    const { wrap } = this.props
-    const { getFieldDecorator } = this.props.form
-    const { msgTemps, appMenus, link } = this.state
-
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 8 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 16 }
-      }
-    }
-
-    return (
-      <div className="model-menu-setting-form">
-        <Form {...formItemLayout}>
-          <Row gutter={24}>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="鐢ㄤ簬缁勪欢闂寸殑鍖哄垎銆�">
-                  <Icon type="question-circle" />
-                  缁勪欢鍚嶇О
-                </Tooltip>
-              }>
-                {getFieldDecorator('name', {
-                  initialValue: wrap.name,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '缁勪欢鍚嶇О!'
-                    }
-                  ]
-                })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="鐧诲綍鏂瑰紡">
-                {getFieldDecorator('loginWays', {
-                  initialValue: wrap.loginWays || [],
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.select'] + '鐧诲綍鏂瑰紡!'
-                    }
-                  ]
-                })(
-                  <Checkbox.Group
-                    options={[
-                      { label: '璐﹀彿', value: 'uname_pwd' },
-                      { label: '鐭俊', value: 'sms_vcode' },
-                      { label: '鎵爜', value: 'app_scan' },
-                    ]}
-                  />
-                )}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="鏍呮牸甯冨眬锛屾瘡琛岀瓑鍒嗕负24鍒椼��">
-                  <Icon type="question-circle" />
-                  瀹藉害
-                </Tooltip>
-              }>
-                {getFieldDecorator('width', {
-                  initialValue: wrap.width || 24,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '瀹藉害!'
-                    }
-                  ]
-                })(<InputNumber min={1} max={24} precision={0} onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="鐧诲綍妗嗙殑鏈�澶у搴﹀�笺��">
-                  <Icon type="question-circle" />
-                  鏈�澶у搴�
-                </Tooltip>
-              }>
-                {getFieldDecorator('maxWidth', {
-                  initialValue: wrap.maxWidth || ''
-                })(<InputNumber min={100} max={2000} precision={0} onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="缁勪欢鍗犵敤鐨勬渶灏忛珮搴︼紝鐢ㄤ簬椤甸潰甯冨眬銆�">
-                  <Icon type="question-circle" />
-                  楂樺害
-                </Tooltip>
-              }>
-                {getFieldDecorator('height', {
-                  initialValue: wrap.height
-                })(<StyleInput options={['px', 'vh', 'vw', '%']}/>)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="閾炬帴">
-                {getFieldDecorator('link', {
-                  initialValue: wrap.link || 'menu'
-                })(
-                  <Radio.Group onChange={(e) => this.setState({link: e.target.value})}>
-                    <Radio key="menu" value="menu"> 鑿滃崟 </Radio>
-                    <Radio key="linkmenu" value="linkmenu"> 鍏宠仈鑿滃崟 </Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col>
-            {link === 'linkmenu' ? <Col span={12}>
-              <Form.Item label="鍏宠仈鑿滃崟">
-                {getFieldDecorator('linkmenu', {
-                  initialValue: wrap.linkmenu || '',
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.select'] + '鑿滃崟!'
-                    }
-                  ]
-                })(
-                  <Select
-                    showSearch
-                    filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  >
-                    {appMenus.map(option =>
-                      <Select.Option key={option.MenuID} value={option.MenuID}>{option.MenuName}</Select.Option>
-                    )}
-                  </Select>
-                )}
-              </Form.Item>
-            </Col> : null}
-            {/* $楠岃瘉鐮�$  $mob$  $send_type$ */}
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="鐭俊妯℃澘鍙湪绠$悊绯荤粺 HS-濂囦簯鐭俊妯℃澘 澶勬坊鍔犮��">
-                  <Icon type="question-circle" />
-                  鐭俊妯℃澘
-                </Tooltip>
-              }>
-                {getFieldDecorator('tempId', {
-                  initialValue: wrap.tempId || ''
-                })(
-                  <Select
-                    showSearch
-                    allowClear
-                    filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  >
-                    {msgTemps.map(option =>
-                      <Select.Option key={option.ID} value={option.ID}>{option.SignName + ' - ' + option.TemplateCode}</Select.Option>
-                    )}
-                  </Select>
-                )}
-              </Form.Item>
-            </Col>
-          </Row>
-        </Form>
-      </div>
-    )
-  }
-}
-
-export default Form.create()(SettingForm)
\ No newline at end of file
diff --git a/src/pc/components/login/wrapsetting/settingform/index.scss b/src/pc/components/login/wrapsetting/settingform/index.scss
deleted file mode 100644
index 159130b..0000000
--- a/src/pc/components/login/wrapsetting/settingform/index.scss
+++ /dev/null
@@ -1,11 +0,0 @@
-.model-menu-setting-form {
-  position: relative;
-
-  .anticon-question-circle {
-    color: #c49f47;
-    margin-right: 3px;
-  }
-  .ant-input-number {
-    width: 100%;
-  }
-}
\ No newline at end of file
diff --git a/src/pc/components/navbar/normal-navbar/index.jsx b/src/pc/components/navbar/normal-navbar/index.jsx
index 11ce5dd..1d3b062 100644
--- a/src/pc/components/navbar/normal-navbar/index.jsx
+++ b/src/pc/components/navbar/normal-navbar/index.jsx
@@ -8,9 +8,10 @@
 import MKEmitter from '@/utils/events.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
+import getWrapForm from './options'
 import './index.scss'
 
-const WrapComponent = asyncIconComponent(() => import('./wrapsetting'))
+const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
 const MenuComponent = asyncIconComponent(() => import('./menusetting'))
 const LinkComponent = asyncIconComponent(() => import('./linksetting'))
 
@@ -163,6 +164,16 @@
     }
   }
 
+  getWrapForms = () => {
+    const { wrap } = this.state.card
+
+    return getWrapForm(wrap)
+  }
+
+  updateWrap = (res) => {
+    this.updateComponent({...this.state.card, wrap: res})
+  }
+
   render() {
     const { card } = this.state
 
@@ -172,7 +183,9 @@
           <div className="mk-popover-control">
             <MenuComponent config={card} updateConfig={this.updateComponent} />
             <LinkComponent config={card} updateConfig={this.updateComponent} />
-            <WrapComponent config={card} updateConfig={this.updateComponent} />
+            <NormalForm title="瀵艰埅鏍忚缃�" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
+              <Icon type="edit" style={{color: '#1890ff'}} title="缂栬緫"/>
+            </NormalForm>
             <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" />
             <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} />
           </div>
diff --git a/src/pc/components/navbar/normal-navbar/options.jsx b/src/pc/components/navbar/normal-navbar/options.jsx
new file mode 100644
index 0000000..4940158
--- /dev/null
+++ b/src/pc/components/navbar/normal-navbar/options.jsx
@@ -0,0 +1,118 @@
+/**
+ * @description Wrap琛ㄥ崟閰嶇疆淇℃伅
+ */
+export default function (wrap) {
+  let menulist = sessionStorage.getItem('appMenus')
+  if (menulist) {
+    try {
+      menulist = JSON.parse(menulist)
+    } catch (e) {
+      menulist = []
+    }
+  } else {
+    menulist = []
+  }
+
+  const wrapForm = [
+    {
+      type: 'text',
+      field: 'name',
+      label: '瀵艰埅鏍忓悕绉�',
+      initval: wrap.name || '',
+      required: true
+    },
+    {
+      type: 'text',
+      field: 'MenuNo',
+      label: '鑿滃崟鍙傛暟',
+      initval: wrap.MenuNo || '',
+      required: true
+    },
+    {
+      type: 'number',
+      field: 'width',
+      label: '瀹藉害',
+      initval: wrap.width || 1200,
+      tooltip: '瀵艰埅鏍忎富浣撳唴瀹瑰搴︼紙鍖呮嫭logo銆佽彍鍗曘�侀摼鎺ョ瓑锛夈��',
+      min: 400,
+      max: 3000,
+      precision: 0,
+      required: true
+    },
+    {
+      type: 'number',
+      field: 'height',
+      label: '楂樺害',
+      initval: wrap.height || 50,
+      min: 50,
+      max: 200,
+      precision: 0,
+      required: true
+    },
+    {
+      type: 'source',
+      field: 'logo',
+      label: 'logo',
+      initval: wrap.logo || '',
+      required: false
+    },
+    {
+      type: 'radio',
+      field: 'property',
+      label: 'logo灞炴��',
+      initval: wrap.property || '',
+      required: false,
+      options: [
+        {value: '', label: '绌�'},
+        {value: 'linkmenu', label: '鍏宠仈鑿滃崟'},
+        {value: 'link', label: '閾炬帴'}
+      ],
+      controlFields: [
+        {field: 'linkmenu', values: ['linkmenu']},
+        {field: 'link', values: ['link']},
+      ]
+    },
+    {
+      type: 'select',
+      field: 'linkmenu',
+      label: '鍏宠仈鑿滃崟',
+      initval: wrap.linkmenu || '',
+      required: true,
+      options: menulist
+    },
+    {
+      type: 'textarea',
+      field: 'link',
+      label: '閾炬帴',
+      initval: wrap.link || '',
+      required: true,
+      span: 24
+    },
+    {
+      type: 'radio',
+      field: 'user',
+      label: '鐢ㄦ埛淇℃伅',
+      initval: wrap.user || 'hidden',
+      tooltip: '瀛樺湪鐧诲綍涓斿彇鍒扮櫥褰曚俊鎭椂锛屾樉绀虹敤鎴峰ご鍍忋�佺敤鎴峰悕鍙婇��鍑恒��',
+      required: false,
+      options: [
+        {value: 'hidden', label: '闅愯棌'},
+        {value: 'show', label: '鏄剧ず'},
+      ]
+    },
+    {
+      type: 'radio',
+      field: 'hover',
+      label: '鎮诞鏄剧ず',
+      initval: wrap.hover || 'false',
+      tooltip: '榛樿闅愯棌鑿滃崟鏍忥紝榧犳爣鍦ㄩ潬杩戦《閮ㄦ椂鏄剧ず銆�',
+      required: false,
+      options: [
+        {value: 'false', label: '涓嶅惎鐢�'},
+        {value: 'true', label: '鍚敤'},
+      ]
+    }
+  ]
+
+  return wrapForm
+} 
\ No newline at end of file
diff --git a/src/pc/components/navbar/normal-navbar/wrapsetting/index.jsx b/src/pc/components/navbar/normal-navbar/wrapsetting/index.jsx
deleted file mode 100644
index 81346a6..0000000
--- a/src/pc/components/navbar/normal-navbar/wrapsetting/index.jsx
+++ /dev/null
@@ -1,83 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { is, fromJS } from 'immutable'
-import { Icon, Modal } from 'antd'
-
-import zhCN from '@/locales/zh-CN/model.js'
-import enUS from '@/locales/en-US/model.js'
-import SettingForm from './settingform'
-import './index.scss'
-
-class DataSource extends Component {
-  static propTpyes = {
-    config: PropTypes.any,
-    updateConfig: PropTypes.func
-  }
-
-  state = {
-    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
-    visible: false,
-    wrap: null
-  }
-
-  UNSAFE_componentWillMount () {
-    const { config } = this.props
-
-    this.setState({wrap: fromJS(config.wrap).toJS()})
-  }
-
-  shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
-  }
-
-  editDataSource = () => {
-    this.setState({
-      visible: true
-    })
-  }
-
-  verifySubmit = () => {
-    const { config } = this.props
-
-    this.verifyRef.handleConfirm().then(res => {
-
-      this.setState({
-        wrap: res,
-        visible: false
-      })
-      this.props.updateConfig({...config, wrap: res})
-    })
-  }
-
-  render () {
-    const { config } = this.props
-    const { visible, dict, wrap } = this.state
-
-    return (
-      <div className="model-menu-setting-wrap">
-        <Icon type="edit" title="缂栬緫" onClick={() => this.editDataSource()} />
-        <Modal
-          wrapClassName="popview-modal"
-          title={config.type === 'table' ? '琛ㄦ牸璁剧疆' : '鍗$墖璁剧疆'}
-          visible={visible}
-          width={800}
-          maskClosable={false}
-          okText={dict['model.submit']}
-          onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ visible: false }) }}
-          destroyOnClose
-        >
-          <SettingForm
-            dict={dict}
-            wrap={wrap}
-            config={config}
-            inputSubmit={this.verifySubmit}
-            wrappedComponentRef={(inst) => this.verifyRef = inst}
-          />
-        </Modal>
-      </div>
-    )
-  }
-}
-
-export default DataSource
\ No newline at end of file
diff --git a/src/pc/components/navbar/normal-navbar/wrapsetting/index.scss b/src/pc/components/navbar/normal-navbar/wrapsetting/index.scss
deleted file mode 100644
index 04372e6..0000000
--- a/src/pc/components/navbar/normal-navbar/wrapsetting/index.scss
+++ /dev/null
@@ -1,7 +0,0 @@
-.model-menu-setting-wrap {
-  display: inline-block;
-
-  >.anticon-edit {
-    color: #1890ff;
-  }
-}
\ No newline at end of file
diff --git a/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx b/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx
deleted file mode 100644
index 61d30f0..0000000
--- a/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.jsx
+++ /dev/null
@@ -1,232 +0,0 @@
-import React, {Component} from 'react'
-import PropTypes from 'prop-types'
-import { Form, Row, Col, Input, Tooltip, Icon, InputNumber, Select, Radio } from 'antd'
-
-import asyncComponent from '@/utils/asyncComponent'
-import './index.scss'
-
-const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent'))
-const { TextArea } = Input
-
-class SettingForm extends Component {
-  static propTpyes = {
-    dict: PropTypes.object,      // 瀛楀吀椤�
-    config: PropTypes.object,    // 鍗$墖琛屼俊鎭�
-    wrap: PropTypes.object,      // 鏁版嵁婧愰厤缃�
-    inputSubmit: PropTypes.func  // 鍥炶溅浜嬩欢
-  }
-
-  state = {
-    appMenus: [],
-    property: ''
-  }
-
-  UNSAFE_componentWillMount () {
-    let appMenus = sessionStorage.getItem('appMenus')
-    if (appMenus) {
-      try {
-        appMenus = JSON.parse(appMenus)
-      } catch (e) {
-        appMenus = []
-      }
-    } else {
-      appMenus = []
-    }
-
-    this.setState({appMenus, property: this.props.wrap.property || ''})
-  }
-
-  handleConfirm = () => {
-    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
-    return new Promise((resolve, reject) => {
-      this.props.form.validateFieldsAndScroll((err, values) => {
-        if (!err) {
-          resolve(values)
-        } else {
-          reject(err)
-        }
-      })
-    })
-  }
-
-  handleSubmit = (e) => {
-    e.preventDefault()
-
-    if (this.props.inputSubmit) {
-      this.props.inputSubmit()
-    }
-  }
-
-  render() {
-    const { wrap } = this.props
-    const { getFieldDecorator } = this.props.form
-    const { appMenus, property } = this.state
-    const formItemLayout = {
-      labelCol: {
-        xs: { span: 24 },
-        sm: { span: 8 }
-      },
-      wrapperCol: {
-        xs: { span: 24 },
-        sm: { span: 16 }
-      }
-    }
-
-    return (
-      <div className="model-menu-setting-form">
-        <Form {...formItemLayout}>
-          <Row gutter={24}>
-            <Col span={12}>
-              <Form.Item label="瀵艰埅鏍忓悕绉�">
-                {getFieldDecorator('name', {
-                  initialValue: wrap.name,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '瀵艰埅鏍忓悕绉�!'
-                    }
-                  ]
-                })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="鑿滃崟鍙傛暟">
-                {getFieldDecorator('MenuNo', {
-                  initialValue: wrap.MenuNo,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '鑿滃崟鍙傛暟!'
-                    }
-                  ]
-                })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="瀵艰埅鏍忎富浣撳唴瀹瑰搴︼紙鍖呮嫭logo銆佽彍鍗曘�侀摼鎺ョ瓑锛夈��">
-                  <Icon type="question-circle" />
-                  瀹藉害
-                </Tooltip>
-              }>
-                {getFieldDecorator('width', {
-                  initialValue: wrap.width || 1200,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '瀹藉害!'
-                    }
-                  ]
-                })(<InputNumber min={400} precision={0} onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="楂樺害">
-                {getFieldDecorator('height', {
-                  initialValue: wrap.height || 50,
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.input'] + '楂樺害!'
-                    }
-                  ]
-                })(<InputNumber min={50} max={200} precision={0} onPressEnter={this.handleSubmit} />)}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="logo">
-                {getFieldDecorator('logo', {
-                  initialValue: wrap.logo
-                })(
-                  <SourceComponent type="image" />
-                )}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label="logo灞炴��">
-                {getFieldDecorator('property', {
-                  initialValue: wrap.property || ''
-                })(
-                  <Radio.Group onChange={(e) => this.setState({property: e.target.value})} style={{whiteSpace: 'nowrap'}}>
-                    <Radio value="">绌�</Radio>
-                    <Radio value="linkmenu">鍏宠仈鑿滃崟</Radio>
-                    <Radio value="link">閾炬帴</Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col>
-            {property === 'linkmenu' ? <Col span={12}>
-              <Form.Item label="logo閾炬帴">
-                {getFieldDecorator('linkmenu', {
-                  initialValue: wrap.linkmenu || '',
-                  rules: [
-                    {
-                      required: true,
-                      message: this.props.dict['form.required.select'] + '鍏宠仈鑿滃崟!'
-                    }
-                  ]
-                })(
-                  <Select
-                    showSearch
-                    filterOption={(input, option) => option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0}
-                  >
-                    {appMenus.map(option =>
-                      <Select.Option key={option.MenuID} value={option.MenuID}>{option.MenuName}</Select.Option>
-                    )}
-                  </Select>
-                )}
-              </Form.Item>
-            </Col> : null}
-            {property === 'link' ? <Col span={24}>
-              <Form.Item label="logo閾炬帴" className="textarea">
-                {getFieldDecorator('link', {
-                  initialValue: wrap.link || '',
-                  rules: [{
-                    required: true,
-                    message: '璇疯緭鍏ラ摼鎺ュ湴鍧�!'
-                  }]
-                })(<TextArea rows={2} />)}
-              </Form.Item>
-            </Col> : null}
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="瀛樺湪鐧诲綍涓斿彇鍒扮櫥褰曚俊鎭椂锛屾樉绀虹敤鎴峰ご鍍忋�佺敤鎴峰悕鍙婇��鍑恒��">
-                  <Icon type="question-circle" />
-                  鐢ㄦ埛淇℃伅
-                </Tooltip>
-              }>
-                {getFieldDecorator('user', {
-                  initialValue: wrap.user || 'hidden'
-                })(
-                  <Radio.Group>
-                    <Radio value="hidden">闅愯棌</Radio>
-                    <Radio value="show">鏄剧ず</Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col>
-            <Col span={12}>
-              <Form.Item label={
-                <Tooltip placement="topLeft" title="榛樿闅愯棌鑿滃崟鏍忥紝榧犳爣鍦ㄩ潬杩戦《閮ㄦ椂鏄剧ず銆�">
-                  <Icon type="question-circle" />
-                  鎮诞鏄剧ず
-                </Tooltip>
-              }>
-                {getFieldDecorator('hover', {
-                  initialValue: wrap.hover || 'false'
-                })(
-                  <Radio.Group>
-                    <Radio value="true">鍚敤</Radio>
-                    <Radio value="false">涓嶅惎鐢�</Radio>
-                  </Radio.Group>
-                )}
-              </Form.Item>
-            </Col>
-          </Row>
-        </Form>
-      </div>
-    )
-  }
-}
-
-export default Form.create()(SettingForm)
\ No newline at end of file
diff --git a/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.scss b/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.scss
deleted file mode 100644
index 25eecb7..0000000
--- a/src/pc/components/navbar/normal-navbar/wrapsetting/settingform/index.scss
+++ /dev/null
@@ -1,19 +0,0 @@
-.model-menu-setting-form {
-  position: relative;
-
-  .anticon-question-circle {
-    color: #c49f47;
-    margin-right: 3px;
-  }
-  .ant-input-number {
-    width: 100%;
-  }
-  .ant-form-item.textarea {
-    .ant-form-item-label {
-      width: 16%;
-    }
-    .ant-form-item-control-wrapper {
-      width: 84%;
-    }
-  }
-}
\ No newline at end of file
diff --git a/src/tabviews/custom/components/card/balcony/index.jsx b/src/tabviews/custom/components/card/balcony/index.jsx
index 5026c93..2842c8a 100644
--- a/src/tabviews/custom/components/card/balcony/index.jsx
+++ b/src/tabviews/custom/components/card/balcony/index.jsx
@@ -175,7 +175,7 @@
       MKEmitter.emit('reloadData', btn.syncComponentId)                        // 鍚岀骇鏍囩鍒锋柊
     }
 
-    if (position === 'mainline' && supModule) {                 // 涓昏〃琛屽埛鏂�
+    if (position === 'mainline' && supModule) {                                // 涓昏〃琛屽埛鏂�
       MKEmitter.emit('reloadData', supModule, (BID || 'empty'))
     } else if (position === 'popclose') {                                      // 鏍囩鍏抽棴鍒锋柊
       supModule && MKEmitter.emit('reloadData', supModule, (BID || 'empty'))
diff --git a/src/tabviews/custom/components/card/data-card/index.scss b/src/tabviews/custom/components/card/data-card/index.scss
index 9f7e363..e01ac8d 100644
--- a/src/tabviews/custom/components/card/data-card/index.scss
+++ b/src/tabviews/custom/components/card/data-card/index.scss
@@ -143,6 +143,8 @@
             bottom: 0;
             left: 0;
             right: 0;
+            z-index: 2;
+            opacity: 0;
             cursor: pointer;
           }
         }
diff --git a/src/tabviews/custom/components/card/prop-card/index.scss b/src/tabviews/custom/components/card/prop-card/index.scss
index bb919f8..d1d8f34 100644
--- a/src/tabviews/custom/components/card/prop-card/index.scss
+++ b/src/tabviews/custom/components/card/prop-card/index.scss
@@ -86,6 +86,8 @@
             bottom: 0;
             left: 0;
             right: 0;
+            z-index: 2;
+            opacity: 0;
             cursor: pointer;
           }
         }
diff --git a/src/utils/utils.js b/src/utils/utils.js
index ca334ec..84bcc0f 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -703,8 +703,6 @@
 
     if (item.type === 'link') {
       arrfield.push(item.linkField)
-    } else if ((item.type === 'select' || item.type === 'radio') && item.linkSubField && item.linkSubField.length > 0) {
-      arrfield.push(...item.linkSubField)
     } else if (item.type === 'checkcard') {
       arrfield = item.fields.map(f => f.field)
       arrfield.push(item.cardValField)
@@ -712,6 +710,9 @@
         arrfield.push(item.urlField)
       }
     }
+    if (['select', 'radio', 'link', 'checkcard'].includes(item.type) && item.linkSubField && item.linkSubField.length > 0) {
+      arrfield.push(...item.linkSubField)
+    }
     if (item.disableField) {
       arrfield.push(item.disableField)
     }
diff --git a/src/views/menudesign/index.scss b/src/views/menudesign/index.scss
index 178ca87..3ac0d49 100644
--- a/src/views/menudesign/index.scss
+++ b/src/views/menudesign/index.scss
@@ -171,4 +171,7 @@
     background: transparent!important;
     border-radius: 0!important;
   }
+}
+body {
+  overflow-y: hidden;
 }
\ No newline at end of file
diff --git a/src/views/mobdesign/index.scss b/src/views/mobdesign/index.scss
index ca8fe66..a0a52fc 100644
--- a/src/views/mobdesign/index.scss
+++ b/src/views/mobdesign/index.scss
@@ -241,4 +241,8 @@
     border: 1px solid rgba(0, 0, 0, 0.07);
     background: rgba(0, 0, 0, 0);
   }
+}
+
+body {
+  overflow-y: hidden;
 }
\ No newline at end of file
diff --git a/src/views/pcdesign/index.scss b/src/views/pcdesign/index.scss
index 8b4d1bd..5652d35 100644
--- a/src/views/pcdesign/index.scss
+++ b/src/views/pcdesign/index.scss
@@ -220,4 +220,8 @@
     border: 1px solid rgba(0, 0, 0, 0.07);
     background: rgba(0, 0, 0, 0);
   }
+}
+
+body {
+  overflow-y: hidden;
 }
\ No newline at end of file

--
Gitblit v1.8.0