From 73c0258e4e30f1d2e407cb067feea8e79fad081d Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期四, 16 九月 2021 14:37:10 +0800 Subject: [PATCH] 2021-09-16 --- src/menu/components/card/cardcellcomponent/elementform/index.jsx | 308 ++++++++++++++++++++++++++++++-------------------- 1 files changed, 185 insertions(+), 123 deletions(-) diff --git a/src/menu/components/card/cardcellcomponent/elementform/index.jsx b/src/menu/components/card/cardcellcomponent/elementform/index.jsx index 5f8e47e..306d61c 100644 --- a/src/menu/components/card/cardcellcomponent/elementform/index.jsx +++ b/src/menu/components/card/cardcellcomponent/elementform/index.jsx @@ -1,21 +1,30 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { fromJS } from 'immutable' -import { Form, Row, Col, Input, Select, Icon, Radio, Tooltip, InputNumber, notification } from 'antd' +import { Form, Row, Col, Input, Select, Icon, Radio, Tooltip, InputNumber } from 'antd' import { formRule } from '@/utils/option.js' -import FileUpload from '@/tabviews/zshare/fileupload' -import ColorSketch from '@/mob/colorsketch' +import asyncComponent from '@/utils/asyncComponent' import './index.scss' +const { TextArea } = Input +const ColorSketch = asyncComponent(() => import('@/mob/colorsketch')) +const SourceComponent = asyncComponent(() => import('@/menu/components/share/sourcecomponent')) +const MkIcon = asyncComponent(() => import('@/components/mkIcon')) + const cardTypeOptions = { - text: ['eleType', 'datatype', 'format', 'fontSize', 'fontWeight', 'width', 'height', 'align', 'padding', 'prefix', 'postfix'], - number: ['eleType', 'datatype', 'format', 'fontSize', 'fontWeight', 'width', 'height', 'align', 'padding', 'prefix', 'postfix'], - picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'radius', 'padding', 'url'], - icon: ['eleType', 'icon', 'datatype', 'fontSize', 'width', 'align', 'padding'], - link: ['eleType', 'datatype', 'labelfield', 'fontSize', 'width', 'height', 'align', 'padding', 'prefix'], - slider: ['eleType', 'datatype', 'width', 'color', 'padding', 'maxValue'], - splitline: ['eleType', 'color', 'width', 'padding'], + sequence: ['eleType', 'width'], + text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'noValue'], + number: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix'], + picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'maxWidth', 'link', 'noValue'], + video: ['eleType', 'datatype', 'width', 'aspectRatio', 'autoPlay', 'loop', 'noValue'], + icon: ['eleType', 'icon', 'datatype', 'width'], + slider: ['eleType', 'datatype', 'width', 'color', 'maxValue'], + splitline: ['eleType', 'color', 'width', 'borderWidth'], + barcode: ['eleType', 'datatype', 'width', 'barHeight', 'displayValue', 'interval', 'noValue'], + qrcode: ['eleType', 'datatype', 'width', 'qrWidth', 'color', 'url', 'noValue'], + currentDate: ['eleType', 'width', 'dateFormat', 'prefix', 'postfix'], + formula: ['eleType', 'width', 'height', 'prefix', 'postfix', 'formula'], } class MainSearch extends Component { @@ -30,39 +39,30 @@ state = { formlist: null, // 琛ㄥ崟淇℃伅 eleType: '', - datatype: '' + datatype: '', + link: '' } - UNSAFE_componentWillMount () { const { card, config } = this.props - let _options = this.getOptions(card.eleType, card.datatype) + let _options = this.getOptions(card.eleType, card.datatype, card.link) this.setState({ + link: card.link, eleType: card.eleType, datatype: card.datatype, formlist: this.props.formlist.map(item => { item.hidden = !_options.includes(item.key) - if (item.key === 'field') { + if (item.key === 'field' || item.key === 'linkurl') { item.options = [] config.columns.forEach(col => { - if (!/^Nvarchar/ig.test(col.datatype) && (card.eleType === 'number' || card.eleType === 'slider')) { + if (/^(Int|Decimal)/ig.test(col.datatype) && (card.eleType === 'number' || card.eleType === 'slider')) { item.options.push({ value: col.field, text: col.label }) - } else if (/^Nvarchar/ig.test(col.datatype) && card.eleType !== 'number' && card.eleType !== 'slider') { - item.options.push({ - value: col.field, - text: col.label - }) - } - }) - } else if (item.key === 'labelfield') { - item.options = [] - config.columns.forEach(col => { - if (/^Nvarchar/ig.test(col.datatype)) { + } else if (/^(Nvarchar|date)/ig.test(col.datatype) && card.eleType !== 'number' && card.eleType !== 'slider') { item.options.push({ value: col.field, text: col.label @@ -72,6 +72,17 @@ } else if (item.key === 'value' && card.eleType === 'slider') { item.type = 'number' item.label = '鍊�' + } else if (item.key === 'format') { + if (card.eleType === 'text') { + item.options = item.oriOptions.filter(op => op.value !== 'percent' && op.value !== 'thdSeparator') + } else if (card.eleType === 'number') { + item.options = item.oriOptions.filter(op => op.value !== 'YYYY-MM-DD') + } + } else if (item.key === 'url') { + item.required = card.eleType !== 'qrcode' + } + if (item.key === 'linkurl') { + item.type = card.link === 'dynamic' ? 'select' : 'textarea' } return item @@ -79,14 +90,28 @@ }) } - getOptions = (eleType, datatype) => { + getOptions = (eleType, datatype, link) => { let _options = fromJS(cardTypeOptions[eleType]).toJS() // 閫夐」鍒楄〃 - if (['text', 'number', 'picture', 'link', 'slider'].includes(eleType)) { + if (['text', 'number', 'picture', 'link', 'slider', 'barcode', 'qrcode', 'video'].includes(eleType)) { if (datatype === 'dynamic') { _options.push('field') - } else if (eleType !== 'picture') { + } else if (eleType === 'picture' || eleType === 'video') { + _options.push('url') + } else { _options.push('value') + } + + if (['text', 'picture'].includes(eleType) && link) { + if (link === 'dynamic' || link === 'static' || link === 'custom') { + _options.push('linkurl', 'joint') + } else if (link === 'page') { + _options.push('copyMenuId', 'joint', 'open') + } else if (link === 'linkpage') { + _options.push('linkmenu', 'joint', 'open') + } + } else if (eleType === 'picture' && !link) { + _options.push('scale') } } else if (eleType === 'icon') { if (datatype === 'dynamic') { @@ -107,10 +132,10 @@ */ selectChange = (key, value, option) => { const { config } = this.props - const { datatype } = this.state + const { datatype, eleType } = this.state if (key === 'eleType') { - let _options = this.getOptions(value, datatype) + let _options = this.getOptions(value, datatype, '') let _formlist = this.state.formlist.map(item => { item.hidden = !_options.includes(item.key) @@ -118,12 +143,12 @@ if (item.key === 'field') { item.options = [] config.columns.forEach(col => { - if (!/^Nvarchar/ig.test(col.datatype) && (value === 'number' || value === 'slider')) { + if (/^(Int|Decimal)/ig.test(col.datatype) && (value === 'number' || value === 'slider')) { item.options.push({ value: col.field, text: col.label }) - } else if (/^Nvarchar/ig.test(col.datatype) && value !== 'number' && value !== 'slider') { + } else if (/^(Nvarchar|date)/ig.test(col.datatype) && value !== 'number' && value !== 'slider') { item.options.push({ value: col.field, text: col.label @@ -138,12 +163,21 @@ item.type = 'text' item.label = '鍐呭' } + } else if (item.key === 'format') { + if (value === 'text') { + item.options = item.oriOptions.filter(op => op.value !== 'percent' && op.value !== 'thdSeparator') + } else if (value === 'number') { + item.options = item.oriOptions.filter(op => op.value !== 'YYYY-MM-DD') + } + } else if (item.key === 'url') { + item.required = value !== 'qrcode' } return item }) this.setState({ + link: '', eleType: value, formlist: _formlist }, () => { @@ -151,12 +185,29 @@ this.props.form.setFieldsValue({width: 24, color: '#1890ff'}) } else if (value === 'splitline') { this.props.form.setFieldsValue({width: 24, color: '#e8e8e8'}) + } else if (value === 'text' || value === 'number') { + this.props.form.setFieldsValue({format: ''}) + } + if (value === 'text' || value === 'picture') { + this.props.form.setFieldsValue({link: ''}) } }) } else if (key === 'field') { if (this.props.form.getFieldValue('value') !== undefined) { this.props.form.setFieldsValue({value: option.props.title}) } + } else if (key === 'link') { + let _options = this.getOptions(eleType, this.state.datatype, value) + this.setState({ + link: value, + formlist: this.state.formlist.map(item => { + item.hidden = !_options.includes(item.key) + if (item.key === 'linkurl') { + item.type = value === 'dynamic' ? 'select' : 'textarea' + } + return item + }) + }) } } @@ -165,13 +216,25 @@ let value = e.target.value if (key === 'datatype') { - let _options = this.getOptions(eleType, value) + let _options = this.getOptions(eleType, value, this.state.link) this.setState({ datatype: value, formlist: this.state.formlist.map(item => { item.hidden = !_options.includes(item.key) + return item + }) + }) + } else if (key === 'link') { + let _options = this.getOptions(eleType, this.state.datatype, value) + this.setState({ + link: value, + formlist: this.state.formlist.map(item => { + item.hidden = !_options.includes(item.key) + if (item.key === 'linkurl') { + item.type = value === 'dynamic' ? 'select' : 'textarea' + } return item }) }) @@ -191,22 +254,13 @@ const fields = [] this.state.formlist.forEach((item, index) => { - if (item.hidden) return + if (item.hidden || item.forbid) return if (item.type === 'text') { // 鏂囨湰鎼滅储 - let rules = [] - - if (item.key === 'padding') { - rules = [{ - pattern: /^\d+px$|^\d+px\s\d+px$|^\d+px\s\d+px\s\d+px$|^\d+px\s\d+px\s\d+px\s\d+px$/ig, - message: '璇锋纭緭鍏ュ唴杈硅窛锛�' - }] - } - fields.push( <Col span={12} key={index}> <Form.Item label={item.tooltip ? - <Tooltip placement="topLeft" overlayClassName={item.tooltipClass} title={item.tooltip}> + <Tooltip placement="topLeft" title={item.tooltip}> <Icon type="question-circle" /> {item.label} </Tooltip> : item.label @@ -221,39 +275,17 @@ { max: formRule.input.max, message: formRule.input.message - }, - ...rules + } ] })(<Input placeholder="" autoComplete="off" disabled={item.readonly} onPressEnter={this.handleSubmit} />)} </Form.Item> </Col> ) - } else if (item.type === 'number') { + } else if (item.type === 'textarea') { // 鏂囨湰鎼滅储 fields.push( - <Col span={12} key={index}> + <Col span={24} className="textarea" key={index}> <Form.Item label={item.tooltip ? - <Tooltip placement="topLeft" overlayClassName={item.tooltipClass} title={item.tooltip}> - <Icon type="question-circle" /> - {item.label} - </Tooltip> : item.label - }> - {getFieldDecorator(item.key, { - initialValue: item.initVal, - rules: [ - { - required: item.readonly ? false : !!item.required, - message: this.props.dict['form.required.input'] + item.label + '!' - } - ] - })(<InputNumber min={item.min || 0} max={item.max || 10000} precision={item.precision || 0} />)} - </Form.Item> - </Col> - ) - } else if (item.type === 'select') { // 涓嬫媺鎼滅储 - fields.push( - <Col span={12} key={index}> - <Form.Item label={item.tooltip ? - <Tooltip placement="topLeft" overlayClassName={item.tooltipClass} title={item.tooltip}> + <Tooltip placement="topLeft" title={item.tooltip}> <Icon type="question-circle" /> {item.label} </Tooltip> : item.label @@ -262,10 +294,52 @@ initialValue: item.initVal || '', rules: [ { - required: !!item.required, - message: this.props.dict['form.required.select'] + item.label + '!' + required: item.readonly ? false : !!item.required, + message: this.props.dict['form.required.input'] + item.label + '!' + }, + { + max: formRule.input.max, + message: formRule.input.message } ] + })(<TextArea rows={2} disabled={item.readonly} placeholder={item.placeholder || ''} />)} + </Form.Item> + </Col> + ) + } else if (item.type === 'number') { + fields.push( + <Col span={12} key={index}> + <Form.Item label={item.tooltip ? + <Tooltip placement="topLeft" title={item.tooltip}> + <Icon type="question-circle" /> + {item.label} + </Tooltip> : item.label + }> + {getFieldDecorator(item.key, { + initialValue: item.initVal, + rules: [{ + required: item.readonly ? false : !!item.required, + message: this.props.dict['form.required.input'] + item.label + '!' + }] + })(<InputNumber min={item.min || 0} max={item.max || 10000} precision={item.precision || 0} onPressEnter={this.handleSubmit} />)} + </Form.Item> + </Col> + ) + } else if (item.type === 'select') { // 涓嬫媺鎼滅储 + fields.push( + <Col span={12} key={index}> + <Form.Item label={item.tooltip ? + <Tooltip placement="topLeft" title={item.tooltip}> + <Icon type="question-circle" /> + {item.label} + </Tooltip> : item.label + }> + {getFieldDecorator(item.key, { + initialValue: item.initVal || '', + rules: [{ + required: !!item.required, + message: this.props.dict['form.required.select'] + item.label + '!' + }] })( <Select showSearch @@ -283,27 +357,49 @@ </Form.Item> </Col> ) + } else if (item.type === 'icon') { + fields.push( + <Col span={12} key={index}> + <Form.Item label={item.tooltip ? + <Tooltip placement="topLeft" title={item.tooltip}> + <Icon type="question-circle" /> + {item.label} + </Tooltip> : item.label + }> + {getFieldDecorator(item.key, { + initialValue: item.initVal || '', + rules: [{ + required: !!item.required, + message: this.props.dict['form.required.select'] + item.label + '!' + }] + })( + <MkIcon /> + )} + </Form.Item> + </Col> + ) } else if (item.type === 'radio') { fields.push( <Col span={12} key={index}> - <Form.Item label={item.label}> + <Form.Item label={item.tooltip ? + <Tooltip placement="topLeft" title={item.tooltip}> + <Icon type="question-circle" /> + {item.label} + </Tooltip> : item.label + }> {getFieldDecorator(item.key, { initialValue: item.initVal, - rules: [ - { - required: !!item.required, - message: this.props.dict['form.required.select'] + item.label + '!' - } - ] + rules: [{ + required: !!item.required, + message: this.props.dict['form.required.select'] + item.label + '!' + }] })( <Radio.Group onChange={(e) => {this.onChange(e, item.key)}} disabled={item.readonly}> - { - item.options.map(option => { - return ( - <Radio key={option.value} value={option.value}>{option.text}</Radio> - ) - }) - } + {item.options.map(option => { + return ( + <Radio key={option.value} value={option.value}>{option.text}</Radio> + ) + })} </Radio.Group> )} </Form.Item> @@ -328,22 +424,11 @@ </Col> ) } else if (item.type === 'file') { - let filelist = [] - if (item.initVal) { - filelist = [{ - uid: `1`, - name: item.initVal.slice(item.initVal.lastIndexOf('/') + 1), - status: 'done', - url: item.initVal, - origin: true - }] - } - fields.push( <Col span={12} key={index}> <Form.Item label={item.label}> {getFieldDecorator(item.key, { - initialValue: filelist, + initialValue: item.initVal, rules: [ { required: !!item.required, @@ -351,7 +436,7 @@ } ] })( - <FileUpload maxFile={item.maxfile} fileType={'text'} /> + <SourceComponent type={this.state.eleType} /> )} </Form.Item> </Col> @@ -368,29 +453,6 @@ if (!err) { values.uuid = this.props.card.uuid values.marks = this.props.card.marks || null - - if (values.url) { - if (values.url.length > 0) { - if (values.url[0].origin && values.url[0].url) { - values.url = values.url[0].url - } else if (!values.url[0].origin && values.url[0].status === 'done' && values.url[0].response) { - values.url = values.url[0].response - } else { - values.url = '' - } - } else { - values.url = '' - } - } - - if (values.eleType === 'picture' && values.datatype === 'static' && !values.url) { - notification.warning({ - top: 92, - message: '灏氭湭娣诲姞鍥剧墖鎴栧浘鐗囦笂浼犲け璐ワ紝璇烽噸鏂版坊鍔狅紒', - duration: 5 - }) - return - } resolve(values) } else { -- Gitblit v1.8.0