import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { Form, Row, Col, Input, Radio, Tooltip, Icon, notification, Select } from 'antd'
|
import moment from 'moment'
|
|
import Api from '@/api'
|
import { formRule } from '@/utils/option.js'
|
import Utils from '@/utils/utils.js'
|
import CodeMirror from '@/templates/zshare/codemirror'
|
import './index.scss'
|
|
const { TextArea } = Input
|
|
class SettingForm extends Component {
|
static propTpyes = {
|
config: PropTypes.object, // 页面配置
|
dict: PropTypes.object, // 字典项
|
menu: PropTypes.object, // 菜单信息
|
setting: PropTypes.object, // 数据源配置
|
columns: PropTypes.array, // 列设置
|
scripts: PropTypes.array, // 自定义脚本
|
updateStatus: PropTypes.func, // 状态更新
|
}
|
|
state = {
|
interType: 'system',
|
procMode: 'script',
|
requestMode: 'system',
|
funcTooltip: '',
|
funcRules: []
|
}
|
|
UNSAFE_componentWillMount () {
|
const { setting } = this.props
|
|
let usefulFields = sessionStorage.getItem('permFuncField')
|
if (usefulFields) {
|
try {
|
usefulFields = JSON.parse(usefulFields)
|
} catch {
|
usefulFields = []
|
}
|
} else {
|
usefulFields = []
|
}
|
|
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
|
})
|
}
|
|
this.setState({
|
interType: setting.interType || 'system',
|
procMode: setting.procMode || 'script',
|
requestMode: setting.requestMode || 'system',
|
funcTooltip: tooltip,
|
funcRules: rules
|
})
|
}
|
|
handleConfirm = () => {
|
const { setting } = this.props
|
// 表单提交时检查输入值是否正确
|
return new Promise((resolve, reject) => {
|
this.props.form.validateFieldsAndScroll((err, values) => {
|
if (!err) {
|
// 数据源前端验证
|
if (values.interType === 'system' && values.default !== 'false' && !values.dataresource) {
|
notification.warning({
|
top: 92,
|
message: '请填写数据源!',
|
duration: 5
|
})
|
reject()
|
return
|
} else if (values.interType === 'system' && values.default !== '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
|
}
|
}
|
|
// 数据源保存
|
if (
|
values.interType === 'system' && values.default !== 'false' &&
|
/[^\s]+\s+[^\s]+/ig.test(values.dataresource) && setting.dataresource !== values.dataresource
|
) {
|
let param = {
|
func: 's_DataSrc_Save',
|
LText: values.dataresource,
|
MenuID: this.props.menu.MenuID
|
}
|
|
param.LText = Utils.formatOptions(param.LText)
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
Api.getLocalConfig(param)
|
}
|
|
resolve(values)
|
} else {
|
reject(err)
|
}
|
})
|
})
|
}
|
|
onRadioChange = (e, key) => {
|
let value = e.target.value
|
|
if (key === 'interType') {
|
this.setState({
|
interType: value
|
})
|
} else if (key === 'procMode') {
|
this.setState({
|
procMode: value
|
})
|
} else if (key === 'requestMode') {
|
this.setState({
|
requestMode: value
|
})
|
} else if (key === 'sysInterface' && value === 'true') {
|
this.props.form.setFieldsValue({
|
interface: window.GLOB.mainSystemApi || ''
|
})
|
}
|
this.props.updateStatus({[key]: value})
|
}
|
|
primaryKeyChange = (val) => {
|
if (val) {
|
this.props.form.setFieldsValue({
|
order: `${val} desc`
|
})
|
}
|
}
|
|
render() {
|
const { setting, dict, menu, config, columns } = this.props
|
const { getFieldDecorator } = this.props.form
|
const { interType, funcRules, funcTooltip, procMode, requestMode } = this.state
|
|
const formItemLayout = {
|
labelCol: {
|
xs: { span: 24 },
|
sm: { span: 8 }
|
},
|
wrapperCol: {
|
xs: { span: 24 },
|
sm: { span: 16 }
|
}
|
}
|
|
return (
|
<div className="model-table-datasource-setting-form-box">
|
<Form {...formItemLayout} className="model-setting-form">
|
<Row gutter={24}>
|
<Col span={12}>
|
<Form.Item label="表名">
|
{getFieldDecorator('tableName', {
|
initialValue: setting.tableName || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '表名!'
|
},
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col>
|
<Col span={12}>
|
<Form.Item label="表格属性">
|
{getFieldDecorator('tableType', {
|
initialValue: setting.tableType
|
})(
|
<Radio.Group>
|
<Radio value="">不可选</Radio>
|
<Radio value="radio">单选</Radio>
|
<Radio value="checkbox">多选</Radio>
|
</Radio.Group>
|
)}
|
</Form.Item>
|
</Col>
|
<Col span={12}>
|
<Form.Item label={dict['header.form.intertype']}>
|
{getFieldDecorator('interType', {
|
initialValue: interType,
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.select'] + dict['header.form.intertype'] + '!'
|
},
|
]
|
})(
|
<Radio.Group style={{whiteSpace: 'nowrap'}} onChange={(e) => {this.onRadioChange(e, 'interType')}}>
|
<Radio value="system">系统</Radio>
|
<Radio value="inner">内部</Radio>
|
<Radio value="outer">外部</Radio>
|
<Radio value="custom">自定义</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
{interType === 'outer' ? <Col span={12}>
|
<Form.Item label={dict['header.form.sysInterface']}>
|
{getFieldDecorator('sysInterface', {
|
initialValue: setting.sysInterface || 'false',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.select'] + dict['header.form.sysInterface'] + '!'
|
},
|
]
|
})(
|
<Radio.Group onChange={(e) => {this.onRadioChange(e, 'sysInterface')}}>
|
<Radio value="true">{dict['model.true']}</Radio>
|
<Radio value="false">{dict['model.false']}</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="参数处理">
|
{getFieldDecorator('procMode', {
|
initialValue: procMode,
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.select'] + '参数处理方式!'
|
},
|
]
|
})(
|
<Radio.Group style={{whiteSpace: 'nowrap'}} onChange={(e) => {this.onRadioChange(e, 'procMode')}}>
|
<Radio value="script">前置脚本</Radio>
|
<Radio value="inner">前置函数</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' && procMode === 'inner' ? <Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={funcTooltip}>
|
<Icon type="question-circle" />
|
前置函数
|
</Tooltip>
|
}>
|
{getFieldDecorator('prevFunc', {
|
initialValue: setting.prevFunc || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '前置函数!'
|
},
|
{
|
max: formRule.func.max,
|
message: formRule.func.maxMessage
|
},
|
...funcRules
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'outer' || interType === 'custom' ? <Col className="data-source" span={24}>
|
<Form.Item label="接口地址">
|
{getFieldDecorator('interface', {
|
initialValue: setting.interface || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '接口地址!'
|
},
|
]
|
})(<TextArea rows={2} />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col className="data-source" span={24}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title="正式系统所使用的的接口地址。">
|
<Icon type="question-circle" />
|
正式地址
|
</Tooltip>
|
}>
|
{getFieldDecorator('proInterface', {
|
initialValue: setting.proInterface || ''
|
})(<TextArea rows={2} />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="请求方式">
|
{getFieldDecorator('method', {
|
initialValue: setting.method || 'post',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.select'] + '请求方式!'
|
},
|
]
|
})(
|
<Radio.Group>
|
<Radio value="get">GET</Radio>
|
<Radio value="post">POST</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="数据请求">
|
{getFieldDecorator('requestMode', {
|
initialValue: requestMode,
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.select'] + '数据请求方式!'
|
},
|
]
|
})(
|
<Radio.Group style={{whiteSpace: 'nowrap'}} onChange={(e) => {this.onRadioChange(e, 'requestMode')}}>
|
<Radio value="system">系统函数</Radio>
|
<Radio value="inner">内部函数</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'inner' || (interType === 'custom' && requestMode === 'inner') ? <Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={funcTooltip}>
|
<Icon type="question-circle" />
|
内部函数
|
</Tooltip>
|
}>
|
{getFieldDecorator('innerFunc', {
|
initialValue: setting.innerFunc || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '内部函数!'
|
},
|
{
|
max: formRule.func.max,
|
message: formRule.func.maxMessage
|
},
|
...funcRules
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'outer' ? <Col span={12}>
|
<Form.Item label="外部函数">
|
{getFieldDecorator('outerFunc', {
|
initialValue: setting.outerFunc || '',
|
rules: [
|
{
|
pattern: formRule.func.pattern,
|
message: formRule.func.message
|
}, {
|
max: formRule.func.max,
|
message: formRule.func.maxMessage
|
}
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' || (interType === 'custom' && requestMode === 'system') ? <Col span={24} className="data-source" style={{paddingLeft: '7px'}}>
|
<Form.Item help={'数据ID:' + menu.MenuID} labelCol={{xs: { span: 24 }, sm: { span: 4 }}} wrapperCol={ {xs: { span: 24 }, sm: { span: 20 }} } label={
|
<Tooltip placement="topLeft" title={'使用系统函数时,需填写数据源。注:数据权限替换符 $@ -> /* 或 \'\'、 @$ -> */ 或 \'\''}>
|
<Icon type="question-circle" />
|
数据源
|
</Tooltip>
|
}>
|
{getFieldDecorator('dataresource', {
|
initialValue: setting.dataresource || ''
|
})(<CodeMirror />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' || (interType === 'custom' && requestMode === 'system') ? <Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'查询时,搜索条件以where条件拼接进入sql,统计时,将数据源中以“@+搜索字段+@”的内容,以搜索条件中的值进行替换后,提交查询,注:查询类型仅在使用系统函数时有效。'}>
|
<Icon type="question-circle" />
|
查询类型
|
</Tooltip>
|
}>
|
{getFieldDecorator('queryType', {
|
initialValue: setting.queryType || 'query'
|
})(
|
<Radio.Group>
|
<Radio value="query">查询</Radio>
|
<Radio value="statistics">统计</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'system' || (interType === 'custom' && requestMode === 'system') ? <Col span={12}>
|
<Form.Item label="默认sql">
|
{getFieldDecorator('default', {
|
initialValue: setting.default || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">执行</Radio>
|
<Radio value="false">不执行</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
<Col span={12}>
|
<Form.Item label="主键">
|
{getFieldDecorator('primaryKey', {
|
initialValue: setting.primaryKey || ''
|
})(
|
<Select onChange={this.primaryKeyChange}>
|
<Select.Option key="empty" value="">未设置</Select.Option>
|
{columns.map((option, i) =>
|
<Select.Option key={i} value={option.value}>
|
{option.text}
|
</Select.Option>
|
)}
|
</Select>
|
)}
|
</Form.Item>
|
</Col>
|
<Col span={12}>
|
<Form.Item label="默认排序">
|
{getFieldDecorator('order', {
|
initialValue: setting.order || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '默认排序!'
|
},
|
{
|
max: formRule.input.max,
|
message: formRule.input.message
|
}
|
]
|
})(<Input placeholder={'ID asc, UID desc'} autoComplete="off" />)}
|
</Form.Item>
|
</Col>
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="回调方式">
|
{getFieldDecorator('callbackType', {
|
initialValue: setting.callbackType || 'script'
|
})(
|
<Radio.Group onChange={(e) => {this.onRadioChange(e, 'callbackType')}}>
|
<Radio value="default">默认脚本</Radio>
|
<Radio value="script">自定义脚本</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="回调表名">
|
{getFieldDecorator('cbTable', {
|
initialValue: setting.cbTable || '',
|
rules: [
|
{
|
required: true,
|
message: dict['form.required.input'] + '回调表名!'
|
},
|
{
|
max: formRule.input.max,
|
message: formRule.input.message
|
}
|
]
|
})(<Input placeholder={''} autoComplete="off" />)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'同步执行:外部接口调用成功后再请求数据;异步执行:外部接口调用与请求数据同时进行。'}>
|
<Icon type="question-circle" />
|
执行方式
|
</Tooltip>
|
}>
|
{getFieldDecorator('execType', {
|
initialValue: setting.execType || 'sync'
|
})(
|
<Radio.Group>
|
<Radio value="sync">同步</Radio>
|
<Radio value="async">异步</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{interType === 'custom' ? <Col span={12}>
|
<Form.Item label="执行次数">
|
{getFieldDecorator('execTime', {
|
initialValue: setting.execTime || 'once'
|
})(
|
<Radio.Group>
|
<Radio value="always">始终</Radio>
|
<Radio value="once">一次</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
<Col span={12}>
|
<Form.Item label="是否分页">
|
{getFieldDecorator('laypage', {
|
initialValue: setting.laypage || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">{dict['model.true']}</Radio>
|
<Radio value="false">{dict['model.false']}</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
<Col span={12}>
|
<Form.Item label="初始化">
|
{getFieldDecorator('onload', {
|
initialValue: setting.onload || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">加载数据</Radio>
|
<Radio value="false">不加载数据</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
{config.Template === 'CommonTable' ? <Col span={12}>
|
<Form.Item label="按钮固定">
|
{getFieldDecorator('actionfixed', {
|
initialValue: setting.actionfixed === 'true' || setting.actionfixed === true ? 'true' : 'false'
|
})(
|
<Radio.Group>
|
<Radio value="true">{dict['model.true']}</Radio>
|
<Radio value="false">{dict['model.false']}</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
{config.Template === 'CommonTable' ? <Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title={'含有合并列或表格出现横向滚动时会显示异常,请慎用!'}>
|
<Icon type="question-circle" />
|
表头固定
|
</Tooltip>
|
}>
|
{getFieldDecorator('columnfixed', {
|
initialValue: setting.columnfixed === 'true' || setting.columnfixed === true ? 'true' : 'false'
|
})(
|
<Radio.Group>
|
<Radio value="true">{dict['model.true']}</Radio>
|
<Radio value="false">{dict['model.false']}</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col> : null}
|
<Col span={12}>
|
<Form.Item label="边框">
|
{getFieldDecorator('bordered', {
|
initialValue: setting.bordered || 'true'
|
})(
|
<Radio.Group>
|
<Radio value="true">有</Radio>
|
<Radio value="false">无</Radio>
|
</Radio.Group>)}
|
</Form.Item>
|
</Col>
|
<Col span={12}>
|
<Form.Item label={
|
<Tooltip placement="topLeft" title="双击表格中行,触发的按钮。">
|
<Icon type="question-circle" />
|
双击事件
|
</Tooltip>
|
}>
|
{getFieldDecorator('doubleClick', {
|
initialValue: setting.doubleClick || ''
|
})(
|
<Select allowClear>
|
{config.action.map(option =>
|
<Select.Option key={option.uuid} value={option.uuid}>{option.label}</Select.Option>
|
)}
|
</Select>
|
)}
|
</Form.Item>
|
</Col>
|
</Row>
|
</Form>
|
</div>
|
)
|
}
|
}
|
|
export default Form.create()(SettingForm)
|