iep-ui
Version:
An enterprise-class UI design language and Vue-based implementation
168 lines (145 loc) • 5.17 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _vueTypes = require('../_util/vue-types');
var _vueTypes2 = _interopRequireDefault(_vueTypes);
var _zrender = require('zrender');
var zrender = _interopRequireWildcard(_zrender);
var _lodash = require('lodash');
var _elementResizeDetector = require('element-resize-detector');
var _elementResizeDetector2 = _interopRequireDefault(_elementResizeDetector);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
exports['default'] = {
name: 'IepDoubleValueProgress',
props: {
value: _vueTypes2['default'].number.def(0),
valueBgColor: _vueTypes2['default'].string.def('#61DDAA'),
valueTextColor: _vueTypes2['default'].string.def('#2C3542'),
bgColor: _vueTypes2['default'].string.def('#65789B'),
textColor: _vueTypes2['default'].string.def('#fff')
},
data: function data() {
return {
isEmpty: _lodash.isEmpty,
chart: null
};
},
created: function created() {
this.handleWindowResize = (0, _lodash.debounce)(this.handleWindowResize, 300);
},
mounted: function mounted() {
var _this = this;
window.addEventListener('resize', this.handleWindowResize);
this.addChartResizeListener();
this.watchData = this.$watch('value', function (e) {
if (e > 0) {
if (_this.chart) {
_this.chart.clear();
}
var _$refs$chartDom$getBo = _this.$refs.chartDom.getBoundingClientRect(),
width = _$refs$chartDom$getBo.width,
height = _$refs$chartDom$getBo.height;
_this.renderChartView(width, height);
}
}, {
immediate: true,
deep: true
});
},
beforeDestroy: function beforeDestroy() {
window.removeEventListener('resize', this.handleWindowResize);
this.watchData();
if (this.chart) {
this.chart.dispose();
this.chart = null;
}
},
methods: {
handleWindowResize: function handleWindowResize() {
if (!this.chart) return;
var _$refs$chartDom$getBo2 = this.$refs.chartDom.getBoundingClientRect(),
width = _$refs$chartDom$getBo2.width,
height = _$refs$chartDom$getBo2.height;
this.renderChartView(width, height);
},
addChartResizeListener: function addChartResizeListener() {
var _this2 = this;
var instance = (0, _elementResizeDetector2['default'])({
strategy: 'scroll',
callOnAdd: true
});
instance.listenTo(this.$el, function () {
if (!_this2.chart) return;
var _$refs$chartDom$getBo3 = _this2.$refs.chartDom.getBoundingClientRect(),
width = _$refs$chartDom$getBo3.width,
height = _$refs$chartDom$getBo3.height;
_this2.renderChartView(width, height);
});
},
renderChartView: function renderChartView(width, height) {
var _$props = this.$props,
value = _$props.value,
valueBgColor = _$props.valueBgColor,
valueTextColor = _$props.valueTextColor,
bgColor = _$props.bgColor,
textColor = _$props.textColor;
var dom = this.$refs.chartDom;
if ((0, _lodash.isEmpty)(dom) || !dom) {
return false;
}
this.chart = zrender.init(dom);
var scale = width / 100;
var rightValue = parseInt(100 * 100 - value * 100) / 100;
var panelTop = new zrender.Rect({
shape: {
width: width,
height: height,
r: 3.2
},
style: {
fill: bgColor
}
});
var leftText = new zrender.Text({
style: {
text: value + '%',
lineHeight: height,
x: scale * value / 2 - (value + '%').length * 9 / 2 < 0 ? 0 : scale * value / 2 - (value + '%').length * 9 / 2,
z: 2,
fontSize: 12,
fill: value <= 0 ? 'rgba(0,0,0,0)' : valueTextColor
}
});
var panelBottom = new zrender.Rect({
shape: {
width: scale * value,
height: height,
r: 3.2
},
style: {
fill: valueBgColor
}
});
var rightText = new zrender.Text({
style: {
text: rightValue + '%',
x: scale * value + (width - scale * value) / 2 - (rightValue + '%').length * 9 / 2 > width - (rightValue + '%').length * 9 ? width - (rightValue + '%').length * 9 : scale * value + (width - scale * value) / 2 - (rightValue + '%').length * 9 / 2,
lineHeight: height,
z: 2,
fontSize: 12,
fill: rightValue <= 0 ? 'rgba(0,0,0,0)' : textColor
}
});
this.chart.add(panelTop);
this.chart.add(panelBottom);
this.chart.add(leftText);
this.chart.add(rightText);
}
},
render: function render() {
var h = arguments[0];
return h('div', { ref: 'chartDom' });
}
};