import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { Form, Row, Col, Input, Radio, Tooltip, notification, Select, InputNumber, Cascader } from 'antd'
|
import { QuestionCircleOutlined } from '@ant-design/icons'
|
|
import { formRule } from '@/utils/option.js'
|
import Utils from '@/utils/utils.js'
|
import MenuUtils from '@/utils/utils-custom.js'
|
import CodeMirror from '@/templates/zshare/codemirror'
|
import './index.scss'
|
|
const { TextArea } = Input
|
|
class SettingForm extends Component {
|
static propTpyes = {
|
dict: PropTypes.object, // 字典项
|
config: PropTypes.object, // 组件配置
|
setting: PropTypes.object, // 数据源配置
|
modules: PropTypes.array, // 可绑定的上级组件
|
columns: PropTypes.array, // 列设置
|
scripts: PropTypes.array, // 自定义脚本
|
}
|
|
state = {
|
interType: this.props.setting.interType || 'system',
|
laypage: this.props.setting.laypage || 'true',
|
modules: [],
|
usefulFields: [],
|
useMSearch: this.props.setting.useMSearch || 'false',
|
sysInterface: this.props.setting.sysInterface || 'false',
|
supModule: this.props.setting.supModule || [],
|
appType: sessionStorage.getItem('appType')
|
}
|
|
UNSAFE_componentWillMount () {
|
const { config } = this.props
|
|
let modules = MenuUtils.getSupModules(window.GLOB.customMenu.components, config.uuid) || []
|
|
modules.unshift({
|
value: 'empty',
|
label: '无'
|
})
|
|
let usefulFields = sessionStorage.getItem('permFuncField')
|
if (usefulFields) {
|
try {
|
usefulFields = JSON.parse(usefulFields)
|
} catch (e) {
|
usefulFields = []
|
}
|
} else {
|
usefulFields = []
|
}
|
|
this.setState({modules, usefulFields})
|
}
|
|
handleConfirm = () => {
|
const { appType } = this.state
|
// 表单提交时检查输入值是否正确
|
return new Promise((resolve, reject) => {
|
this.props.form.validateFieldsAndScroll((err, values) => {
|
if (!err) {
|
values.sync = values.sync || 'false'
|
|
if (appType === 'mob' && values.useMSearch === 'true') {
|
values.syncRefresh = 'true'
|
}
|
|
// 数据源前端验证
|
if (values.interType === 'system' && values.execute !== 'false' && !values.dataresource) {
|
notification.warning({
|
top: 92,
|
message: '请填写内部函数或数据源!',
|
duration: 5
|
})
|
reject()
|
return
|
} else if (values.interType === 'system' && values.execute !== 'false' && values.dataresource) {
|
let _quot = values.dataresource.match(/'{1}/g)
|
let _lparen = values.dataresource.match(/\({1}/g)
|
let _rparen = values.dataresource.match(/\){1}/g)
|
|
_quot = _quot ? _quot.length : 0
|
_lparen = _lparen ? _lparen.length : 0
|
_rparen = _rparen ? _rparen.length : 0
|
|
if (_quot % 2 !== 0) {
|
notification.warning({
|
top: 92,
|
message: '数据源中\'必须成对出现',
|
duration: 5
|
})
|
reject()
|
return
|
} else if (_lparen !== _rparen) {
|
notification.warning({
|
top: 92,
|
message: '数据源中()必须成对出现',
|
duration: 5
|
})
|
reject()
|
return
|
} else if (/--/ig.test(values.dataresource)) {
|
notification.warning({
|
top: 92,
|
message: '数据源中,不可出现字符 -- ,注释请用 /*内容*/',
|
duration: 5
|
})
|
reject()
|
return
|
}
|
|
let error = Utils.verifySql(values.dataresource)
|
|
if (error) {
|
notification.warning({
|
top: 92,
|
message: '数据源中不可使用' + error,
|
duration: 5
|
})
|
reject()
|
return
|
}
|
}
|
|
resolve(values)
|
} else {
|
reject(err)
|
}
|
})
|
})
|
}
|
|
onRadioChange = (e, key) => {
|
let value = e.target.value
|
|
if (key === 'interType') {
|
this.setState({
|
interType: value
|
})
|
}
|
}
|
|
onSysInter = (e) => {
|
let value = e.target.value
|
|
this.setState({
|
sysInterface: value
|
})
|
if (value === 'true') {
|
this.props.form.setFieldsValue({interface: window.GLOB.mainSystemApi})
|
}
|
}
|
|
changeSupModule = (val) => {
|
this.setState({supModule: val})
|
}
|
|
render() {
|
const { setting, columns, config } = this.props
|
const { getFieldDecorator } = this.props.form
|
const { interType, modules, useMSearch, laypage, supModule, usefulFields, appType, sysInterface } = this.state
|
|
const formItemLayout = {
|
labelCol: {
|
xs: { span: 24 },
|
sm: { span: 8 }
|
},
|
wrapperCol: {
|
xs: { span: 24 },
|
sm: { span: 16 }
|
}
|
}
|
|
let tooltip = null
|
let rules = []
|
|
if (usefulFields.length > 0) {
|
tooltip = '开头可用字符:' + usefulFields.join(', ')
|
let str = '^(' + usefulFields.join('|') + ')'
|
let _patten = new RegExp(str + formRule.func.innerPattern + '$', 'g')
|
|
rules.push({
|
pattern: _patten,
|
message: formRule.func.innerMessage
|
})
|
}
|
|
return (
|
<div className="model-datasource-setting-form-box">
|
<Form {...formItemLayout} className="model-setting-form">
|
<Row gutter={24}>
|
<Col span={8}>
|
<Form.Item label="表名">
|
{getFieldDecorator('tableName', {
|
initialValue: setting.tableName,
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.input'] + '表名!'
|
},
|
{
|
max: 50,
|
message: '表名最长为50个字符!'
|
}
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col>
|
<Col span={8}>
|
<Form.Item label="接口类型">
|
{getFieldDecorator('interType', {
|
initialValue: interType,
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.select'] + '接口类型!'
|
},
|
]
|
})(
|
<Radio.Group onChange={(e) => {this.onRadioChange(e, 'interType')}}>
|
<Radio value="system">系统</Radio>
|
<Radio value="inner">内部</Radio>
|
<Radio value="outer">外部</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
{interType === 'outer' ? <Col span={8}>
|
<Form.Item label="系统接口">
|
{getFieldDecorator('sysInterface', {
|
initialValue: sysInterface,
|
rules: [
|
{
|
required: true,
|
message: '请选择是否使用系统接口!'
|
}
|
]
|
})(
|
<Radio.Group onChange={this.onSysInter}>
|
<Radio value="true">是</Radio>
|
<Radio value="false">否</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'inner' ? <Col span={8}>
|
<Form.Item label={tooltip ?
|
<Tooltip placement="topLeft" title={tooltip}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
内部函数
|
</Tooltip> : '内部函数'
|
}>
|
{getFieldDecorator('innerFunc', {
|
initialValue: setting.innerFunc || '',
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.input'] + '内部函数!'
|
},
|
...rules
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'outer' ? <Col className="outer-interface" span={24}>
|
<Form.Item label="接口地址">
|
{getFieldDecorator('interface', {
|
initialValue: setting.interface || (sysInterface === 'true' ? window.GLOB.mainSystemApi : ''),
|
rules: [
|
{
|
required: sysInterface !== 'true' ? true : false,
|
message: this.props.dict['form.required.input'] + '接口地址!'
|
}
|
]
|
})(<TextArea rows={2} readOnly={sysInterface === 'true'}/>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'outer' && sysInterface !== 'true' ? <Col className="outer-interface" span={24}>
|
<Form.Item label={<Tooltip placement="topLeft" title="正式系统接口地址,为空时使用接口地址">
|
<QuestionCircleOutlined className="mk-form-tip" />
|
正式地址
|
</Tooltip>
|
}>
|
{getFieldDecorator('proInterface', {
|
initialValue: setting.proInterface || ''
|
})(<TextArea rows={2}/>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'outer' ? <Col span={8}>
|
<Form.Item label="外部函数">
|
{getFieldDecorator('outerFunc', {
|
initialValue: setting.outerFunc || '',
|
rules: [
|
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' ? <Col span={24} className="data-source" style={{paddingLeft: '7px'}}>
|
<Form.Item labelCol={{xs: { span: 24 }, sm: { span: 2 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 22 }} } label={
|
<Tooltip placement="topLeft" title={`使用系统函数时,需填写数据源。注:数据权限替换符 $@ -> /* 或 ''、 @$ -> */ 或 '';查询替换符 $select@ -> /* 或 ''、 @select$ -> */ 或 '';统计替换符 $sum@ -> /* 或 ''、 @sum$ -> */ 或 ''。`}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
数据源
|
</Tooltip>
|
}>
|
{getFieldDecorator('dataresource', {
|
initialValue: setting.dataresource || ''
|
})(<CodeMirror />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'查询时,搜索条件以where条件拼接进入sql,统计时,将数据源中以“@+搜索字段+@”的内容,以搜索条件中的值进行替换后,提交查询,注:查询类型仅在使用系统函数时有效。'}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
查询类型
|
</Tooltip>
|
}>
|
{getFieldDecorator('queryType', {
|
initialValue: setting.queryType || 'query'
|
})(
|
<Radio.Group>
|
<Radio value="query">查询</Radio>
|
<Radio value="statistics">统计</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
<Col span={8}>
|
<Form.Item label="主键">
|
{getFieldDecorator('primaryKey', {
|
initialValue: setting.primaryKey || ''
|
})(
|
<Select>
|
{columns.map((option, i) =>
|
<Select.Option key={i} value={option.field}>
|
{option.label}
|
</Select.Option>
|
)}
|
</Select>
|
)}
|
</Form.Item>
|
</Col>
|
{/* 数组数据,需设置排序规则 */}
|
{config.format === 'array' ? <Col span={8}>
|
<Form.Item label="默认排序">
|
{getFieldDecorator('order', {
|
initialValue: setting.order || 'ID desc',
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.input'] + '默认排序!'
|
}
|
]
|
})(<Input placeholder={'ID asc, UID desc'} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' ? <Col span={8}>
|
<Form.Item label="默认sql">
|
{getFieldDecorator('execute', {
|
initialValue: setting.execute || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">执行</Radio>
|
<Radio value="false">不执行</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{!['navbar', 'balcony', 'menubar'].includes(config.type) && (!config.wrap || config.wrap.supType !== 'multi') ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'该组件如果受其他组件控制,请选项相应的组件,没有时选“无”。'}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
上级组件
|
</Tooltip>
|
}>
|
{getFieldDecorator('supModule', {
|
initialValue: supModule,
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.select'] + '上级组件!'
|
}
|
]
|
})(
|
<Cascader options={modules} onChange={this.changeSupModule} expandTrigger="hover" placeholder="" />
|
)}
|
</Form.Item>
|
</Col> : null}
|
{config.pageable ? <Col span={8}>
|
<Form.Item label="分页">
|
{getFieldDecorator('laypage', {
|
initialValue: setting.laypage || 'true'
|
})(
|
<Radio.Group onChange={(e) => this.setState({laypage: e.target.value})}>
|
<Radio value="true">是</Radio>
|
<Radio value="false">否</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
{config.pageable && laypage !== 'false' ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title="选择分页时有效。">
|
<QuestionCircleOutlined className="mk-form-tip" />
|
每页数量
|
</Tooltip>
|
}>
|
{getFieldDecorator('pageSize', {
|
initialValue: setting.pageSize || 10,
|
rules: [
|
{
|
required: true,
|
message: this.props.dict['form.required.input'] + '每页数量!'
|
}
|
]
|
})(<InputNumber min={1} max={500} precision={0} />)}
|
</Form.Item>
|
</Col> : null}
|
{/* 1、不分页且不存在上级模块 */}
|
{!['navbar'].includes(config.type) && !['editable'].includes(config.subtype) && (!config.pageable || (config.pageable && laypage === 'false')) && (!supModule || supModule.length === 0 || supModule[0] === 'empty') ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'初始化加载时,是否与其他组件一同加载数据,注:仅在使用系统函数,且初始化加载数据时有效,分页请求时无效。'}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
同步查询
|
</Tooltip>
|
}>
|
{getFieldDecorator('sync', {
|
initialValue: setting.sync || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">是</Radio>
|
<Radio value="false">否</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
{!['navbar', 'balcony', 'menubar'].includes(config.type) ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'优先使用同级的搜索条件组件,同级搜索不存在时,依次向上选取,与当前组件的搜索条件一同用作数据过滤(当前组件的搜索条件优先)。'}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
外部搜索
|
</Tooltip>
|
}>
|
{getFieldDecorator('useMSearch', {
|
initialValue: setting.useMSearch || 'true'
|
})(
|
<Radio.Group onChange={(e) => this.setState({useMSearch: e.target.value})}>
|
<Radio value="true">使用</Radio>
|
<Radio value="false">不使用</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
{!['navbar', 'balcony', 'menubar'].includes(config.type) && useMSearch === 'true' && appType !== 'mob' ? <Col span={8}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'外层搜索条件改变时,是否刷新当前组件数据。'}>
|
<QuestionCircleOutlined className="mk-form-tip" />
|
同步刷新
|
</Tooltip>
|
}>
|
{getFieldDecorator('syncRefresh', {
|
initialValue: setting.syncRefresh || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">是</Radio>
|
<Radio value="false">否</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
<Col span={8}>
|
<Form.Item label="事务">
|
{getFieldDecorator('transaction', {
|
initialValue: setting.transaction || 'false'
|
})(
|
<Radio.Group>
|
<Radio value="true">使用</Radio>
|
<Radio value="false">不使用</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
{!['navbar', 'balcony', 'menubar'].includes(config.type) ? <Col span={8}>
|
<Form.Item label="初始化数据">
|
{getFieldDecorator('onload', {
|
initialValue: setting.onload || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">加载</Radio>
|
<Radio value="false">不加载</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col> : null}
|
</Row>
|
</Form>
|
</div>
|
)
|
}
|
}
|
|
export default Form.create()(SettingForm)
|