From a9ac16fecc0cf9bc66dfaefe4e9b35fa3c722812 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 10 十一月 2020 16:58:43 +0800
Subject: [PATCH] 2020-11-10

---
 src/menu/components/card/cardcellcomponent/index.jsx |  562 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 533 insertions(+), 29 deletions(-)

diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 8e58563..3d80bc4 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -1,11 +1,16 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Modal } from 'antd'
+import {connect} from 'react-redux'
+import { Modal, Button, notification } from 'antd'
 
+import Api from '@/api'
+import options from '@/store/options.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
+import asyncComponent from '@/utils/asyncComponent'
 import { getCardCellForm } from './formconfig'
+import { getActionForm } from '@/menu/actioncomponent/formconfig'
 
 import MKEmitter from '@/utils/events.js'
 import ElementForm from './elementform'
@@ -14,9 +19,18 @@
 
 const { confirm } = Modal
 
+const ActionForm = asyncComponent(() => import('@/menu/actioncomponent/actionform'))
+const CreateFunc = asyncComponent(() => import('@/templates/zshare/createfunc'))
+const VerifyCard = asyncComponent(() => import('@/templates/zshare/verifycard'))
+const VerifyPrint = asyncComponent(() => import('@/menu/actioncomponent/verifyprint'))
+const VerifyExcelIn = asyncComponent(() => import('@/menu/actioncomponent/verifyexcelin'))
+const VerifyExcelOut = asyncComponent(() => import('@/menu/actioncomponent/verifyexcelout'))
+
 class CardCellComponent extends Component {
   static propTpyes = {
-    config: PropTypes.object,        // 鑿滃崟閰嶇疆淇℃伅
+    cards: PropTypes.object,         // 鑿滃崟閰嶇疆淇℃伅
+    cardCell: PropTypes.object,
+    side: PropTypes.string,
     elements: PropTypes.array,       // 鍏冪礌闆�
     updateElement: PropTypes.func    // 鑿滃崟閰嶇疆鏇存柊
   }
@@ -27,6 +41,8 @@
     formlist: null,      // 琛ㄥ崟淇℃伅
     elements: null,      // 鎸夐挳缁�
     visible: false,      // 妯℃�佹鎺у埗
+    actvisible: false,   // 鎸夐挳缂栬緫妯℃�佹
+    profVisible: false,  // 楠岃瘉淇℃伅缂栬緫
   }
 
   /**
@@ -42,10 +58,20 @@
 
   componentDidMount () {
     MKEmitter.addListener('cardAddElement', this.cardAddElement)
+    MKEmitter.addListener('submitStyle', this.getStyle)
+    MKEmitter.addListener('submitModal', this.handleSave)
   }
 
   shouldComponentUpdate (nextProps, nextState) {
-    return !is(fromJS(this.props.config), fromJS(nextProps.config)) || !is(fromJS(this.state), fromJS(nextState))
+    return !is(fromJS(this.props.cards), fromJS(nextProps.cards)) || !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  UNSAFE_componentWillReceiveProps(nextProps) {
+    if (this.props.side !== nextProps.side) {
+      this.setState({
+        elements: fromJS(nextProps.elements).toJS()
+      })
+    }
   }
 
   /**
@@ -56,37 +82,297 @@
       return
     }
     MKEmitter.removeListener('cardAddElement', this.cardAddElement)
+    MKEmitter.removeListener('submitStyle', this.getStyle)
+    MKEmitter.removeListener('submitModal', this.handleSave)
   }
 
-  cardAddElement = (cardId, element) => {
-    if (cardId !== this.props.config.uuid) return
+  cardAddElement = (ids, element) => {
+    const { cards, cardCell } = this.props
+
+    if (!ids || ids.length !== 2 || ids[0] !== cards.uuid || ids[1] !== cardCell.uuid) return
 
     const { elements } = this.state
 
     this.setState({elements: [...elements, element]})
+
     this.handleElement(element)
+  }
+
+  handleStyle = (element) => {
+    const { cards, cardCell } = this.props
+
+    let _style = element.style ? fromJS(element.style).toJS() : {}
+    let options = ['font', 'border', 'padding', 'margin', 'backgroundColor']
+
+    if (element.eleType === 'button') {
+      if (element.btnstyle) {
+        _style = {..._style, ...element.btnstyle}
+      }
+    } else if (element.eleType === 'picture') {
+      options = ['border', 'margin']
+    } else if (element.eleType === 'slider') {
+      options = ['padding', 'margin']
+    } else if (element.eleType === 'splitline') {
+      options = ['padding', 'margin']
+    }
+
+    this.setState({
+      card: element
+    })
+
+    MKEmitter.emit('changeStyle', [cards.uuid, cardCell.uuid, element.uuid], options, _style)
+  }
+
+  getStyle = (comIds, style) => {
+    const { cards, cardCell } = this.props
+    const { card, elements } = this.state
+
+    if (comIds.length !== 3 || comIds[0] !== cards.uuid || comIds[1] !== cardCell.uuid) return
+
+    let _card = fromJS(card).toJS()
+    
+    if (_card.eleType === 'text' || _card.eleType === 'number' || _card.eleType === 'link') {
+      _card.style = style
+
+      let fontSize = 14
+      let lineHeight = 1.5
+      let line = _card.height || 1
+
+      if (_card.style.fontSize) {
+        fontSize = parseInt(_card.style.fontSize)
+      }
+      if (_card.style.lineHeight) {
+        lineHeight = parseFloat(_card.style.lineHeight)
+      }
+
+      _card.innerHeight = fontSize * lineHeight * line
+    } else if (_card.eleType === 'barcode') {
+      _card.style = style
+
+      let fontSize = 14
+
+      if (_card.style.fontSize) {
+        fontSize = parseInt(_card.style.fontSize)
+      }
+
+      _card.innerHeight = _card.barHeight + (_card.displayValue === 'true' ? fontSize + 2 : 0)
+    } else if (_card.eleType === 'button') { // 鎷嗗垎style
+      let _style = fromJS(style).toJS()
+      _card.style = {}
+
+      if (_style.marginTop) {
+        _card.style.marginTop = _style.marginTop
+        delete _style.marginTop
+      }
+      if (_style.marginBottom) {
+        _card.style.marginBottom = _style.marginBottom
+        delete _style.marginBottom
+      }
+      if (_style.marginLeft) {
+        _card.style.marginLeft = _style.marginLeft
+        delete _style.marginLeft
+      }
+      if (_style.marginRight) {
+        _card.style.marginRight = _style.marginRight
+        delete _style.marginRight
+      }
+      if (_style.paddingTop) {
+        _card.style.paddingTop = _style.paddingTop
+        delete _style.paddingTop
+      }
+      if (_style.paddingBottom) {
+        _card.style.paddingBottom = _style.paddingBottom
+        delete _style.paddingBottom
+      }
+      if (_style.paddingLeft) {
+        _card.style.paddingLeft = _style.paddingLeft
+        delete _style.paddingLeft
+      }
+      if (_style.paddingRight) {
+        _card.style.paddingRight = _style.paddingRight
+        delete _style.paddingRight
+      }
+      if (_style.textAlign) {
+        _card.style.textAlign = _style.textAlign
+        delete _style.textAlign
+      }
+
+      _card.btnstyle = _style
+    } else {
+      _card.style = style
+    }
+
+    let _elements = elements.map(cell => {
+      if (cell.uuid === _card.uuid) return _card
+      return cell
+    })
+
+    this.setState({
+      elements: _elements
+    }, () => {
+      this.props.updateElement(_elements)
+    })
   }
 
   /**
    * @description 鎸夐挳椤哄簭璋冩暣
    */
   handleList = (list) => {
-    const { config } = this.props
-
     this.setState({elements: list}, () => {
-      this.props.updateElement({...config, elements: list})
+      this.props.updateElement(list)
     })
+  }
+
+  /**
+   * @description 鍏冪礌缂栬緫锛岃幏鍙栧厓绱犺〃鍗曚俊鎭�
+   */
+  handleElement = (card) => {
+    const { cards } = this.props
+
+    if (card.eleType === 'button') {
+      this.handleAction(card)
+    } else {
+      this.setState({
+        visible: true,
+        card: card,
+        formlist: getCardCellForm(card, cards.type)
+      })
+    }
   }
 
   /**
    * @description 鎸夐挳缂栬緫锛岃幏鍙栨寜閽〃鍗曚俊鎭�
    */
