From 03a22ec6f9ad7303d10b4c65bb5bc6fa5cbd448a Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期六, 22 十月 2022 23:21:42 +0800 Subject: [PATCH] 2022-10-22 --- src/menu/datasource/verifycard/index.jsx | 679 ++++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 504 insertions(+), 175 deletions(-) diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx index e5de13b..ec62f40 100644 --- a/src/menu/datasource/verifycard/index.jsx +++ b/src/menu/datasource/verifycard/index.jsx @@ -1,7 +1,8 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' import { fromJS } from 'immutable' -import { Form, Tabs, Table, Popconfirm, Icon, notification, Modal, Typography, Spin } from 'antd' +import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button } from 'antd' +import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons' import moment from 'moment' import Api from '@/api' @@ -11,19 +12,20 @@ import ColForm from './columnform' import CustomScriptsForm from './customscript' import SettingForm from './settingform' +import PasteForm from '@/templates/zshare/pasteform' import SettingUtils from './utils' +import MinView from '@/assets/img/minview.png' import './index.scss' const { TabPane } = Tabs const { Paragraph } = Typography +const CodeMirror = asyncComponent(() => import('@/templates/zshare/codemirror')) const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent')) const EditTable = asyncComponent(() => import('@/templates/zshare/editTable')) class VerifyCard extends Component { static propTpyes = { - dict: PropTypes.object, // 瀛楀吀椤� - menu: PropTypes.object, // 鑿滃崟閰嶇疆淇℃伅 config: PropTypes.object, // 缁勪欢閰嶇疆淇℃伅 } @@ -33,11 +35,14 @@ loading: false, initsql: '', // sql楠岃瘉鏃跺彉閲忓0鏄庡強璧嬪�� usefulfields: '', - defaultsql: '', // 榛樿Sql - systemScripts: [{ - name: '榛樿sql', - value: '' - }], + defaultsql: '', // 榛樿Sql + defaultSearch: '', + systemScripts: [], + visible: false, + pvisible: false, + reload: false, + script: null, + scriptValue: '', colColumns: [ { title: '鍚嶇О', @@ -52,6 +57,11 @@ inputType: 'input', editable: true, unique: true, + copy: true, + rules: [{ + pattern: /^[\u4E00-\u9FA50-9a-zA-Z_]*$/ig, + message: '瀛楁鍚嶅彧鍏佽鍖呭惈鏁板瓧銆佸瓧姣嶃�佹眽瀛椾互鍙奯' + }], width: '28%' }, { @@ -59,8 +69,11 @@ dataIndex: 'datatype', inputType: 'select', options: [ + { value: 'Nvarchar(10)', text: 'Nvarchar(10)' }, + { value: 'Nvarchar(20)', text: 'Nvarchar(20)' }, { value: 'Nvarchar(50)', text: 'Nvarchar(50)' }, { value: 'Nvarchar(100)', text: 'Nvarchar(100)' }, + { value: 'Nvarchar(256)', text: 'Nvarchar(256)' }, { value: 'Nvarchar(512)', text: 'Nvarchar(512)' }, { value: 'Nvarchar(1024)', text: 'Nvarchar(1024)' }, { value: 'Nvarchar(2048)', text: 'Nvarchar(2048)' }, @@ -85,6 +98,8 @@ { value: 'Decimal(18,16)', text: 'Decimal(18,16)' }, { value: 'Decimal(18,17)', text: 'Decimal(18,17)' }, { value: 'Decimal(18,18)', text: 'Decimal(18,18)' }, + { value: 'date', text: 'date' }, + { value: 'datetime', text: 'datetime' }, ], editable: true, width: '25%', @@ -94,46 +109,53 @@ { title: 'SQL', dataIndex: 'sql', - width: '65%', - render: (text) => ( - <Paragraph copyable ellipsis={{ rows: 4, expandable: true }}>{text}</Paragraph> - ) + width: '72%', + render: (text) => { + let title = text.match(/^\s*\/\*.+\*\//) + title = title && title[0] ? title[0] : '' + let _text = title ? text.replace(title, '') : text + + return ( + <div> + {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> + ) + } }, { title: '鐘舵��', dataIndex: 'status', - width: '15%', + width: '13%', render: (text, record) => record.status === 'false' ? ( - <div> - {this.props.dict['model.status.forbidden']} - <Icon style={{marginLeft: '5px'}} type="stop" theme="twoTone" twoToneColor="#ff4d4f" /> + <div style={{color: '#ff4d4f'}}> + 绂佺敤 + <StopOutlined style={{marginLeft: '5px'}} /> </div> ) : ( - <div> - {this.props.dict['model.status.open']} - <Icon style={{marginLeft: '5px'}} type="check-circle" theme="twoTone" twoToneColor="#52c41a" /> + <div style={{color: '#26C281'}}> + 鍚敤 + <CheckCircleOutlined style={{marginLeft: '5px'}}/> </div> ) }, { title: '鎿嶄綔', align: 'center', - width: '20%', + width: '15%', dataIndex: 'operation', render: (text, record) => - (<div> - <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" onClick={() => this.handleUpDown(record, 'up')} style={{color: '#1890ff'}}><Icon type="arrow-up" /></span> - <span className="operation-btn" onClick={() => this.handleUpDown(record, 'down')} style={{color: '#ff4d4f'}}><Icon type="arrow-down" /></span> - <span className="operation-btn" title={this.props.dict['model.status.change']} onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><Icon type="swap" /></span> + (<div style={{textAlign: 'center'}}> + <span className="operation-btn" title="缂栬緫" onClick={() => this.handleEdit(record)} style={{color: '#1890ff'}}><EditOutlined /></span> + <span className="operation-btn" title="鐘舵�佸垏鎹�" onClick={() => this.handleStatus(record)} style={{color: '#8E44AD'}}><SwapOutlined /></span> <Popconfirm overlayClassName="popover-confirm" - title={this.props.dict['model.query.delete']} + title="纭畾鍒犻櫎鍚�?" 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>) } @@ -141,7 +163,7 @@ } UNSAFE_componentWillMount() { - const { config, mainSearch, menu } = this.props + const { config, mainSearch } = this.props let search = config.search || [] @@ -149,72 +171,46 @@ search = [...search, ...mainSearch] } - let Marks = [] - let getcomponentmarks = (box, conf) => { - if (!conf.parentId && box.Template === 'CustomPage') { - box.components.forEach(item => { - if (item.uuid !== conf.uuid && item.setting && item.setting.varMark) { - Marks.push(item.setting.varMark.toLowerCase()) - } + let _setting = fromJS(config.setting).toJS() + let scripts = config.scripts ? fromJS(config.scripts).toJS() : [] + + if (window.GLOB.funcs && window.GLOB.funcs.length > 0) { + window.GLOB.funcs.forEach(m => { + let reg = new RegExp(`\\/\\*\\$ex@${m.func_code}-begin\\*\\/[\\s\\S]+\\/\\*@ex\\$-end\\*\\/`, 'ig') + if (_setting.dataresource) { + _setting.dataresource = _setting.dataresource.replace(reg, `$ex@${m.func_code}@ex$`) + } + scripts && scripts.forEach(item => { + item.sql = item.sql.replace(reg, `$ex@${m.func_code}@ex$`) }) - } else if (conf.parentId === box.parentId && conf.tabId === box.uuid) { - box.components.forEach(item => { - 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 _search = this.formatSearch(search) + _search = Utils.joinMainSearchkey(_search) - let _setting = fromJS(config.setting).toJS() - - // if (_setting.varMark === undefined) { - // _setting.varMark = this.getMark(Marks) - // } + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ - columns: fromJS(config.columns).toJS(), + scripts, + columns: config.columns ? fromJS(config.columns).toJS() : [], setting: _setting, - scripts: fromJS(config.scripts).toJS(), searches: search, - varMarks: Marks + defaultSearch: _search }) this.getsysScript() } - getMark = (varMarks) => { - let m = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] - let i = 0 - let n = 25 - - let name = '' - while (!name) { - name = `${m[n]}${m[i]}_` - if (varMarks.includes(name) && n > 0) { - i++ - if (i >= 26) { - n-- - i = 0 - } - name = '' - } + getsysScript = () => { + if (sessionStorage.getItem('mk_sys_scripts')) { + this.setState({ + systemScripts: JSON.parse(sessionStorage.getItem('mk_sys_scripts')) + }) + return } - return name - } - - getsysScript = () => { let _scriptSql = `Select distinct func+Remark as funcname,longparam, s.Sort from聽 s_custom_script s inner join (select OpenID from sapp where ID=@Appkey@) p on s.openid = case when s.appkey='' then s.openid else p.OpenID end order by s.Sort` _scriptSql = Utils.formatOptions(_scriptSql) @@ -233,19 +229,17 @@ Api.getSystemConfig(_sParam).then(res => { if (res.status) { - let _scripts = [] - - res.data.forEach(item => { - let _item = { + let _scripts = res.data.map(item => { + return { name: item.funcname, - value: Utils.UnformatOptions(item.longparam) + value: window.decodeURIComponent(window.atob(item.longparam)) } - - _scripts.push(_item) }) + sessionStorage.setItem('mk_sys_scripts', JSON.stringify(_scripts)) + this.setState({ - systemScripts: [...this.state.systemScripts, ..._scripts] + systemScripts: _scripts }) } else { notification.warning({ @@ -257,11 +251,11 @@ }) } - columnChange = (values) => { + columnChange = (values, resolve) => { const { columns } = this.state - let fields = columns.map(item => item.field) - if (fields.includes(values.field)) { + let fields = columns.map(item => item.field.toLowerCase()) + if (fields.includes(values.field.toLowerCase())) { notification.warning({ top: 92, message: '瀛楁宸插瓨鍦紒', @@ -270,19 +264,28 @@ return } + resolve() + values.uuid = Utils.getuuid() this.setState({ columns: [...columns, values] }) } deleteScript = (record) => { - this.setState({ scripts: this.state.scripts.filter(item => item.uuid !== record.uuid) }) + const { script, scripts } = this.state + + if (script && script.uuid === record.uuid) { + this.setState({script: null}) + } + + this.setState({ scripts: scripts.filter(item => item.uuid !== record.uuid) }) } handleEdit = (record) => { this.scriptsForm.edit(record) - let node = document.getElementById('model-data-source-wrap').parentNode + // let node = document.getElementById('mk-scripts-tabpane').parentNode + let node = document.getElementById('mk-scripts-tabpane') if (node && node.scrollTop) { let inter = Math.ceil(node.scrollTop / 10) @@ -313,30 +316,6 @@ this.setState({ scripts }) } - handleUpDown = (record, direction) => { - let scripts = fromJS(this.state.scripts).toJS() - let index = 0 - - scripts = scripts.filter((item, i) => { - if (item.uuid === record.uuid) { - index = i - } - - return item.uuid !== record.uuid - }) - if ((index === 0 && direction === 'up') || (index === scripts.length && direction === 'down')) { - return - } - - if (direction === 'up') { - scripts.splice(index - 1, 0, record) - } else { - scripts.splice(index + 1, 0, record) - } - - this.setState({ scripts }) - } - scriptsChange = (values) => { let scripts = fromJS(this.state.scripts).toJS() @@ -355,6 +334,10 @@ return new Promise((resolve, reject) => { this.sqlverify(resolve, reject, false, scripts) }) + } + + changeScripts = (scripts) => { + this.setState({ scripts }) } scriptSubmit = (values) => { @@ -378,7 +361,7 @@ changeTab = (val) => { const { config, mainSearch } = this.props - const { activeKey, varMarks } = this.state + const { activeKey } = this.state this.setState({loading: true}) if (activeKey === 'setting') { @@ -389,20 +372,15 @@ 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) + _search = Utils.joinMainSearchkey(_search) + + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ searches: search, + defaultSearch: _search, setting: res }, () => { this.sqlverify(() => { // 楠岃瘉鎴愬姛 @@ -410,26 +388,41 @@ activeKey: val, loading: false }) + this.getdefaultSql() }, () => { // 楠岃瘉澶辫触 this.setState({ activeKey: val, loading: false }) + this.getdefaultSql() }, true) }) }, () => { this.setState({loading: false}) }) } else if (activeKey === 'columns') { + if (this.datasource && this.datasource.state.editingKey) { + notification.warning({ + top: 92, + message: '瀛楁鏈繚瀛橈紝璇蜂繚瀛樺悗鍒囨崲锛�', + duration: 5 + }) + this.setState({ + loading: false + }) + return + } + this.setState({ activeKey: val, loading: false }) + this.getdefaultSql() } else if (activeKey === 'scripts') { let _loading = false if (this.scriptsForm && this.scriptsForm.state.editItem) { _loading = true - } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && this.scriptsForm.props.form.getFieldValue('sql') !== ' ') { + } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) { _loading = true } @@ -452,9 +445,76 @@ } } + getdefaultSql = () => { + const { columns, setting, defaultSearch } = this.state + let defaultsql = '' + let arr_field = columns.map(col => col.field).join(',') + + if (setting.dataresource) { + let _dataresource = setting.dataresource + + if (/\s/.test(_dataresource)) { + _dataresource = '(' + _dataresource + ') tb' + } + + defaultsql = `select top @pageSize@ ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by @orderBy@) as rows from ${_dataresource} ${defaultSearch}) tmptable where rows > (@pageSize@ * (@pageIndex@ - 1)) order by tmptable.rows` + } + + this.setState({defaultsql}) + } + + /** + * @description 鑾峰彇鍏ㄩ儴鎼滅储鏉′欢 + * @param {Array} searches 鎼滅储鏉′欢鏁扮粍 + */ + formatSearch (searches) { + if (!searches) return [] + + let newsearches = [] + searches.forEach(search => { + if (!search.field) return + + let item = { + key: search.field, + match: search.match, + type: search.type, + label: search.label, + value: search.initval, + required: search.required === 'true' + } + if (item.type === 'group') { + item.key = search.datefield + item.type = 'daterange' + item.match = 'between' + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') + + newsearches.push(item) + return + } else if (item.type === 'date') { + item.value = moment().format('YYYY-MM-DD') + } else if (item.type === 'datemonth') { + item.value = moment().format('YYYY-MM') + } else if (item.type === 'dateweek') { + item.value = moment().format('YYYY-MM-DD') + } else if (item.type === 'daterange') { + item.value = [moment().format('YYYY-MM-DD'), moment().format('YYYY-MM-DD')].join(',') + } else if (item.type === 'range') { + + } else if (item.type === 'multiselect' || (item.type === 'checkcard' && search.multiple === 'true')) { + item.type = 'multi' + item.value = '@$@' + } else { + item.value = '@$@' + } + newsearches.push(item) + }) + + return newsearches + } + 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') { @@ -465,18 +525,15 @@ 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) + _search = Utils.joinMainSearchkey(_search) + + _search = _search.replace(/@\$@/ig, '') + _search = _search ? 'where ' + _search : '' this.setState({ searches: search, + defaultSearch: _search, setting: res }, () => { this.sqlverify(() => { resolve({setting: res, columns, scripts }) }, reject, false) @@ -485,12 +542,21 @@ reject() }) } else if (activeKey === 'columns') { + if (this.datasource && this.datasource.state.editingKey) { + notification.warning({ + top: 92, + message: '瀛楁鏈繚瀛橈紝璇蜂繚瀛樺悗鎻愪氦锛�', + duration: 5 + }) + reject() + return + } this.sqlverify(() => { resolve({setting, columns, scripts }) }, reject, false) } else if (activeKey === 'scripts') { let _loading = false if (this.scriptsForm && this.scriptsForm.state.editItem) { _loading = true - } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && this.scriptsForm.props.form.getFieldValue('sql') !== ' ') { + } else if (this.scriptsForm && this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))) { _loading = true } @@ -510,7 +576,7 @@ } sqlverify = (resolve, reject, change = false, testScripts) => { - const { columns, setting, scripts, searches } = this.state + const { columns, setting, scripts, searches, defaultSearch } = this.state let _scripts = scripts.filter(item => item.status !== 'false') @@ -528,29 +594,54 @@ } if ((setting.interType === 'system' && setting.execute !== 'false') || _scripts.length > 0) { - let result = SettingUtils.getDebugSql(setting, _scripts, columns, searches) + let timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + let r = SettingUtils.getDebugSql(setting, _scripts, columns, searches, defaultSearch, timestamp) - if (result.error) { + if (r.errors) { notification.warning({ top: 92, - message: result.error, + message: r.errors, duration: 5 }) - reject() - return } let param = { func: 's_debug_sql', - LText: result.sql + exec_type: 'y', + LText: r.sql } param.LText = Utils.formatOptions(param.LText) - param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') - param.secretkey = Utils.encrypt(param.LText, param.timestamp) + param.timestamp = timestamp + param.secretkey = Utils.encrypt('', 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 => { + Api.genericInterface(param).then(result => { if (result.status) { - resolve() + if (sumParam) { + Api.genericInterface(sumParam).then(res => { + if (res.status) { + resolve() + } else { + reject() + Modal.error({ + title: res.message + }) + } + }) + } else { + resolve() + } } else { reject() Modal.error({ @@ -563,10 +654,166 @@ } } + triggerConfirm = () => { + const { script, scriptValue, scripts } = this.state + let _scripts = fromJS(scripts).toJS() + + if (!scriptValue) { + notification.warning({ + top: 92, + message: '璇疯緭鍏ql!', + duration: 5 + }) + return + } + + if (script) { + _scripts = _scripts.map(item => { + if (script.uuid === item.uuid) { + item.sql = scriptValue + } + return item + }) + } else { + let _script = { + uuid: Utils.getuuid(), + sql: scriptValue, + $index: _scripts.length + 1, + status: 'true' + } + + _scripts.push(_script) + } + + this.setState({loading: true}) + + this.sqlverify(() => {this.setState({scripts: _scripts, script: null, scriptValue: '', loading: false})}, () => {this.setState({loading: false})}, false, _scripts) + } + updatefields = (columns) => { this.setState({ columns: columns }) + } + + copyDatasource = () => { + const { config } = this.props + const { columns, scripts } = this.state + + if (columns.length === 0) { + notification.warning({ + top: 92, + message: '璇锋坊鍔犲瓧娈甸泦!', + duration: 5 + }) + return + } + + this.settingForm.handleConfirm().then(res => { + delete res.supModule + res.name = config.name + + let source = { + key: 'interface', + type: 'line', + data: {setting: res, columns, scripts, pageable: false, format: 'array', name: res.name, status: 'false', type: 'interface', uuid: '' } + } + + try { + source = window.btoa(window.encodeURIComponent(JSON.stringify(source))) + } catch (e) { + console.warn('Stringify Failure') + source = '' + } + + if (source) { + let oInput = document.createElement('input') + oInput.value = source + document.body.appendChild(oInput) + oInput.select() + document.execCommand('Copy') + document.body.removeChild(oInput) + message.success('澶嶅埗鎴愬姛銆�') + } + }) + } + + pasteSubmit = () => { + const { config } = this.props + const { setting } = this.state + + this.pasteFormRef.handleConfirm().then(res => { + if (res.key !== 'interface') { + notification.warning({ + top: 92, + message: '閰嶇疆绫诲瀷閿欒!', + duration: 5 + }) + return + } else if (res.type !== 'line') { + notification.warning({ + top: 92, + message: '璇风矘璐村崟椤规暟鎹簮!', + duration: 5 + }) + return + } + + if (setting.supModule) { + res.data.setting.supModule = setting.supModule + } + + if (config.subtype !== 'basetable') { + this.setState({ + scripts: res.data.scripts.map(col => { + col.uuid = Utils.getuuid() + return col + }), + columns: res.data.columns.map(col => { + col.uuid = Utils.getuuid() + return col + }), + setting: res.data.setting, + reload: true, + pvisible: false + }, () => { + this.setState({reload: false}) + }) + } else { + this.setState({ + scripts: res.data.scripts.map(col => { + col.uuid = Utils.getuuid() + return col + }), + setting: res.data.setting, + reload: true, + pvisible: false + }, () => { + this.setState({reload: false}) + }) + } + }) + } + + copyColumns = () => { + const { columns } = this.state + let m = [] + let n = [] + + columns.forEach(col => { + m.push(`${col.field}(${col.label})`) + n.push(col.field) + }) + + let oInput = document.createElement('input') + oInput.value = `/*${m.join(',')}*/ + ${n.join(',')}` + document.body.appendChild(oInput) + oInput.select() + document.execCommand('Copy') + document.body.removeChild(oInput) + + message.success('澶嶅埗鎴愬姛銆�') } /** @@ -579,61 +826,143 @@ } render() { - const { menu, config } = this.props - const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches } = this.state + const { config } = this.props + const { columns, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue } = this.state return ( - <div id="model-data-source-wrap"> + <div className="model-data-source-wrap"> + {config.name ? <div className="mk-com-name">{config.name} - 鏁版嵁婧�</div> : null} {loading && <Spin size="large" />} - <Tabs activeKey={activeKey} className="verify-card-box" onChange={this.changeTab}> - <TabPane tab="鏁版嵁婧�" key="setting"> - <SettingForm - menu={menu} - dict={this.props.dict} + <Tabs activeKey={activeKey} className="data-source-card-box" onChange={this.changeTab}> + <TabPane tab={ + <span> + 鏁版嵁婧� + {config.type !== 'interface' ? <CopyOutlined title="澶嶅埗鏁版嵁婧�" className="mk-copy-datasource" onClick={this.copyDatasource}/> : null} + {config.type !== 'interface' ? <SnippetsOutlined title="瀵煎叆鏁版嵁婧�" className="mk-paste-datasource" onClick={() => this.setState({pvisible: true})}/> : null} + </span> + } key="setting"> + {!reload ? <SettingForm config={config} columns={columns} setting={setting} scripts={scripts} wrappedComponentRef={(inst) => this.settingForm = inst} - /> + /> : null} </TabPane> - <TabPane tab="瀛楁闆�" key="columns"> - <ColForm dict={this.props.dict} columnChange={this.columnChange}/> + {config.subtype !== 'basetable' ? <TabPane tab={ + <span> + 瀛楁闆� + {columns.length ? <span className="count-tip">{columns.length}</span> : null} + <CopyOutlined title="浠ラ�楀彿鎷兼帴褰㈠紡澶嶅埗瀛楁" className="mk-copy-fields" onClick={this.copyColumns}/> + </span> + } key="columns"> + <ColForm columnChange={this.columnChange}/> <FieldsComponent config={{...config, columns}} type="fields" - tableFields={menu.tableFields} updatefield={this.updatefields} /> - <EditTable data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> - </TabPane> + <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/> + </TabPane> : null} <TabPane tab={ <span> 鑷畾涔夎剼鏈� {scripts.length ? <span className="count-tip">{scripts.length}</span> : null} </span> - } key="scripts"> + } key="scripts" id="mk-scripts-tabpane"> + {scripts.length ? <BorderOutlined className="full-scripts" onClick={() => { + if (this.scriptsForm && (this.scriptsForm.state.editItem || (this.scriptsForm.props.form.getFieldValue('sql') && !/^\s+$/.test(this.scriptsForm.props.form.getFieldValue('sql'))))) { + notification.warning({ + top: 92, + message: '璇蜂繚瀛樿嚜瀹氫箟鑴氭湰锛�', + duration: 5 + }) + return + } + this.setState({visible: true, script: null, scriptValue: ''}) + }}/> : null} <CustomScriptsForm setting={setting} searches={searches} + defaultsql={defaultsql} initsql={this.state.initsql} - dict={this.props.dict} customScripts={scripts} systemScripts={this.state.systemScripts} scriptsChange={this.scriptsChange} scriptSubmit={this.scriptSubmit} wrappedComponentRef={(inst) => this.scriptsForm = inst} /> - <Table - bordered - rowKey="uuid" - className="custom-table" - dataSource={scripts} - columns={scriptsColumns} - pagination={false} - /> + <EditTable actions={['move']} data={scripts} columns={scriptsColumns} onChange={this.changeScripts}/> </TabPane> </Tabs> + <Modal + wrapClassName="model-custom-view-scripts-modal" + title="鑷畾涔夎剼鏈�" + visible={visible} + width={'95vw'} + maskClosable={false} + destroyOnClose + > + <img className="unfull-scripts" src={MinView} onClick={() => this.setState({visible: false, script: null})} alt=""/> + <div className="script-table-wrap"> + {scripts.map(item => { + let title = item.sql.match(/^\s*\/\*.+\*\//) + title = title && title[0] ? title[0] : '' + let _text = title ? item.sql.replace(title, '') : item.sql + + return ( + <div className={'script-item ' + (script && script.uuid === item.uuid ? 'active' : '') } key={item.uuid}> + <div style={{cursor: 'pointer'}} onClick={() => { + this.setState({script: item, scriptValue: item.sql}) + }}> + {title ? <div style={{color: '#a50', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis'}}>{title}</div> : null} + <Paragraph copyable={{ text: item.sql }} ellipsis={{ rows: 4 }}>{_text}</Paragraph> + <div>{item.status === 'false' ? + <span style={{color: '#ff4d4f', marginLeft: '20px'}}> + 绂佺敤 + <StopOutlined style={{marginLeft: '5px'}} /> + </span> : + <span style={{color: '#26C281', marginLeft: '20px'}}> + 鍚敤 + <CheckCircleOutlined style={{marginLeft: '5px'}}/> + </span>} + </div> + </div> + <div style={{textAlign: 'right'}}> + <span className="operation-btn" onClick={() => this.handleStatus(item)} style={{color: '#8E44AD'}}><SwapOutlined /></span> + <Popconfirm + overlayClassName="popover-confirm" + title="纭畾鍒犻櫎鍚�?" + onConfirm={() => this.deleteScript(item) + }> + <span className="operation-btn" style={{color: '#ff4d4f'}}><DeleteOutlined /></span> + </Popconfirm> + </div> + </div> + ) + })} + </div> + <div className="script-button"> + <Button onClick={this.triggerConfirm} loading={this.state.loading} className="mk-green" style={{marginBottom: 15, marginLeft: 40}}> + {script ? '淇濆瓨' : '娣诲姞'} + </Button> + <Button onClick={() => {this.setState({script: null, scriptValue: ''})}} style={{marginBottom: 15, marginLeft: 10}}> + 鍙栨秷 + </Button> + </div> + <CodeMirror value={scriptValue} onChange={(val) => {this.setState({scriptValue: val})}}></CodeMirror> + </Modal> + <Modal + title="绮樿创" + visible={pvisible} + width={600} + maskClosable={false} + onOk={this.pasteSubmit} + onCancel={() => {this.setState({pvisible: false})}} + destroyOnClose + > + <PasteForm wrappedComponentRef={(inst) => this.pasteFormRef = inst} inputSubmit={this.pasteSubmit}/> + </Modal> </div> ) } -- Gitblit v1.8.0