| | |
| | | import { is, fromJS } from 'immutable' |
| | | import { Chart } from '@antv/g2' |
| | | import { connect } from 'react-redux' |
| | | import DataSet from '@antv/data-set' |
| | | import DataSet, { DataView } from '@antv/data-set' |
| | | import { Spin, Empty, notification } from 'antd' |
| | | import moment from 'moment' |
| | | |
| | | import Api from '@/api' |
| | | import Utils from '@/utils/utils.js' |
| | | import { modifyTabview } from '@/store/action' |
| | | import { chartColors } from '@/utils/option.js' |
| | | import asyncComponent from '@/utils/asyncComponent' |
| | | // import asyncComponent from '@/utils/asyncComponent' |
| | | import UtilsDM from '@/utils/utils-datamanage.js' |
| | | import MKEmitter from '@/utils/events.js' |
| | | import NormalHeader from '@/tabviews/custom/components/share/normalheader' |
| | | import './index.scss' |
| | | |
| | | const NormalHeader = asyncComponent(() => import('@/tabviews/custom/components/share/normalheader')) |
| | | // const NormalHeader = asyncComponent(() => import('@/tabviews/custom/components/share/normalheader')) |
| | | |
| | | class PieChart extends Component { |
| | | static propTpyes = { |
| | |
| | | _sync = false |
| | | } |
| | | |
| | | if (config.plot.title || config.search.length > 0) { |
| | | _config.plot.height = _config.plot.height - 80 |
| | | } else { |
| | | _config.plot.height = _config.plot.height - 30 |
| | | } |
| | | _config.style.height = config.plot.height || 400 |
| | | |
| | | if (_config.style) { |
| | | _config.style = {..._config.style, minHeight: (config.plot.height || 400)} |
| | | } else { |
| | | _config.style = {minHeight: (config.plot.height || 400)} |
| | | } |
| | | let decimal = 0 |
| | | _config.columns.forEach(col => { |
| | | if (_config.plot.Yaxis === col.field && /Decimal/ig.test(col.datatype)) { |
| | | decimal = +col.datatype.replace(/^Decimal\(18,/ig, '').replace(/\)/ig, '') |
| | | } |
| | | }) |
| | | |
| | | _config.plot.$decimal = decimal |
| | | |
| | | this.setState({ |
| | | config: _config, |
| | |
| | | this.setState({sync: false, data: _data}, () => { |
| | | this.handleData() |
| | | }) |
| | | } else if (nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { |
| | | if (config.setting.syncRefresh === 'true') { |
| | | this.setState({}, () => { |
| | | this.loadData() |
| | | }) |
| | | } |
| | | } else if (config.setting.syncRefresh && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { |
| | | this.setState({}, () => { |
| | | this.loadData() |
| | | }) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | componentDidMount () { |
| | | MKEmitter.addListener('reloadData', this.reloadData) |
| | | MKEmitter.addListener('resetSelectLine', this.resetParentParam) |
| | | this.handleTimer() |
| | | } |
| | | |
| | | /** |
| | | * @description 组件销毁,清除state更新,清除快捷键设置 |
| | | */ |
| | | componentWillUnmount () { |
| | | clearTimeout(this.timer) |
| | | this.setState = () => { |
| | | return |
| | | } |
| | | MKEmitter.removeListener('reloadData', this.reloadData) |
| | | MKEmitter.removeListener('resetSelectLine', this.resetParentParam) |
| | | } |
| | | |
| | | handleTimer = () => { |
| | | const { config } = this.state |
| | | |
| | | if (!config.timer) return |
| | | |
| | | const _change = { '15s': 15000, '30s': 30000, '1min': 60000, '5min': 300000, '10min': 600000, '15min': 900000, '30min': 1800000, '1hour': 3600000 } |
| | | |
| | | let timer = _change[config.timer] |
| | | |
| | | if (!timer) return |
| | | |
| | | let _param = { |
| | | func: 's_get_timers_role', |
| | | LText: `select '${window.GLOB.appkey || ''}','${config.uuid}'`, |
| | | timer_type: config.timer, |
| | | component_id: config.uuid |
| | | } |
| | | |
| | | _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') // 时间戳 |
| | | _param.LText = Utils.formatOptions(_param.LText) // 关键字符替换,base64加密 |
| | | _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp) // md5密钥 |
| | | |
| | | Api.getSystemConfig(_param).then(result => { |
| | | if (!result.status) { |
| | | notification.warning({ |
| | | top: 92, |
| | | message: result.message, |
| | | duration: 5 |
| | | }) |
| | | return |
| | | } else if (result.run_type) { |
| | | this.setState({timer}) |
| | | this.timer = setTimeout(() => { |
| | | this.timerTask() |
| | | }, timer) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | timerTask = () => { |
| | | const { timer } = this.state |
| | | if (!timer) return |
| | | |
| | | this.loadData(true) |
| | | |
| | | this.timer = setTimeout(() => { |
| | | this.timerTask() |
| | | }, timer) |
| | | } |
| | | |
| | | reloadData = (menuId) => { |
| | | const { config } = this.state |
| | | |
| | | if (config.uuid !== menuId) return |
| | | |
| | | this.loadData() |
| | | } |
| | | |
| | | resetParentParam = (MenuID, id) => { |
| | |
| | | } |
| | | |
| | | handleData = () => { |
| | | let _element = document.getElementById(this.state.chartId) |
| | | const { plot, chartId } = this.state |
| | | |
| | | let _element = document.getElementById(chartId) |
| | | if (_element) { |
| | | _element.innerHTML = '' |
| | | } |
| | | this.pierender() |
| | | |
| | | if (plot.shape === 'nest') { |
| | | this.nestrender() |
| | | } else { |
| | | this.pierender() |
| | | } |
| | | } |
| | | |
| | | async loadData () { |
| | | async loadData (hastimer) { |
| | | const { mainSearch, menuType } = this.props |
| | | const { config, arr_field, search, BID } = this.state |
| | | |
| | |
| | | } |
| | | |
| | | let searches = fromJS(search).toJS() |
| | | if (mainSearch && mainSearch.length > 0) { // 主表搜索条件 |
| | | if (config.setting.useMSearch && mainSearch && mainSearch.length > 0) { // 主表搜索条件 |
| | | let keys = searches.map(item => item.key) |
| | | mainSearch.forEach(item => { |
| | | if (!keys.includes(item.key)) { |
| | |
| | | }) |
| | | } |
| | | |
| | | this.setState({ |
| | | loading: true |
| | | }) |
| | | let requireFields = searches.filter(item => item.required && item.value === '') |
| | | if (requireFields.length > 0) { |
| | | return |
| | | } |
| | | |
| | | if (!hastimer) { |
| | | this.setState({ |
| | | loading: true |
| | | }) |
| | | } |
| | | |
| | | let _orderBy = config.setting.order || '' |
| | | let param = UtilsDM.getQueryDataParams(config.setting, arr_field, searches, _orderBy, '', '', BID, menuType) |
| | |
| | | }) |
| | | } else { |
| | | this.setState({ |
| | | loading: false |
| | | loading: false, |
| | | timer: null |
| | | }) |
| | | notification.error({ |
| | | top: 92, |
| | |
| | | * 3、柱状图数据补齐 |
| | | */ |
| | | getdata = () => { |
| | | const { data, plot, config } = this.state |
| | | const { data, plot } = this.state |
| | | |
| | | if (!data) { |
| | | this.setState({empty: true}) |
| | | return [] |
| | | } |
| | | |
| | | let decimal = 0 |
| | | config.columns.forEach(col => { |
| | | if (plot.Yaxis === col.field && /Decimal/ig.test(col.datatype)) { |
| | | decimal = +col.datatype.replace(/^Decimal\(18,/ig, '').replace(/\)/ig, '') |
| | | } |
| | | }) |
| | | |
| | | let _data = [] |
| | | let _cdata = fromJS(data).toJS() |
| | |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | item[plot.Yaxis] = 0 |
| | | return |
| | | } |
| | | } else if (!item[plot.Xaxis]) { |
| | | return |
| | | } |
| | | |
| | | if (item[plot.Xaxis] && !_mdata.has(item[plot.Xaxis])) { |
| | | if (!_mdata.has(item[plot.Xaxis])) { |
| | | item.$count = 1 |
| | | _mdata.set(item[plot.Xaxis], item) |
| | | } else if (item[plot.Xaxis]) { |
| | | } else { |
| | | let _item = _mdata.get(item[plot.Xaxis]) |
| | | _item.$count++ |
| | | _item[plot.Yaxis] += item[plot.Yaxis] |
| | |
| | | _data = [..._mdata.values()] |
| | | _data = _data.map(item => { |
| | | item[plot.Yaxis] = item[plot.Yaxis] / item.$count |
| | | item[plot.Yaxis] = item[plot.Yaxis].toFixed(decimal) |
| | | item[plot.Yaxis] = +item[plot.Yaxis] |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | |
| | | return item |
| | | }) |
| | |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | item[plot.Yaxis] = 0 |
| | | return |
| | | } |
| | | } else if (!item[plot.Xaxis]) { |
| | | return |
| | | } |
| | | |
| | | if (item[plot.Xaxis] && !_mdata.has(item[plot.Xaxis])) { |
| | | if (!_mdata.has(item[plot.Xaxis])) { |
| | | _mdata.set(item[plot.Xaxis], item) |
| | | } else if (item[plot.Xaxis]) { |
| | | } else { |
| | | let _item = _mdata.get(item[plot.Xaxis]) |
| | | _item[plot.Yaxis] += item[plot.Yaxis] |
| | | _mdata.set(item[plot.Xaxis], _item) |
| | |
| | | |
| | | _data = [..._mdata.values()] |
| | | _data = _data.map(item => { |
| | | item[plot.Yaxis] = item[plot.Yaxis].toFixed(decimal) |
| | | item[plot.Yaxis] = +item[plot.Yaxis] |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | return item |
| | | }) |
| | | } else { // plot.repeat === 'unrepeat' |
| | | let _mdata = new Map() |
| | | _cdata.forEach(item => { |
| | | if (item[plot.Xaxis] && !_mdata.has(item[plot.Xaxis])) { |
| | | |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | item[plot.Yaxis] = 0 |
| | | } |
| | | } |
| | | |
| | | item[plot.Yaxis] = item[plot.Yaxis].toFixed(decimal) |
| | | item[plot.Yaxis] = +item[plot.Yaxis] |
| | | |
| | | _mdata.set(item[plot.Xaxis], item) |
| | | if (!item[plot.Xaxis] || _mdata.has(item[plot.Xaxis])) { |
| | | return |
| | | } |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | return |
| | | } |
| | | } |
| | | |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | |
| | | _mdata.set(item[plot.Xaxis], item) |
| | | }) |
| | | |
| | | _data = [..._mdata.values()] |
| | | } |
| | | |
| | | this.setState({empty: _data.length === 0}) |
| | | |
| | | return _data |
| | | } |
| | | |
| | | getnestdata = () => { |
| | | const { data, plot } = this.state |
| | | |
| | | if (!data) { |
| | | this.setState({empty: true}) |
| | | return [] |
| | | } |
| | | |
| | | let _data = [] |
| | | let _cdata = fromJS(data).toJS() |
| | | |
| | | if (plot.repeat === 'average') { |
| | | let _mdata = new Map() |
| | | let map = new Map() |
| | | let sort = 1 |
| | | _cdata.forEach(item => { |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | return |
| | | } |
| | | } else if (!item[plot.Xaxis] || !item[plot.type]) { |
| | | return |
| | | } |
| | | |
| | | let sign = item[plot.type] + item[plot.Xaxis] |
| | | |
| | | if (!_mdata.has(sign)) { |
| | | let _sort = sort |
| | | if (map.has(item.type)) { |
| | | _sort = map.get(item.type) |
| | | } else { |
| | | map.set(item.type, _sort) |
| | | sort++ |
| | | } |
| | | |
| | | item.$count = 1 |
| | | item.$sort = _sort |
| | | _mdata.set(sign, item) |
| | | } else { |
| | | let _item = _mdata.get(sign) |
| | | _item.$count++ |
| | | _item[plot.Yaxis] += item[plot.Yaxis] |
| | | _mdata.set(sign, _item) |
| | | } |
| | | }) |
| | | |
| | | _data = [..._mdata.values()] |
| | | _data = _data.map(item => { |
| | | item[plot.Yaxis] = item[plot.Yaxis] / item.$count |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | |
| | | return item |
| | | }) |
| | | } else if (plot.repeat === 'cumsum') { |
| | | let _mdata = new Map() |
| | | let map = new Map() |
| | | let sort = 1 |
| | | _cdata.forEach(item => { |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | return |
| | | } |
| | | } else if (!item[plot.Xaxis] || !item[plot.type]) { |
| | | return |
| | | } |
| | | |
| | | let sign = item[plot.type] + item[plot.Xaxis] |
| | | |
| | | if (!_mdata.has(sign)) { |
| | | let _sort = sort |
| | | if (map.has(item.type)) { |
| | | _sort = map.get(item.type) |
| | | } else { |
| | | map.set(item.type, _sort) |
| | | sort++ |
| | | } |
| | | |
| | | item.$sort = _sort |
| | | _mdata.set(sign, item) |
| | | } else { |
| | | let _item = _mdata.get(sign) |
| | | _item[plot.Yaxis] += item[plot.Yaxis] |
| | | _mdata.set(sign, _item) |
| | | } |
| | | }) |
| | | |
| | | _data = [..._mdata.values()] |
| | | _data = _data.map(item => { |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | return item |
| | | }) |
| | | } else { // plot.repeat === 'unrepeat' |
| | | let _mdata = new Map() |
| | | let map = new Map() |
| | | let sort = 1 |
| | | _cdata.forEach(item => { |
| | | let sign = item[plot.type] + item[plot.Xaxis] |
| | | if (!item[plot.Xaxis] || !item[plot.type] || _mdata.has(sign)) { |
| | | return |
| | | } |
| | | |
| | | if (typeof(item[plot.Yaxis]) !== 'number') { |
| | | item[plot.Yaxis] = parseFloat(item[plot.Yaxis]) |
| | | if (isNaN(item[plot.Yaxis])) { |
| | | return |
| | | } |
| | | } |
| | | |
| | | let _sort = sort |
| | | if (map.has(item.type)) { |
| | | _sort = map.get(item.type) |
| | | } else { |
| | | map.set(item.type, _sort) |
| | | sort++ |
| | | } |
| | | |
| | | item.$sort = _sort |
| | | item[plot.Yaxis] = +item[plot.Yaxis].toFixed(plot.$decimal) |
| | | |
| | | _mdata.set(sign, item) |
| | | }) |
| | | |
| | | _data = [..._mdata.values()] |
| | | } |
| | | |
| | | this.setState({empty: _data.length === 0}) |
| | | |
| | | return _data |
| | | } |
| | | |
| | | nestrender = () => { |
| | | const { plot, chartId } = this.state |
| | | |
| | | let X_axis = plot.Xaxis |
| | | let Y_axis = plot.Yaxis |
| | | let type = plot.type |
| | | let color = plot.color |
| | | |
| | | let colors = new Map() |
| | | let colorIndex = 0 |
| | | |
| | | if (plot.colors && plot.colors.length > 0) { |
| | | plot.colors.forEach(item => { |
| | | if (!colors.has(item.label)) { |
| | | colors.set(item.label, item.color) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | let _data = this.getnestdata() |
| | | |
| | | const dvx = new DataView().source(_data) |
| | | |
| | | dvx.transform({ |
| | | type: 'sort-by', |
| | | fields: ['$sort'] |
| | | }) |
| | | |
| | | let data = dvx.rows |
| | | |
| | | // 通过 DataSet 计算百分比 |
| | | const dv = new DataView() |
| | | dv.source(data).transform({ |
| | | type: 'percent', |
| | | field: Y_axis, |
| | | dimension: type, |
| | | as: '$percent' |
| | | }) |
| | | |
| | | const dv1 = new DataView() |
| | | dv1.source(data).transform({ |
| | | type: 'percent', |
| | | field: Y_axis, |
| | | dimension: X_axis, |
| | | as: '$percent', |
| | | }) |
| | | |
| | | const chart = new Chart({ |
| | | container: chartId, |
| | | autoFit: true, |
| | | height: this.wrap.offsetHeight - 30, |
| | | padding: 0, |
| | | }) |
| | | |
| | | chart.data(dv.rows) |
| | | |
| | | if (plot.show !== 'value') { |
| | | chart.scale('percent', { |
| | | formatter: (val) => { |
| | | val = val * 100 + '%' |
| | | return val |
| | | } |
| | | }) |
| | | |
| | | Y_axis = '$percent' |
| | | } |
| | | let radius = plot.radius / 100 |
| | | let innerRadius = plot.innerRadius / 100 |
| | | |
| | | chart.coordinate('theta', { |
| | | innerRadius: innerRadius, |
| | | radius: innerRadius + (radius - innerRadius) / 2, |
| | | }) |
| | | chart.tooltip({ |
| | | showTitle: false, |
| | | showMarkers: false, |
| | | }) |
| | | chart.legend(false) |
| | | let chart1 = chart |
| | | .interval() |
| | | .adjust('stack') |
| | | .position(Y_axis) |
| | | .tooltip(`${type}*${Y_axis}`, (type, percent) => { |
| | | if (plot.show !== 'value') { |
| | | percent = (percent * 100).toFixed(2) + '%' |
| | | } |
| | | return { |
| | | name: type, |
| | | value: percent, |
| | | } |
| | | }) |
| | | if (plot.splitLine) { |
| | | chart1.style({ |
| | | lineWidth: plot.splitLine, |
| | | stroke: plot.splitColor, |
| | | }) |
| | | } |
| | | if (plot.colors && plot.colors.length > 0) { |
| | | let limit = chartColors.length |
| | | chart1.color(type, (_type) => { |
| | | if (colors.has(_type)) { |
| | | return colors.get(_type) |
| | | } else { |
| | | let _c = chartColors[colorIndex % limit] |
| | | colors.set(type, _c) |
| | | colorIndex++ |
| | | return _c |
| | | } |
| | | }) |
| | | } else { |
| | | chart1.color(type) |
| | | } |
| | | |
| | | if (plot.label !== 'false') { |
| | | chart1.label(type, { |
| | | offset: -10, |
| | | }) |
| | | } |
| | | |
| | | const outterView = chart.createView() |
| | | |
| | | outterView.data(dv1.rows) |
| | | |
| | | if (plot.show !== 'value') { |
| | | outterView.scale('percent', { |
| | | formatter: (val) => { |
| | | val = val * 100 + '%' |
| | | return val |
| | | } |
| | | }) |
| | | } |
| | | outterView.coordinate('theta', { |
| | | innerRadius: (innerRadius + (radius - innerRadius) / 2) / radius, |
| | | radius: radius |
| | | }) |
| | | let chart2 = outterView |
| | | .interval() |
| | | .adjust('stack') |
| | | .position(Y_axis) |
| | | .tooltip(`${X_axis}*${Y_axis}`, (name, value) => { |
| | | if (plot.show !== 'value') { |
| | | value = (value * 100).toFixed(2) + '%' |
| | | } |
| | | return { |
| | | name: name, |
| | | value: value |
| | | } |
| | | }) |
| | | |
| | | if (plot.splitLine) { |
| | | chart2.style({ |
| | | lineWidth: plot.splitLine, |
| | | stroke: plot.splitColor, |
| | | }) |
| | | } |
| | | if (plot.colors && plot.colors.length > 0) { |
| | | let limit = chartColors.length |
| | | chart2.color(X_axis, (type) => { |
| | | if (colors.has(type)) { |
| | | return colors.get(type) |
| | | } else { |
| | | let _c = chartColors[colorIndex % limit] |
| | | colors.set(type, _c) |
| | | colorIndex++ |
| | | return _c |
| | | } |
| | | }) |
| | | } else { |
| | | chart2.color(X_axis) |
| | | } |
| | | |
| | | if (plot.label !== 'false') { |
| | | if (plot.label === 'inner') { |
| | | chart2.label(Y_axis, { |
| | | offset: -30, |
| | | content: (data) => { |
| | | let _val = '' |
| | | if (plot.show !== 'value') { |
| | | _val = `${(data[Y_axis] * 100).toFixed(2)}%` |
| | | } else { |
| | | _val = `${data[Y_axis]}` |
| | | } |
| | | return _val |
| | | }, |
| | | style: { |
| | | textAlign: 'center', |
| | | fontSize: 16, |
| | | shadowBlur: 2, |
| | | shadowColor: 'rgba(0, 0, 0, .45)', |
| | | fill: '#fff', |
| | | } |
| | | }) |
| | | } else { |
| | | chart2.label(Y_axis, { |
| | | layout: { type: plot.label === 'outer' ? 'pie-spider' : 'fixed-overlap' }, |
| | | labelHeight: 20, |
| | | content: (data) => { |
| | | let _val = '' |
| | | if (plot.show !== 'value') { |
| | | _val = `${(data[Y_axis] * 100).toFixed(2)}%` |
| | | } else { |
| | | _val = `${data[Y_axis]}` |
| | | } |
| | | |
| | | return `${data[X_axis]}: ${_val}` |
| | | }, |
| | | labelLine: { |
| | | style: { |
| | | lineWidth: 0.5, |
| | | }, |
| | | }, |
| | | style: { |
| | | fill: color |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | if (plot.interaction && plot.interaction.length) { |
| | | plot.interaction.forEach(t => { |
| | | chart.interaction(t) |
| | | }) |
| | | } |
| | | chart.render() |
| | | } |
| | | |
| | | /** |
| | |
| | | */ |
| | | pierender = () => { |
| | | const { plot, chartId } = this.state |
| | | let color = plot.color || 'rgba(0, 0, 0, 0.85)' |
| | | |
| | | let X_axis = plot.Xaxis || 'x' |
| | | let Y_axis = plot.Yaxis || 'y' |
| | | let color = plot.color |
| | | |
| | | let data = this.getdata(X_axis, Y_axis) |
| | | let X_axis = plot.Xaxis |
| | | let Y_axis = plot.Yaxis |
| | | |
| | | let data = this.getdata() |
| | | |
| | | const ds = new DataSet() |
| | | const dv = ds.createView().source(data) |
| | |
| | | const chart = new Chart({ |
| | | container: chartId, |
| | | autoFit: true, |
| | | height: plot.height || 400 |
| | | height: this.wrap.offsetHeight - 30 |
| | | }) |
| | | |
| | | if (plot.shape !== 'nightingale' && plot.show !== 'value') { |
| | |
| | | value: value |
| | | } |
| | | }) |
| | | |
| | | if (plot.splitLine) { |
| | | _chart.style({ |
| | | lineWidth: plot.splitLine, |
| | | stroke: plot.splitColor, |
| | | }) |
| | | } |
| | | if (plot.colors && plot.colors.length > 0) { |
| | | let limit = chartColors.length |
| | | _chart.color(X_axis, (type) => { |
| | | if (colors.get(type)) { |
| | | if (colors.has(type)) { |
| | | return colors.get(type) |
| | | } else { |
| | | colors.set(type, chartColors[colorIndex % limit]) |
| | | let _c = chartColors[colorIndex % limit] |
| | | colors.set(type, _c) |
| | | colorIndex++ |
| | | return _c |
| | | } |
| | | }) |
| | | } else { |
| | |
| | | }) |
| | | } else { |
| | | _chart.label(Y_axis, { |
| | | layout: { type: 'pie-spider' }, |
| | | layout: { type: plot.label === 'outer' ? 'pie-spider' : 'fixed-overlap' }, |
| | | labelHeight: 20, |
| | | content: (data) => { |
| | | let _val = '' |
| | |
| | | }) |
| | | } |
| | | } |
| | | chart.interaction('element-active') |
| | | } else { |
| | | chart.axis(false) |
| | | chart.interaction('element-highlight') |
| | | let _chart = chart |
| | | .interval() |
| | | .position(`${X_axis}*${Y_axis}`) |
| | |
| | | if (plot.colors && plot.colors.length > 0) { |
| | | let limit = chartColors.length |
| | | _chart.color(X_axis, (type) => { |
| | | if (colors.get(type)) { |
| | | if (colors.has(type)) { |
| | | return colors.get(type) |
| | | } else { |
| | | colors.set(type, chartColors[colorIndex % limit]) |
| | | let _c = chartColors[colorIndex % limit] |
| | | colors.set(type, _c) |
| | | colorIndex++ |
| | | return _c |
| | | } |
| | | }) |
| | | } else { |
| | |
| | | } |
| | | |
| | | _chart.label(X_axis, _label) |
| | | .style({ |
| | | lineWidth: 1, |
| | | stroke: '#fff', |
| | | } |
| | | if (plot.splitLine) { |
| | | _chart.style({ |
| | | lineWidth: plot.splitLine, |
| | | stroke: plot.splitColor, |
| | | }) |
| | | } |
| | | } |
| | |
| | | ...menu, |
| | | selected: true, |
| | | param: { |
| | | BID: primaryId, |
| | | data: data |
| | | $BID: primaryId |
| | | } |
| | | } |
| | | |
| | |
| | | return tab.MenuID !== newtab.MenuID |
| | | }) |
| | | |
| | | if (this.props.tabviews.length !== tabs.length) { |
| | | if (this.props.tabviews.length > tabs.length) { |
| | | this.props.modifyTabview(fromJS(tabs).toJS()) |
| | | } |
| | | |
| | |
| | | tabs.push(newtab) |
| | | this.props.modifyTabview(tabs) |
| | | }) |
| | | } catch { |
| | | } catch (e) { |
| | | console.warn('菜单打开失败!') |
| | | } |
| | | }) |
| | | } |
| | | |
| | | if (plot.interaction && plot.interaction.length) { |
| | | plot.interaction.forEach(t => { |
| | | chart.interaction(t) |
| | | }) |
| | | } |
| | | chart.render() |
| | | } |
| | | |
| | |
| | | </div> : null |
| | | } |
| | | <NormalHeader config={config} BID={BID} menuType={this.props.menuType} refresh={this.refreshSearch} /> |
| | | <div className="canvas-wrap"> |
| | | <div className="canvas-wrap" ref={ref => this.wrap = ref}> |
| | | <div className={'canvas' + (empty ? ' empty' : '')} id={this.state.chartId}></div> |
| | | </div> |
| | | {empty ? <Empty description={false}/> : null} |