-  handleElement = (card) => {
-    this.setState({
-      visible: true,
-      card: card,
-      formlist: getCardCellForm(card)
+  handleAction = (card) => {
+    const { menu, cards } = this.props
+
+    let ableField = menu.permFuncField ? menu.permFuncField.join(', ') : ''
+    let functip = <div>
+      <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p>
+      <p>{this.state.dict['model.tooltip.func.outface']}</p>
+    </div>
+
+    let menulist = []
+    if (menu.fstMenuList) {
+      menulist = menu.fstMenuList.map(item => {
+        return {
+          value: item.MenuID,
+          label: item.text,
+          isLeaf: false
+        }
+      })
+    }
+
+    let modules = this.getModules(menu.components, cards.uuid)
+
+    if (menu.fstMenuList && card.linkmenu && card.linkmenu.length > 0) {
+      let _param = {
+        func: 'sPC_Get_FunMenu',
+        ParentID: card.linkmenu[0],
+        systemType: options.sysType,
+        debug: 'Y'
+      }
+  
+      Api.getSystemConfig(_param).then(result => {
+        if (result.status) {
+          menulist = menulist.map(item => {
+            if (item.value === card.linkmenu[0]) {
+              item.children = result.data.map(item => {
+                let submenu = {
+                  value: item.ParentID,
+                  label: item.MenuNameP,
+                  children: item.FunMenu.map(cell => {
+                    return {
+                      value: cell.MenuID,
+                      label: cell.MenuName,
+                      MenuID: cell.MenuID,
+                      MenuName: cell.MenuName,
+                      MenuNo: cell.MenuNo,
+                      Ot: cell.Ot,
+                      PageParam: cell.PageParam,
+                      LinkUrl: cell.LinkUrl,
+                      disabled: cell.MenuID === menu.MenuID
+                    }
+                  })
+                }
+
+                return submenu
+              })
+            }
+            return item
+          })
+        } else {
+          notification.warning({
+            top: 92,
+            message: result.message,
+            duration: 5
+          })
+        }
+
+        this.setState({
+          actvisible: true,
+          card: card,
+          formlist: getActionForm(card, functip, cards.setting, menu.permFuncField, 'card', menulist, modules)
+        })
+      })
+    } else {
+      this.setState({
+        actvisible: true,
+        card: card,
+        formlist: getActionForm(card, functip, cards.setting, menu.permFuncField, 'card', menulist, modules)
+      })
+    }
+  }
+
+  getModules = (components, selfId) => {
+    let modules = components.map(item => {
+      if (item.uuid === selfId) {
+        return {
+          children: null
+        }
+      } else if (item.format) {
+        return {
+          value: item.uuid,
+          label: item.name
+        }
+      } else if (item.type === 'tabs') {
+        let _item = {
+          value: item.uuid,
+          label: item.name,
+          children: item.subtabs.map(f_tab => {
+            let subItem = {
+              value: f_tab.uuid,
+              label: f_tab.label,
+              children: this.getModules(f_tab.components, selfId)
+            }
+
+            if (!subItem.children || subItem.children.length === 0) {
+              return {children: null}
+            }
+            return subItem
+          })
+        }
+
+        _item.children = _item.children.filter(t => t.children !== null)
+
+        if (_item.children.length === 0) {
+          return {children: null}
+        }
+
+        return _item
+      } else {
+        return {
+          children: null
+        }
+      }
     })
+
+    modules = modules.filter(mod => mod.children !== null)
+
+    if (modules.length === 0) {
+      return null
+    }
+    return modules
   }
 
   /**
@@ -105,24 +391,52 @@
     this.setState({
       card: null,
       elements: _elements,
-      visible: false
+      visible: false,
+      actvisible: false
     })
   }
 
   /**
-   * @description 鎼滅储淇敼鍚庢彁浜や繚瀛�
-   * 1銆佸幓闄ょ郴缁熼粯璁ゆ悳绱㈡潯浠�
-   * 2銆佸瓧娈靛強鎻愮ず鏂囧瓧閲嶅鏍¢獙
-   * 3銆佹洿鏂颁笅鎷夎彍鍗曞彲閫夐泦鍚�
-   * 4銆佷笅鎷夎彍鍗曟暟鎹簮璇硶楠岃瘉
+   * @description 鍏冪礌淇敼鍚庢彁浜や繚瀛�
    */
   handleSubmit = () => {
-    const { config } = this.props
     const { elements } = this.state
 
-    this.elementFormRef.handleConfirm().then(ele => {
+    this.elementFormRef.handleConfirm().then(res => {
       let _elements = elements.map(cell => {
-        if (cell.uuid === ele.uuid) return ele
+        if (cell.uuid === res.uuid) {
+          res.style = cell.style || {}
+          if (res.eleType === 'splitline' && cell.eleType !== 'splitline') {
+            res.style.paddingTop = '5px'
+            res.style.paddingBottom = '5px'
+          } else if (res.eleType === 'text' || res.eleType === 'number' || res.eleType === 'link') {
+            let fontSize = 14
+            let lineHeight = 1.5
+            let line = res.height || 1
+      
+            if (res.style && res.style.fontSize) {
+              fontSize = parseInt(res.style.fontSize)
+            }
+            if (res.style && res.style.lineHeight) {
+              lineHeight = parseFloat(res.style.lineHeight)
+            }
+            res.innerHeight = fontSize * lineHeight * line
+
+            if (res.eleType === 'link' && !res.style.color) {
+              res.style.color = 'rgba(24, 144, 255, 1)'
+            }
+          } else if (res.eleType === 'barcode') {
+            let fontSize = 14
+      
+            if (res.style && res.style.fontSize) {
+              fontSize = parseInt(res.style.fontSize)
+            }
+      
+            res.innerHeight = res.barHeight + (res.displayValue === 'true' ? fontSize + 2 : 0)
+          }
+          
+          return res
+        }
         return cell
       })
 
@@ -130,7 +444,32 @@
         elements: _elements,
         visible: false
       }, () => {
-        this.props.updateElement({...config, elements: _elements})
+        this.props.updateElement(_elements)
+      })
+    })
+  }
+
+  /**
+   * @description 鍏冪礌淇敼鍚庢彁浜や繚瀛�
+   */
+  handleActionSubmit = () => {
+    const { elements } = this.state
+
+    this.actionFormRef.handleConfirm().then(res => {
+      let _elements = elements.map(cell => {
+        if (cell.uuid === res.uuid) {
+          res = {...cell, ...res}
+          delete res.focus
+          return res
+        }
+        return cell
+      })
+
+      this.setState({
+        elements: _elements,
+        actvisible: false
+      }, () => {
+        this.props.updateElement(_elements)
       })
     })
   }
@@ -139,7 +478,6 @@
    * @description 鎸夐挳鍒犻櫎
    */
   deleteElement = (card) => {
-    const { config } = this.props
     const { dict, elements } = this.state
     let _this = this
 
@@ -151,16 +489,99 @@
         _this.setState({
           elements: _elements
         }, () => {
-          _this.props.updateElement({...config, elements: _elements})
+          _this.props.updateElement(_elements)
         })
       },
       onCancel() {}
     })
   }
 
