| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { fromJS } from 'immutable' |
| | | import { Form, Tabs, Popconfirm, Icon, notification, Modal, Typography, Spin, message } from 'antd' |
| | | import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message } from 'antd' |
| | | import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined } from '@ant-design/icons' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | |
| | | class VerifyCard extends Component { |
| | | static propTpyes = { |
| | | dict: PropTypes.object, // 字典项 |
| | | menu: PropTypes.object, // 菜单配置信息 |
| | | config: PropTypes.object, // 组件配置信息 |
| | | } |
| | | |
| | |
| | | dataIndex: 'label', |
| | | inputType: 'input', |
| | | editable: true, |
| | | width: '28%' |
| | | width: '20%' |
| | | }, |
| | | { |
| | | title: '字段', |
| | |
| | | editable: true, |
| | | unique: true, |
| | | copy: true, |
| | | width: '28%' |
| | | width: '20%' |
| | | }, |
| | | { |
| | | title: '数据类型', |
| | |
| | | { value: 'datetime', text: 'datetime' }, |
| | | ], |
| | | editable: true, |
| | | width: '25%', |
| | | } |
| | | width: '20%', |
| | | }, |
| | | { |
| | | title: '备注', |
| | | dataIndex: 'remark', |
| | | inputType: 'textarea', |
| | | editable: true, |
| | | width: '20%' |
| | | }, |
| | | ], |
| | | scriptsColumns: [ |
| | | { |
| | |
| | | render: (text) => { |
| | | let title = text.match(/^\s*\/\*.+\*\//) |
| | | title = title && title[0] ? title[0] : '' |
| | | text = title ? text.replace(title, '') : text |
| | | let _text = title ? text.replace(title, '') : text |
| | | |
| | | return ( |
| | | <div> |
| | | {title ? <span style={{color: '#a50'}}>{title}</span> : null} |
| | | <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph> |
| | | {title ? <span style={{color: '#a50'}}>{title}<span style={{fontSize: '12px', marginLeft: '5px'}}>{_text.length}</span></span> : null} |
| | | <Paragraph copyable={{ text: text }} ellipsis={{ rows: 4, expandable: true }}>{_text}</Paragraph> |
| | | </div> |
| | | ) |
| | | } |
| | |
| | | width: '13%', |
| | | render: (text, record) => record.status === 'false' ? |
| | | ( |
| | | <div> |
| | | <div style={{color: '#ff4d4f'}}> |
| | | {this.props.dict['model.status.forbidden']} |
| | | <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" /> |
| | | <StopOutlined style={{marginLeft: '5px'}} /> |
| | | </div> |
| | | ) : |
| | | ( |
| | | <div> |
| | | <div style={{color: '#26C281'}}> |
| | | {this.props.dict['model.status.open']} |
| | | <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" /> |
| | | <CheckCircleOutlined style={{marginLeft: '5px'}}/> |
| | | </div> |
| | | ) |
| | | }, |
| | |
| | | dataIndex: 'operation', |
| | | render: (text, record) => |
| | | (<div style={{textAlign: 'center'}}> |
| | | <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><Icon type="edit" /></span> |
| | | <span className="operation-btn" title={this.props.dict['model.status.change']} onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><Icon type="swap" /></span> |
| | | <span className="operation-btn" title={this.props.dict['model.edit']} onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><EditOutlined /></span> |
| | | <span className="operation-btn" title={this.props.dict['model.status.change']} onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><SwapOutlined /></span> |
| | | <Popconfirm |
| | | overlayClassName="popover-confirm" |
| | | title={this.props.dict['model.query.delete']} |
| | | onConfirm={() => this.deleteScript(record) |
| | | }> |
| | | <span className="operation-btn" style={{color: '#ff4d4f'}}><Icon type="delete" /></span> |
| | | <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span> |
| | | </Popconfirm> |
| | | </div>) |
| | | } |
| | |
| | | } |
| | | |
| | | UNSAFE_componentWillMount() { |
| | | const { config, mainSearch, menu } = this.props |
| | | const { config, mainSearch } = this.props |
| | | |
| | | let search = config.search || [] |
| | | |
| | |
| | | search = [...search, ...mainSearch] |
| | | } |
| | | |
| | | let Marks = [] |
| | | let getcomponentmarks = (box, conf) => { |
| | | if (!conf.parentId && box.Template === 'CustomPage') { |
| | | box.components.forEach(item => { |
| | | if (item.type === 'group') { |
| | | item.components.forEach(cell => { |
| | | if (cell.uuid !== conf.uuid && cell.setting && cell.setting.varMark) { |
| | | Marks.push(cell.setting.varMark.toLowerCase()) |
| | | } |
| | | }) |
| | | } else if (item.uuid !== conf.uuid && item.setting && item.setting.varMark) { |
| | | Marks.push(item.setting.varMark.toLowerCase()) |
| | | } |
| | | }) |
| | | } else if (conf.parentId === box.parentId && conf.tabId === box.uuid) { |
| | | box.components.forEach(item => { |
| | | if (item.type === 'group') { |
| | | item.components.forEach(cell => { |
| | | if (cell.uuid !== conf.uuid && cell.setting && cell.setting.varMark) { |
| | | Marks.push(cell.setting.varMark.toLowerCase()) |
| | | } |
| | | }) |
| | | } else if (item.uuid !== conf.uuid && item.setting && item.setting.varMark) { |
| | | Marks.push(item.setting.varMark.toLowerCase()) |
| | | } |
| | | }) |
| | | } else { |
| | | box.components.forEach(item => { |
| | | if (item.type !== 'tabs') return |
| | | |
| | | item.subtabs.forEach(tab => { |
| | | getcomponentmarks(tab, conf) |
| | | }) |
| | | }) |
| | | } |
| | | } |
| | | |
| | | getcomponentmarks(menu, config) |
| | | |
| | | let _setting = fromJS(config.setting).toJS() |
| | | let scripts = fromJS(config.scripts).toJS() |
| | | let scripts = config.scripts ? fromJS(config.scripts).toJS() : [] |
| | | |
| | | if (window.GLOB.funcs && window.GLOB.funcs.length > 0) { |
| | | window.GLOB.funcs.forEach(m => { |
| | |
| | | |
| | | this.setState({ |
| | | scripts, |
| | | columns: fromJS(config.columns).toJS(), |
| | | columns: config.columns ? fromJS(config.columns).toJS() : [], |
| | | setting: _setting, |
| | | searches: search, |
| | | defaultSearch: _search, |
| | | varMarks: Marks |
| | | defaultSearch: _search |
| | | }) |
| | | |
| | | this.getsysScript() |
| | |
| | | |
| | | changeTab = (val) => { |
| | | const { config, mainSearch } = this.props |
| | | const { activeKey, varMarks } = this.state |
| | | const { activeKey } = this.state |
| | | |
| | | this.setState({loading: true}) |
| | | if (activeKey === 'setting') { |
| | |
| | | |
| | | if (res.useMSearch === 'true') { // 使用主搜索条件 |
| | | search = [...search, ...mainSearch] |
| | | } |
| | | |
| | | if (res.varMark && varMarks.includes(res.varMark.toLowerCase())) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '变量标识不可重复!', |
| | | duration: 5 |
| | | }) |
| | | this.setState({ |
| | | loading: false |
| | | }) |
| | | return |
| | | } |
| | | |
| | | let _search = this.formatSearch(search) |
| | |
| | | |
| | | submitDataSource = () => { |
| | | const { config, mainSearch } = this.props |
| | | const { activeKey, setting, columns, scripts, varMarks } = this.state |
| | | const { activeKey, setting, columns, scripts } = this.state |
| | | |
| | | return new Promise((resolve, reject) => { |
| | | if (activeKey === 'setting') { |
| | |
| | | |
| | | if (res.useMSearch === 'true') { // 使用主搜索条件 |
| | | search = [...search, ...mainSearch] |
| | | } |
| | | |
| | | if (res.varMark && varMarks.includes(res.varMark.toLowerCase())) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: '变量标识不可重复!', |
| | | duration: 5 |
| | | }) |
| | | reject() |
| | | return |
| | | } |
| | | |
| | | let _search = this.formatSearch(search) |
| | |
| | | } |
| | | |
| | | if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) { |
| | | let result = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch) |
| | | let r = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch) |
| | | |
| | | if (result.error) { |
| | | if (r.error) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.error, |
| | | message: r.error, |
| | | duration: 5 |
| | | }) |
| | | reject() |
| | |
| | | let param = { |
| | | func: 's_debug_sql', |
| | | exec_type: 'y', |
| | | LText: result.sql |
| | | LText: r.sql |
| | | } |
| | | param.LText = Utils.formatOptions(param.LText) |
| | | param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | param.secretkey = Utils.encrypt('', param.timestamp) |
| | | |
| | | let sumParam = null |
| | | if (r.sumSql) { |
| | | sumParam = { |
| | | func: 's_debug_sql', |
| | | exec_type: 'y', |
| | | LText: r.sumSql |
| | | } |
| | | sumParam.LText = Utils.formatOptions(sumParam.LText) |
| | | sumParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') |
| | | sumParam.secretkey = Utils.encrypt('', sumParam.timestamp) |
| | | } |
| | | |
| | | Api.getLocalConfig(param).then(result => { |
| | | if (result.status) { |
| | | resolve() |
| | | if (sumParam) { |
| | | Api.getLocalConfig(sumParam).then(res => { |
| | | if (res.status) { |
| | | resolve() |
| | | } else { |
| | | reject() |
| | | Modal.error({ |
| | | title: res.message |
| | | }) |
| | | } |
| | | }) |
| | | } else { |
| | | resolve() |
| | | } |
| | | } else { |
| | | reject() |
| | | Modal.error({ |
| | |
| | | } |
| | | |
| | | render() { |
| | | const { menu, config } = this.props |
| | | const { config } = this.props |
| | | const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql } = this.state |
| | | |
| | | return ( |
| | |
| | | <Tabs activeKey={activeKey} className="data-source-card-box" onChange={this.changeTab}> |
| | | <TabPane tab="数据源" key="setting"> |
| | | <SettingForm |
| | | menu={menu} |
| | | dict={this.props.dict} |
| | | config={config} |
| | | columns={columns} |
| | |
| | | type="fields" |
| | | updatefield={this.updatefields} |
| | | /> |
| | | <Icon type="copy" title="以逗号拼接形式复制字段" onClick={this.copyColumns} style={{position: 'absolute', cursor: 'pointer', zIndex: 1, top: '-35px', right: '0px', color: '#1890ff'}} /> |
| | | <CopyOutlined title="以逗号拼接形式复制字段" onClick={this.copyColumns} style={{position: 'absolute', cursor: 'pointer', zIndex: 1, top: '-35px', right: '0px', color: '#1890ff'}} /> |
| | | <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> |
| | | </TabPane> |
| | | <TabPane tab={ |