From b5364600d98c8749caba625ec813d4fe670d0a19 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期四, 16 十二月 2021 17:29:55 +0800
Subject: [PATCH] 2021-12-16

---
 src/menu/components/card/data-card/node-wrap/index.scss                  |    9 +
 src/mob/searchconfig/index.jsx                                           |    2 
 src/menu/datasource/index.jsx                                            |    1 
 src/mob/components/formdragelement/index.scss                            |    3 
 src/mob/searchconfig/settingform/index.scss                              |    5 
 src/views/appmanage/submutilform/index.scss                              |    5 
 src/views/mobdesign/index.jsx                                            |    6 
 src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss |    0 
 src/views/menudesign/index.jsx                                           |    2 
 src/menu/datasource/verifycard/index.jsx                                 |    8 
 src/tabviews/custom/components/card/data-card/index.jsx                  |   85 ++++++++--
 src/menu/components/card/data-card/node-wrap/menus/index.jsx             |   69 ++++++++
 src/mob/searchconfig/groupdragelement/index.scss                         |    2 
 src/menu/components/card/cardcellcomponent/index.jsx                     |   10 
 src/menu/components/card/data-card/options.jsx                           |   13 +
 src/views/pcdesign/index.jsx                                             |    7 
 src/menu/components/card/data-card/node-wrap/index.jsx                   |   68 ++++++++
 src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx  |   82 ++++++++++
 src/menu/datasource/verifycard/settingform/index.jsx                     |    7 
 src/menu/components/card/data-card/node-wrap/menus/index.scss            |    0 
 src/menu/components/card/data-card/index.jsx                             |   12 +
 src/mob/searchconfig/settingform/index.jsx                               |   13 +
 src/tabviews/custom/index.jsx                                            |   11 +
 src/views/appmanage/index.jsx                                            |    7 
 src/views/appmanage/submutilform/index.jsx                               |   15 +
 25 files changed, 399 insertions(+), 43 deletions(-)

diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 7686036..551555c 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -167,11 +167,11 @@
 
     if (comIds.length !== 3 || comIds[0] !== cards.uuid || comIds[1] !== cardCell.uuid || !card) return
 
-    if (card.eleType === 'button') {
-      if ((style.paddingLeft || style.paddingRight) && !style.width) {
-        style.width = 'auto'
-      }
-    }
+    // if (card.eleType === 'button') {
+    //   if ((style.paddingLeft || style.paddingRight) && !style.width) {
+    //     style.width = 'auto'
+    //   }
+    // }
 
     let _card = this.resetCardStyle(card, style)
 
diff --git a/src/menu/components/card/data-card/index.jsx b/src/menu/components/card/data-card/index.jsx
index 1a44355..c864bd0 100644
--- a/src/menu/components/card/data-card/index.jsx
+++ b/src/menu/components/card/data-card/index.jsx
@@ -14,6 +14,7 @@
 const SettingComponent = asyncIconComponent(() => import('@/menu/datasource'))
 const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
 const CardComponent = asyncComponent(() => import('../cardcomponent'))
+const Nodes = asyncComponent(() => import('./node-wrap'))
 const MobPagination = asyncIconComponent(() => import('@/menu/components/share/mobPagination'))
 const LogComponent = asyncIconComponent(() => import('@/menu/components/share/logcomponent'))
 const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
@@ -599,6 +600,16 @@
     }
   }
 