+  /**
+   * @description 楠岃瘉淇℃伅閰嶇疆
+   */
+  profileAction = (element) => {
+    this.setState({
+      profVisible: true,
+      card: element
+    })
+  }
+
+  /**
+   * @description 楠岃瘉淇℃伅淇濆瓨
+   */
+  verifySubmit = () => {
+    const { elements, card } = this.state
+
+    this.verifyRef.handleConfirm().then(res => {
+      let _elements = elements.map(cell => {
+        if (cell.uuid === card.uuid) {
+          cell.verify = res
+        }
+
+        return cell
+      })
+
+      this.setState({
+        elements: _elements,
+        profVisible: false
+      }, () => {
+        this.props.updateElement(_elements)
+      })
+    })
+  }
+
+  handleSubConfig = (item) => {
+    const { cards } = this.props
+
+    if (item.eleType !== 'button') return
+    if (item.OpenType === 'pop') {
+      let btn = fromJS(item).toJS()
+      if (!btn.modal) {
+        btn.modal = {
+          setting: {
+            title: btn.label,
+            width: 60,
+            cols: '2',
+            container: 'tab',
+            focus: '',
+            finish: 'close',
+            clickouter: 'unclose',
+            display: 'modal'
+          },
+          tables: [],
+          groups: [],
+          fields: []
+        }
+      }
+
+      MKEmitter.emit('changeModal', cards, btn)
+    }
+  }
+
+  handleSave = (_cards, btn, modal) => {
+    const { cards } = this.props
+    const { elements } = this.state
+
+    if (cards.uuid !== _cards.uuid) return
+
+    let _elements = elements.map(cell => {
+      if (cell.uuid === btn.uuid) {
+        cell.modal = modal
+      }
+
+      return cell
+    })
+
+    this.setState({
+      elements: _elements
+    }, () => {
+      this.props.updateElement(_elements)
+    })
+  }
+
   render() {
-    const { config } = this.props
-    const { elements, visible, card, dict } = this.state
+    const { cards } = this.props
+    const { elements, visible, actvisible, profVisible, card, dict } = this.state
 
     return (
       <div className="model-menu-card-cell-list">
@@ -168,6 +589,9 @@
           list={elements}
           handleList={this.handleList}
           handleMenu={this.handleElement}
+          handleStyle={this.handleStyle}
+          profileAction={this.profileAction}
+          handleSubConfig={this.handleSubConfig}
           deleteMenu={this.deleteElement}
         />
         {/* 缂栬緫鎸夐挳锛氬鍒躲�佺紪杈� */}
@@ -185,14 +609,94 @@
             card={card}
             formlist={this.state.formlist}
             inputSubmit={this.handleSubmit}
-            config={config}
+            config={cards}
             wrappedComponentRef={(inst) => this.elementFormRef = inst}
           />
+        </Modal>
+        {/* 缂栬緫鎸夐挳锛氬鍒躲�佺紪杈� */}
+        <Modal
+          title={dict['model.action'] + '-' + (card && card.copyType === 'action' ? dict['model.copy'] : dict['model.edit'])}
+          visible={actvisible}
+          width={800}
+          maskClosable={false}
+          onCancel={this.editModalCancel}
+          footer={[
+            <CreateFunc key="create" dict={dict} ref="btnCreatFunc" trigger={this.creatFunc}/>,
+            <Button key="cancel" onClick={this.editModalCancel}>{dict['model.cancel']}</Button>,
+            <Button key="confirm" type="primary" onClick={this.handleActionSubmit}>{dict['model.confirm']}</Button>
+          ]}
+          destroyOnClose
+        >
+          <ActionForm
+            dict={dict}
+            type="card"
+            card={card}
+            formlist={this.state.formlist}
+            inputSubmit={this.handleActionSubmit}
+            setting={cards.setting}
+            wrappedComponentRef={(inst) => this.actionFormRef = inst}
+          />
+        </Modal>
+        {/* 鎸夐挳浣跨敤绯荤粺瀛樺偍杩囩▼鏃讹紝楠岃瘉淇℃伅妯℃�佹 */}
+        <Modal
+          wrapClassName="model-table-action-verify-modal"
+          title={'楠岃瘉淇℃伅'}
+          visible={profVisible}
+          width={'75vw'}
+          maskClosable={false}
+          style={{minWidth: '900px', maxWidth: '1200px'}}
+          okText={dict['model.submit']}
+          onOk={this.verifySubmit}
+          onCancel={() => { this.setState({ profVisible: false }) }}
+          destroyOnClose
+        >
+          {card && !card.execMode && card.OpenType !== 'excelIn' && card.OpenType !== 'excelOut' ?
+            <VerifyCard
+              card={card}
+              dict={dict}
+              config={cards}
+              columns={cards.columns}
+              wrappedComponentRef={(inst) => this.verifyRef = inst}
+            /> : null
+          }
+          {card && card.execMode ?
+            <VerifyPrint
+              card={card}
+              dict={dict}
+              columns={cards.columns}
+              wrappedComponentRef={(inst) => this.verifyRef = inst}
+            /> : null
+          }
+          {card && card.OpenType === 'excelIn' ?
+            <VerifyExcelIn
+              card={card}
+              dict={dict}
+              columns={cards.columns}
+              wrappedComponentRef={(inst) => this.verifyRef = inst}
+            /> : null
+          }
+          {card && card.OpenType === 'excelOut' ?
+            <VerifyExcelOut
+              card={card}
+              dict={dict}
+              config={cards}
+              wrappedComponentRef={(inst) => this.verifyRef = inst}
+            /> : null
+          }
         </Modal>
       </div>
     )
   }
 }
 
+const mapStateToProps = (state) => {
+  return {
+    menu: state.customMenu
+  }
+}
 
-export default CardCellComponent
\ No newline at end of file
+const mapDispatchToProps = () => {
+  return {}
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(CardCellComponent)
\ No newline at end of file

--
Gitblit v1.8.0