From 95afd40fc2741ac0ce59c2091f6cfce1f98877d4 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期四, 24 六月 2021 09:15:45 +0800 Subject: [PATCH] 2021-06-24 --- src/menu/components/card/cardcellcomponent/index.jsx | 607 +++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 451 insertions(+), 156 deletions(-) diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx index 50a91b6..3f1b073 100644 --- a/src/menu/components/card/cardcellcomponent/index.jsx +++ b/src/menu/components/card/cardcellcomponent/index.jsx @@ -1,40 +1,45 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { is, fromJS } from 'immutable' -import {connect} from 'react-redux' -import { Modal, Button, notification } from 'antd' +import { Modal, Button } 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 { getActionForm } from '@/menu/components/share/actioncomponent/formconfig' import MKEmitter from '@/utils/events.js' +import MenuUtils from '@/utils/utils-custom.js' import ElementForm from './elementform' import DragElement from './dragaction' -import ActionForm from '@/menu/actioncomponent/actionform' -import CreateFunc from '@/templates/zshare/createfunc' import './index.scss' const { confirm } = Modal +const ActionForm = asyncComponent(() => import('@/menu/components/share/actioncomponent/actionform')) +const VerifyCard = asyncComponent(() => import('@/templates/zshare/verifycard')) +const VerifyPrint = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyprint')) +const VerifyExcelIn = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelin')) +const VerifyExcelOut = asyncComponent(() => import('@/templates/sharecomponent/actioncomponent/verifyexcelout')) + class CardCellComponent extends Component { static propTpyes = { cards: PropTypes.object, // 鑿滃崟閰嶇疆淇℃伅 - card: PropTypes.object, + cardCell: PropTypes.object, + side: PropTypes.string, elements: PropTypes.array, // 鍏冪礌闆� updateElement: PropTypes.func // 鑿滃崟閰嶇疆鏇存柊 } state = { - dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, + dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, card: null, // 缂栬緫涓厓绱� formlist: null, // 琛ㄥ崟淇℃伅 elements: null, // 鎸夐挳缁� visible: false, // 妯℃�佹鎺у埗 - actvisible: false // 鎸夐挳缂栬緫妯℃�佹 + actvisible: false, // 鎸夐挳缂栬緫妯℃�佹 + profVisible: false, // 楠岃瘉淇℃伅缂栬緫 } /** @@ -42,18 +47,42 @@ */ UNSAFE_componentWillMount () { const { elements } = this.props + let _elements = fromJS(elements).toJS() this.setState({ - elements: fromJS(elements).toJS() + elements: _elements.map(item => { + if (item.btnstyle) { // 鍏煎 + item.style = item.style || {} + item.style = {...item.style, ...item.btnstyle} + delete item.btnstyle + } + + return item + }) }) } componentDidMount () { MKEmitter.addListener('cardAddElement', this.cardAddElement) + MKEmitter.addListener('submitStyle', this.getStyle) + MKEmitter.addListener('submitModal', this.handleSave) + MKEmitter.addListener('submitComponentStyle', this.updateComponentStyle) } shouldComponentUpdate (nextProps, 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() + }) + } else if (!is(fromJS(this.props.elements), fromJS(nextProps.elements)) && nextProps.elements.length !== this.state.elements.length) { + this.setState({ + elements: fromJS(nextProps.elements).toJS() + }) + } } /** @@ -64,20 +93,135 @@ return } MKEmitter.removeListener('cardAddElement', this.cardAddElement) + MKEmitter.removeListener('submitStyle', this.getStyle) + MKEmitter.removeListener('submitModal', this.handleSave) + MKEmitter.removeListener('submitComponentStyle', this.updateComponentStyle) + } + + updateComponentStyle = (parentId, keys, style) => { + const { cardCell } = this.props + + if (!cardCell || cardCell.uuid !== parentId) return + + const { elements } = this.state + + let _elements = elements.map(item => { + if (keys.includes(item.uuid)) { + return this.resetCardStyle(item, {...item.style, ...style}) + } + return item + }) + + this.setState({ + elements: _elements + }, () => { + this.props.updateElement(_elements) + }) } cardAddElement = (ids, element) => { - if (!ids || ids.length !== 2 || ids[0] !== this.props.cards.uuid || ids[1] !== this.props.card.uuid) return + 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') { - this.handleAction(element) - } else { - this.handleElement(element) + options.push('width') + } 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 || !card) return + + let _card = this.resetCardStyle(card, style) + + let _elements = elements.map(cell => { + if (cell.uuid === _card.uuid) return _card + return cell + }) + + this.setState({ + elements: _elements + }, () => { + this.props.updateElement(_elements) + }) + } + + resetCardStyle = (card, style) => { + let _card = fromJS(card).toJS() + + if (_card.eleType === 'text' || _card.eleType === 'number') { + _card.style = style + + let fontSize = 14 + let lineHeight = 1.5 + let line = _card.height || null + + if (_card.style.fontSize) { + fontSize = parseInt(_card.style.fontSize) + } + if (_card.style.lineHeight) { + lineHeight = parseFloat(_card.style.lineHeight) + } + + if (line) { + _card.innerHeight = fontSize * lineHeight * line + } + } else if (_card.eleType === 'sequence') { + _card.style = style + + let fontSize = 14 + let lineHeight = 1.5 + + if (_card.style.fontSize) { + fontSize = parseInt(_card.style.fontSize) + } + + _card.innerHeight = fontSize * lineHeight + } 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 + _card.style = style + } else { + _card.style = style + } + + return _card } /** @@ -93,146 +237,59 @@ * @description 鍏冪礌缂栬緫锛岃幏鍙栧厓绱犺〃鍗曚俊鎭� */ handleElement = (card) => { - this.setState({ - visible: true, - card: card, - formlist: getCardCellForm(card) - }) + const { cards, cardCell } = this.props + + if (card.eleType === 'button') { + this.handleAction(card) + } else { + this.setState({ + visible: true, + card: card, + formlist: getCardCellForm(card, cards.type, cards.subtype, cardCell) + }) + } } /** * @description 鎸夐挳缂栬緫锛岃幏鍙栨寜閽〃鍗曚俊鎭� */ handleAction = (card) => { - const { menu, cards } = this.props + const { cards } = this.props - let ableField = menu.permFuncField ? menu.permFuncField.join(', ') : '' + let usefulFields = sessionStorage.getItem('permFuncField') + if (usefulFields) { + try { + usefulFields = JSON.parse(usefulFields) + } catch { + usefulFields = [] + } + } else { + usefulFields = [] + } + + let ableField = usefulFields.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' + let menulist = sessionStorage.getItem('fstMenuList') + if (menulist) { + try { + menulist = JSON.parse(menulist) + } catch { + menulist = [] } - - 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, '', menulist, modules) - }) - }) } else { - this.setState({ - actvisible: true, - card: card, - formlist: getActionForm(card, functip, cards.setting, menu.permFuncField, '', menulist, modules) - }) + menulist = [] } - } - 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) - } + let modules = MenuUtils.getSubModules(window.GLOB.customMenu.components, cards.uuid) - 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 - } - } + this.setState({ + actvisible: true, + card: card, + formlist: getActionForm(card, functip, cards.setting, usefulFields, 'card', menulist, modules, cards.columns) }) - - modules = modules.filter(mod => mod.children !== null) - - if (modules.length === 0) { - return null - } - return modules } /** @@ -262,9 +319,45 @@ handleSubmit = () => { 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 || {} + res.$type = cell.$type || '' + if (res.eleType === 'splitline' && cell.eleType !== 'splitline') { + res.style.paddingTop = '5px' + res.style.paddingBottom = '5px' + } else if (res.eleType === 'text' || res.eleType === 'number') { + let fontSize = 14 + let lineHeight = 1.5 + let line = res.height || null + + if (res.style && res.style.fontSize) { + fontSize = parseInt(res.style.fontSize) + } + if (res.style && res.style.lineHeight) { + lineHeight = parseFloat(res.style.lineHeight) + } + + if (line) { + res.innerHeight = fontSize * lineHeight * line + } + + if (res.eleType === 'text' && res.link && !res.style.color) { + res.style.color = '#2440B3' + } + } 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 }) @@ -282,10 +375,28 @@ */ handleActionSubmit = () => { const { elements } = this.state + let color = { primary: '#1890ff', yellow: '#c49f47', orange: 'orange', danger: '#ff4d4f', green: '#26C281', dgreen: '#32c5d2', purple: '#8E44AD', cyan: '#13c2c2', gray: '#666666' } - this.actionFormRef.handleConfirm().then(ele => { + this.actionFormRef.handleConfirm().then(res => { let _elements = elements.map(cell => { - if (cell.uuid === ele.uuid) return ele + if (cell.uuid === res.uuid) { + res = {...cell, ...res} + delete res.focus + let style = {} + + if (res.class !== cell.class || res.show !== cell.show || !res.style) { + if (res.show === 'link' || res.show === 'icon') { + style.color = color[res.class] + style.backgroundColor = 'transparent' + } else { + style.color = '#ffffff' + style.backgroundColor = color[res.class] + } + } + res.style = {...res.style, ...style} + + return res + } return cell }) @@ -302,6 +413,7 @@ * @description 鎸夐挳鍒犻櫎 */ deleteElement = (card) => { + const { cards, cardCell, side } = this.props const { dict, elements } = this.state let _this = this @@ -309,6 +421,16 @@ content: dict['model.confirm'] + dict['model.delete'] + '鍏冪礌鍚楋紵', onOk() { let _elements = elements.filter(item => item.uuid !== card.uuid) + + if (card.eleType === 'button') { + MKEmitter.emit('delButtons', [card.uuid]) + } + if (card.OpenType === 'popview' || card.verify || card.modal) { + card.$parentId = cardCell.uuid + card.$side = side || '' + + MKEmitter.emit('logButton', cards.uuid, card) + } _this.setState({ elements: _elements @@ -320,16 +442,153 @@ }) } - render() { + /** + * @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 - const { elements, visible, actvisible, card, dict } = this.state + let btn = fromJS(item).toJS() + + if ((sessionStorage.getItem('style-control') && sessionStorage.getItem('style-control') === 'true')) return + + if (btn.eleType === 'button') { + if (btn.OpenType === 'pop') { + if (!btn.modal) { + btn.modal = { + setting: { title: btn.label, width: 60, cols: '2', container: 'view', focus: '', finish: 'close', clickouter: 'unclose', display: 'modal' }, + tables: [], + groups: [], + fields: [] + } + } + + MKEmitter.emit('changeModal', cards, btn) + } else if (btn.OpenType === 'popview') { + MKEmitter.emit('changePopview', cards, btn) + } else if (btn.OpenType === 'innerpage' && btn.pageTemplate === 'page') { + MKEmitter.emit('changeEditMenu', {MenuID: btn.uuid, copyMenuId: btn.copyMenuId}) + } else if (btn.OpenType === 'innerpage' && btn.pageTemplate === 'linkpage') { + MKEmitter.emit('changeEditMenu', {MenuID: btn.linkmenu}) + } + } else { + if (btn.link === 'page') { + MKEmitter.emit('changeEditMenu', {MenuID: btn.uuid, copyMenuId: btn.copyMenuId}) + } else if (btn.link === 'linkpage') { + MKEmitter.emit('changeEditMenu', {MenuID: btn.linkmenu}) + } + } + } + + handleSave = (_cards, btn, modal) => { + const { cards } = this.props + const { elements } = this.state + + if (cards.uuid !== _cards.uuid) return + + let _index = elements.findIndex(cell => cell.uuid === btn.uuid) + + if (_index === -1) return + + let _elements = elements.map(cell => { + if (cell.uuid === btn.uuid) { + cell.modal = modal + } + + return cell + }) + + this.setState({ + elements: _elements + }, () => { + this.props.updateElement(_elements) + }) + } + + updateMarks = (card) => { + const { elements } = this.state + + let _elements = elements.map(cell => { + if (cell.uuid === card.uuid) return card + return cell + }) + + this.setState({ + elements: _elements + }, () => { + this.props.updateElement(_elements) + }) + } + + dropButton = (id) => { + const { cards } = this.props + + if (!cards.action) return + + let index = cards.action.findIndex(item => item.uuid === id) + + if (index === -1) return + + let btn = cards.action[index] + btn.eleType = 'button' + + let _elements = [...this.state.elements, btn] + let _action = cards.action.filter(item => item.uuid !== id) + + this.setState({ + elements: _elements + }, () => { + this.props.updateElement(_elements, _action) + }) + } + + render() { + const { cards, cardCell } = this.props + const { elements, visible, actvisible, profVisible, card, dict } = this.state return ( <div className="model-menu-card-cell-list"> <DragElement list={elements} + parent={{...cardCell, components: elements}} + fields={cards.columns} + updateMarks={this.updateMarks} handleList={this.handleList} handleMenu={this.handleElement} + handleStyle={this.handleStyle} + dropButton={this.dropButton} + profileAction={this.profileAction} + handleSubConfig={this.handleSubConfig} deleteMenu={this.deleteElement} /> {/* 缂栬緫鎸夐挳锛氬鍒躲�佺紪杈� */} @@ -359,7 +618,6 @@ 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> ]} @@ -367,6 +625,7 @@ > <ActionForm dict={dict} + type="card" card={card} formlist={this.state.formlist} inputSubmit={this.handleActionSubmit} @@ -374,19 +633,55 @@ wrappedComponentRef={(inst) => this.actionFormRef = inst} /> </Modal> + {/* 鎸夐挳浣跨敤绯荤粺瀛樺偍杩囩▼鏃讹紝楠岃瘉淇℃伅妯℃�佹 */} + <Modal + wrapClassName="model-table-action-verify-modal" + title={'楠岃瘉淇℃伅'} + visible={profVisible} + width={'75vw'} + maskClosable={false} + 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 - } -} - -const mapDispatchToProps = () => { - return {} -} - -export default connect(mapStateToProps, mapDispatchToProps)(CardCellComponent) \ No newline at end of file +export default CardCellComponent \ No newline at end of file -- Gitblit v1.8.0