From 00de865d827da6687928b10f031482628a5144c8 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期五, 06 十一月 2020 18:39:16 +0800 Subject: [PATCH] 2020-11-06 --- src/templates/sharecomponent/settingcomponent/index.jsx | 2 src/menu/components/card/table-card/cardcomponent/index.scss | 0 src/menu/components/card/table-card/index.jsx | 76 +++ src/menu/components/card/cardcellcomponent/elementform/index.jsx | 1 src/menu/components/card/cardcellcomponent/dragaction/card.jsx | 6 src/menu/components/chart/antv-bar/index.scss | 24 src/menu/components/chart/antv-bar/index.jsx | 30 src/menu/components/tabs/tabcomponents/index.jsx | 1 src/menu/components/card/table-card/cardcomponent/index.jsx | 208 +++++++++++ src/menu/menushell/card.jsx | 3 src/menu/components/card/table-card/cardcomponent/settingform/index.scss | 11 src/menu/components/card/data-card/wrapsetting/index.jsx | 2 src/templates/sharecomponent/settingcomponent/settingform/utils.jsx | 2 src/tabviews/custom/components/card/table-card/index.scss | 89 ++++ src/menu/components/card/table-card/index.scss | 23 + src/tabviews/custom/components/card/table-card/index.jsx | 245 +++++++++++++ src/tabviews/custom/components/card/cardcellList/index.jsx | 13 src/tabviews/custom/components/card/table-card/asyncButtonComponent.jsx | 34 + src/tabviews/custom/components/share/tabtransfer/index.jsx | 7 src/menu/components/card/cardcellcomponent/index.jsx | 4 src/menu/datasource/verifycard/settingform/index.jsx | 2 src/menu/components/chart/antv-pie/index.scss | 24 src/menu/components/card/data-card/index.jsx | 7 src/menu/components/chart/antv-pie/index.jsx | 28 src/menu/components/search/main-search/index.jsx | 3 src/menu/components/card/table-card/cardcomponent/settingform/index.jsx | 131 +++++++ src/menu/components/card/cardcellcomponent/formconfig.jsx | 26 src/menu/modelsource/option.jsx | 2 src/tabviews/custom/index.jsx | 7 src/templates/zshare/createinterface/index.jsx | 7 src/menu/components/card/data-card/wrapsetting/settingform/index.jsx | 27 + src/menu/components/card/prop-card/index.jsx | 7 src/menu/components/tabs/tabcomponents/card.jsx | 2 src/menu/components/tabs/antv-tabs/index.jsx | 3 src/menu/menushell/index.jsx | 1 35 files changed, 945 insertions(+), 113 deletions(-) diff --git a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx index c2c52ee..d5741ea 100644 --- a/src/menu/components/card/cardcellcomponent/dragaction/card.jsx +++ b/src/menu/components/card/cardcellcomponent/dragaction/card.jsx @@ -38,7 +38,11 @@ } const getContent = () => { - if (card.eleType === 'text' || card.eleType === 'number') { + if (card.eleType === 'sequence') { + return ( + <div className={'ant-mk-text'}>1</div> + ) + } else if (card.eleType === 'text' || card.eleType === 'number') { let val = `${card.prefix || ''}${card.datatype === 'static' ? (card.value || '') : (card.field || '')}${card.postfix || ''}` return ( <div className={'ant-mk-text line' + card.height} style={{height: card.innerHeight || 21}}>{val}</div> diff --git a/src/menu/components/card/cardcellcomponent/elementform/index.jsx b/src/menu/components/card/cardcellcomponent/elementform/index.jsx index 25862b9..d2748f7 100644 --- a/src/menu/components/card/cardcellcomponent/elementform/index.jsx +++ b/src/menu/components/card/cardcellcomponent/elementform/index.jsx @@ -9,6 +9,7 @@ import './index.scss' const cardTypeOptions = { + sequence: ['eleType', 'width'], text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix'], number: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix'], picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'url'], diff --git a/src/menu/components/card/cardcellcomponent/formconfig.jsx b/src/menu/components/card/cardcellcomponent/formconfig.jsx index 195c5f4..5e01655 100644 --- a/src/menu/components/card/cardcellcomponent/formconfig.jsx +++ b/src/menu/components/card/cardcellcomponent/formconfig.jsx @@ -10,7 +10,21 @@ * @param {*} permFuncField 瀛樺偍杩囩▼鍙敤鐨勫紑濮嬪瓧娈� * @param {*} type 鎸夐挳绫诲瀷锛岀敤浜庡尯鍒嗗彲閫夌殑鎵撳紑鏂瑰紡 */ -export function getCardCellForm (card) { +export function getCardCellForm (card, type) { + let _options = [ + { value: 'text', text: '鏂囨湰'}, + { value: 'number', text: '鏁板��'}, + { value: 'picture', text: '鍥剧墖'}, + { value: 'icon', text: '鍥炬爣'}, + { value: 'link', text: '閾炬帴'}, + { value: 'slider', text: '杩涘害鏉�'}, + { value: 'splitline', text: '鍒嗗壊绾�'}, + ] + + if (type === 'table') { + _options.push({value: 'sequence', text: '搴忓彿'}) + } + let forms = [ { type: 'select', @@ -18,15 +32,7 @@ label: '鍏冪礌绫诲瀷', initVal: card.eleType, required: true, - options: [ - { value: 'text', text: '鏂囨湰'}, - { value: 'number', text: '鏁板��'}, - { value: 'picture', text: '鍥剧墖'}, - { value: 'icon', text: '鍥炬爣'}, - { value: 'link', text: '閾炬帴'}, - { value: 'slider', text: '杩涘害鏉�'}, - { value: 'splitline', text: '鍒嗗壊绾�'}, - ] + options: _options }, { type: 'select', diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx index b7e64eb..e533b77 100644 --- a/src/menu/components/card/cardcellcomponent/index.jsx +++ b/src/menu/components/card/cardcellcomponent/index.jsx @@ -217,13 +217,15 @@ * @description 鍏冪礌缂栬緫锛岃幏鍙栧厓绱犺〃鍗曚俊鎭� */ handleElement = (card) => { + const { cards } = this.props + if (card.eleType === 'button') { this.handleAction(card) } else { this.setState({ visible: true, card: card, - formlist: getCardCellForm(card) + formlist: getCardCellForm(card, cards.type) }) } } diff --git a/src/menu/components/card/data-card/index.jsx b/src/menu/components/card/data-card/index.jsx index 385a1c5..242002b 100644 --- a/src/menu/components/card/data-card/index.jsx +++ b/src/menu/components/card/data-card/index.jsx @@ -19,7 +19,7 @@ const { confirm } = Modal -class antvBarLineChart extends Component { +class DataCardEditComponent extends Component { static propTpyes = { card: PropTypes.object, deletecomponent: PropTypes.func, @@ -186,13 +186,14 @@ } render() { + const { menu } = this.props const { card } = this.state return ( <div className="menu-data-card-edit-box" style={{...card.style, minHeight: card.wrap.minHeight}}> <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ <div className="mk-popover-control"> - <WrapComponent sysRoles={this.props.menu.sysRoles} config={card} updateConfig={this.updateComponent} /> + <WrapComponent sysRoles={menu ? menu.sysRoles : []} config={card} updateConfig={this.updateComponent} /> <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> <SettingComponent config={card} updateConfig={this.updateComponent} /> @@ -217,4 +218,4 @@ return {} } -export default connect(mapStateToProps, mapDispatchToProps)(antvBarLineChart) \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(DataCardEditComponent) \ No newline at end of file diff --git a/src/menu/components/card/data-card/wrapsetting/index.jsx b/src/menu/components/card/data-card/wrapsetting/index.jsx index 167d2ce..4e20be3 100644 --- a/src/menu/components/card/data-card/wrapsetting/index.jsx +++ b/src/menu/components/card/data-card/wrapsetting/index.jsx @@ -59,7 +59,7 @@ <Icon type="edit" onClick={() => this.editDataSource()} /> <Modal wrapClassName="popview-modal" - title={'鍗$墖璁剧疆'} + title={config.type === 'table' ? '琛ㄦ牸璁剧疆' : '鍗$墖璁剧疆'} visible={visible} width={700} maskClosable={false} diff --git a/src/menu/components/card/data-card/wrapsetting/settingform/index.jsx b/src/menu/components/card/data-card/wrapsetting/settingform/index.jsx index c495e78..c41ab83 100644 --- a/src/menu/components/card/data-card/wrapsetting/settingform/index.jsx +++ b/src/menu/components/card/data-card/wrapsetting/settingform/index.jsx @@ -53,6 +53,13 @@ <div className="model-menu-setting-form"> <Form {...formItemLayout}> <Row gutter={24}> + {config.subtype === 'tablecard' ? <Col span={12}> + <Form.Item label="鏍囬"> + {getFieldDecorator('title', { + initialValue: wrap.title || '' + })(<Input placeholder={''} autoComplete="off" onPressEnter={this.handleSubmit} />)} + </Form.Item> + </Col> : null} <Col span={12}> <Form.Item label={ <Tooltip placement="topLeft" title="鐢ㄤ簬缁勪欢闂寸殑鍖哄垎銆�"> @@ -123,7 +130,7 @@ )} </Form.Item> </Col> : null} - <Col span={12}> + {config.subtype !== 'tablecard' ? <Col span={12}> <Form.Item label={ <Tooltip placement="topLeft" title="閫夋嫨鍗$墖鍒囨崲鏃讹紝鍙悜鍏朵粬缁勪欢浼犻�掍富閿�笺��"> <Icon type="question-circle" /> @@ -139,8 +146,8 @@ </Radio.Group> )} </Form.Item> - </Col> - <Col span={12}> + </Col> : null} + {config.subtype !== 'tablecard' ? <Col span={12}> <Form.Item label={ <Tooltip placement="topLeft" title="鍗$墖澶栬竟妗嗙殑鏈�灏忛珮搴︼紝鎺у埗鏁版嵁鍔犺浇鏃剁粍浠剁殑鍗犱綅銆�"> <Icon type="question-circle" /> @@ -151,7 +158,19 @@ initialValue: wrap.minHeight || 100 })(<InputNumber min={20} max={2000} precision={0} onPressEnter={this.handleSubmit} />)} </Form.Item> - </Col> + </Col> : null} + {config.subtype === 'tablecard' ? <Col span={12}> + <Form.Item label={ + <Tooltip placement="topLeft" title="琛ㄦ牸楂樺害锛岃秴鍑烘椂婊氬姩锛岄珮搴︿负绌烘椂鏍规嵁鍐呭鑷�傚簲銆�"> + <Icon type="question-circle" /> + 楂樺害 + </Tooltip> + }> + {getFieldDecorator('height', { + initialValue: wrap.height + })(<InputNumber min={100} max={2000} precision={0} onPressEnter={this.handleSubmit} />)} + </Form.Item> + </Col> : null} <Col span={12}> <Form.Item label="榛戝悕鍗�"> {getFieldDecorator('blacklist', { diff --git a/src/menu/components/card/prop-card/index.jsx b/src/menu/components/card/prop-card/index.jsx index 61cdf4a..25e0e6c 100644 --- a/src/menu/components/card/prop-card/index.jsx +++ b/src/menu/components/card/prop-card/index.jsx @@ -19,7 +19,7 @@ const { confirm } = Modal -class antvBarLineChart extends Component { +class PropCardEditComponent extends Component { static propTpyes = { card: PropTypes.object, deletecomponent: PropTypes.func, @@ -221,6 +221,7 @@ } render() { + const { menu } = this.props const { card } = this.state return ( @@ -228,7 +229,7 @@ <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ <div className="mk-popover-control"> <Icon className="plus" title="娣诲姞鍗$墖" onClick={this.addCard} type="plus" /> - <WrapComponent config={card} sysRoles={this.props.menu.sysRoles} updateConfig={this.updateComponent} /> + <WrapComponent config={card} sysRoles={menu ? menu.sysRoles : []} updateConfig={this.updateComponent} /> <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> {card.wrap.datatype !== 'static' ? <SettingComponent config={card} updateConfig={this.updateComponent} /> : null} @@ -252,4 +253,4 @@ return {} } -export default connect(mapStateToProps, mapDispatchToProps)(antvBarLineChart) \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(PropCardEditComponent) \ No newline at end of file diff --git a/src/menu/components/card/table-card/cardcomponent/index.jsx b/src/menu/components/card/table-card/cardcomponent/index.jsx new file mode 100644 index 0000000..3d0f004 --- /dev/null +++ b/src/menu/components/card/table-card/cardcomponent/index.jsx @@ -0,0 +1,208 @@ +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import { is, fromJS } from 'immutable' +import { Modal, Popover, Icon } from 'antd' + +import asyncComponent from '@/utils/asyncComponent' +import zhCN from '@/locales/zh-CN/model.js' +import enUS from '@/locales/en-US/model.js' +import SettingForm from './settingform' + +import Utils from '@/utils/utils.js' +import MKEmitter from '@/utils/events.js' +import './index.scss' + +const CardCellComponent = asyncComponent(() => import('../../cardcellcomponent')) + +class CardBoxComponent extends Component { + static propTpyes = { + cards: PropTypes.object, // 鍗$墖琛岄厤缃俊鎭� + card: PropTypes.object, // 鍗$墖閰嶇疆淇℃伅 + deleteElement: PropTypes.func, // 鍗$墖鍒犻櫎 + updateElement: PropTypes.func // 鑿滃崟閰嶇疆鏇存柊 + } + + state = { + dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS, + card: null, // 鍗$墖淇℃伅锛屽寘鎷鍙嶉潰 + formlist: null, // 璁剧疆琛ㄥ崟淇℃伅 + elements: null, // 缂栬緫缁� + visible: false, // 妯℃�佹鎺у埗 + settingVisible: false, + } + + /** + * @description 鎼滅储鏉′欢鍒濆鍖� + */ + UNSAFE_componentWillMount () { + const { card } = this.props + + this.setState({ + card: fromJS(card).toJS(), + elements: fromJS(card.elements).toJS(), + }) + } + + componentDidMount () { + MKEmitter.addListener('submitStyle', this.getStyle) + } + + shouldComponentUpdate (nextProps, nextState) { + return !is(fromJS(this.props.cards), fromJS(nextProps.cards)) || !is(fromJS(this.state), fromJS(nextState)) + } + + /** + * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊锛屾竻闄ゅ揩鎹烽敭璁剧疆 + */ + componentWillUnmount () { + this.setState = () => { + return + } + MKEmitter.removeListener('submitStyle', this.getStyle) + } + + getStyle = (comIds, style) => { + const { cards } = this.props + const { card } = this.state + + if (comIds.length !== 2 || comIds[0] !== cards.uuid || comIds[1] !== card.uuid) return + + let _card = fromJS(card).toJS() + _card.style = style + + this.setState({ + card: _card + }) + + this.props.updateElement(_card) + } + + updateCard = (elements) => { + const { card } = this.state + + let _card = {...card, elements: elements} + + this.setState({ + card: _card + }) + + this.props.updateElement(_card) + } + + addElement = () => { + const { cards } = this.props + const { card } = this.state + + let newcard = {} + newcard.uuid = Utils.getuuid() + newcard.focus = true + + newcard.eleType = 'text' + newcard.datatype = 'dynamic' + newcard.color = 'rgba(0,0,0,0.85)' + newcard.padding = '5px' + newcard.align = 'left' + + // 娉ㄥ唽浜嬩欢-娣诲姞鍏冪礌 + MKEmitter.emit('cardAddElement', [cards.uuid, card.uuid], newcard) + } + + addButton = () => { + const { cards } = this.props + const { card } = this.state + + let newcard = {} + newcard.uuid = Utils.getuuid() + newcard.focus = true + + newcard.eleType = 'button' + newcard.label = 'button' + newcard.sqlType = '' + newcard.Ot = 'requiredSgl' + newcard.OpenType = 'prompt' + newcard.icon = '' + newcard.class = 'primary' + newcard.intertype = 'system' + newcard.method = 'POST' + newcard.execSuccess = 'grid' + newcard.execError = 'never' + newcard.popClose = 'never' + newcard.errorTime = 10 + newcard.verify = null + newcard.show = 'link' + + // 娉ㄥ唽浜嬩欢-娣诲姞鍏冪礌 + MKEmitter.emit('cardAddElement', [cards.uuid, card.uuid], newcard) + } + + changeStyle = () => { + const { cards } = this.props + const { card } = this.state + + let _style = null + let options = ['height', 'background', 'border', 'padding', 'margin'] + _style = card.style ? fromJS(card.style).toJS() : {} + + MKEmitter.emit('changeStyle', [cards.uuid, card.uuid], options, _style) + } + + settingSubmit = () => { + const { card } = this.state + + this.settingRef.handleConfirm().then(res => { + this.setState({ + settingVisible: false, + card: {...card, setting: res} + }) + + this.props.updateElement({...card, setting: res}) + }) + } + + render() { + const { cards } = this.props + const { card, elements, settingVisible, dict } = this.state + + return ( + <div className="ant-col ant-col-24"> + <div className="card-item" style={card.style}> + <CardCellComponent cards={cards} cardCell={card} elements={elements} updateElement={this.updateCard}/> + <div className="card-control"> + <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ + <div className="mk-popover-control"> + <Icon className="plus" title="娣诲姞鍏冪礌" onClick={this.addElement} type="plus" /> + <Icon className="plus" title="娣诲姞鎸夐挳" onClick={this.addButton} type="plus-square" /> + <Icon className="edit" type="edit" onClick={() => this.setState({settingVisible: true})} /> + <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> + <Icon className="close" title="鍒犻櫎鍗$墖" type="delete" onClick={() => this.props.deleteElement(card)} /> + </div> + } trigger="hover"> + <Icon type="tool" /> + </Popover> + </div> + </div> + <Modal + wrapClassName="popview-modal" + title={'琛岃缃�'} + visible={settingVisible} + width={700} + maskClosable={false} + okText={dict['model.submit']} + onOk={this.settingSubmit} + onCancel={() => { this.setState({ settingVisible: false }) }} + destroyOnClose + > + <SettingForm + dict={dict} + cards={cards} + setting={card.setting} + inputSubmit={this.settingSubmit} + wrappedComponentRef={(inst) => this.settingRef = inst} + /> + </Modal> + </div> + ) + } +} + +export default CardBoxComponent \ No newline at end of file diff --git a/src/menu/components/card/table-card/cardcomponent/index.scss b/src/menu/components/card/table-card/cardcomponent/index.scss new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/menu/components/card/table-card/cardcomponent/index.scss diff --git a/src/menu/components/card/table-card/cardcomponent/settingform/index.jsx b/src/menu/components/card/table-card/cardcomponent/settingform/index.jsx new file mode 100644 index 0000000..ba0dcf4 --- /dev/null +++ b/src/menu/components/card/table-card/cardcomponent/settingform/index.jsx @@ -0,0 +1,131 @@ +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import { Form, Row, Col, Radio, Tooltip, Icon, Input, Select } from 'antd' + +import './index.scss' + +class SettingForm extends Component { + static propTpyes = { + dict: PropTypes.object, // 瀛楀吀椤� + cards: PropTypes.object, // 鍗$墖闆� + setting: PropTypes.object, // 鏁版嵁婧愰厤缃� + inputSubmit: PropTypes.func // 鍥炶溅浜嬩欢 + } + + state = { + condition: this.props.setting.condition || 'false' + } + + handleConfirm = () => { + // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭� + return new Promise((resolve, reject) => { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + resolve(values) + } else { + reject(err) + } + }) + }) + } + + handleSubmit = (e) => { + e.preventDefault() + + if (this.props.inputSubmit) { + this.props.inputSubmit() + } + } + + render() { + const { setting, cards } = this.props + const { getFieldDecorator } = this.props.form + + const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 8 } + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 16 } + } + } + + return ( + <div className="model-menu-setting-form"> + <Form {...formItemLayout}> + <Row gutter={24}> + <Col span={12}> + <Form.Item label={ + <Tooltip placement="topLeft" title="褰撻�夋嫨鈥滄湁鈥濇椂锛屽彧鏈夌鍚堟潯浠剁殑鏁版嵁鎵嶄細灞曠ず銆�"> + <Icon type="question-circle" /> + 鏄剧ず鏉′欢 + </Tooltip> + }> + {getFieldDecorator('condition', { + initialValue: setting.condition || 'false' + })( + <Radio.Group onChange={(e) => this.setState({ condition: e.target.value })}> + <Radio value="true">鏈�</Radio> + <Radio value="false">鏃�</Radio> + </Radio.Group> + )} + </Form.Item> + </Col> + {this.state.condition === 'true' ? <Col span={12}> + <Form.Item label="鎺у埗瀛楁"> + {getFieldDecorator('controlField', { + initialValue: setting.controlField || '', + rules: [ + { + required: true, + message: this.props.dict['form.required.select'] + '鎺у埗瀛楁!' + } + ] + })( + <Select> + {cards.columns.map((option, index) => + <Select.Option key={index} value={option.field}> + {option.label} + </Select.Option> + )} + </Select> + )} + </Form.Item> + </Col> : null} + {this.state.condition === 'true' ? <Col span={12}> + <Form.Item label="瀵规瘮鏂瑰紡"> + {getFieldDecorator('controlType', { + initialValue: setting.controlType || '=', + rules: [ + { + required: true, + message: this.props.dict['form.required.select'] + '瀵规瘮鏂瑰紡!' + } + ] + })( + <Radio.Group> + <Radio value="=">=</Radio> + <Radio value="!=">!=</Radio> + <Radio value=">">></Radio> + <Radio value="<"><</Radio> + </Radio.Group> + )} + </Form.Item> + </Col> : null} + {this.state.condition === 'true' ? <Col span={12}> + <Form.Item label="瀵规瘮鍊�"> + {getFieldDecorator('controlValue', { + initialValue: setting.controlValue || '' + })(<Input placeholder="" autoComplete="off" onPressEnter={this.handleSubmit}/>)} + </Form.Item> + </Col> : null} + </Row> + </Form> + </div> + ) + } +} + +export default Form.create()(SettingForm) \ No newline at end of file diff --git a/src/menu/components/card/table-card/cardcomponent/settingform/index.scss b/src/menu/components/card/table-card/cardcomponent/settingform/index.scss new file mode 100644 index 0000000..159130b --- /dev/null +++ b/src/menu/components/card/table-card/cardcomponent/settingform/index.scss @@ -0,0 +1,11 @@ +.model-menu-setting-form { + position: relative; + + .anticon-question-circle { + color: #c49f47; + margin-right: 3px; + } + .ant-input-number { + width: 100%; + } +} \ No newline at end of file diff --git a/src/menu/components/card/table-card/index.jsx b/src/menu/components/card/table-card/index.jsx index bd2e425..992e7f4 100644 --- a/src/menu/components/card/table-card/index.jsx +++ b/src/menu/components/card/table-card/index.jsx @@ -15,11 +15,12 @@ const SettingComponent = asyncIconComponent(() => import('@/menu/datasource')) const WrapComponent = asyncIconComponent(() => import('../data-card/wrapsetting')) -const CardComponent = asyncComponent(() => import('../cardcomponent')) +const SearchComponent = asyncComponent(() => import('@/menu/searchcomponent')) +const CardComponent = asyncComponent(() => import('./cardcomponent')) const { confirm } = Modal -class antvBarLineChart extends Component { +class TableCardEditComponent extends Component { static propTpyes = { card: PropTypes.object, deletecomponent: PropTypes.func, @@ -53,9 +54,7 @@ uuid: Utils.getuuid(), setting: { width: 24, type: 'simple'}, style: { - borderWidth: '1px', borderColor: '#e8e8e8', - paddingTop: '15px', paddingBottom: '15px', paddingLeft: '15px', paddingRight: '15px', - marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px' + paddingTop: '5px', paddingBottom: '5px', paddingLeft: '15px', paddingRight: '15px', }, elements: [] }] @@ -72,15 +71,18 @@ switchable: false, // 缁勪欢灞炴�� - 鏁版嵁鏄惁鍙垏鎹� dataName: card.dataName || '', width: 12, + search: [], name: card.name, subtype: card.subtype, setting: { interType: 'system' }, - wrap: { name: card.name, width: 12, addable: 'false', switch: 'false', datatype: 'dynamic' }, - style: { marginLeft: '0px', marginRight: '0px', marginTop: '8px', marginBottom: '8px' }, + wrap: { name: card.name, width: 12 }, + style: { marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px' }, + headerStyle: { fontSize: '16px' }, columns: [], scripts: [], subcards: subcards } + this.setState({ card: _card }) @@ -165,12 +167,25 @@ MKEmitter.emit('changeStyle', [card.uuid], ['background', 'border', 'padding', 'margin'], card.style) } + changeTitleStyle = () => { + const { card } = this.state + + MKEmitter.emit('changeStyle', [card.uuid, 'header'], ['font', 'border'], card.headerStyle) + } + getStyle = (comIds, style) => { const { card } = this.state - if (comIds.length !== 1 || comIds[0] !== card.uuid) return + if (comIds[0] !== card.uuid) return - let _card = {...card, style} + let _card = {} + if (comIds.length === 1) { + _card = {...card, style} + } else if (comIds.length === 2 && comIds[1] === 'header') { + _card = {...card, headerStyle: style} + } else { + return + } this.setState({ card: _card @@ -186,9 +201,7 @@ uuid: Utils.getuuid(), setting: { width: 6, type: 'simple'}, style: { - borderWidth: '1px', borderColor: '#e8e8e8', - paddingTop: '15px', paddingBottom: '15px', paddingLeft: '15px', paddingRight: '15px', - marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px' + paddingTop: '5px', paddingBottom: '5px', paddingLeft: '15px', paddingRight: '15px', }, elements: [] } @@ -208,15 +221,48 @@ this.props.updateConfig(card) } + addSearch = () => { + const { card } = this.state + + let newcard = {} + newcard.uuid = Utils.getuuid() + newcard.focus = true + + newcard.label = 'label' + newcard.initval = '' + newcard.type = 'select' + newcard.resourceType = '0' + newcard.options = [] + newcard.setAll = 'false' + newcard.orderType = 'asc' + newcard.display = 'dropdown' + newcard.match = '=' + + // 娉ㄥ唽浜嬩欢-娣诲姞鎼滅储 + MKEmitter.emit('addSearch', card.uuid, newcard) + } + render() { + const { menu } = this.props const { card } = this.state return ( - <div className="menu-prop-card-edit-box" style={{...card.style, minHeight: card.wrap.minHeight}}> + <div className="menu-table-card-edit-box" style={{...card.style, height: card.wrap.height}}> + <div className="table-header" style={card.headerStyle}> + <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ + <div className="mk-popover-control"> + <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeTitleStyle} type="font-colors" /> + </div> + } trigger="hover"> + <span className="table-title">{card.wrap.title || ''}</span> + </Popover> + <SearchComponent config={card} updatesearch={this.updateComponent}/> + </div> <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ <div className="mk-popover-control"> <Icon className="plus" title="娣诲姞鍗$墖" onClick={this.addCard} type="plus" /> - <WrapComponent config={card} sysRoles={this.props.menu.sysRoles} updateConfig={this.updateComponent} /> + <Icon className="plus" title="娣诲姞鎼滅储" onClick={this.addSearch} type="plus-circle" /> + <WrapComponent config={card} sysRoles={menu ? menu.sysRoles : []} updateConfig={this.updateComponent} /> <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> <Icon className="close" title="鍒犻櫎缁勪欢" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> {card.wrap.datatype !== 'static' ? <SettingComponent config={card} updateConfig={this.updateComponent} /> : null} @@ -240,4 +286,4 @@ return {} } -export default connect(mapStateToProps, mapDispatchToProps)(antvBarLineChart) \ No newline at end of file +export default connect(mapStateToProps, mapDispatchToProps)(TableCardEditComponent) \ No newline at end of file diff --git a/src/menu/components/card/table-card/index.scss b/src/menu/components/card/table-card/index.scss index 2e1b614..88da58c 100644 --- a/src/menu/components/card/table-card/index.scss +++ b/src/menu/components/card/table-card/index.scss @@ -1,4 +1,4 @@ -.menu-prop-card-edit-box { +.menu-table-card-edit-box { position: relative; box-sizing: border-box; background: #ffffff; @@ -7,6 +7,23 @@ background-size: cover; min-height: 100px; + .table-header { + position: relative; + height: 45px; + overflow: hidden; + padding-right: 35px; + + .table-title { + text-decoration: inherit; + font-weight: inherit; + font-style: inherit; + float: left; + line-height: 45px; + margin-left: 10px; + position: relative; + z-index: 1; + } + } .card-control { position: absolute; top: 0px; @@ -65,11 +82,11 @@ } } } -.menu-prop-card-edit-box::after { +.menu-table-card-edit-box::after { display: block; content: ' '; clear: both; } -.menu-prop-card-edit-box:hover { +.menu-table-card-edit-box:hover { box-shadow: 0px 0px 2px #e8e8e8; } diff --git a/src/menu/components/chart/antv-bar/index.jsx b/src/menu/components/chart/antv-bar/index.jsx index 23333cf..07456db 100644 --- a/src/menu/components/chart/antv-bar/index.jsx +++ b/src/menu/components/chart/antv-bar/index.jsx @@ -731,6 +731,7 @@ } render() { + const { menu } = this.props const { card } = this.state return ( @@ -743,23 +744,20 @@ } trigger="hover"> <span className="chart-title">{card.plot.title || ''}</span> </Popover> - <SearchComponent - config={card} - updatesearch={this.updateComponent} - /> - <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ - <div className="mk-popover-control"> - <Icon className="plus" title="娣诲姞鎼滅储" onClick={this.addSearch} type="plus-circle" /> - <Icon className="plus" title="娣诲姞鎸夐挳" onClick={this.addButton} type="plus-square" /> - <ChartCompileForm config={card} sysRoles={this.props.menu.sysRoles} dict={this.state.dict} plotchange={this.updateComponent}/> - <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> - <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> - <SettingComponent config={card} updateConfig={this.updateComponent}/> - </div> - } trigger="hover"> - <Icon type="tool" /> - </Popover> + <SearchComponent config={card} updatesearch={this.updateComponent}/> </div> + <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ + <div className="mk-popover-control"> + <Icon className="plus" title="娣诲姞鎼滅储" onClick={this.addSearch} type="plus-circle" /> + <Icon className="plus" title="娣诲姞鎸夐挳" onClick={this.addButton} type="plus-square" /> + <ChartCompileForm config={card} sysRoles={menu ? menu.sysRoles : []} dict={this.state.dict} plotchange={this.updateComponent}/> + <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> + <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> + <SettingComponent config={card} updateConfig={this.updateComponent}/> + </div> + } trigger="hover"> + <Icon type="tool" /> + </Popover> <ActionComponent type="chart" plus="false" diff --git a/src/menu/components/chart/antv-bar/index.scss b/src/menu/components/chart/antv-bar/index.scss index 161b992..37bc72b 100644 --- a/src/menu/components/chart/antv-bar/index.scss +++ b/src/menu/components/chart/antv-bar/index.scss @@ -20,18 +20,6 @@ overflow: hidden; padding-right: 35px; - >.anticon-tool { - position: absolute; - right: 1px; - top: 1px; - z-index: 1; - font-size: 16px; - padding: 5px; - cursor: pointer; - color: rgba(0, 0, 0, 0.85); - background: rgba(255, 255, 255, 0.55); - } - .chart-title { text-decoration: inherit; font-weight: inherit; @@ -44,6 +32,18 @@ } } + >.anticon-tool { + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + font-size: 16px; + padding: 5px; + cursor: pointer; + color: rgba(0, 0, 0, 0.85); + background: rgba(255, 255, 255, 0.55); + } + .model-menu-action-list { position: absolute; right: 0px; diff --git a/src/menu/components/chart/antv-pie/index.jsx b/src/menu/components/chart/antv-pie/index.jsx index e36b9d6..39e1fe7 100644 --- a/src/menu/components/chart/antv-pie/index.jsx +++ b/src/menu/components/chart/antv-pie/index.jsx @@ -408,6 +408,7 @@ } render() { + const { menu } = this.props const { card } = this.state return ( @@ -420,22 +421,19 @@ } trigger="hover"> <span className="chart-title">{card.plot.title || ''}</span> </Popover> - <SearchComponent - config={card} - updatesearch={this.updateComponent} - /> - <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ - <div className="mk-popover-control"> - <Icon className="plus" title="娣诲姞鎼滅储" onClick={this.addSearch} type="plus-circle" /> - <ChartCompileForm config={card} sysRoles={this.props.menu.sysRoles} dict={this.state.dict} plotchange={this.updateComponent}/> - <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> - <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> - <SettingComponent config={card} updateConfig={this.updateComponent}/> - </div> - } trigger="hover"> - <Icon type="tool" /> - </Popover> + <SearchComponent config={card} updatesearch={this.updateComponent}/> </div> + <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ + <div className="mk-popover-control"> + <Icon className="plus" title="娣诲姞鎼滅储" onClick={this.addSearch} type="plus-circle" /> + <ChartCompileForm config={card} sysRoles={menu ? menu.sysRoles : []} dict={this.state.dict} plotchange={this.updateComponent}/> + <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> + <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> + <SettingComponent config={card} updateConfig={this.updateComponent}/> + </div> + } trigger="hover"> + <Icon type="tool" /> + </Popover> <div className="canvas" id={card.uuid}></div> </div> ) diff --git a/src/menu/components/chart/antv-pie/index.scss b/src/menu/components/chart/antv-pie/index.scss index bb1752c..e7d0365 100644 --- a/src/menu/components/chart/antv-pie/index.scss +++ b/src/menu/components/chart/antv-pie/index.scss @@ -19,18 +19,6 @@ overflow: hidden; padding-right: 35px; - >.anticon-tool { - position: absolute; - right: 1px; - top: 1px; - z-index: 1; - font-size: 16px; - padding: 5px; - cursor: pointer; - color: rgba(0, 0, 0, 0.85); - background: rgba(255, 255, 255, 0.55); - } - .chart-title { text-decoration: inherit; font-weight: inherit; @@ -43,6 +31,18 @@ } } + >.anticon-tool { + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + font-size: 16px; + padding: 5px; + cursor: pointer; + color: rgba(0, 0, 0, 0.85); + background: rgba(255, 255, 255, 0.55); + } + .model-menu-action-list { position: absolute; right: 0px; diff --git a/src/menu/components/search/main-search/index.jsx b/src/menu/components/search/main-search/index.jsx index bbf5a34..6e7e13c 100644 --- a/src/menu/components/search/main-search/index.jsx +++ b/src/menu/components/search/main-search/index.jsx @@ -339,6 +339,7 @@ } render() { + const { menu } = this.props const { dict, card, visible, sqlVerifing } = this.state return ( @@ -353,7 +354,7 @@ <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ <div className="mk-popover-control"> <Icon className="plus" title="娣诲姞" onClick={this.addSearch} type="plus" /> - <WrapComponent config={card} sysRoles={this.props.menu.sysRoles} updateConfig={this.updateComponent}/> + <WrapComponent config={card} sysRoles={menu ? menu.sysRoles : []} updateConfig={this.updateComponent}/> <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(card.uuid)} /> </div> diff --git a/src/menu/components/tabs/antv-tabs/index.jsx b/src/menu/components/tabs/antv-tabs/index.jsx index b17d53f..598c98a 100644 --- a/src/menu/components/tabs/antv-tabs/index.jsx +++ b/src/menu/components/tabs/antv-tabs/index.jsx @@ -227,6 +227,7 @@ } render() { + const { menu } = this.props const { tabs, dict, labelvisible, editab } = this.state return ( @@ -252,7 +253,7 @@ <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={ <div className="mk-popover-control"> <Icon className="plus" title="娣诲姞鏍囩" type="plus" onClick={this.tabAdd} /> - <SettingComponent config={tabs} sysRoles={this.props.menu.sysRoles} updateConfig={this.updateComponent} /> + <SettingComponent config={tabs} sysRoles={menu ? menu.sysRoles : []} updateConfig={this.updateComponent} /> <Icon className="style" title="璋冩暣鏍峰紡" onClick={this.changeStyle} type="font-colors" /> <Icon className="close" title="delete" type="delete" onClick={() => this.props.deletecomponent(tabs.uuid)} /> </div> diff --git a/src/menu/components/tabs/tabcomponents/card.jsx b/src/menu/components/tabs/tabcomponents/card.jsx index e7aff3f..32a3955 100644 --- a/src/menu/components/tabs/tabcomponents/card.jsx +++ b/src/menu/components/tabs/tabcomponents/card.jsx @@ -58,7 +58,7 @@ return (<DataCard card={card} updateConfig={updateConfig} deletecomponent={delCard} />) } else if (card.type === 'card' && card.subtype === 'propcard') { return (<PropCard card={card} updateConfig={updateConfig} deletecomponent={delCard}/>) - } else if (card.type === 'card' && card.subtype === 'tablecard') { + } else if (card.type === 'table' && card.subtype === 'tablecard') { return (<TableCard card={card} updateConfig={updateConfig} deletecomponent={delCard}/>) } } diff --git a/src/menu/components/tabs/tabcomponents/index.jsx b/src/menu/components/tabs/tabcomponents/index.jsx index e2b9908..7fc0e47 100644 --- a/src/menu/components/tabs/tabcomponents/index.jsx +++ b/src/menu/components/tabs/tabcomponents/index.jsx @@ -89,6 +89,7 @@ tabs: '鏍囩缁�', pie: '楗煎浘', search: '鎼滅储', + table: '琛ㄦ牸', card: '鍗$墖' } let i = 1 diff --git a/src/menu/datasource/verifycard/settingform/index.jsx b/src/menu/datasource/verifycard/settingform/index.jsx index 09621e4..30f8ce9 100644 --- a/src/menu/datasource/verifycard/settingform/index.jsx +++ b/src/menu/datasource/verifycard/settingform/index.jsx @@ -406,7 +406,7 @@ )} </Form.Item> </Col> : null} - {config.pageable ? <Col span={8}> + {config.pageable && laypage !== 'false' ? <Col span={8}> <Form.Item label={ <Tooltip placement="topLeft" title="閫夋嫨鍒嗛〉鏃舵湁鏁堛��"> <Icon type="question-circle" /> diff --git a/src/menu/menushell/card.jsx b/src/menu/menushell/card.jsx index 445cae5..04b6b4f 100644 --- a/src/menu/menushell/card.jsx +++ b/src/menu/menushell/card.jsx @@ -54,11 +54,10 @@ return (<DataCard card={card} updateConfig={updateConfig} deletecomponent={delCard}/>) } else if (card.type === 'card' && card.subtype === 'propcard') { return (<PropCard card={card} updateConfig={updateConfig} deletecomponent={delCard}/>) - } else if (card.type === 'card' && card.subtype === 'tablecard') { + } else if (card.type === 'table' && card.subtype === 'tablecard') { return (<TableCard card={card} updateConfig={updateConfig} deletecomponent={delCard}/>) } } - return ( <div className={'ant-col mk-component-card ant-col-' + (card.width || 24)} ref={node => drag(drop(node))} style={style}> {getCardComponent()} diff --git a/src/menu/menushell/index.jsx b/src/menu/menushell/index.jsx index de7b7da..35a5a66 100644 --- a/src/menu/menushell/index.jsx +++ b/src/menu/menushell/index.jsx @@ -81,6 +81,7 @@ tabs: '鏍囩缁�', pie: '楗煎浘', search: '鎼滅储', + table: '琛ㄦ牸', card: '鍗$墖' } let i = 1 diff --git a/src/menu/modelsource/option.jsx b/src/menu/modelsource/option.jsx index 6764d0f..477ba9f 100644 --- a/src/menu/modelsource/option.jsx +++ b/src/menu/modelsource/option.jsx @@ -21,7 +21,7 @@ { type: 'menu', url: Mainsearch, component: 'search', subtype: 'mainsearch', title: '鎼滅储鏉′欢', width: 24 }, { type: 'menu', url: card1, component: 'card', subtype: 'datacard', title: '鏁版嵁鍗�', config: `[{"uuid":"160135809128212dm7i29fim9ksto9od","setting":{"width":6},"style":{"paddingTop":"15px","marginTop":"4px","paddingRight":"15px","marginRight":"8px","marginLeft":"8px","backgroundColor":"rgba(255, 255, 255, 1)","borderColor":"#e8e8e8","paddingLeft":"15px","marginBottom":"4px","borderWidth":"1px","paddingBottom":"10px"},"backStyle":{},"elements":[{"datatype":"static","width":12,"marks":null,"height":1,"value":"鍏冲崟","style":{},"prefix":"","postfix":"","format":"","eleType":"text","uuid":"160231860159931untbea62sgokunc5s"},{"datatype":"dynamic","width":12,"marks":null,"style":{"color":"rgba(250, 219, 20, 1)","textAlign":"right"},"btnstyle":{},"eleType":"icon","icon":"question-circle","field":"nvarchar2","uuid":"1602318768361nv8ql4t47sgcsn88b0u"},{"datatype":"static","width":24,"marks":null,"height":1,"innerHeight":36,"value":"100","style":{"fontSize":"24px","fontWeight":"500","color":"rgba(0, 0, 0, 1)"},"prefix":"","btnstyle":{},"postfix":"","format":"","eleType":"text","uuid":"1602318817884v70gtgb65ubnm8mbcvv"},{"color":"#1890ff","width":24,"marks":null,"maxValue":100,"style":{"color":"rgba(250, 140, 22, 1)","paddingTop":"20px","paddingBottom":"10px"},"btnstyle":{},"eleType":"slider","field":"int1","uuid":"16023188871233rkktuvpp1h077igrsu"},{"eleType":"splitline","width":24,"color":"#e8e8e8","uuid":"1602320017038n31bk9o831ggug0tu0b","marks":null,"style":{"marginTop":"10px","marginBottom":"10px"},"btnstyle":{}},{"datatype":"static","width":12,"marks":null,"height":1,"value":"100","style":{"marginTop":"6px"},"prefix":"鍏冲崟","btnstyle":{},"postfix":"","format":"","eleType":"text","uuid":"1602320061243drd7lf3agvn04kgr175"}],"backElements":[]}]` }, { type: 'menu', url: card2, component: 'card', subtype: 'propcard', title: '灞炴�у崱', config: `[{"uuid":"1603681387259qaqf1127f72esmtchge","setting":{"width":6,"type":"simple"},"style":{"paddingTop":"15px","marginTop":"8px","paddingRight":"15px","marginRight":"8px","marginLeft":"8px","borderColor":"#e8e8e8","paddingLeft":"15px","marginBottom":"8px","borderWidth":"1px","paddingBottom":"15px"},"backStyle":{},"elements":[{"datatype":"static","width":12,"marks":null,"height":1,"value":"瓒呮椂宸ュ崟","style":{"color":"rgba(67, 67, 67, 0.51)"},"prefix":"","postfix":"","format":"","eleType":"text","uuid":"1603681402945qnkgm7q8cng65evn5ev"},{"eleType":"icon","datatype":"static","width":12,"icon":"question-circle","tooltip":"瓒呮椂宸ュ崟","uuid":"1603681473384i2crkbtofg4pu76k06a","marks":null,"style":{"textAlign":"right","color":"rgba(250, 219, 20, 1)"}},{"datatype":"static","width":24,"marks":null,"height":1,"innerHeight":36,"value":"100","style":{"fontSize":"24px","color":"rgba(0, 0, 0, 1)"},"prefix":"","postfix":"","format":"","eleType":"number","uuid":"1603681539870d704ufqf98kc6t7537t"},{"color":"rgba(250, 219, 20, 1)","datatype":"static","width":24,"marks":null,"maxValue":100,"value":50,"style":{"paddingTop":"10px","paddingBottom":"10px"},"eleType":"slider","uuid":"1603683067556mvupau0odvrtv45u7o8"},{"eleType":"splitline","width":24,"color":"#e8e8e8","uuid":"1603683117981t9k55k8an430fuppmci","marks":null,"style":{"paddingTop":"5px","paddingBottom":"5px"}},{"datatype":"static","width":12,"marks":null,"height":1,"value":"100","style":{"color":"rgba(0, 0, 0, 0.65)","marginTop":"10px"},"prefix":"瓒呮椂宸ュ崟 ","postfix":"","format":"","eleType":"text","uuid":"1603683136553uvsmkfohkft9idbfkhu"}],"backElements":[]}]` }, - { type: 'menu', url: TableCard, component: 'card', subtype: 'tablecard', title: '琛ㄦ牸' }, + { type: 'menu', url: TableCard, component: 'table', subtype: 'tablecard', title: '琛ㄦ牸', width: 12 }, { type: 'menu', url: line, component: 'line', subtype: 'line', title: '鎶樼嚎鍥�' }, { type: 'menu', url: line1, component: 'line', subtype: 'line1', title: '闃舵鎶樼嚎鍥�' }, { type: 'menu', url: bar, component: 'bar', subtype: 'bar', title: '鏌辩姸鍥�' }, diff --git a/src/tabviews/custom/components/card/cardcellList/index.jsx b/src/tabviews/custom/components/card/cardcellList/index.jsx index 2c2a41c..a77d793 100644 --- a/src/tabviews/custom/components/card/cardcellList/index.jsx +++ b/src/tabviews/custom/components/card/cardcellList/index.jsx @@ -21,6 +21,7 @@ class CardCellComponent extends Component { static propTpyes = { BID: PropTypes.any, // 涓婄骇ID + seq: PropTypes.any, // 搴忓彿 cards: PropTypes.object, // 鑿滃崟閰嶇疆淇℃伅 cardCell: PropTypes.object, data: PropTypes.object, @@ -89,9 +90,17 @@ } getContent = (card) => { - const { data, BID, cards } = this.props + const { data, BID, cards, seq } = this.props - if (card.eleType === 'text') { + if (card.eleType === 'sequence') { + return ( + <Col key={card.uuid} span={card.width}> + <div style={card.style}> + <div className={'ant-mk-text'}>{seq}</div> + </div> + </Col> + ) + } else if (card.eleType === 'text') { let val = '' if (card.datatype === 'static') { diff --git a/src/tabviews/custom/components/card/table-card/asyncButtonComponent.jsx b/src/tabviews/custom/components/card/table-card/asyncButtonComponent.jsx new file mode 100644 index 0000000..5fb9c1a --- /dev/null +++ b/src/tabviews/custom/components/card/table-card/asyncButtonComponent.jsx @@ -0,0 +1,34 @@ +import React, {Component} from 'react' +import { Button } from 'antd' + +/** + * @description 寮傛鍔犺浇妯″潡 + * @param {*} importComponent + */ +export default function asyncComponent(importComponent) { + return class extends Component { + constructor(props) { + super(props) + + this.state = { + component: null + } + } + + async componentDidMount() { + const {default: component} = await importComponent() + + this.setState({component}) + } + + // <Button className="loading-skeleton" disabled={true}></Button> // 楠ㄦ灦鎸夐挳 + render() { + const C = this.state.component + const btn = this.props.btn || {} + + return C ? + <C {...this.props} /> : + <Button icon={btn.OpenType === 'excelOut' ? 'download' : 'upload'} disabled={true} title={btn.label} style={{border: 0, background: 'transparent'}}></Button> + } + } +} \ No newline at end of file diff --git a/src/tabviews/custom/components/card/table-card/index.jsx b/src/tabviews/custom/components/card/table-card/index.jsx new file mode 100644 index 0000000..4f76e24 --- /dev/null +++ b/src/tabviews/custom/components/card/table-card/index.jsx @@ -0,0 +1,245 @@ +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import { is, fromJS } from 'immutable' +import { Spin, notification, Col, Empty } from 'antd' + +import asyncComponent from '@/utils/asyncComponent' +import Api from '@/api' +import UtilsDM from '@/utils/utils-datamanage.js' +import MKEmitter from '@/utils/events.js' +import './index.scss' + +const CardCellComponent = asyncComponent(() => import('../cardcellList')) + +class TableCard extends Component { + static propTpyes = { + BID: PropTypes.any, // 鐖剁骇Id + data: PropTypes.array, // 缁熶竴鏌ヨ鏁版嵁 + config: PropTypes.object, // 缁勪欢閰嶇疆淇℃伅 + mainSearch: PropTypes.any, // 澶栧眰鎼滅储鏉′欢 + menuType: PropTypes.any, // 鑿滃崟绫诲瀷 + dataManager: PropTypes.any, // 鏁版嵁鏉冮檺 + } + + state = { + config: null, // 鍥捐〃閰嶇疆淇℃伅 + loading: false, // 鏁版嵁鍔犺浇鐘舵�� + sync: false, // 鏄惁缁熶竴璇锋眰鏁版嵁 + data: null, // 鏁版嵁 + title: '', // 鏍囬 + showHeader: false // 瀛樺湪鏍囬銆佹悳绱� + } + + UNSAFE_componentWillMount () { + const { data } = this.props + let _config = fromJS(this.props.config).toJS() + let _cols = new Map() + + let _data = null + let _sync = _config.setting.sync === 'true' + + if (_config.setting.sync === 'true' && data) { + _data = data[_config.dataName] || [] + _sync = false + } + + let showHeader = false + if (_config.wrap.title || _config.search.length > 0) { + showHeader = true + } + + _config.columns.forEach(item => { + _cols.set(item.field, item) + }) + + _config.subcards.forEach(card => { + card.elements = card.elements.map(item => { + if (item.field && _cols.has(item.field)) { + item.col = _cols.get(item.field) + } + return item + }) + }) + + this.setState({ + showHeader: showHeader, + title: _config.wrap.title, + sync: _sync, + data: _data, + config: _config, + arr_field: _config.columns.map(col => col.field).join(','), + }, () => { + if (_config.setting.sync !== 'true' && _config.setting.onload === 'true') { + this.loadData() + } else if (_sync && !_data) { + this.setState({ + loading: true + }) + } + }) + } + + componentDidMount () { + MKEmitter.addListener('syncRefreshComponentId', this.reload) + } + + shouldComponentUpdate (nextProps, nextState) { + return !is(fromJS(this.state), fromJS(nextState)) + } + + componentWillUnmount () { + this.setState = () => { + return + } + MKEmitter.removeListener('syncRefreshComponentId', this.reload) + } + + /** + * @description 鍥捐〃鏁版嵁鏇存柊锛屽埛鏂板唴瀹� + */ + UNSAFE_componentWillReceiveProps (nextProps) { + const { sync, config } = this.state + + if (sync && !is(fromJS(this.props.data), fromJS(nextProps.data))) { + let _data = [] + if (nextProps.data && nextProps.data[config.dataName]) { + _data = nextProps.data[config.dataName] || [] + } + + this.setState({sync: false, loading: false, data: _data}) + } else if (!is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { + if (config.setting.syncRefresh === 'true') { + this.setState({}, () => { + this.loadData() + }) + } + } + } + + reload = (syncId) => { + const { config } = this.state + + if (syncId && syncId !== config.uuid) return + + this.loadData() + } + + async loadData () { + const { mainSearch, BID, menuType, dataManager } = this.props + const { config, arr_field } = this.state + + let searches = [] + if (mainSearch && mainSearch.length > 0) { // 涓昏〃鎼滅储鏉′欢 + let keys = searches.map(item => item.key) + mainSearch.forEach(item => { + if (!keys.includes(item.key)) { + searches.push(item) + } + }) + } + + this.setState({ + loading: true + }) + + let _orderBy = config.setting.order || '' + let param = UtilsDM.getQueryDataParams(config.setting, arr_field, searches, _orderBy, 1, 1, BID, menuType, dataManager) + + let result = await Api.genericInterface(param) + if (result.status) { + this.setState({ + data: result.data, + loading: false + }) + } else { + this.setState({ + loading: false + }) + notification.error({ + top: 92, + message: result.message, + duration: 10 + }) + } + } + + updateStatus = (type, position, btn) => { + const { config } = this.state + + if (type === 'refresh' && position === 'grid') { + this.loadData() + if (btn && btn.syncComponent && btn.syncComponent[0]) { + let syncId = btn.syncComponent[btn.syncComponent.length - 1] + if (config.uuid !== syncId) { + MKEmitter.emit('syncRefreshComponentId', syncId) + } + } + } + } + + getLines = (data, seq) => { + const { BID } = this.props + const { config } = this.state + + let line = [] + + config.subcards.forEach((item, index) => { + let display = item.setting.condition !== 'true' + + if (!display && item.setting.controlField) { + let val = data[item.setting.controlField] + + if (val || val === 0) { + val = `${val}` + } + + if (item.setting.controlType === '=' && val === item.setting.controlValue) { + display = true + } else if (item.setting.controlType === '!=' && val !== item.setting.controlValue) { + display = true + } else if (item.setting.controlType === '>' && val > item.setting.controlValue) { + display = true + } else if (item.setting.controlType === '<' && val < item.setting.controlValue) { + display = true + } + } + + if (!display) return + + line.push( + <Col key={index} span={24}> + <div className="card-item-box" style={item.style}> + <CardCellComponent BID={BID} seq={seq} data={data} cards={config} cardCell={item} elements={item.elements} updateStatus={this.updateStatus}/> + </div> + </Col> + ) + }) + + return line + } + + render() { + const { config, loading, data, title, showHeader } = this.state + + return ( + <div className="custom-table-card-box" style={{...config.style, height: config.wrap.height}}> + {loading ? + <div className="loading-mask"> + <div className="ant-spin-blur"></div> + <Spin /> + </div> : null + } + {showHeader ? <div className="table-header" style={config.headerStyle}> + <span className="table-title">{title}</span> + {/* <searchLine /> */} + </div> : null} + {data && data.length > 0 ? <div className="card-row-list" style={{height: config.wrap.height - (showHeader ? 45 : 0)}}> + {data.map((item, index) => this.getLines(item, index + 1))} + </div> : null} + {data && data.length === 0 ? <Empty description={false}/> : null} + </div> + ) + } +} + +export default TableCard \ No newline at end of file diff --git a/src/tabviews/custom/components/card/table-card/index.scss b/src/tabviews/custom/components/card/table-card/index.scss new file mode 100644 index 0000000..3f5ac95 --- /dev/null +++ b/src/tabviews/custom/components/card/table-card/index.scss @@ -0,0 +1,89 @@ +.custom-table-card-box { + background: #ffffff; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + min-height: 100px; + position: relative; + overflow-y: hidden; + + > .table-header { + height: 45px; + // border-bottom: 1px solid #e8e8e8; + overflow: hidden; + + .table-title { + // font-size: 16px; + float: left; + line-height: 45px; + margin-left: 10px; + text-decoration: inherit; + font-weight: inherit; + font-style: inherit; + } + } + + .card-row-list::after { + content: ' '; + display: block; + clear: both; + } + + .card-row-list { + overflow-y: auto; + .card-item-box { + transition: all 0.3s; + } + >.active >.card-item-box { + border-color: #1890ff!important; + box-shadow: 0 0 3px #1890ff; + } + } + .card-row-list::-webkit-scrollbar { + width: 7px; + } + .card-row-list::-webkit-scrollbar-thumb { + border-radius: 5px; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13); + background: rgba(0, 0, 0, 0.13); + } + .card-row-list::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + border-radius: 3px; + border: 1px solid rgba(0, 0, 0, 0.07); + background: rgba(0, 0, 0, 0); + } + + .card-item-box { + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + } + + .loading-mask { + position: absolute; + left: 40px; + top: 0; + right: 40px; + bottom: 0px; + display: flex; + align-items: center; + justify-content: center; + text-align: justify; + z-index: 1; + + .ant-spin-blur { + position: absolute; + width: 100%; + height: 100%; + opacity: 0.5; + background: #ffffff; + } + } +} + +.custom-card-box::after { + content: ' '; + display: block; + clear: both; +} diff --git a/src/tabviews/custom/components/share/tabtransfer/index.jsx b/src/tabviews/custom/components/share/tabtransfer/index.jsx index a923413..56ab3e9 100644 --- a/src/tabviews/custom/components/share/tabtransfer/index.jsx +++ b/src/tabviews/custom/components/share/tabtransfer/index.jsx @@ -17,6 +17,7 @@ const AntvPie = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-pie')) const AntvTabs = asyncComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs')) const DataCard = asyncComponent(() => import('@/tabviews/custom/components/card/data-card')) +const TableCard = asyncComponent(() => import('@/tabviews/custom/components/card/table-card')) const PropCard = asyncComponent(() => import('@/tabviews/custom/components/card/prop-card')) class TabTransfer extends Component { @@ -270,6 +271,12 @@ <PropCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> </Col> ) + } else if (item.type === 'table' && item.subtype === 'tablecard') { + return ( + <Col span={item.width} key={item.uuid}> + <TableCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) } else { return null } diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx index 0cc3646..b489ec0 100644 --- a/src/tabviews/custom/index.jsx +++ b/src/tabviews/custom/index.jsx @@ -22,6 +22,7 @@ const AntvTabs = asyncComponent(() => import('./components/tabs/antv-tabs')) const DataCard = asyncComponent(() => import('./components/card/data-card')) const PropCard = asyncComponent(() => import('./components/card/prop-card')) +const TableCard = asyncComponent(() => import('./components/card/table-card')) const MainSearch = asyncComponent(() => import('./components/search/main-search')) class CustomPage extends Component { @@ -496,6 +497,12 @@ <PropCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> </Col> ) + } else if (item.type === 'table' && item.subtype === 'tablecard') { + return ( + <Col span={item.width} key={item.uuid}> + <TableCard config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} /> + </Col> + ) } else { return null } diff --git a/src/templates/sharecomponent/settingcomponent/index.jsx b/src/templates/sharecomponent/settingcomponent/index.jsx index ff5fe44..ca71c7b 100644 --- a/src/templates/sharecomponent/settingcomponent/index.jsx +++ b/src/templates/sharecomponent/settingcomponent/index.jsx @@ -37,7 +37,7 @@ */ changeSetting = () => { const { MenuID, config, mainsearch } = this.props - let menu = { MenuID: MenuID, MenuName: config.MenuName, MenuNo: config.MenuNo } + let menu = { MenuID: MenuID, MenuName: config.MenuName || config.tabName || '', MenuNo: config.MenuNo || config.tabNo || '' } let _search = fromJS(config.search).toJS() diff --git a/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx b/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx index 19cea66..b5c6d98 100644 --- a/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx +++ b/src/templates/sharecomponent/settingcomponent/settingform/utils.jsx @@ -87,7 +87,7 @@ } else { sql = _dataresource } - + return sql } } \ No newline at end of file diff --git a/src/templates/zshare/createinterface/index.jsx b/src/templates/zshare/createinterface/index.jsx index e9133b3..0100d2f 100644 --- a/src/templates/zshare/createinterface/index.jsx +++ b/src/templates/zshare/createinterface/index.jsx @@ -276,12 +276,7 @@ }).then(res => { if (res === false) return res - if (window.GLOB.mainSystemApi) { - _mainParam.rduri = window.GLOB.mainSystemApi - - return Api.getLocalConfig(_mainParam) - } - return 'success' + return Api.getCloudConfig(_mainParam) }).then(result => { if (result === false || result === 'success') return result -- Gitblit v1.8.0