ts-bigscreen-vue/node_modules/v-charts/lib/core.js

441 lines
14 KiB
JavaScript

'use strict';
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var utilsLite = require('utils-lite');
var echartsLib = _interopDefault(require('echarts/lib/echarts'));
require('echarts/lib/component/tooltip');
require('echarts/lib/component/legend');
var numerify = _interopDefault(require('numerify'));
var constants = require('./constants');
var Loading = { render: function render() {
var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('div', { staticClass: "v-charts-component-loading" }, [_c('div', { staticClass: "loader" }, [_c('div', { staticClass: "loading-spinner" }, [_c('svg', { staticClass: "circular", attrs: { "viewBox": "25 25 50 50" } }, [_c('circle', { staticClass: "path", attrs: { "cx": "50", "cy": "50", "r": "20", "fill": "none" } })])])])]);
}, staticRenderFns: []
};
var DataEmpty = { render: function render() {
var _vm = this;var _h = _vm.$createElement;var _c = _vm._self._c || _h;return _c('div', { staticClass: "v-charts-data-empty" }, [_vm._v(" 暂无数据 ")]);
}, staticRenderFns: []
};
var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
function setExtend (options, extend) {
Object.keys(extend).forEach(function (attr) {
var value = extend[attr];
if (~attr.indexOf('.')) {
// eg: a.b.c a.1.b
utilsLite.set(options, attr, value);
} else if (typeof value === 'function') {
// get callback value
options[attr] = value(options[attr]);
} else {
// mixin extend value
if (utilsLite.isArray(options[attr]) && utilsLite.isObject(options[attr][0])) {
// eg: [{ xx: 1 }, { xx: 2 }]
options[attr].forEach(function (option, index) {
options[attr][index] = _extends({}, option, value);
});
} else if (utilsLite.isObject(options[attr])) {
// eg: { xx: 1, yy: 2 }
options[attr] = _extends({}, options[attr], value);
} else {
options[attr] = value;
}
}
});
}
function setMark (seriesItem, marks) {
Object.keys(marks).forEach(function (key) {
if (marks[key]) seriesItem[key] = marks[key];
});
}
function setAnimation (options, animation) {
Object.keys(animation).forEach(function (key) {
options[key] = animation[key];
});
}
var core = {
render: function render(h) {
return h('div', {
class: [utilsLite.camelToKebab(this.$options.name || this.$options._componentTag)],
style: this.canvasStyle
}, [h('div', {
style: this.canvasStyle,
class: { 'v-charts-mask-status': this.dataEmpty || this.loading },
ref: 'canvas'
}), h(DataEmpty, {
style: { display: this.dataEmpty ? '' : 'none' }
}), h(Loading, {
style: { display: this.loading ? '' : 'none' }
}), this.$slots.default]);
},
props: {
data: { type: [Object, Array], default: function _default() {
return {};
}
},
settings: { type: Object, default: function _default() {
return {};
}
},
width: { type: String, default: 'auto' },
height: { type: String, default: '400px' },
beforeConfig: { type: Function },
afterConfig: { type: Function },
afterSetOption: { type: Function },
afterSetOptionOnce: { type: Function },
events: { type: Object },
grid: { type: [Object, Array] },
colors: { type: Array },
tooltipVisible: { type: Boolean, default: true },
legendVisible: { type: Boolean, default: true },
legendPosition: { type: String },
markLine: { type: Object },
markArea: { type: Object },
markPoint: { type: Object },
visualMap: { type: [Object, Array] },
dataZoom: { type: [Object, Array] },
toolbox: { type: [Object, Array] },
initOptions: { type: Object, default: function _default() {
return {};
}
},
title: [Object, Array],
legend: [Object, Array],
xAxis: [Object, Array],
yAxis: [Object, Array],
radar: Object,
tooltip: Object,
axisPointer: [Object, Array],
brush: [Object, Array],
geo: [Object, Array],
timeline: [Object, Array],
graphic: [Object, Array],
series: [Object, Array],
backgroundColor: [Object, String],
textStyle: [Object, Array],
animation: Object,
theme: Object,
themeName: String,
loading: Boolean,
dataEmpty: Boolean,
extend: Object,
judgeWidth: { type: Boolean, default: false },
widthChangeDelay: { type: Number, default: 300 },
tooltipFormatter: { type: Function },
resizeable: { type: Boolean, default: true },
resizeDelay: { type: Number, default: 200 },
changeDelay: { type: Number, default: 0 },
setOptionOpts: { type: [Boolean, Object], default: true },
cancelResizeCheck: Boolean,
notSetUnchange: Array,
log: Boolean
},
watch: {
data: {
deep: true,
handler: function handler(v) {
if (v) {
this.changeHandler();
}
}
},
settings: {
deep: true,
handler: function handler(v) {
if (v.type && this.chartLib) this.chartHandler = this.chartLib[v.type];
this.changeHandler();
}
},
width: 'nextTickResize',
height: 'nextTickResize',
events: {
deep: true,
handler: 'createEventProxy'
},
theme: {
deep: true,
handler: 'themeChange'
},
themeName: 'themeChange',
resizeable: 'resizeableHandler'
},
computed: {
canvasStyle: function canvasStyle() {
return {
width: this.width,
height: this.height,
position: 'relative'
};
},
chartColor: function chartColor() {
return this.colors || this.theme && this.theme.color || constants.DEFAULT_COLORS;
}
},
methods: {
dataHandler: function dataHandler() {
if (!this.chartHandler) return;
var data = this.data;
var _data = data,
_data$columns = _data.columns,
columns = _data$columns === undefined ? [] : _data$columns,
_data$rows = _data.rows,
rows = _data$rows === undefined ? [] : _data$rows;
var extra = {
tooltipVisible: this.tooltipVisible,
legendVisible: this.legendVisible,
echarts: this.echarts,
color: this.chartColor,
tooltipFormatter: this.tooltipFormatter,
_once: this._once
};
if (this.beforeConfig) data = this.beforeConfig(data);
var options = this.chartHandler(columns, rows, this.settings, extra);
if (options) {
if (typeof options.then === 'function') {
options.then(this.optionsHandler);
} else {
this.optionsHandler(options);
}
}
},
nextTickResize: function nextTickResize() {
this.$nextTick(this.resize);
},
resize: function resize() {
if (!this.cancelResizeCheck) {
if (this.$el && this.$el.clientWidth && this.$el.clientHeight) {
this.echartsResize();
}
} else {
this.echartsResize();
}
},
echartsResize: function echartsResize() {
this.echarts && this.echarts.resize();
},
optionsHandler: function optionsHandler(options) {
var _this = this;
// legend
if (this.legendPosition && options.legend) {
options.legend[this.legendPosition] = 10;
if (~['left', 'right'].indexOf(this.legendPosition)) {
options.legend.top = 'middle';
options.legend.orient = 'vertical';
}
}
// color
options.color = this.chartColor;
// echarts self settings
constants.ECHARTS_SETTINGS.forEach(function (setting) {
if (_this[setting]) options[setting] = _this[setting];
});
// animation
if (this.animation) setAnimation(options, this.animation);
// marks
if (this.markArea || this.markLine || this.markPoint) {
var marks = {
markArea: this.markArea,
markLine: this.markLine,
markPoint: this.markPoint
};
var series = options.series;
if (utilsLite.isArray(series)) {
series.forEach(function (item) {
setMark(item, marks);
});
} else if (utilsLite.isObject(series)) {
setMark(series, marks);
}
}
// change inited echarts settings
if (this.extend) setExtend(options, this.extend);
if (this.afterConfig) options = this.afterConfig(options);
var setOptionOpts = this.setOptionOpts;
// map chart not merge
if ((this.settings.bmap || this.settings.amap) && !utilsLite.isObject(setOptionOpts)) {
setOptionOpts = false;
}
// exclude unchange options
if (this.notSetUnchange && this.notSetUnchange.length) {
this.notSetUnchange.forEach(function (item) {
var value = options[item];
if (value) {
if (utilsLite.isEqual(value, _this._store[item])) {
options[item] = undefined;
} else {
_this._store[item] = utilsLite.cloneDeep(value);
}
}
});
if (utilsLite.isObject(setOptionOpts)) {
setOptionOpts.notMerge = false;
} else {
setOptionOpts = false;
}
}
if (this._isDestroyed) return;
if (this.log) console.log(options);
this.echarts.setOption(options, setOptionOpts);
this.$emit('ready', this.echarts, options, echartsLib);
if (!this._once['ready-once']) {
this._once['ready-once'] = true;
this.$emit('ready-once', this.echarts, options, echartsLib);
}
if (this.judgeWidth) this.judgeWidthHandler(options);
if (this.afterSetOption) this.afterSetOption(this.echarts, options, echartsLib);
if (this.afterSetOptionOnce && !this._once['afterSetOptionOnce']) {
this._once['afterSetOptionOnce'] = true;
this.afterSetOptionOnce(this.echarts, options, echartsLib);
}
},
judgeWidthHandler: function judgeWidthHandler(options) {
var _this2 = this;
var widthChangeDelay = this.widthChangeDelay,
resize = this.resize;
if (this.$el.clientWidth || this.$el.clientHeight) {
resize();
} else {
this.$nextTick(function (_) {
if (_this2.$el.clientWidth || _this2.$el.clientHeight) {
resize();
} else {
setTimeout(function (_) {
resize();
if (!_this2.$el.clientWidth || !_this2.$el.clientHeight) {
console.warn(' Can\'t get dom width or height ');
}
}, widthChangeDelay);
}
});
}
},
resizeableHandler: function resizeableHandler(resizeable) {
if (resizeable && !this._once.onresize) this.addResizeListener();
if (!resizeable && this._once.onresize) this.removeResizeListener();
},
init: function init() {
if (this.echarts) return;
var themeName = this.themeName || this.theme || constants.DEFAULT_THEME;
this.echarts = echartsLib.init(this.$refs.canvas, themeName, this.initOptions);
if (this.data) this.changeHandler();
this.createEventProxy();
if (this.resizeable) this.addResizeListener();
},
addResizeListener: function addResizeListener() {
window.addEventListener('resize', this.resizeHandler);
this._once.onresize = true;
},
removeResizeListener: function removeResizeListener() {
window.removeEventListener('resize', this.resizeHandler);
this._once.onresize = false;
},
addWatchToProps: function addWatchToProps() {
var _this3 = this;
var watchedVariable = this._watchers.map(function (watcher) {
return watcher.expression;
});
Object.keys(this.$props).forEach(function (prop) {
if (!~watchedVariable.indexOf(prop) && !~constants.STATIC_PROPS.indexOf(prop)) {
var opts = {};
if (~['[object Object]', '[object Array]'].indexOf(utilsLite.getType(_this3.$props[prop]))) {
opts.deep = true;
}
_this3.$watch(prop, function () {
_this3.changeHandler();
}, opts);
}
});
},
createEventProxy: function createEventProxy() {
var _this4 = this;
// 只要用户使用 on 方法绑定的事件都做一层代理,
// 是否真正执行相应的事件方法取决于该方法是否仍然存在 events 中
// 实现 events 的动态响应
var self = this;
var keys = Object.keys(this.events || {});
keys.length && keys.forEach(function (ev) {
if (_this4.registeredEvents.indexOf(ev) === -1) {
_this4.registeredEvents.push(ev);
_this4.echarts.on(ev, function (ev) {
return function () {
if (ev in self.events) {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
self.events[ev].apply(null, args);
}
};
}(ev));
}
});
},
themeChange: function themeChange(theme) {
this.clean();
this.echarts = null;
this.init();
},
clean: function clean() {
if (this.resizeable) this.removeResizeListener();
this.echarts.dispose();
}
},
created: function created() {
this.echarts = null;
this.registeredEvents = [];
this._once = {};
this._store = {};
this.resizeHandler = utilsLite.debounce(this.resize, this.resizeDelay);
this.changeHandler = utilsLite.debounce(this.dataHandler, this.changeDelay);
this.addWatchToProps();
},
mounted: function mounted() {
this.init();
},
beforeDestroy: function beforeDestroy() {
this.clean();
},
_numerify: numerify
};
module.exports = core;