+  updateSupNodes = (res) => {
+    const { card } = this.state
+
+    this.setState({
+      card: {...card, supNodes: res}
+    })
+
+    this.updateComponent({...card, supNodes: res})
+  }
+
   render() {
     const { card, appType } = this.state
 
@@ -626,6 +637,7 @@
             <NormalForm title="鏁版嵁鍗¤缃�" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
               <Icon type="edit" style={{color: '#1890ff'}} title="缂栬緫"/>
             </NormalForm>
+            {card.wrap.supType === 'multi' && appType !== 'mob' ? <Nodes card={card} updateMenus={this.updateSupNodes}/> : null}
             <CopyComponent type="datacard" card={card}/>
             <PasteComponent options={['action', 'search', 'form', 'cardcell']} updateConfig={this.pasteComponent} />
             <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" />
diff --git a/src/menu/components/card/data-card/node-wrap/index.jsx b/src/menu/components/card/data-card/node-wrap/index.jsx
new file mode 100644
index 0000000..aa87f47
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/index.jsx
@@ -0,0 +1,68 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Modal, Icon } from 'antd'
+
+import MenusForm from './menus'
+import './index.scss'
+
+class NodesWrap extends Component {
+  static propTpyes = {
+    card: PropTypes.object,
+    updateMenus: PropTypes.func
+  }
+
+  state = {
+    visible: false,
+    supNodes: [],
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  trigger = () => {
+    const { card } = this.props
+
+    this.setState({
+      visible: true,
+      supNodes: card.supNodes || []
+    })
+  }
+
+  submit = () => {
+    this.setState({
+      visible: false
+    })
+    this.props.updateMenus(this.state.supNodes)
+  }
+
+  update = (supNodes) => {
+    this.setState({supNodes})
+  }
+
+  render() {
+    const { card } = this.props
+    const { visible, supNodes } = this.state
+
+    return (
+      <>
+        <Icon type="fork" title="涓婄骇缁勪欢" style={{color: 'orange'}} onClick={this.trigger}/>
+        <Modal
+          title="涓婄骇缁勪欢"
+          wrapClassName="menus-field-modal"
+          visible={visible}
+          width={700}
+          maskClosable={false}
+          onOk={this.submit}
+          onCancel={() => { this.setState({ visible: false })}}
+          destroyOnClose
+        >
+          <MenusForm supNodes={supNodes} card={card} update={this.update}/>
+        </Modal>
+      </>
+    )
+  }
+}
+
+export default NodesWrap
\ No newline at end of file
diff --git a/src/menu/components/card/data-card/node-wrap/index.scss b/src/menu/components/card/data-card/node-wrap/index.scss
new file mode 100644
index 0000000..52caa86
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/index.scss
@@ -0,0 +1,9 @@
+.menus-field-modal {
+  .ant-modal {
+    top: 70px;
+  }
+  .ant-modal-body {
+    min-height: 150px;
+    padding-top: 40px;
+  }
+}
\ No newline at end of file
diff --git a/src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx b/src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx
new file mode 100644
index 0000000..6c6a36b
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/menus/columnform/index.jsx
@@ -0,0 +1,82 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { Form, Row, Col, Button, Cascader, notification } from 'antd'
+// import './index.scss'
+
+class MenusColumn extends Component {
+  static propTpyes = {
+    supNodes: PropTypes.array,
+    modules: PropTypes.array,
+    columnChange: PropTypes.func
+  }
+
+  state = {options: []}
+
+  handleConfirm = () => {
+    const { supNodes } = this.props
+    // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
+    this.props.form.validateFieldsAndScroll((err, values) => {
+      if (!err) {
+        values.componentId = values.nodes[values.nodes.length - 1]
+        if (supNodes.filter(item => item.componentId === values.componentId).length > 0) {
+          notification.warning({
+            top: 92,
+            message: '缁勪欢宸叉坊鍔狅紒',
+            duration: 2
+          })
+          return
+        }
+
+        values.label = this.state.options.map(item => item.label).join(' / ')
+
+        this.props.columnChange(values)
+      }
+    })
+  }
+
+  onChange = (values, options) => {
+    this.setState({options: options})
+  }
+
+  render() {
+    const { modules } = this.props
+    const { getFieldDecorator } = this.props.form
+    const formItemLayout = {
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 8 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      }
+    }
+
+    return (
+      <Form {...formItemLayout}>
+        <Row gutter={24}>
+          <Col span={16}>
+            <Form.Item label="缁勪欢">
+              {getFieldDecorator('nodes', {
+                initialValue: [],
+                rules: [
+                  {
+                    required: true,
+                    message: '璇烽�夋嫨缁勪欢!'
+                  }
+                ]
+              })(<Cascader options={modules} onChange={this.onChange} placeholder=""/>)}
+            </Form.Item>
+          </Col>
+          <Col span={6} offset={2} style={{paddingTop: '4px'}}>
+            <Button onClick={this.handleConfirm} type="primary" className="mk-green">
+              娣诲姞
+            </Button>
+          </Col>
+        </Row>
+      </Form>
+    )
+  }
+}
+
+export default Form.create()(MenusColumn)
\ No newline at end of file
diff --git a/src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss b/src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/menus/columnform/index.scss
diff --git a/src/menu/components/card/data-card/node-wrap/menus/index.jsx b/src/menu/components/card/data-card/node-wrap/menus/index.jsx
new file mode 100644
index 0000000..37990be
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/menus/index.jsx
@@ -0,0 +1,69 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { fromJS } from 'immutable'
+
+import Utils from '@/utils/utils.js'
+import ColumnForm from './columnform'
+import asyncComponent from '@/utils/asyncComponent'
+import MenuUtils from '@/utils/utils-custom.js'
+// import './index.scss'
+
+const EditTable = asyncComponent(() => import('@/templates/zshare/editTable'))
+
+class SupNodes extends Component {
+  static propTpyes = {
+    card: PropTypes.object,
+    supNodes: PropTypes.array,
+    update: PropTypes.func
+  }
+
+  state = {
+    modules: [],
+    columns: [
+      {
+        title: '缁勪欢',
+        dataIndex: 'label',
+        editable: false,
+        width: '60%'
+      }
+    ]
+  }
+
+  UNSAFE_componentWillMount() {
+    const { supNodes, card } = this.props
+
+    let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, card.uuid) || []
+
+    this.setState({
+      modules,
+      supNodes: fromJS(supNodes).toJS()
+    })
+  }
+
+  columnChange = (values) => {
+    const { supNodes } = this.state
+    values.uuid = Utils.getuuid()
+    let _nodes = [...supNodes, values]
+
+    this.setState({supNodes: _nodes})
+    this.props.update(_nodes)
+  }
+
+  changeColumns = (columns) => {
+    this.setState({supNodes: columns})
+    this.props.update(columns)
+  }
+
+  render() {
+    const { supNodes, columns, modules } = this.state
+
+    return (
+      <div style={{minHeight: '250px'}}>
+        <ColumnForm supNodes={supNodes} modules={modules} columnChange={this.columnChange}/>
+        <EditTable actions={['del']} data={supNodes} columns={columns} onChange={this.changeColumns}/>
+      </div>
+    )
+  }
+}
+
+export default SupNodes
\ No newline at end of file
diff --git a/src/menu/components/card/data-card/node-wrap/menus/index.scss b/src/menu/components/card/data-card/node-wrap/menus/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/menu/components/card/data-card/node-wrap/menus/index.scss
diff --git a/src/menu/components/card/data-card/options.jsx b/src/menu/components/card/data-card/options.jsx
index 6ea0c7c..1614f78 100644
--- a/src/menu/components/card/data-card/options.jsx
+++ b/src/menu/components/card/data-card/options.jsx
@@ -118,6 +118,19 @@
       ]
     },
     {
+      type: 'radio',
+      field: 'supType',
+      label: '涓婄骇绫诲瀷',
+      initval: wrap.supType || 'single',
+      tooltip: '涓婄骇缁勪欢涓哄崟涓�缁勪欢鎴栧涓粍浠躲��',
+      required: false,
+      forbid: subtype !== 'datacard' || appType === 'mob',
+      options: [
+        {value: 'single', label: '鍗曠粍浠�'},
+        {value: 'multi', label: '澶氱粍浠�'},
+      ]
+    },
+    {
       type: subtype === 'propcard' ? 'select' : 'radio',
       field: 'selStyle',
       label: '閫変腑椋庢牸',
diff --git a/src/menu/datasource/index.jsx b/src/menu/datasource/index.jsx
index 42e66df..c0c34ad 100644
--- a/src/menu/datasource/index.jsx
+++ b/src/menu/datasource/index.jsx
@@ -241,7 +241,6 @@
         >
           <VerifyCard
             dict={dict}
-            menu={window.GLOB.customMenu}
             mainSearch={mainSearch}
             config={config}
             wrappedComponentRef={(inst) => this.verifyRef = inst}
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index edd2fa1..ced365c 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -24,7 +24,6 @@
 class VerifyCard extends Component {
   static propTpyes = {
     dict: PropTypes.object,          // 瀛楀吀椤�
-    menu: PropTypes.object,          // 鑿滃崟閰嶇疆淇℃伅
     config: PropTypes.object,        // 缁勪欢閰嶇疆淇℃伅
   }
 
@@ -161,7 +160,7 @@
     }
 
     let _setting = fromJS(config.setting).toJS()
-    let scripts = fromJS(config.scripts).toJS()
+    let scripts = config.scripts ? fromJS(config.scripts).toJS() : []
 
     if (window.GLOB.funcs && window.GLOB.funcs.length > 0) {
       window.GLOB.funcs.forEach(m => {
@@ -183,7 +182,7 @@
 
     this.setState({
       scripts,
-      columns: fromJS(config.columns).toJS(),
+      columns: config.columns ? fromJS(config.columns).toJS() : [],
       setting: _setting,
       searches: search,
       defaultSearch: _search
@@ -646,7 +645,7 @@
   }
 
   render() {
-    const { menu, config } = this.props
+    const { config } = this.props
     const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql } = this.state
 
     return (
@@ -655,7 +654,6 @@
         <Tabs activeKey={activeKey} className="data-source-card-box" onChange={this.changeTab}>
           <TabPane tab="鏁版嵁婧�" key="setting">
             <SettingForm
-              menu={menu}
               dict={this.props.dict}
               config={config}
               columns={columns}
diff --git a/src/menu/datasource/verifycard/settingform/index.jsx b/src/menu/datasource/verifycard/settingform/index.jsx
index 854ee9b..dcba39d 100644
--- a/src/menu/datasource/verifycard/settingform/index.jsx
+++ b/src/menu/datasource/verifycard/settingform/index.jsx
@@ -14,7 +14,6 @@
 class SettingForm extends Component {
   static propTpyes = {
     dict: PropTypes.object,       // 瀛楀吀椤�
-    menu: PropTypes.any,          // 鑿滃崟閰嶇疆淇℃伅
     config: PropTypes.object,     // 缁勪欢閰嶇疆
     setting: PropTypes.object,    // 鏁版嵁婧愰厤缃�
     modules: PropTypes.array,     // 鍙粦瀹氱殑涓婄骇缁勪欢
@@ -32,9 +31,9 @@
   }
 
   UNSAFE_componentWillMount () {
-    const { menu, config } = this.props
+    const { config } = this.props
 
-    let modules = MenuUtils.getSupModules(menu.components, config.uuid) || []
+    let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, config.uuid) || []
 
     modules.unshift({
       value: 'empty',
@@ -349,7 +348,7 @@
                 </Radio.Group>)}
               </Form.Item>
             </Col> : null}
-            {!['navbar', 'balcony', 'menubar'].includes(config.type) ? <Col span={8}>
+            {!['navbar', 'balcony', 'menubar'].includes(config.type) && (!config.wrap || config.wrap.supType !== 'multi') ? <Col span={8}>
               <Form.Item label={
                 <Tooltip placement="topLeft" title={'璇ョ粍浠跺鏋滃彈鍏朵粬缁勪欢鎺у埗锛岃閫夐」鐩稿簲鐨勭粍浠讹紝娌℃湁鏃堕�夆�滄棤鈥濄��'}>
                   <QuestionCircleOutlined className="mk-form-tip" />
diff --git a/src/mob/components/formdragelement/index.scss b/src/mob/components/formdragelement/index.scss
index b8673a5..c89ff7b 100644
--- a/src/mob/components/formdragelement/index.scss
+++ b/src/mob/components/formdragelement/index.scss
@@ -93,6 +93,9 @@
       .check-card-edit-box {
         margin-top: 0!important;
       }
+      .am-input-label {
+        width: auto;
+      }
     }
   }
   .am-list-item.hint {
diff --git a/src/mob/searchconfig/groupdragelement/index.scss b/src/mob/searchconfig/groupdragelement/index.scss
index bf9d07a..a400b7a 100644
--- a/src/mob/searchconfig/groupdragelement/index.scss
+++ b/src/mob/searchconfig/groupdragelement/index.scss
@@ -6,7 +6,7 @@
   margin-bottom: 15px;
   .page-card {
     float: left;
-    width: 13.333%;
+    width: 16.666%;
     text-align: center;
     padding: 5px;
     .icon {
diff --git a/src/mob/searchconfig/index.jsx b/src/mob/searchconfig/index.jsx
index 2ad5662..25dde68 100644
--- a/src/mob/searchconfig/index.jsx
+++ b/src/mob/searchconfig/index.jsx
@@ -495,7 +495,7 @@
           </div>
           <div className="setting">
             <div className="mob-shell" style={{width: window.GLOB.shellWidth, height: window.GLOB.shellHeight}}>
-              <div className="mob-shell-inner">
+              <div className="mob-shell-inner" style={{backgroundColor: group.setting.backgroundColor || '#ffffff'}}>
                 <Icon className="setting-group" onClick={this.changeSetting} type="setting" />
                 {group.setting.type === 'title' ? <div className="am-navbar">
                   <Icon type="left" />
diff --git a/src/mob/searchconfig/settingform/index.jsx b/src/mob/searchconfig/settingform/index.jsx
index 52653f6..42a7ee2 100644
--- a/src/mob/searchconfig/settingform/index.jsx
+++ b/src/mob/searchconfig/settingform/index.jsx
@@ -2,8 +2,12 @@
 import PropTypes from 'prop-types'
 import { Form, Row, Col, Input, Radio, Select, Tooltip } from 'antd'
 import { QuestionCircleOutlined } from '@ant-design/icons'
+
+import asyncComponent from '@/utils/asyncComponent'
 import { formRule } from '@/utils/option.js'
 import './index.scss'
+
+const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
 
 class SettingForm extends Component {
   static propTpyes = {
@@ -208,6 +212,15 @@
               )}
             </Form.Item>
           </Col> : null}
+          <Col span={12}>
+            <Form.Item className="sys-bgcolor" label="鑳屾櫙鑹�">
+              {getFieldDecorator('backgroundColor', {
+                initialValue: config.setting.backgroundColor || '#ffffff'
+              })(
+                <ColorSketch value={config.setting.backgroundColor || '#ffffff'}/>
+              )}
+            </Form.Item>
+          </Col>
           {type === 'search' ? <Col span={12}>
             <Form.Item label="榛戝悕鍗�">
               {getFieldDecorator('blacklist', {
diff --git a/src/mob/searchconfig/settingform/index.scss b/src/mob/searchconfig/settingform/index.scss
index 0bfd8f4..cd7da53 100644
--- a/src/mob/searchconfig/settingform/index.scss
+++ b/src/mob/searchconfig/settingform/index.scss
@@ -12,4 +12,9 @@
     float: none;
     vertical-align: top;
   }
+  .sys-bgcolor {
+    .ant-form-item-children {
+      padding-top: 7px;
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/tabviews/custom/components/card/data-card/index.jsx b/src/tabviews/custom/components/card/data-card/index.jsx
index d608b7c..2bbbf72 100644
--- a/src/tabviews/custom/components/card/data-card/index.jsx
+++ b/src/tabviews/custom/components/card/data-card/index.jsx
@@ -41,7 +41,9 @@
     total: null,
     precards: [],
     nextcards: [],
-    selected: 'false'
+    selected: 'false',
+    supNodes: [],
+    supComs: null
   }
 
   UNSAFE_componentWillMount () {
@@ -144,7 +146,13 @@
       return item
     })
 
+    let supComs = null
+    if (_config.wrap.supType === 'multi') {
+      supComs = _config.supNodes.map(item => item.componentId)
+    }
+
     this.setState({
+      supComs,
       selected,
       precards,
       nextcards,
@@ -227,7 +235,7 @@
    * @param {*} btn        // 鎵ц鐨勬寜閽�
    */
   refreshByButtonResult = (menuId, position, btn, id, lines) => {
-    const { config, BID } = this.state
+    const { config, BID, supComs, supNodes } = this.state
 
     if (config.uuid !== menuId) return
 
@@ -243,15 +251,38 @@
       this.loadData()
     }
 
-    if (btn.syncComponentId && btn.syncComponentId !== config.uuid && btn.syncComponentId !== config.setting.supModule) {
-      MKEmitter.emit('reloadData', btn.syncComponentId)                        // 鍚岀骇鏍囩鍒锋柊
-    }
 
-    if (position === 'mainline' && config.setting.supModule) {                 // 涓昏〃琛屽埛鏂�
-      MKEmitter.emit('reloadData', config.setting.supModule, (BID || 'empty'))
-    } else if (position === 'popclose') {                                      // 鏍囩鍏抽棴鍒锋柊
-      config.setting.supModule && MKEmitter.emit('reloadData', config.setting.supModule, (BID || 'empty'))
-      btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId)
+    if (supComs) {
+      if (btn.syncComponentId && btn.syncComponentId !== config.uuid && !supComs.includes(btn.syncComponentId)) {
+        MKEmitter.emit('reloadData', btn.syncComponentId)                        // 鍚岀骇鏍囩鍒锋柊
+      }
+  
+      if (position === 'mainline' || position === 'popclose') {                 // 涓昏〃琛屽埛鏂�
+        let supNode = supNodes[supNodes.length - 1]
+        supComs.forEach((item, i) => {
+          setTimeout(() => {
+            if (supNode && supNode.key === item) {
+              MKEmitter.emit('reloadData', item, supNode.value)
+            } else {
+              MKEmitter.emit('reloadData', item)
+            }
+          }, i * 10)
+        })
+        if (position === 'popclose') {                                      // 鏍囩鍏抽棴鍒锋柊
+          btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId)
+        }
+      }
+    } else {
+      if (btn.syncComponentId && btn.syncComponentId !== config.uuid && btn.syncComponentId !== config.setting.supModule) {
+        MKEmitter.emit('reloadData', btn.syncComponentId)                        // 鍚岀骇鏍囩鍒锋柊
+      }
+  
+      if (position === 'mainline' && config.setting.supModule) {                 // 涓昏〃琛屽埛鏂�
+        MKEmitter.emit('reloadData', config.setting.supModule, (BID || 'empty'))
+      } else if (position === 'popclose') {                                      // 鏍囩鍏抽棴鍒锋柊
+        config.setting.supModule && MKEmitter.emit('reloadData', config.setting.supModule, (BID || 'empty'))
+        btn.$tabId && MKEmitter.emit('refreshPopButton', btn.$tabId)
+      }
     }
   }
 
@@ -327,13 +358,35 @@
   }
 
   resetParentParam = (MenuID, id, data) => {
-    const { config } = this.state
+    const { config, supComs } = this.state
 
-    if (!config.setting.supModule || config.setting.supModule !== MenuID) return
-    if (id !== this.state.BID || id !== '') {
-      this.setState({ BID: id, BData: data, pageIndex: 1 }, () => {
-        this.loadData()
-      })
+    if (supComs) {
+      if (!supComs.includes(MenuID)) return
+
+      let supNodes = this.state.supNodes.filter(item => item.key !== MenuID)
+      let bid = ''
+      let _data = null
+
+      if (id) {
+        supNodes.push({key: MenuID, value: id, data})
+      }
+      if (supNodes.length > 0) {
+        bid = supNodes[supNodes.length - 1].value
+        _data = supNodes[supNodes.length - 1].data
+      }
+
+      if (bid !== this.state.BID || bid !== '') {
+        this.setState({ BID: bid, BData: _data, pageIndex: 1 }, () => {
+          this.loadData()
+        })
+      }
+    } else {
+      if (!config.setting.supModule || config.setting.supModule !== MenuID) return
+      if (id !== this.state.BID || id !== '') {
+        this.setState({ BID: id, BData: data, pageIndex: 1 }, () => {
+          this.loadData()
+        })
+      }
     }
   }
 
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index d4bc44a..2070009 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -737,7 +737,15 @@
         }
       } 
 
-      if (item.setting && item.setting.supModule) {
+      if (item.wrap && item.wrap.supType === 'multi') { // 鏁版嵁鍗″涓婄骇缁勪欢
+        if (item.supNodes && item.supNodes[0]) {
+          item.setting.supModule = item.supNodes[0].componentId
+        } else {
+          item.wrap.supType = 'single'
+          item.supNodes = null
+          item.setting.supModule = ''
+        }
+      } else if (item.setting && item.setting.supModule) {
         let pid = item.setting.supModule.pop()
         if (pid && pid !== 'empty') {
           item.setting.supModule = pid
@@ -745,6 +753,7 @@
           item.setting.supModule = ''
         }
       }
+
       if (item.wrap && item.wrap.doubleClick) {
         let index = item.action.findIndex((btn) => btn.uuid === item.wrap.doubleClick)
         if (index === -1) {
diff --git a/src/views/appmanage/index.jsx b/src/views/appmanage/index.jsx
index 913707c..b5020dd 100644
--- a/src/views/appmanage/index.jsx
+++ b/src/views/appmanage/index.jsx
@@ -472,6 +472,7 @@
               cell.apptype = _param.apptype || ''
               cell.delay = _param.delay || 0
               cell.statusBarColor = _param.statusBarColor || 'black'
+              cell.sysBgColor = _param.sysBgColor || '#ffffff'
               cell.adapter = _param.adapter || ''
               if (cell.adapter && (cell.adapter === 'true' || cell.adapter === 'false')) {
                 cell.adapter = ''
@@ -612,7 +613,7 @@
     sublist = sublist.filter(item => item.ID !== record.ID)
 
     // param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}'`)
-    param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
+    param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
     param.LText = param.LText.join(' union all ')
     param.LText = Utils.formatOptions(param.LText)
     
@@ -836,7 +837,7 @@
 
       if (visible === 'edit') {
         // param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}'`)
-        param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
+        param.LText = selectApp.sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
         param.LText = param.LText.join(' union all ')
         param.LText = Utils.formatOptions(param.LText)
       }
@@ -922,7 +923,7 @@
       }
 
       // param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','${item.login_types || 'true'}','${item.link_type || 'true'}','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}'`)
-      param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', adapter: item.adapter || ''})))}'`)
+      param.LText = sublist.map(item => `select '${item.ID}','${item.typename}','${selectApp.ID}','${sessionStorage.getItem('CloudUserID') || ''}','${window.GLOB.appkey || ''}','false','false','${item.role_type || 'true'}','${item.lang || 'zh-CN'}','${item.css || ''}','${item.title || ''}','${item.favicon || ''}','${item.user_binding || ''}','${item.sms_id || ''}','${window.btoa(window.encodeURIComponent(JSON.stringify({copyright: item.copyright || '', logo: item.logo || '', apptype: item.apptype || '', delay: item.delay || 0, statusBarColor: item.statusBarColor || 'black', sysBgColor: item.sysBgColor || '#ffffff', adapter: item.adapter || ''})))}'`)
       param.LText = param.LText.join(' union all ')
       param.LText = Utils.formatOptions(param.LText)
 
diff --git a/src/views/appmanage/submutilform/index.jsx b/src/views/appmanage/submutilform/index.jsx
index 3a49a97..ac533bf 100644
--- a/src/views/appmanage/submutilform/index.jsx
+++ b/src/views/appmanage/submutilform/index.jsx
@@ -6,6 +6,7 @@
 import asyncComponent from '@/utils/asyncComponent'
 import './index.scss'
 
+const ColorSketch = asyncComponent(() => import('@/mob/colorsketch'))
 const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent'))
 
 class MainSearch extends Component {
@@ -293,6 +294,20 @@
               )}
             </Form.Item>
           </Col> : null}
+          <Col span={12}>
+            <Form.Item className="sys-bgcolor" label={
+              <Tooltip placement="topLeft" title="瀛愬簲鐢ㄩ�氱敤鐨勮儗鏅壊锛屽瓙搴旂敤椤甸潰鍒涘缓鏃朵細榛樿娣诲姞姝よ儗鏅壊銆�">
+                <QuestionCircleOutlined className="mk-form-tip" />
+                鑳屾櫙鑹�
+              </Tooltip>
+            }>
+              {getFieldDecorator('sysBgColor', {
+                initialValue: card ? card.sysBgColor || '#ffffff' : '#ffffff'
+              })(
+                <ColorSketch value={card ? card.sysBgColor || '#ffffff' : '#ffffff'}/>
+              )}
+            </Form.Item>
+          </Col>
         </Row>
       </Form>
     )
diff --git a/src/views/appmanage/submutilform/index.scss b/src/views/appmanage/submutilform/index.scss
index 4adee58..7b121c8 100644
--- a/src/views/appmanage/submutilform/index.scss
+++ b/src/views/appmanage/submutilform/index.scss
@@ -15,4 +15,9 @@
   .ant-form-item-with-help {
     margin-bottom: 24px;
   }
+  .sys-bgcolor {
+    .ant-form-item-children {
+      padding-top: 7px;
+    }
+  }
 }
\ No newline at end of file
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index 66ce2e4..f5246d3 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -864,7 +864,7 @@
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆鏁版嵁婧愶紒`
           } else if (!item.setting.primaryKey) {
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆涓婚敭锛乣
-          } else if (!item.setting.supModule && item.type !== 'balcony') {
+          } else if (!item.setting.supModule && item.type !== 'balcony' && (!item.wrap || item.wrap.supType !== 'multi')) {
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆涓婄骇缁勪欢锛乣
           }
         }
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 44a255b..4e92bb9 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -87,6 +87,7 @@
         sessionStorage.setItem('login_types', param.login_types || 'false')
         sessionStorage.setItem('typename', param.typename || 'mob')
         sessionStorage.setItem('adapter', param.adapter || '')
+        sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
 
         this.setState({
           localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
@@ -466,8 +467,9 @@
             tables: [],
             components: [],
             viewType: 'menu',
+            statusBarbgColor: sessionStorage.getItem('sysBgColor') || '#ffffff',
             style: {
-              backgroundColor: '#ffffff', backgroundImage: ''
+              backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: ''
             }
           }
         }
@@ -1034,7 +1036,7 @@
                 Typename: sessionStorage.getItem('typename'),
                 MenuName: item.name || '',
                 PageParam: JSON.stringify({Template: item.type}),
-                open_edition: _item.open_edition || '',
+                open_edition: _item ? (_item.open_edition || '') : '',
                 menus_rolelist: window.btoa(window.encodeURIComponent(JSON.stringify(roles))),
                 LText: '',
                 LTexttb: ''
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index 4c94c51..982c2da 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -88,6 +88,7 @@
         sessionStorage.setItem('kei_no', param.kei_no || '')
         sessionStorage.setItem('role_type', param.role_type || 'true')
         sessionStorage.setItem('login_types', param.login_types || 'false')
+        sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
 
         this.setState({
           localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
@@ -529,7 +530,7 @@
             components: [],
             viewType: 'menu',
             style: {
-              backgroundColor: '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
+              backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
             }
           }
         }
@@ -647,7 +648,7 @@
           components: [],
           viewType: 'menu',
           style: {
-            backgroundColor: '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
+            backgroundColor: sessionStorage.getItem('sysBgColor') || '#ffffff', backgroundImage: '', paddingLeft: '20px', paddingRight: '20px'
           }
         }
       } else {
@@ -1407,7 +1408,7 @@
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆鏁版嵁婧愶紒`
           } else if (!item.setting.primaryKey) {
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆涓婚敭锛乣
-          } else if (!item.setting.supModule && item.type !== 'balcony') {
+          } else if (!item.setting.supModule && item.type !== 'balcony' && (!item.wrap || item.wrap.supType !== 'multi')) {
             error = `缁勪欢銆�${item.name}銆嬫湭璁剧疆涓婄骇缁勪欢锛乣
           }
         }

--
Gitblit v1.8.0