|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349 |
- 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; };
-
- // Mixins
- import Colorable from '../../mixins/colorable';
- // Utilities
- import mixins from '../../util/mixins';
- import { genPoints } from './helpers/core';
- import { genPath as _genPath } from './helpers/path';
- export default mixins(Colorable).extend({
- name: 'VSparkline',
- props: {
- autoDraw: Boolean,
- autoDrawDuration: {
- type: Number,
- default: 2000
- },
- autoDrawEasing: {
- type: String,
- default: 'ease'
- },
- autoLineWidth: {
- type: Boolean,
- default: false
- },
- color: {
- type: String,
- default: 'primary'
- },
- fill: {
- type: Boolean,
- default: false
- },
- gradient: {
- type: Array,
- default: function _default() {
- return [];
- }
- },
- gradientDirection: {
- type: String,
- validator: function validator(val) {
- return ['top', 'bottom', 'left', 'right'].includes(val);
- },
- default: 'top'
- },
- height: {
- type: [String, Number],
- default: 75
- },
- labels: {
- type: Array,
- default: function _default() {
- return [];
- }
- },
- lineWidth: {
- type: [String, Number],
- default: 4
- },
- padding: {
- type: [String, Number],
- default: 8
- },
- smooth: {
- type: [Boolean, Number, String],
- default: false
- },
- showLabels: Boolean,
- type: {
- type: String,
- default: 'trend',
- validator: function validator(val) {
- return ['trend', 'bar'].includes(val);
- }
- },
- value: {
- type: Array,
- default: function _default() {
- return [];
- }
- },
- width: {
- type: [Number, String],
- default: 300
- },
- labelSize: {
- type: [Number, String],
- default: 7
- }
- },
- data: function data() {
- return {
- lastLength: 0
- };
- },
- computed: {
- parsedPadding: function parsedPadding() {
- return Number(this.padding);
- },
- parsedWidth: function parsedWidth() {
- return Number(this.width);
- },
- totalBars: function totalBars() {
- return this.value.length;
- },
- _lineWidth: function _lineWidth() {
- if (this.autoLineWidth && this.type !== 'trend') {
- var totalPadding = this.parsedPadding * (this.totalBars + 1);
- return (this.parsedWidth - totalPadding) / this.totalBars;
- } else {
- return Number(this.lineWidth) || 4;
- }
- },
- boundary: function boundary() {
- var height = Number(this.height);
- return {
- minX: this.parsedPadding,
- minY: this.parsedPadding,
- maxX: this.parsedWidth - this.parsedPadding,
- maxY: height - this.parsedPadding
- };
- },
- hasLabels: function hasLabels() {
- return Boolean(this.showLabels || this.labels.length > 0 || this.$scopedSlots.label);
- },
- parsedLabels: function parsedLabels() {
- var labels = [];
- var points = this.points;
- var len = points.length;
- for (var i = 0; labels.length < len; i++) {
- var item = points[i];
- var value = this.labels[i];
- if (!value) {
- value = item === Object(item) ? item.value : item;
- }
- labels.push(_extends({}, item, {
- value: String(value)
- }));
- }
- return labels;
- },
- points: function points() {
- return genPoints(this.value.slice(), this.boundary, this.type);
- },
- textY: function textY() {
- return this.boundary.maxY + 6;
- }
- },
- watch: {
- value: {
- immediate: true,
- handler: function handler() {
- var _this = this;
-
- this.$nextTick(function () {
- if (!_this.autoDraw || _this.type === 'bar') return;
- var path = _this.$refs.path;
- var length = path.getTotalLength();
- if (!_this.fill) {
- path.style.transition = 'none';
- path.style.strokeDasharray = length + ' ' + length;
- path.style.strokeDashoffset = Math.abs(length - (_this.lastLength || 0)).toString();
- path.getBoundingClientRect();
- path.style.transition = 'stroke-dashoffset ' + _this.autoDrawDuration + 'ms ' + _this.autoDrawEasing;
- path.style.strokeDashoffset = '0';
- } else {
- path.style.transformOrigin = 'bottom center';
- path.style.transition = 'none';
- path.style.transform = 'scaleY(0)';
- path.getBoundingClientRect();
- path.style.transition = 'transform ' + _this.autoDrawDuration + 'ms ' + _this.autoDrawEasing;
- path.style.transform = 'scaleY(1)';
- }
- _this.lastLength = length;
- });
- }
- }
- },
- methods: {
- genGradient: function genGradient() {
- var _this2 = this;
-
- var gradientDirection = this.gradientDirection;
- var gradient = this.gradient.slice();
- // Pushes empty string to force
- // a fallback to currentColor
- if (!gradient.length) gradient.push('');
- var len = Math.max(gradient.length - 1, 1);
- var stops = gradient.reverse().map(function (color, index) {
- return _this2.$createElement('stop', {
- attrs: {
- offset: index / len,
- 'stop-color': color || _this2.color || 'currentColor'
- }
- });
- });
- return this.$createElement('defs', [this.$createElement('linearGradient', {
- attrs: {
- id: this._uid,
- x1: +(gradientDirection === 'left'),
- y1: +(gradientDirection === 'top'),
- x2: +(gradientDirection === 'right'),
- y2: +(gradientDirection === 'bottom')
- }
- }, stops)]);
- },
- genG: function genG(children) {
- return this.$createElement('g', {
- style: {
- fontSize: '8',
- textAnchor: 'middle',
- dominantBaseline: 'mathematical',
- fill: this.color || 'currentColor'
- }
- }, children);
- },
- genLabels: function genLabels() {
- if (!this.hasLabels) return undefined;
- return this.genG(this.parsedLabels.map(this.genText));
- },
- genPath: function genPath() {
- var radius = this.smooth === true ? 8 : Number(this.smooth);
- return this.$createElement('path', {
- attrs: {
- id: this._uid,
- d: _genPath(this.points.slice(), radius, this.fill, Number(this.height)),
- fill: this.fill ? 'url(#' + this._uid + ')' : 'none',
- stroke: this.fill ? 'none' : 'url(#' + this._uid + ')'
- },
- ref: 'path'
- });
- },
- genText: function genText(item, index) {
- var children = this.$scopedSlots.label ? this.$scopedSlots.label({ index: index, value: item.value }) : item.value;
- return this.$createElement('text', {
- attrs: {
- x: item.x,
- y: this.textY
- }
- }, [children]);
- },
- genBar: function genBar() {
- if (!this.value || this.totalBars < 2) return undefined;
- var width = this.width,
- height = this.height,
- parsedPadding = this.parsedPadding,
- _lineWidth = this._lineWidth;
-
- var viewWidth = width || this.totalBars * parsedPadding * 2;
- var viewHeight = height || 75;
- var boundary = {
- minX: parsedPadding,
- minY: parsedPadding,
- maxX: Number(viewWidth) - parsedPadding,
- maxY: Number(viewHeight) - parsedPadding
- };
- var props = _extends({}, this.$props);
- props.points = genPoints(this.value, boundary, this.type);
- var totalWidth = boundary.maxX / (props.points.length - 1);
- props.boundary = boundary;
- props.lineWidth = _lineWidth || totalWidth - Number(parsedPadding || 5);
- props.offsetX = 0;
- if (!this.autoLineWidth) {
- props.offsetX = boundary.maxX / this.totalBars / 2 - boundary.minX;
- }
- return this.$createElement('svg', {
- attrs: {
- width: '100%',
- height: '25%',
- viewBox: '0 0 ' + viewWidth + ' ' + viewHeight
- }
- }, [this.genGradient(), this.genClipPath(props.offsetX, props.lineWidth, 'sparkline-bar-' + this._uid), this.hasLabels ? this.genBarLabels(props) : undefined, this.$createElement('g', {
- attrs: {
- transform: 'scale(1,-1) translate(0,-' + boundary.maxY + ')',
- 'clip-path': 'url(#sparkline-bar-' + this._uid + '-clip)',
- fill: 'url(#' + this._uid + ')'
- }
- }, [this.$createElement('rect', {
- attrs: {
- x: 0,
- y: 0,
- width: viewWidth,
- height: viewHeight
- }
- })])]);
- },
- genClipPath: function genClipPath(offsetX, lineWidth, id) {
- var _this3 = this;
-
- var maxY = this.boundary.maxY;
-
- var rounding = typeof this.smooth === 'number' ? this.smooth : this.smooth ? 2 : 0;
- return this.$createElement('clipPath', {
- attrs: {
- id: id + '-clip'
- }
- }, this.points.map(function (item) {
- return _this3.$createElement('rect', {
- attrs: {
- x: item.x + offsetX,
- y: 0,
- width: lineWidth,
- height: Math.max(maxY - item.y, 0),
- rx: rounding,
- ry: rounding
- }
- }, [_this3.autoDraw ? _this3.$createElement('animate', {
- attrs: {
- attributeName: 'height',
- from: 0,
- to: maxY - item.y,
- dur: _this3.autoDrawDuration + 'ms',
- fill: 'freeze'
- }
- }) : undefined]);
- }));
- },
- genBarLabels: function genBarLabels(props) {
- var _this4 = this;
-
- var offsetX = props.offsetX || 0;
- var children = props.points.map(function (item) {
- return _this4.$createElement('text', {
- attrs: {
- x: item.x + offsetX + _this4._lineWidth / 2,
- y: props.boundary.maxY + (Number(_this4.labelSize) || 7),
- 'font-size': Number(_this4.labelSize) || 7
- }
- }, item.value.toString());
- });
- return this.genG(children);
- },
- genTrend: function genTrend() {
- return this.$createElement('svg', this.setTextColor(this.color, {
- attrs: {
- 'stroke-width': this._lineWidth || 1,
- width: '100%',
- height: '25%',
- viewBox: '0 0 ' + this.width + ' ' + this.height
- }
- }), [this.genGradient(), this.genLabels(), this.genPath()]);
- }
- },
- render: function render(h) {
- if (this.totalBars < 2) return undefined;
- return this.type === 'trend' ? this.genTrend() : this.genBar();
- }
- });
- //# sourceMappingURL=VSparkline.js.map
|