import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Icon, Modal, notification } from 'antd'
|
import html2canvas from 'html2canvas'
|
|
import Api from '@/api'
|
import Utils from '@/utils/utils.js'
|
import zhCN from '@/locales/zh-CN/model.js'
|
import enUS from '@/locales/en-US/model.js'
|
import UserForm from './settingform'
|
import MKEmitter from '@/utils/events.js'
|
import './index.scss'
|
|
class DataSource extends Component {
|
static propTpyes = {
|
btnlog: PropTypes.array,
|
handlelog: PropTypes.func
|
}
|
|
state = {
|
dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
visible: false,
|
loading: false,
|
name: '',
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
trigger = () => {
|
const { config } = this.props
|
|
this.setState({
|
visible: true,
|
loading: false,
|
name: window.GLOB.UserComponentMap.get(config.uuid) || config.name || ''
|
})
|
}
|
|
getUserComponent = () => {
|
let config = fromJS(this.props.config).toJS()
|
let _config = {}
|
|
_config.wrap = config.wrap || {}
|
_config.type = config.type || ''
|
_config.subtype = config.subtype || ''
|
_config.style = config.style || {}
|
_config.subcards = config.subcards || []
|
_config.headerStyle = config.headerStyle || {}
|
_config.action = config.action || []
|
_config.search = config.search || []
|
_config.cols = config.cols || []
|
_config.plot = config.plot || {}
|
|
_config.width = _config.wrap.width || _config.plot.width || config.width || 24
|
|
_config.subcards = _config.subcards.map(card => {
|
if (card.elements) {
|
card.elements = card.elements.map(item => this.resetElement(item))
|
}
|
if (card.backElements) {
|
card.backElements = card.backElements.map(item => this.resetElement(item))
|
}
|
return card
|
})
|
_config.action = _config.action.map(item => {
|
item.verify = null
|
return item
|
})
|
_config.search = _config.search.map(item => {
|
if (item.resourceType === '1') {
|
item.resourceType = '0'
|
item.dataSource = ''
|
item.valueText = ''
|
item.valueText = ''
|
item.options = ''
|
}
|
item.blacklist = []
|
return item
|
})
|
|
_config.cols = _config.cols.map(col => {
|
if (col.type === 'colspan' && col.subcols) {
|
col = this.loopCol(col)
|
} else if (col.type === 'custom' && col.elements) {
|
col.elements = col.elements.map(cell => this.resetElement(cell))
|
} else if (col.type === 'action' && col.elements) {
|
col.elements = col.elements.map(cell => {
|
cell.verify = null
|
return cell
|
})
|
}
|
col.marks = null
|
return col
|
})
|
|
return _config
|
}
|
|
loopCol = (col) => {
|
col.subcols = col.subcols.map(c => {
|
if (c.type === 'colspan' && c.subcols) {
|
c = this.loopCol(c)
|
} else if (c.type === 'custom' && c.elements) {
|
c.elements = c.elements.map(cell => this.resetElement(cell))
|
}
|
c.marks = null
|
return c
|
})
|
|
return col
|
}
|
|
resetElement = (item) => {
|
item.marks = null
|
item.verify = null
|
|
if (item.datatype === 'dynamic') {
|
if (item.eleType === 'icon') {
|
item.tooltip = item.field
|
} else if (item.eleType === 'slider') {
|
item.value = 50
|
} else {
|
item.value = item.field
|
}
|
|
item.datatype = 'static'
|
item.field = ''
|
}
|
if (item.link === 'dynamic') {
|
item.link = 'static'
|
}
|
return item
|
}
|
|
submit = () => {
|
const { config } = this.props
|
|
this.verifyRef.handleConfirm().then(res => {
|
document.getElementsByClassName('menu-view')[0].classList.add('saving')
|
this.setState({loading: true})
|
setTimeout(() => {
|
let template = this.getUserComponent()
|
html2canvas(document.getElementById(config.uuid)).then(canvas => {
|
let img = canvas.toDataURL('image/png') // 获取生成的图片
|
Api.fileuploadbase64(img, 'cloud').then(result => {
|
if (result.status) {
|
Api.getSystemConfig({
|
func: 's_custom_components_adduptdel',
|
c_id: config.uuid,
|
images: Utils.getcloudurl(result.Images),
|
c_name: res.name,
|
long_param: window.btoa(window.encodeURIComponent(JSON.stringify(template))),
|
del_type: ''
|
}).then(response => {
|
if (response.status) {
|
this.setState({loading: false, visible: false})
|
notification.success({
|
top: 92,
|
message: '保存成功',
|
duration: 2
|
})
|
document.getElementsByClassName('menu-view')[0].classList.remove('saving')
|
MKEmitter.emit('updateCustomComponent')
|
} else {
|
this.setState({loading: false})
|
notification.warning({
|
top: 92,
|
message: response.message,
|
duration: 5
|
})
|
}
|
})
|
} else {
|
this.setState({loading: false})
|
notification.warning({
|
top: 92,
|
message: result.ErrMesg,
|
duration: 5
|
})
|
}
|
})
|
})
|
}, 300)
|
})
|
}
|
|
cancel = () => {
|
this.setState({ visible: false })
|
document.getElementsByClassName('menu-view')[0].classList.remove('saving')
|
}
|
|
render () {
|
const { visible, dict, loading, name } = this.state
|
|
return (
|
<div className="user-component-wrap">
|
<Icon type="user" title="生成自定义组件" onClick={this.trigger} />
|
<Modal
|
wrapClassName="popview-modal"
|
title="自定义组件"
|
visible={visible}
|
width={500}
|
maskClosable={false}
|
confirmLoading={loading}
|
onOk={this.submit}
|
onCancel={this.cancel}
|
destroyOnClose
|
>
|
<UserForm dict={dict} name={name} inputSubmit={this.submit} wrappedComponentRef={(inst) => this.verifyRef = inst}/>
|
</Modal>
|
</div>
|
)
|
}
|
}
|
|
export default DataSource
|