UNPKG

@progress/kendo-ui

Version:

This package is part of the [Kendo UI for jQuery](http://www.telerik.com/kendo-ui) suite.

1,684 lines (1,334 loc) 69.7 kB
module.exports = /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ({ /***/ 0: /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(883); /***/ }), /***/ 3: /***/ (function(module, exports) { module.exports = function() { throw new Error("define cannot be used indirect"); }; /***/ }), /***/ 857: /***/ (function(module, exports) { module.exports = require("../../kendo.dataviz.core"); /***/ }), /***/ 859: /***/ (function(module, exports) { module.exports = require("../../kendo.drawing"); /***/ }), /***/ 862: /***/ (function(module, exports) { module.exports = require("../../kendo.core"); /***/ }), /***/ 863: /***/ (function(module, exports) { module.exports = require("../../kendo.color"); /***/ }), /***/ 883: /***/ (function(module, exports, __webpack_require__) { var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*********************************************************************** * WARNING: this file is auto-generated. If you change it directly, * your modifications will eventually be lost. The source code is in * `kendo-charts` repository, you should make your changes there and * run `src-modules/sync.sh` in this repository. */ (function(f, define){ !(__WEBPACK_AMD_DEFINE_ARRAY__ = [ __webpack_require__(862), __webpack_require__(863), __webpack_require__(859), __webpack_require__(857) ], __WEBPACK_AMD_DEFINE_FACTORY__ = (f), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); })(function(){ (function ($) { window.kendo.dataviz = window.kendo.dataviz || {}; var dataviz = kendo.dataviz; var getSpacing = dataviz.getSpacing; var defined = dataviz.defined; var constants = dataviz.constants; var BLACK = constants.BLACK; var COORD_PRECISION = constants.COORD_PRECISION; var services = dataviz.services; var deepExtend = dataviz.deepExtend; var isArray = dataviz.isArray; var setDefaultOptions = dataviz.setDefaultOptions; var NumericAxis = dataviz.NumericAxis; var limitValue = dataviz.limitValue; var Box = dataviz.Box; var interpolateValue = dataviz.interpolateValue; var round = dataviz.round; var drawing = kendo.drawing; var DrawingGroup = drawing.Group; var DrawingPath = drawing.Path; var Animation = drawing.Animation; var AnimationFactory = drawing.AnimationFactory; var geometry = kendo.geometry; var Rect = geometry.Rect; var GeometryPoint = geometry.Point; var transform = geometry.transform; var ANGULAR_SPEED = 150; var LINEAR_SPEED = 250; var ARROW = "arrow"; var ARROW_POINTER = "arrowPointer"; var BAR_POINTER = "barPointer"; var DEFAULT_HEIGHT = 200; var DEFAULT_LINE_WIDTH = 0.5; var DEFAULT_WIDTH = 200; var DEGREE = Math.PI / 180; var INSIDE = "inside"; var LINEAR = "linear"; var OUTSIDE = "outside"; var RADIAL_POINTER = "radialPointer"; var RADIAL_RANGE_POINTER = "radialRangePointer"; function pad(bbox, value) { var origin = bbox.getOrigin(); var size = bbox.getSize(); var spacing = getSpacing(value); bbox.setOrigin([ origin.x - spacing.left, origin.y - spacing.top ]); bbox.setSize([ size.width + (spacing.left + spacing.right), size.height + (spacing.top + spacing.bottom) ]); return bbox; } var Group = DrawingGroup; var Path$1 = DrawingPath; var Text = drawing.Text; function buildLabelElement(label, options) { var labelBox = label.box; var textBox = label.children[0].box; var border = options.border || {}; var background = options.background || ""; var wrapper = Path$1.fromRect(new Rect([ labelBox.x1, labelBox.y1 ], [ labelBox.width(), labelBox.height() ]), { stroke: {} }); var text = new Text(label.text, new GeometryPoint(textBox.x1, textBox.y1), { font: options.font, fill: { color: options.color } }); var styleGeometry = pad(text.bbox().clone(), options.padding); var styleBox = Path$1.fromRect(styleGeometry, { stroke: { color: border.width ? border.color : "", width: border.width, dashType: border.dashType, lineJoin: "round", lineCap: "round" }, fill: { color: background } }); var elements = new Group(); elements.append(wrapper); elements.append(styleBox); elements.append(text); return elements; } function getRange(range, min, max) { var from = defined(range.from) ? range.from : constants.MIN_VALUE; var to = defined(range.to) ? range.to : constants.MAX_VALUE; range.from = Math.max(Math.min(to, from), min); range.to = Math.min(Math.max(to, from), max); return range; } function unpad(bbox, value) { var spacing = getSpacing(value); spacing.left = -spacing.left; spacing.top = -spacing.top; spacing.right = -spacing.right; spacing.bottom = -spacing.bottom; return pad(bbox, spacing); } var DEFAULT_MARGIN = 5; var Path = DrawingPath; var Surface = drawing.Surface; var Gauge = dataviz.Class.extend({ init: function(element, userOptions, theme, context) { if (context === void 0) { context = {}; } this.element = element; this.theme = theme; this.contextService = new services.ChartService(this, context); this._originalOptions = deepExtend({}, this.options, userOptions); this.options = deepExtend({}, this._originalOptions); this._initTheme(theme); this.redraw(); }, destroy: function() { if (this.surface) { this.surface.destroy(); this.surface = null; } delete this.element; delete this.surfaceElement; }, value: function(pointerValue) { var pointer = this.pointers[0]; if (arguments.length === 0) { return pointer.value(); } pointer.value(pointerValue); this._setValueOptions(pointerValue); }, _draw: function() { var surface = this.surface; surface.clear(); surface.draw(this._visuals); }, exportVisual: function() { return this._visuals; }, allValues: function(values) { var pointers = this.pointers; var allValues = []; if (arguments.length === 0) { for (var i = 0; i < pointers.length; i++) { allValues.push(pointers[i].value()); } return allValues; } if (isArray(values)) { for (var i$1 = 0; i$1 < values.length; i$1++) { if (dataviz.isNumber(values[i$1])) { pointers[i$1].value(values[i$1]); } } } this._setValueOptions(values); }, _setValueOptions: function(values) { var pointers = [].concat(this.options.pointer); var arrayValues = [].concat(values); for (var i = 0; i < arrayValues.length; i++) { pointers[i].value = arrayValues[i]; } }, resize: function() { this.noTransitionsRedraw(); }, noTransitionsRedraw: function() { var transitions = this.options.transitions; this._toggleTransitions(false); this.redraw(); this._toggleTransitions(transitions); }, redraw: function() { var size = this._surfaceSize(); var wrapper = new Rect([ 0, 0 ], [ size.width, size.height ]); this._initSurface(); this.gaugeArea = this._createGaugeArea(); this._createModel(); var bbox = unpad(wrapper.bbox(), this._gaugeAreaMargin); this.reflow(bbox); }, setOptions: function(options, theme) { this._originalOptions = deepExtend(this._originalOptions, options); this.options = deepExtend({}, this._originalOptions); this._initTheme(theme); this.redraw(); }, setDirection: function(rtl) { this.contextService.rtl = Boolean(rtl); if (this.surface && this.surface.type === 'svg') { this.surface.destroy(); this.surface = null; } }, setIntlService: function(intl) { this.contextService.intl = intl; }, _initTheme: function(theme) { var currentTheme = theme || this.theme || {}; this.theme = currentTheme; this.options = deepExtend({}, currentTheme, this.options); var options = this.options; var pointer = options.pointer; if (isArray(pointer)) { var pointers = []; for (var i = 0; i < pointer.length; i++) { pointers.push(deepExtend({}, currentTheme.pointer, pointer[i])); } options.pointer = pointers; } }, _createGaugeArea: function() { var options = this.options.gaugeArea; var size = this.surface.size(); var border = options.border || {}; var areaGeometry = new Rect([ 0, 0 ], [ size.width, size.height ]); this._gaugeAreaMargin = options.margin || DEFAULT_MARGIN; if (border.width > 0) { areaGeometry = unpad(areaGeometry, border.width); } var gaugeArea = Path.fromRect(areaGeometry, { stroke: { color: border.width ? border.color : "", width: border.width, dashType: border.dashType, lineJoin: "round", lineCap: "round" }, fill: { color: options.background } }); return gaugeArea; }, _initSurface: function() { var ref = this; var options = ref.options; var surface = ref.surface; var element = this._surfaceElement(); var size = this._surfaceSize(); dataviz.elementSize(element, size); if (!surface || surface.options.type !== options.renderAs) { if (surface) { surface.destroy(); } this.surface = Surface.create(element, { type: options.renderAs }); } else { this.surface.clear(); this.surface.resize(); } }, _surfaceSize: function() { var options = this.options; var size = this._getSize(); if (options.gaugeArea) { deepExtend(size, options.gaugeArea); } return size; }, _surfaceElement: function() { if (!this.surfaceElement) { this.surfaceElement = document.createElement('div'); this.element.appendChild(this.surfaceElement); } return this.surfaceElement; }, getSize: function() { return this._getSize(); }, _getSize: function() { var element = this.element; var defaultSize = this._defaultSize(); var width = element.offsetWidth; var height = element.offsetHeight; if (!width) { width = defaultSize.width; } if (!height) { height = defaultSize.height; } return { width: width, height: height }; }, _defaultSize: function() { return { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT }; }, _toggleTransitions: function(value) { var this$1 = this; this.options.transitions = value; for (var i = 0; i < this.pointers.length; i++) { this$1.pointers[i].options.animation.transitions = value; } } }); setDefaultOptions(Gauge, { plotArea: {}, theme: "default", renderAs: "", pointer: {}, scale: {}, gaugeArea: {} }); var Path$2 = DrawingPath; var Group$2 = DrawingGroup; var Point = GeometryPoint; function renderAxisTick(tickRenderOptions, tickOptions) { var position = tickRenderOptions.position; var tickX = tickRenderOptions.tickX; var tickY = tickRenderOptions.tickY; var start, end; if (tickRenderOptions.vertical) { start = new Point(tickX, position); end = new Point(tickX + tickOptions.size, position); } else { start = new Point(position, tickY); end = new Point(position, tickY + tickOptions.size); } var tickPath = new Path$2({ stroke: { color: tickOptions.color, width: tickOptions.width } }).moveTo(start).lineTo(end); return tickPath; } function renderTicks(tickGroup, tickPositions, tickRenderOptions, tickOptions) { var count = tickPositions.length; if (tickOptions.visible) { var mirror = tickRenderOptions.mirror; var lineBox = tickRenderOptions.lineBox; for (var i = tickOptions.skip; i < count; i += tickOptions.step) { if (i % tickOptions.skipUnit === 0) { continue; } tickRenderOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size; tickRenderOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1; tickRenderOptions.position = tickPositions[i]; tickGroup.append(renderAxisTick(tickRenderOptions, tickOptions)); } } } var LinearScale = NumericAxis.extend({ init: function(options, service) { var scaleOptions = options || {}; if (!defined(scaleOptions.reverse) && scaleOptions.vertical === false && (service || {}).rtl) { scaleOptions = $.extend({}, scaleOptions, { reverse: true }); } NumericAxis.fn.init.call(this, 0, 1, scaleOptions, service); this.options.minorUnit = this.options.minorUnit || this.options.majorUnit / 10; }, initUserOptions: function(options) { var scaleOptions = deepExtend({}, this.options, options); scaleOptions = deepExtend({}, scaleOptions , { labels: { mirror: scaleOptions.mirror } }); scaleOptions.majorUnit = scaleOptions.majorUnit || dataviz.autoMajorUnit(scaleOptions.min, scaleOptions.max); return scaleOptions; }, initFields: function() { }, render: function() { var elements = this.elements = new Group$2(); var labels = this.renderLabels(); var scaleLine = this.renderLine(); var scaleTicks = this.renderTicks(); var ranges = this.renderRanges(); elements.append(scaleLine, labels, scaleTicks, ranges); return elements; }, renderRanges: function() { var this$1 = this; var options = this.options; var min = options.min; var max = options.max; var vertical = options.vertical; var mirror = options.labels.mirror; var ranges = options.ranges || []; var elements = new Group$2(); var count = ranges.length; var rangeSize = options.rangeSize || options.minorTicks.size / 2; for (var i = 0; i < count; i++) { var range = getRange(ranges[i], min, max); var slot = this$1.getSlot(range.from, range.to); var slotX = vertical ? this$1.lineBox() : slot; var slotY = vertical ? slot : this$1.lineBox(); if (vertical) { slotX.x1 -= rangeSize * (mirror ? -1 : 1); } else { slotY.y2 += rangeSize * (mirror ? -1 : 1); } elements.append(Path$2.fromRect(new Rect([ slotX.x1, slotY.y1 ], [ slotX.x2 - slotX.x1, slotY.y2 - slotY.y1 ]), { fill: { color: range.color, opacity: range.opacity }, stroke: { } })); } return elements; }, renderLabels: function() { var ref = this; var labels = ref.labels; var options = ref.options; var elements = new Group$2(); for (var i = 0; i < labels.length; i++) { elements.append(buildLabelElement(labels[i], options.labels)); } return elements; }, renderLine: function() { var line = this.options.line; var lineBox = this.lineBox(); var elements = new Group$2(); if (line.width > 0 && line.visible) { var linePath = new Path$2({ stroke: { color: line.color, dashType: line.dashType, width: line.width } }); linePath.moveTo(lineBox.x1, lineBox.y1).lineTo(lineBox.x2, lineBox.y2); elements.append(linePath); } return elements; }, renderTicks: function() { var ticks = new Group$2(); var options = this.options; var majorUnit = options.majorTicks.visible ? options.majorUnit : 0; var tickRenderOptions = { vertical: options.vertical, mirror: options.labels.mirror, lineBox: this.lineBox() }; renderTicks(ticks, this.getMajorTickPositions(), tickRenderOptions, options.majorTicks); renderTicks(ticks, this.getMinorTickPositions(), tickRenderOptions, deepExtend({}, { skipUnit: majorUnit / options.minorUnit }, options.minorTicks)); return ticks; } }); setDefaultOptions(LinearScale, { min: 0, max: 50, majorTicks: { size: 15, align: INSIDE, color: BLACK, width: DEFAULT_LINE_WIDTH, visible: true }, minorTicks: { size: 10, align: INSIDE, color: BLACK, width: DEFAULT_LINE_WIDTH, visible: true }, line: { width: DEFAULT_LINE_WIDTH }, labels: { position: INSIDE, padding: 2 }, mirror: false, _alignLines: false }); var Pointer = dataviz.Class.extend({ init: function(scale, userOptions) { var ref = scale.options; var min = ref.min; var max = ref.max; var options = this.options = deepExtend({}, this.options, userOptions); options.fill = options.color; this.scale = scale; if (defined(options.value)) { options.value = limitValue(options.value, min, max); } else { options.value = min; } }, value: function(newValue) { var options = this.options; var value = options.value; if (arguments.length === 0) { return value; } var ref = this.scale.options; var min = ref.min; var max = ref.max; options._oldValue = defined(options._oldValue) ? options.value : min; options.value = limitValue(newValue, min, max); if (this.elements) { this.repaint(); } } }); setDefaultOptions(Pointer, { color: BLACK }); var LinearPointer = Pointer.extend({ init: function(scale, options) { Pointer.fn.init.call(this, scale, options); this.options = deepExtend({ track: { visible: defined(options.track) } }, this.options); }, reflow: function() { var ref = this; var options = ref.options; var scale = ref.scale; var ref$1 = scale.options; var mirror = ref$1.mirror; var vertical = ref$1.vertical; var scaleLine = scale.lineBox(); var trackSize = options.track.size || options.size; var pointerHalfSize = options.size / 2; var margin = getSpacing(options.margin); var space = vertical ? margin[mirror ? "left" : "right"] : margin[mirror ? "bottom" : "top"]; var pointerBox, pointerRangeBox, trackBox; space = mirror ? -space : space; if (vertical) { trackBox = new Box( scaleLine.x1 + space, scaleLine.y1, scaleLine.x1 + space, scaleLine.y2); if (mirror) { trackBox.x1 -= trackSize; } else { trackBox.x2 += trackSize; } if (options.shape !== BAR_POINTER) { pointerRangeBox = new Box( scaleLine.x2 + space, scaleLine.y1 - pointerHalfSize, scaleLine.x2 + space, scaleLine.y2 + pointerHalfSize ); pointerBox = pointerRangeBox; } } else { trackBox = new Box( scaleLine.x1, scaleLine.y1 - space, scaleLine.x2, scaleLine.y1 - space); if (mirror) { trackBox.y2 += trackSize; } else { trackBox.y1 -= trackSize; } if (options.shape !== BAR_POINTER) { pointerRangeBox = new Box( scaleLine.x1 - pointerHalfSize, scaleLine.y1 - space, scaleLine.x2 + pointerHalfSize, scaleLine.y1 - space ); pointerBox = pointerRangeBox; } } this.trackBox = trackBox; this.pointerRangeBox = pointerRangeBox; this.box = pointerBox || trackBox.clone().pad(options.border.width); }, getElementOptions: function() { var options = this.options; return { fill: { color: options.color, opacity: options.opacity }, stroke: defined(options.border) ? { color: options.border.width ? options.border.color || options.color : "", width: options.border.width, dashType: options.border.dashType, opacity: options.opacity } : null }; }, _margin: function() { var ref = this; var scale = ref.scale; var options = ref.options; var ref$1 = scale.options; var mirror = ref$1.mirror; var vertical = ref$1.vertical; var margin = getSpacing(options.margin); var space = vertical ? margin[mirror ? "left" : "right"] : margin[mirror ? "bottom" : "top"]; return space; } }); setDefaultOptions(LinearPointer, { shape: BAR_POINTER, track: { border: { width: 1 } }, color: BLACK, border: { width: 1 }, opacity: 1, margin: getSpacing(3), animation: { type: BAR_POINTER }, visible: true }); var ArrowLinearPointerAnimation = Animation.extend({ setup: function() { var options = this.options; var margin = options.margin; var from = options.from; var to = options.to; var vertical = options.vertical; var axis = vertical ? "x1" : "y1"; if (options.mirror === vertical) { from[axis] -= margin; to[axis] -= margin; } else { from[axis] += margin; to[axis] += margin; } var fromScale = this.fromScale = new GeometryPoint(from.x1, from.y1); var toScale = this.toScale = new GeometryPoint(to.x1, to.y1); if (options.duration !== 0) { options.duration = Math.max((fromScale.distanceTo(toScale) / options.duration) * 1000, 1); } }, step: function(pos) { var translateX = interpolateValue(this.fromScale.x, this.toScale.x, pos); var translateY = interpolateValue(this.fromScale.y, this.toScale.y, pos); this.element.transform(transform().translate(translateX, translateY)); } }); setDefaultOptions(ArrowLinearPointerAnimation, { easing: LINEAR, duration: LINEAR_SPEED }); AnimationFactory.current.register(ARROW_POINTER, ArrowLinearPointerAnimation); var Point$1 = GeometryPoint; var Path$3 = DrawingPath; var ArrowLinearPointer = LinearPointer.extend({ init: function(scale, options) { LinearPointer.fn.init.call(this, scale, options); if (!defined(this.options.size)) { this.options.size = this.scale.options.majorTicks.size * 0.6; } }, pointerShape: function() { var ref = this; var scale = ref.scale; var size = ref.options.size; var halfSize = size / 2; var sign = (scale.options.mirror ? -1 : 1); var shape; if (scale.options.vertical) { shape = [ new Point$1(0, 0 - halfSize), new Point$1(0 - sign * size, 0), new Point$1(0, 0 + halfSize) ]; } else { shape = [ new Point$1(0 - halfSize, 0), new Point$1(0, 0 + sign * size), new Point$1(0 + halfSize, 0) ]; } return shape; }, repaint: function() { var ref = this; var scale = ref.scale; var options = ref.options; var animation = new ArrowLinearPointerAnimation(this.elements, deepExtend(options.animation, { vertical: scale.options.vertical, mirror: scale.options.mirror, margin: this._margin(options.margin), from: scale.getSlot(options._oldValue), to: scale.getSlot(options.value) })); if (options.animation.transitions === false) { animation.options.duration = 0; } animation.setup(); animation.play(); }, render: function() { var ref = this; var scale = ref.scale; var options = ref.options; var elementOptions = this.getElementOptions(); var shape = this.pointerShape(options.value); options.animation.type = ARROW_POINTER; var elements = new Path$3({ stroke: elementOptions.stroke, fill: elementOptions.fill }).moveTo(shape[0]).lineTo(shape[1]).lineTo(shape[2]).close(); var slot = scale.getSlot(options.value); elements.transform(transform().translate(slot.x1, slot.y1)); this.elements = elements; return elements; } }); var BarLinearPointerAnimation = Animation.extend({ setup: function() { var options = this.options; var axis = this.axis = options.vertical ? constants.Y : constants.X; var to = this.to = options.newPoints[0][axis]; var from = this.from = options.oldPoints[0][axis]; if (options.duration !== 0) { options.duration = Math.max((Math.abs(to - from) / options.speed) * 1000, 1); } this._set(from); }, step: function(pos) { var value = interpolateValue(this.from, this.to, pos); this._set(value); }, _set: function(value) { var setter = "set" + this.axis.toUpperCase(); var points = this.options.newPoints; points[0][setter](value); points[1][setter](value); } }); setDefaultOptions(BarLinearPointerAnimation, { easing: LINEAR, speed: LINEAR_SPEED }); AnimationFactory.current.register(BAR_POINTER, BarLinearPointerAnimation); var Group$3 = DrawingGroup; var Path$4 = DrawingPath; var BarLinearPointer = LinearPointer.extend({ init: function(scale, options) { LinearPointer.fn.init.call(this, scale, options); if (!defined(this.options.size)) { this.options.size = this.scale.options.majorTicks.size * 0.3; } }, pointerShape: function(value) { var ref = this; var scale = ref.scale; var options = ref.options; var ref$1 = scale.options; var mirror = ref$1.mirror; var vertical = ref$1.vertical; var dir = mirror === vertical ? -1 : 1; var size = options.size * dir; var minSlot = scale.getSlot(scale.options.min); var slot = scale.getSlot(value); var axis = vertical ? constants.Y : constants.X; var sizeAxis = vertical ? constants.X : constants.Y; var margin = this._margin() * dir; var p1 = new GeometryPoint(); p1[axis] = minSlot[axis + "1"]; p1[sizeAxis] = minSlot[sizeAxis + "1"]; var p2 = new GeometryPoint(); p2[axis] = slot[axis + "1"]; p2[sizeAxis] = slot[sizeAxis + "1"]; if (vertical) { p1.translate(margin, 0); p2.translate(margin, 0); } else { p1.translate(0, margin); p2.translate(0, margin); } var p3 = p2.clone(); var p4 = p1.clone(); if (vertical) { p3.translate(size, 0); p4.translate(size, 0); } else { p3.translate(0, size); p4.translate(0, size); } return [ p1, p2, p3, p4 ]; }, repaint: function() { var ref = this; var scale = ref.scale; var options = ref.options; var shape = this.pointerShape(options.value); var pointerPath = this.pointerPath; var oldShape = this.pointerShape(options._oldValue); pointerPath.moveTo(shape[0]).lineTo(shape[1]).lineTo(shape[2]).lineTo(shape[3]).close(); var animation = new BarLinearPointerAnimation(pointerPath, deepExtend(options.animation, { reverse: scale.options.reverse, vertical: scale.options.vertical, oldPoints: [ oldShape[1], oldShape[2] ], newPoints: [ shape[1], shape[2] ] })); if (options.animation.transitions === false) { animation.options.duration = 0; } animation.setup(); animation.play(); }, render: function() { var group = new Group$3(); var elementOptions = this.getElementOptions(); if (this.options.track.visible) { group.append(this.renderTrack()); } var pointer = this.pointerPath = new Path$4({ stroke: elementOptions.stroke, fill: elementOptions.fill }); group.append(pointer); this.elements = group; return group; }, renderTrack: function() { var trackOptions = this.options.track; var border = trackOptions.border || {}; var trackBox = this.trackBox.clone().pad(border.width || 0); return new Path$4.fromRect(trackBox.toRect(), { fill: { color: trackOptions.color, opacity: trackOptions.opacity }, stroke: { color: border.width ? border.color || trackOptions.color : "", width: border.width, dashType: border.dashType } }); } }); var DEFAULT_MIN_WIDTH = 60; var DEFAULT_MIN_HEIGHT = 60; var Group$1 = DrawingGroup; var LinearGauge = Gauge.extend({ reflow: function(bbox) { var pointers = this.pointers; var bboxX = bbox.origin.x; var bboxY = bbox.origin.y; var box = new Box(bboxX, bboxY, bboxX + bbox.width(), bboxY + bbox.height()); this.scale.reflow(box); this._shrinkScaleWidth(box); for (var i = 0; i < pointers.length; i++) { pointers[i].reflow(); } this.bbox = this._getBox(box); this._alignElements(); this._shrinkElements(); this._buildVisual(); this._draw(); }, _buildVisual: function() { var visuals = new Group$1(); var scaleElements = this.scale.render(); var pointers = this.pointers; visuals.append(this.gaugeArea); visuals.append(scaleElements); for (var i = 0; i < pointers.length; i++) { var current = pointers[i]; visuals.append(current.render()); current.value(current.options.value); } this._visuals = visuals; }, _createModel: function() { var this$1 = this; var options = this.options; var scale = this.scale = new LinearScale(options.scale, this.contextService); this.pointers = []; var pointers = options.pointer; pointers = isArray(pointers) ? pointers : [ pointers ]; for (var i = 0; i < pointers.length; i++) { var currentOptions = deepExtend({}, pointers[i], { animation: { transitions: options.transitions } }); var pointerType = currentOptions.shape === ARROW ? ArrowLinearPointer : BarLinearPointer; this$1.pointers.push(new pointerType(scale, currentOptions)); } }, _defaultSize: function() { var vertical = this.options.scale.vertical; return { width: vertical ? DEFAULT_MIN_WIDTH : DEFAULT_WIDTH, height: vertical ? DEFAULT_HEIGHT : DEFAULT_MIN_HEIGHT }; }, _getBox: function(box) { var ref = this; var scale = ref.scale; var pointers = ref.pointers; var boxCenter = box.center(); var plotAreaBox = pointers[0].box.clone().wrap(scale.box); for (var i = 0; i < pointers.length; i++) { plotAreaBox.wrap(pointers[i].box.clone()); } var size; if (scale.options.vertical) { size = plotAreaBox.width() / 2; plotAreaBox = new Box( boxCenter.x - size, box.y1, boxCenter.x + size, box.y2 ); } else { size = plotAreaBox.height() / 2; plotAreaBox = new Box( box.x1, boxCenter.y - size, box.x2, boxCenter.y + size ); } return plotAreaBox; }, _alignElements: function() { var this$1 = this; var ref = this; var scale = ref.scale; var pointers = ref.pointers; var scaleBox = scale.box; var box = pointers[0].box.clone().wrap(scale.box); var plotAreaBox = this.bbox; for (var i = 0; i < pointers.length; i++) { box.wrap(pointers[i].box.clone()); } var diff; if (scale.options.vertical) { diff = plotAreaBox.center().x - box.center().x; scale.reflow(new Box( scaleBox.x1 + diff, plotAreaBox.y1, scaleBox.x2 + diff, plotAreaBox.y2 )); } else { diff = plotAreaBox.center().y - box.center().y; scale.reflow(new Box( scaleBox.x1, scaleBox.y1 + diff, scaleBox.x2, scaleBox.y2 + diff )); } for (var i$1 = 0; i$1 < pointers.length; i$1++) { pointers[i$1].reflow(this$1.bbox); } }, _shrinkScaleWidth: function(bbox) { var ref = this; var scale = ref.scale; if (!scale.options.vertical) { var overflow = scale.contentBox().width() - bbox.width(); if (overflow > 0) { scale.box.shrink(overflow, 0); scale.box.alignTo(bbox, 'center'); scale.reflow(scale.box); } } }, _shrinkElements: function() { var this$1 = this; var ref = this; var scale = ref.scale; var pointers = ref.pointers; var scaleBox = scale.box.clone(); var pos = scale.options.vertical ? "y" : "x"; var pointerBox = pointers[0].box; for (var i = 0; i < pointers.length; i++) { pointerBox.wrap(pointers[i].box.clone()); } scaleBox[pos + 1] += Math.max(scaleBox[pos + 1] - pointerBox[pos + 1], 0); scaleBox[pos + 2] -= Math.max(pointerBox[pos + 2] - scaleBox[pos + 2], 0); scale.reflow(scaleBox); for (var i$1 = 0; i$1 < pointers.length; i$1++) { pointers[i$1].reflow(this$1.bbox); } } }); setDefaultOptions(LinearGauge, { transitions: true, gaugeArea: { background: "" }, scale: { vertical: true } }); var GEO_ARC_ADJUST_ANGLE = 180; var Arc = drawing.Arc; var Path$5 = DrawingPath; var Group$5 = DrawingGroup; function drawTicks(arc, tickAngles, unit, tickOptions) { var ticks = new Group$5(); var center = arc.center; var radius = arc.getRadiusX(); if (tickOptions.visible) { for (var i = 0; i < tickAngles.length; i++) { var tickStart = arc.pointAt(tickAngles[i]); var tickEnd = new GeometryPoint(center.x + radius - tickOptions.size, center.y).rotate(tickAngles[i], center); ticks.append(new Path$5({ stroke: { color: tickOptions.color, width: tickOptions.width } }).moveTo(tickStart).lineTo(tickEnd)); } } return ticks; } function rangeSegment(from, to, color, opacity) { return { from: from, to: to, color: color, opacity: opacity }; } var RadialScale = NumericAxis.extend({ init: function(options, service) { NumericAxis.fn.init.call(this, 0, 1, options, service); }, initUserOptions: function(options) { var scaleOptions = deepExtend({}, this.options, options); scaleOptions.majorUnit = scaleOptions.majorUnit || dataviz.autoMajorUnit(scaleOptions.min, scaleOptions.max); scaleOptions.minorUnit = scaleOptions.minorUnit || scaleOptions.majorUnit / 10; return scaleOptions; }, initFields: function() { }, render: function(center, radius) { var arc = this.renderArc(center, radius); this.bbox = arc.bbox(); this.labelElements = this.renderLabels(); this.ticks = this.renderTicks(); this.ranges = this.renderRanges(); }, reflow: function(bbox) { var center = bbox.center(); var radius = Math.min(bbox.height(), bbox.width()) / 2; if (defined(this.bbox)) { this.bbox = this.arc.bbox(); this.radius(this.arc.getRadiusX()); this.repositionRanges(); this.renderLabels(); } else { return this.render(center, radius); } }, slotAngle: function(value) { var ref = this.options; var min = ref.min; var max = ref.max; var reverse = ref.reverse; var startAngle = ref.startAngle; var endAngle = ref.endAngle; var angle = endAngle - startAngle; var result; if (reverse) { result = endAngle - (value - min) / (max - min) * angle; } else { result = ((value - min) / (max - min) * angle) + startAngle; } return result + GEO_ARC_ADJUST_ANGLE; }, hasRanges: function() { var ranges = this.options.ranges; return ranges && ranges.length; }, ticksSize: function() { var ref = this.options; var majorTicks = ref.majorTicks; var minorTicks = ref.minorTicks; var size = 0; if (majorTicks.visible) { size = majorTicks.size; } if (minorTicks.visible) { size = Math.max(minorTicks.size, size); } return size; }, renderLabels: function() { var this$1 = this; var options = this.options; var arc = this.arc.clone(); var radius = arc.getRadiusX(); var tickAngles = this.tickAngles(arc, options.majorUnit); var rangeSize = options.rangeSize = options.rangeSize || radius * 0.1; var labelsGroup = new Group$5(); var rangeDistance = radius * 0.05; if (defined(options.rangeDistance)) { rangeDistance = options.rangeDistance; } else { options.rangeDistance = rangeDistance; } var labelsOptions = options.labels; var isInside = labelsOptions.position === INSIDE; var hasLabelElements = defined(this.labelElements); if (isInside) { radius -= this.ticksSize(); if (this.hasRanges() && !hasLabelElements) { radius -= rangeSize + rangeDistance; } arc.setRadiusX(radius).setRadiusY(radius); } var labels = this.labels; var count = labels.length; var padding = labelsOptions.padding; for (var i = 0; i < count; i++) { var label = labels[i]; var halfWidth = label.box.width() / 2; var halfHeight = label.box.height() / 2; var angle = tickAngles[i]; var labelAngle = (angle - GEO_ARC_ADJUST_ANGLE) * DEGREE; var lp = arc.pointAt(angle); var cx = lp.x + (Math.cos(labelAngle) * (halfWidth + padding) * (isInside ? 1 : -1)); var cy = lp.y + (Math.sin(labelAngle) * (halfHeight + padding) * (isInside ? 1 : -1)); label.reflow(new Box(cx - halfWidth, cy - halfHeight, cx + halfWidth, cy + halfHeight)); var labelPos = new GeometryPoint(label.box.x1, label.box.y1); var labelElement = (void 0); if (!hasLabelElements) { labelElement = buildLabelElement(label, options.labels); labelsGroup.append(labelElement); } else { labelElement = this$1.labelElements.children[i]; var prevLabelPos = labelElement.bbox().origin; var labelTransform = labelElement.transform() || transform(); labelTransform.translate(labelPos.x - prevLabelPos.x, labelPos.y - prevLabelPos.y); labelElement.transform(labelTransform); } this$1.bbox = Rect.union(this$1.bbox, labelElement.bbox()); } return labelsGroup; }, repositionRanges: function() { var ranges = this.ranges.children; if (ranges.length > 0) { var ref = this.options; var rangeDistance = ref.rangeDistance; var rangeSize = ref.rangeSize; var rangeRadius = this.getRangeRadius(); if (this.options.labels.position === INSIDE) { rangeRadius += rangeSize + rangeDistance; } var newRadius = rangeRadius + (rangeSize / 2); for (var i = 0; i < ranges.length; i++) { ranges[i]._geometry.setRadiusX(newRadius).setRadiusY(newRadius); } this.bbox = Rect.union(this.bbox, this.ranges.bbox()); } }, renderRanges: function() { var this$1 = this; var segments = this.rangeSegments(); var segmentsCount = segments.length; var result = new Group$5(); if (segmentsCount) { var ref = this.options; var rangeSize = ref.rangeSize; var reverse = ref.reverse; var rangeDistance = ref.rangeDistance; var rangeRadius = this.getRangeRadius(); // move the ticks with a range distance and a range size this.radius(this.radius() - rangeSize - rangeDistance); for (var i = 0; i < segmentsCount; i++) { var segment = segments[i]; var from = this$1.slotAngle(segment[reverse ? "to" : "from"]); var to = this$1.slotAngle(segment[!reverse ? "to" : "from"]); if (to - from !== 0) { result.append(this$1.createRange(from, to, rangeRadius, segment)); } } } return result; }, createRange: function(startAngle, endAngle, rangeRadius, options) { var rangeSize = this.options.rangeSize; var rangeGeom = new geometry.Arc(this.arc.center, { radiusX: rangeRadius + (rangeSize / 2), radiusY: rangeRadius + (rangeSize / 2), startAngle: startAngle, endAngle: endAngle }); return new Arc(rangeGeom, { stroke: { width: rangeSize, color: options.color, opacity: options.opacity, lineCap: options.lineCap } }); }, rangeSegments: function() { var options = this.options; var ranges = options.ranges || []; var count = ranges.length; var segments = []; if (count) { var min = options.min; var max = options.max; var defaultColor = options.rangePlaceholderColor; segments.push(rangeSegment(min, max, defaultColor)); for (var i = 0; i < count; i++) { var range = getRange(ranges[i], min, max); var segmentsCount = segments.length; for (var j = 0; j < segmentsCount; j++) { var segment = segments[j]; if (segment.from <= range.from && range.from <= segment.to) { segments.push(rangeSegment(range.from, range.to, range.color, range.opacity)); if (segment.from <= range.to && range.to <= segment.to) { segments.push(rangeSegment(range.to, segment.to, defaultColor, range.opacity)); } segment.to = range.from; break; } } } } return segments; }, getRangeRadius: function() { var ref = this; var arc = ref.arc; var options = ref.options; var rangeSize = options.rangeSize; var rangeDistance = options.rangeDistance; var majorTickSize = options.majorTicks.size; var radius; if (options.labels.position === OUTSIDE) { radius = arc.getRadiusX() - majorTickSize - rangeDistance - rangeSize; } else { radius = arc.getRadiusX() - rangeSize; } return radius; }, renderArc: function(center, radius) { var options = this.options; var arc = this.arc = new geometry.Arc(center, { radiusX: radius, radiusY: radius, startAngle: options.startAngle + GEO_ARC_ADJUST_ANGLE, endAngle: options.endAngle + GEO_ARC_ADJUST_ANGLE }); return arc; }, renderTicks: function() { var ref = this; var arc = ref.arc; var options = ref.options; var tickArc = arc.clone(); this.majorTickAngles = this.tickAngles(arc, options.majorUnit); this.majorTicks = drawTicks(tickArc, this.majorTickAngles, options.majorUnit, options.majorTicks); var allTicks = new Group$5(); allTicks.append(this.majorTicks); var majorTickSize = options.majorTicks.size; var minorTickSize = options.minorTicks.size; this._tickDifference = majorTickSize - minorTickSize; if (options.labels.position === OUTSIDE) { var radius = tickArc.getRadiusX(); tickArc.setRadiusX(radius - majorTickSize + minorTickSize) .setRadiusY(radius - majorTickSize + minorTickSize); } this.minorTickAngles = this.normalizeTickAngles(this.tickAngles(arc, options.minorUnit)); this.minorTicks = drawTicks(tickArc, this.minorTickAngles, options.minorUnit, options.minorTicks); allTicks.append(this.minorTicks); return allTicks; }, normalizeTickAngles: function(angles) { var options = this.options; var skip = options.majorUnit / options.minorUnit; for (var i = angles.length - 1; i >= 0; i--) { if (i % skip === 0) { angles.splice(i, 1); } } return angles; }, tickAngles: fun