tracker.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. /**
  2. * DevExtreme (viz/chart_components/tracker.js)
  3. * Version: 19.1.16
  4. * Build date: Tue Oct 18 2022
  5. *
  6. * Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
  7. * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
  8. */
  9. "use strict";
  10. var domAdapter = require("../../core/dom_adapter");
  11. var eventsEngine = require("../../events/core/events_engine");
  12. var clickEvent = require("../../events/click");
  13. var extend = require("../../core/utils/extend").extend;
  14. var each = require("../../core/utils/iterator").each;
  15. var consts = require("../components/consts");
  16. var eventsConsts = consts.events;
  17. var vizUtils = require("../core/utils");
  18. var pointerEvents = require("../../events/pointer");
  19. var holdEvent = require("../../events/hold");
  20. var addNamespace = require("../../events/utils").addNamespace;
  21. var isDefined = require("../../core/utils/type").isDefined;
  22. var _normalizeEnum = require("../core/utils").normalizeEnum;
  23. var _floor = Math.floor;
  24. var _each = each;
  25. var _noop = require("../../core/utils/common").noop;
  26. var HOVER_STATE = consts.states.hoverMark;
  27. var NORMAL_STATE = consts.states.normalMark;
  28. var EVENT_NS = "dxChartTracker";
  29. var DOT_EVENT_NS = "." + EVENT_NS;
  30. var POINTER_ACTION = addNamespace([pointerEvents.down, pointerEvents.move], EVENT_NS);
  31. var LEGEND_CLICK = "legendClick";
  32. var SERIES_CLICK = "seriesClick";
  33. var POINT_CLICK = "pointClick";
  34. var POINT_DATA = "chart-data-point";
  35. var SERIES_DATA = "chart-data-series";
  36. var ARG_DATA = "chart-data-argument";
  37. var DELAY = 100;
  38. var NONE_MODE = "none";
  39. var ALL_ARGUMENT_POINTS_MODE = "allargumentpoints";
  40. var INCLUDE_POINTS_MODE = "includepoints";
  41. var EXLUDE_POINTS_MODE = "excludepoints";
  42. var LEGEND_HOVER_MODES = [INCLUDE_POINTS_MODE, EXLUDE_POINTS_MODE, NONE_MODE];
  43. function getData(event, dataKey) {
  44. var target = event.target;
  45. return ("tspan" === target.tagName ? target.parentNode : target)[dataKey]
  46. }
  47. function eventCanceled(event, target) {
  48. return event.cancel || !target.getOptions()
  49. }
  50. function inCanvas(canvas, x, y) {
  51. return x >= canvas.left && x <= canvas.right && y >= canvas.top && y <= canvas.bottom
  52. }
  53. function correctLegendHoverMode(mode) {
  54. if (LEGEND_HOVER_MODES.indexOf(mode) > -1) {
  55. return mode
  56. } else {
  57. return INCLUDE_POINTS_MODE
  58. }
  59. }
  60. function correctHoverMode(target) {
  61. var mode = target.getOptions().hoverMode;
  62. return mode === NONE_MODE ? mode : ALL_ARGUMENT_POINTS_MODE
  63. }
  64. var baseTrackerPrototype = {
  65. ctor: function(options) {
  66. var that = this;
  67. var data = {
  68. tracker: that
  69. };
  70. that._renderer = options.renderer;
  71. that._legend = options.legend;
  72. that._tooltip = options.tooltip;
  73. that._eventTrigger = options.eventTrigger;
  74. that._seriesGroup = options.seriesGroup;
  75. options.seriesGroup.off(DOT_EVENT_NS).on(addNamespace(eventsConsts.showPointTooltip, EVENT_NS), data, that._showPointTooltip).on(addNamespace(eventsConsts.hidePointTooltip, EVENT_NS), data, that._hidePointTooltip);
  76. that._renderer.root.off(DOT_EVENT_NS).on(POINTER_ACTION, data, that._pointerHandler).on(addNamespace(clickEvent.name, EVENT_NS), data, that._clickHandler).on(addNamespace(holdEvent.name, EVENT_NS), {
  77. timeout: 300
  78. }, _noop)
  79. },
  80. update: function() {},
  81. updateSeries: function(series, resetDecorations) {
  82. var that = this;
  83. var noHoveredSeries = !(series && series.some(function(s) {
  84. return s === that.hoveredSeries
  85. }) || that._hoveredPoint && that._hoveredPoint.series);
  86. if (that._storedSeries !== series) {
  87. that._storedSeries = series || []
  88. }
  89. if (noHoveredSeries) {
  90. that._clean();
  91. that._renderer.initHatching()
  92. }
  93. if (resetDecorations) {
  94. that.clearSelection();
  95. if (!noHoveredSeries) {
  96. that._hideTooltip(that.pointAtShownTooltip);
  97. that.clearHover()
  98. }
  99. }
  100. },
  101. setCanvases: function(mainCanvas, paneCanvases) {
  102. this._mainCanvas = mainCanvas;
  103. this._canvases = paneCanvases
  104. },
  105. repairTooltip: function() {
  106. var point = this.pointAtShownTooltip;
  107. if (!point || !point.series || !point.isVisible()) {
  108. this._hideTooltip(point, true)
  109. } else {
  110. this._showTooltip(point)
  111. }
  112. },
  113. _setHoveredPoint: function(point) {
  114. if (point === this._hoveredPoint) {
  115. return
  116. }
  117. this._releaseHoveredPoint();
  118. point.hover();
  119. this._hoveredPoint = point
  120. },
  121. _releaseHoveredPoint: function() {
  122. if (this._hoveredPoint && this._hoveredPoint.getOptions()) {
  123. this._hoveredPoint.clearHover();
  124. this._hoveredPoint = null;
  125. if (this._tooltip.isEnabled()) {
  126. this._hideTooltip(this._hoveredPoint)
  127. }
  128. }
  129. },
  130. _setHoveredSeries: function(series, mode) {
  131. this._releaseHoveredSeries();
  132. this._releaseHoveredPoint();
  133. series.hover(mode);
  134. this.hoveredSeries = series
  135. },
  136. _releaseHoveredSeries: function(needSetHoverView, hoveredPoint) {
  137. if (this.hoveredSeries) {
  138. this.hoveredSeries.clearHover();
  139. this.hoveredSeries = null
  140. }
  141. },
  142. clearSelection: function() {
  143. this._storedSeries.forEach(function(series) {
  144. if (series) {
  145. series.clearSelection();
  146. series.getPoints().forEach(function(point) {
  147. point.clearSelection()
  148. })
  149. }
  150. })
  151. },
  152. _clean: function() {
  153. var that = this;
  154. that.hoveredPoint = that.hoveredSeries = that._hoveredArgumentPoints = null;
  155. that._hideTooltip(that.pointAtShownTooltip)
  156. },
  157. clearHover: function() {
  158. this._resetHoveredArgument();
  159. this._releaseHoveredSeries();
  160. this._releaseHoveredPoint()
  161. },
  162. _hideTooltip: function(point, silent) {
  163. var that = this;
  164. if (!that._tooltip || point && that.pointAtShownTooltip !== point) {
  165. return
  166. }
  167. if (!silent && that.pointAtShownTooltip) {
  168. that.pointAtShownTooltip = null
  169. }
  170. that._tooltip.hide()
  171. },
  172. _showTooltip: function(point) {
  173. var that = this;
  174. var tooltipFormatObject;
  175. var eventData;
  176. if (point && point.getOptions()) {
  177. tooltipFormatObject = point.getTooltipFormatObject(that._tooltip);
  178. if (!isDefined(tooltipFormatObject.valueText) && !tooltipFormatObject.points || !point.isVisible()) {
  179. return
  180. }
  181. if (!that.pointAtShownTooltip || that.pointAtShownTooltip !== point) {
  182. eventData = {
  183. target: point
  184. }
  185. }
  186. var coords = point.getTooltipParams(that._tooltip.getLocation());
  187. var rootOffset = that._renderer.getRootOffset();
  188. coords.x += rootOffset.left;
  189. coords.y += rootOffset.top;
  190. if (!that._tooltip.show(tooltipFormatObject, coords, eventData)) {
  191. return
  192. }
  193. that.pointAtShownTooltip = point
  194. }
  195. },
  196. _showPointTooltip: function(event, point) {
  197. var that = event.data.tracker;
  198. var pointWithTooltip = that.pointAtShownTooltip;
  199. if (pointWithTooltip && pointWithTooltip !== point) {
  200. that._hideTooltip(pointWithTooltip)
  201. }
  202. that._showTooltip(point)
  203. },
  204. _hidePointTooltip: function(event, point) {
  205. event.data.tracker._hideTooltip(point)
  206. },
  207. _enableOutHandler: function() {
  208. if (this._outHandler) {
  209. return
  210. }
  211. var that = this;
  212. var handler = function(e) {
  213. var rootOffset = that._renderer.getRootOffset();
  214. var x = _floor(e.pageX - rootOffset.left);
  215. var y = _floor(e.pageY - rootOffset.top);
  216. if (!inCanvas(that._mainCanvas, x, y)) {
  217. that._pointerOut();
  218. that._disableOutHandler()
  219. }
  220. };
  221. eventsEngine.on(domAdapter.getDocument(), POINTER_ACTION, handler);
  222. this._outHandler = handler
  223. },
  224. _disableOutHandler: function() {
  225. this._outHandler && eventsEngine.off(domAdapter.getDocument(), POINTER_ACTION, this._outHandler);
  226. this._outHandler = null
  227. },
  228. stopCurrentHandling: function() {
  229. this._pointerOut(true)
  230. },
  231. _pointerOut: function(force) {
  232. this.clearHover();
  233. (force || this._tooltip.isEnabled()) && this._hideTooltip(this.pointAtShownTooltip)
  234. },
  235. _triggerLegendClick: function(eventArgs, elementClick) {
  236. var eventTrigger = this._eventTrigger;
  237. eventTrigger(LEGEND_CLICK, eventArgs, function() {
  238. !eventCanceled(eventArgs.event, eventArgs.target) && eventTrigger(elementClick, eventArgs)
  239. })
  240. },
  241. _hoverLegendItem: function(x, y) {
  242. var that = this;
  243. var item = that._legend.getItemByCoord(x, y);
  244. var series;
  245. var legendHoverMode = correctLegendHoverMode(that._legend.getOptions().hoverMode);
  246. if (item) {
  247. series = that._storedSeries[item.id];
  248. if (!series.isHovered() || series.lastHoverMode !== legendHoverMode) {
  249. that._setHoveredSeries(series, legendHoverMode)
  250. }
  251. that._tooltip.isEnabled() && that._hideTooltip(that.pointAtShownTooltip)
  252. } else {
  253. that.clearHover()
  254. }
  255. },
  256. _hoverArgument: function(argument, argumentIndex) {
  257. var that = this;
  258. var hoverMode = that._getArgumentHoverMode();
  259. if (isDefined(argument)) {
  260. that._releaseHoveredPoint();
  261. that._hoveredArgument = argument;
  262. that._argumentIndex = argumentIndex;
  263. that._notifySeries({
  264. action: "pointHover",
  265. notifyLegend: that._notifyLegendOnHoverArgument,
  266. target: {
  267. argument: argument,
  268. fullState: HOVER_STATE,
  269. argumentIndex: argumentIndex,
  270. getOptions: function() {
  271. return {
  272. hoverMode: hoverMode
  273. }
  274. }
  275. }
  276. })
  277. }
  278. },
  279. _resetHoveredArgument: function() {
  280. var that = this;
  281. var hoverMode;
  282. if (isDefined(that._hoveredArgument)) {
  283. hoverMode = that._getArgumentHoverMode();
  284. that._notifySeries({
  285. action: "clearPointHover",
  286. notifyLegend: that._notifyLegendOnHoverArgument,
  287. target: {
  288. fullState: NORMAL_STATE,
  289. argumentIndex: that._argumentIndex,
  290. argument: that._hoveredArgument,
  291. getOptions: function() {
  292. return {
  293. hoverMode: hoverMode
  294. }
  295. }
  296. }
  297. });
  298. that._hoveredArgument = null
  299. }
  300. },
  301. _notifySeries: function(data) {
  302. this._storedSeries.forEach(function(series) {
  303. series.notify(data)
  304. })
  305. },
  306. _pointerHandler: function(e) {
  307. var that = e.data.tracker;
  308. var rootOffset = that._renderer.getRootOffset();
  309. var x = _floor(e.pageX - rootOffset.left);
  310. var y = _floor(e.pageY - rootOffset.top);
  311. var canvas = that._getCanvas(x, y);
  312. var series = getData(e, SERIES_DATA);
  313. var point = getData(e, POINT_DATA) || series && series.getPointByCoord(x, y);
  314. if (point && !point.getMarkerVisibility()) {
  315. point = void 0
  316. }
  317. that._enableOutHandler();
  318. if (that._legend.coordsIn(x, y)) {
  319. that._hoverLegendItem(x, y);
  320. return
  321. }
  322. if (that.hoveredSeries && that.hoveredSeries !== that._stuckSeries) {
  323. that._releaseHoveredSeries()
  324. }
  325. if (that._hoverArgumentAxis(x, y, e)) {
  326. return
  327. }
  328. if (that._isPointerOut(canvas, point)) {
  329. that._pointerOut()
  330. }
  331. if (!canvas && !point) {
  332. return
  333. }
  334. if (series && !point) {
  335. point = series.getNeighborPoint(x, y);
  336. if (!that._stickyHovering && point && !point.coordsIn(x, y)) {
  337. point = null
  338. }
  339. if (series !== that.hoveredSeries) {
  340. that._setTimeout(function() {
  341. that._setHoveredSeries(series);
  342. that._setStuckSeries(e, series, x, y);
  343. that._pointerComplete(point, x, y)
  344. }, series);
  345. return
  346. }
  347. } else {
  348. if (point) {
  349. if (e.type !== pointerEvents.move && "touch" !== e.pointerType) {
  350. return
  351. }
  352. if (that.hoveredSeries) {
  353. that._setTimeout(function() {
  354. that._pointerOnPoint(point, x, y, e)
  355. }, point)
  356. } else {
  357. that._pointerOnPoint(point, x, y, e)
  358. }
  359. return
  360. } else {
  361. if (that._setStuckSeries(e, void 0, x, y) && that._stickyHovering) {
  362. series = that._stuckSeries;
  363. point = series.getNeighborPoint(x, y);
  364. that._releaseHoveredSeries();
  365. point && point.getMarkerVisibility() && that._setHoveredPoint(point)
  366. } else {
  367. if (!that._stickyHovering) {
  368. that._pointerOut()
  369. }
  370. }
  371. }
  372. }
  373. that._pointerComplete(point, x, y)
  374. },
  375. _pointerOnPoint: function(point, x, y) {
  376. this._resetHoveredArgument();
  377. this._setHoveredPoint(point);
  378. this._pointerComplete(point, x, y)
  379. },
  380. _pointerComplete: function(point) {
  381. this.pointAtShownTooltip !== point && this._tooltip.isEnabled() && this._showTooltip(point)
  382. },
  383. _clickHandler: function(e) {
  384. var that = e.data.tracker;
  385. var rootOffset = that._renderer.getRootOffset();
  386. var x = _floor(e.pageX - rootOffset.left);
  387. var y = _floor(e.pageY - rootOffset.top);
  388. var point = getData(e, POINT_DATA);
  389. var series = that._stuckSeries || getData(e, SERIES_DATA) || point && point.series;
  390. var axis = that._argumentAxis;
  391. if (that._legend.coordsIn(x, y)) {
  392. var item = that._legend.getItemByCoord(x, y);
  393. if (item) {
  394. that._legendClick(item, e)
  395. }
  396. } else {
  397. if (axis && axis.coordsIn(x, y)) {
  398. var argument = getData(e, ARG_DATA);
  399. if (isDefined(argument)) {
  400. that._eventTrigger("argumentAxisClick", {
  401. argument: argument,
  402. event: e
  403. })
  404. }
  405. } else {
  406. if (series) {
  407. point = point || series.getPointByCoord(x, y);
  408. if (point && point.getMarkerVisibility()) {
  409. that._pointClick(point, e)
  410. } else {
  411. getData(e, SERIES_DATA) && that._eventTrigger(SERIES_CLICK, {
  412. target: series,
  413. event: e
  414. })
  415. }
  416. }
  417. }
  418. }
  419. },
  420. dispose: function() {
  421. var that = this;
  422. that._disableOutHandler();
  423. that._renderer.root.off(DOT_EVENT_NS);
  424. that._seriesGroup.off(DOT_EVENT_NS)
  425. }
  426. };
  427. var ChartTracker = function(options) {
  428. this.ctor(options)
  429. };
  430. extend(ChartTracker.prototype, baseTrackerPrototype, {
  431. _pointClick: function(point, event) {
  432. var that = this;
  433. var eventTrigger = that._eventTrigger;
  434. var series = point.series;
  435. eventTrigger(POINT_CLICK, {
  436. target: point,
  437. event: event
  438. }, function() {
  439. !eventCanceled(event, series) && eventTrigger(SERIES_CLICK, {
  440. target: series,
  441. event: event
  442. })
  443. })
  444. },
  445. update: function(options) {
  446. var that = this;
  447. baseTrackerPrototype.update.call(this, options);
  448. that._argumentAxis = options.argumentAxis || {};
  449. that._axisHoverEnabled = that._argumentAxis && _normalizeEnum(that._argumentAxis.getOptions().hoverMode) === ALL_ARGUMENT_POINTS_MODE;
  450. that._chart = options.chart;
  451. that._rotated = options.rotated;
  452. that._crosshair = options.crosshair;
  453. that._stickyHovering = options.stickyHovering
  454. },
  455. _getCanvas: function(x, y) {
  456. var that = this;
  457. var canvases = that._canvases || [];
  458. for (var i = 0; i < canvases.length; i++) {
  459. var c = canvases[i];
  460. if (inCanvas(c, x, y)) {
  461. return c
  462. }
  463. }
  464. return null
  465. },
  466. _isPointerOut: function(canvas) {
  467. return !canvas && this._stuckSeries
  468. },
  469. _hideCrosshair: function() {
  470. this._crosshair && this._crosshair.hide()
  471. },
  472. _moveCrosshair: function(point, x, y) {
  473. if (point && this._crosshair && point.isVisible()) {
  474. this._crosshair.show({
  475. point: point,
  476. x: x,
  477. y: y
  478. })
  479. }
  480. },
  481. _clean: function() {
  482. var that = this;
  483. baseTrackerPrototype._clean.call(that);
  484. that._resetTimer();
  485. that._stuckSeries = null
  486. },
  487. _getSeriesForShared: function(x, y) {
  488. var that = this;
  489. var points = [];
  490. var point = null;
  491. var distance = 1 / 0;
  492. if (that._tooltip.isShared() && !that.hoveredSeries) {
  493. _each(that._storedSeries, function(_, series) {
  494. var point = series.getNeighborPoint(x, y);
  495. point && points.push(point)
  496. });
  497. _each(points, function(_, p) {
  498. var coords = p.getCrosshairData(x, y);
  499. var d = vizUtils.getDistance(x, y, coords.x, coords.y);
  500. if (d < distance) {
  501. point = p;
  502. distance = d
  503. }
  504. })
  505. }
  506. return point && point.series
  507. },
  508. _setTimeout: function(callback, keeper) {
  509. var that = this;
  510. if (that._timeoutKeeper !== keeper) {
  511. that._resetTimer();
  512. that._hoverTimeout = setTimeout(function() {
  513. callback();
  514. that._timeoutKeeper = null
  515. }, DELAY);
  516. that._timeoutKeeper = keeper
  517. }
  518. },
  519. _resetTimer: function() {
  520. clearTimeout(this._hoverTimeout);
  521. this._timeoutKeeper = this._hoverTimeout = null
  522. },
  523. _stopEvent: function(e) {
  524. if (!isDefined(e.cancelable) || e.cancelable) {
  525. e.preventDefault();
  526. e.stopPropagation()
  527. }
  528. },
  529. _setStuckSeries: function(e, series, x, y) {
  530. if ("mouse" !== e.pointerType) {
  531. this._stuckSeries = null
  532. } else {
  533. this._stuckSeries = series || this._stuckSeries || this._getSeriesForShared(x, y)
  534. }
  535. return !!this._stuckSeries
  536. },
  537. _pointerOut: function() {
  538. var that = this;
  539. that._stuckSeries = null;
  540. that._hideCrosshair();
  541. that._resetTimer();
  542. baseTrackerPrototype._pointerOut.apply(that, arguments)
  543. },
  544. _hoverArgumentAxis: function(x, y, e) {
  545. var that = this;
  546. that._resetHoveredArgument();
  547. if (that._axisHoverEnabled && that._argumentAxis.coordsIn(x, y)) {
  548. that._hoverArgument(getData(e, ARG_DATA));
  549. return true
  550. }
  551. },
  552. _pointerComplete: function(point, x, y) {
  553. var that = this;
  554. that.hoveredSeries && that.hoveredSeries.updateHover(x, y);
  555. that._resetTimer();
  556. that._moveCrosshair(point, x, y);
  557. baseTrackerPrototype._pointerComplete.call(that, point)
  558. },
  559. _legendClick: function(item, e) {
  560. var series = this._storedSeries[item.id];
  561. this._triggerLegendClick({
  562. target: series,
  563. event: e
  564. }, SERIES_CLICK)
  565. },
  566. _hoverLegendItem: function(x, y) {
  567. this._stuckSeries = null;
  568. this._hideCrosshair();
  569. baseTrackerPrototype._hoverLegendItem.call(this, x, y)
  570. },
  571. _pointerOnPoint: function(point, x, y, e) {
  572. this._setStuckSeries(e, point.series, x, y);
  573. this._releaseHoveredSeries();
  574. baseTrackerPrototype._pointerOnPoint.call(this, point, x, y, e)
  575. },
  576. _notifyLegendOnHoverArgument: false,
  577. _getArgumentHoverMode: function() {
  578. return correctHoverMode(this._argumentAxis)
  579. },
  580. dispose: function() {
  581. this._resetTimer();
  582. baseTrackerPrototype.dispose.call(this)
  583. }
  584. });
  585. var PieTracker = function(options) {
  586. this.ctor(options)
  587. };
  588. extend(PieTracker.prototype, baseTrackerPrototype, {
  589. _isPointerOut: function(_, point) {
  590. return !point
  591. },
  592. _legendClick: function(item, e) {
  593. var that = this;
  594. var points = [];
  595. that._storedSeries.forEach(function(s) {
  596. return points.push.apply(points, s.getPointsByKeys(item.argument, item.argumentIndex))
  597. });
  598. that._eventTrigger(LEGEND_CLICK, {
  599. target: item.argument,
  600. points: points,
  601. event: e
  602. })
  603. },
  604. _pointClick: function(point, e) {
  605. this._eventTrigger(POINT_CLICK, {
  606. target: point,
  607. event: e
  608. })
  609. },
  610. _hoverLegendItem: function(x, y) {
  611. var that = this;
  612. var item = that._legend.getItemByCoord(x, y);
  613. that._resetHoveredArgument();
  614. if (item) {
  615. that._hoverArgument(item.argument, item.argumentIndex)
  616. } else {
  617. that.clearHover()
  618. }
  619. },
  620. _getArgumentHoverMode: function() {
  621. return correctHoverMode(this._legend)
  622. },
  623. _hoverArgumentAxis: _noop,
  624. _setStuckSeries: _noop,
  625. _getCanvas: _noop,
  626. _notifyLegendOnHoverArgument: true
  627. });
  628. exports.ChartTracker = ChartTracker;
  629. exports.PieTracker = PieTracker;