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