annotations.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /**
  2. * DevExtreme (viz/core/annotations.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. Object.defineProperty(exports, "__esModule", {
  11. value: true
  12. });
  13. exports.plugins = exports.__test_utils = exports.createAnnotations = void 0;
  14. var _dom_adapter = require("../../core/dom_adapter");
  15. var _type = require("../../core/utils/type");
  16. var _tooltip = require("../core/tooltip");
  17. var _extend = require("../../core/utils/extend");
  18. var _utils = require("./utils");
  19. var _plaque = require("./plaque");
  20. var _pointer = require("../../events/pointer");
  21. var _pointer2 = _interopRequireDefault(_pointer);
  22. var _drag = require("../../events/drag");
  23. var _drag2 = _interopRequireDefault(_drag);
  24. var _utils2 = require("../../events/utils");
  25. var _events_engine = require("../../events/core/events_engine");
  26. var _events_engine2 = _interopRequireDefault(_events_engine);
  27. function _interopRequireDefault(obj) {
  28. return obj && obj.__esModule ? obj : {
  29. "default": obj
  30. }
  31. }
  32. var EVENT_NS = "annotations";
  33. var DOT_EVENT_NS = "." + EVENT_NS;
  34. var POINTER_ACTION = (0, _utils2.addNamespace)([_pointer2.default.down, _pointer2.default.move], EVENT_NS);
  35. var POINTER_UP_EVENT_NAME = (0, _utils2.addNamespace)(_pointer2.default.up, EVENT_NS);
  36. var DRAG_START_EVENT_NAME = _drag2.default.start + DOT_EVENT_NS;
  37. var DRAG_EVENT_NAME = _drag2.default.move + DOT_EVENT_NS;
  38. var DRAG_END_EVENT_NAME = _drag2.default.end + DOT_EVENT_NS;
  39. function coreAnnotation(options, _draw) {
  40. return {
  41. type: options.type,
  42. name: options.name,
  43. x: options.x,
  44. y: options.y,
  45. value: options.value,
  46. argument: options.argument,
  47. axis: options.axis,
  48. series: options.series,
  49. options: options,
  50. offsetX: options.offsetX,
  51. offsetY: options.offsetY,
  52. draw: function(widget, group) {
  53. var _this = this;
  54. var annotationGroup = widget._renderer.g().append(group);
  55. this.plaque = new _plaque.Plaque(options, widget, annotationGroup, _draw.bind(this), (0, _type.isDefined)(options.value) || (0, _type.isDefined)(options.argument));
  56. this.plaque.draw(widget._getAnnotationCoords(this));
  57. if (options.allowDragging) {
  58. annotationGroup.on(DRAG_START_EVENT_NAME, {
  59. immediate: true
  60. }, function(e) {
  61. _this._dragOffsetX = _this.plaque.x - e.pageX;
  62. _this._dragOffsetY = _this.plaque.y - e.pageY
  63. }).on(DRAG_EVENT_NAME, function(e) {
  64. _this.plaque.move(e.pageX + _this._dragOffsetX, e.pageY + _this._dragOffsetY)
  65. }).on(DRAG_END_EVENT_NAME, function(e) {
  66. _this.offsetX = (_this.offsetX || 0) + e.offset.x;
  67. _this.offsetY = (_this.offsetY || 0) + e.offset.y
  68. })
  69. }
  70. },
  71. hitTest: function(x, y) {
  72. return this.plaque.hitTest(x, y)
  73. },
  74. showTooltip: function(tooltip, _ref) {
  75. var x = _ref.x,
  76. y = _ref.y;
  77. if (tooltip.annotation !== this) {
  78. if (tooltip.show(this.options, {
  79. x: x,
  80. y: y
  81. }, {
  82. target: this.options
  83. }, this.options.customizeTooltip)) {
  84. tooltip.annotation = this
  85. }
  86. } else {
  87. tooltip.move(x, y)
  88. }
  89. }
  90. }
  91. }
  92. function labelAnnotation(options) {
  93. return coreAnnotation(options, function(widget, group, _ref2) {
  94. var width = _ref2.width,
  95. height = _ref2.height;
  96. var text = widget._renderer.text(options.text).css((0, _utils.patchFontOptions)(options.font)).attr({
  97. "class": options.cssClass
  98. }).append(group);
  99. if ((0, _type.isDefined)(width) || (0, _type.isDefined)(height)) {
  100. text.setMaxSize(width, height, {
  101. wordWrap: options.wordWrap,
  102. textOverflow: options.textOverflow
  103. })
  104. }
  105. })
  106. }
  107. function imageAnnotation(options) {
  108. var _ref3 = options.image || {},
  109. width = _ref3.width,
  110. height = _ref3.height,
  111. url = _ref3.url,
  112. location = _ref3.location;
  113. return coreAnnotation(options, function(widget, group, _ref4) {
  114. var outerWidth = _ref4.width,
  115. outerHeight = _ref4.height;
  116. var imageWidth = outerWidth > 0 ? Math.min(width, outerWidth) : width;
  117. var imageHeight = outerHeight > 0 ? Math.min(height, outerHeight) : height;
  118. widget._renderer.image(0, 0, imageWidth, imageHeight, url, location || "center").append(group)
  119. })
  120. }
  121. function createAnnotation(item, commonOptions, customizeAnnotation) {
  122. var options = (0, _extend.extend)(true, {}, commonOptions, item);
  123. if (customizeAnnotation && customizeAnnotation.call) {
  124. options = (0, _extend.extend)(true, options, customizeAnnotation(item))
  125. }
  126. if ("image" === options.type) {
  127. return imageAnnotation(options)
  128. } else {
  129. if ("text" === options.type) {
  130. return labelAnnotation(options)
  131. }
  132. }
  133. }
  134. var createAnnotations = exports.createAnnotations = function(items) {
  135. var options = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
  136. var customizeAnnotation = arguments.length > 2 ? arguments[2] : void 0;
  137. return items.reduce(function(arr, item) {
  138. var annotation = createAnnotation(item, options, customizeAnnotation);
  139. annotation && arr.push(annotation);
  140. return arr
  141. }, [])
  142. };
  143. var chartPlugin = {
  144. name: "annotations_chart",
  145. init: function() {},
  146. dispose: function() {},
  147. members: {
  148. _getAnnotationCoords: function(annotation) {
  149. var coords = {
  150. offsetX: annotation.offsetX,
  151. offsetY: annotation.offsetY
  152. };
  153. var argCoordName = this._options.rotated ? "y" : "x";
  154. var valCoordName = this._options.rotated ? "x" : "y";
  155. var argAxis = this.getArgumentAxis();
  156. var argument = argAxis.validateUnit(annotation.argument);
  157. var axis = this.getValueAxis(annotation.axis);
  158. var series;
  159. var pane = (0, _type.isDefined)(axis) ? axis.pane : void 0;
  160. if (annotation.series) {
  161. series = this.series.filter(function(s) {
  162. return s.name === annotation.series
  163. })[0];
  164. axis = series && series.getValueAxis();
  165. (0, _type.isDefined)(axis) && (pane = axis.pane)
  166. }
  167. if ((0, _type.isDefined)(argument)) {
  168. if (series) {
  169. var center = series.getPointCenterByArg(argument);
  170. center && (coords[argCoordName] = center[argCoordName])
  171. } else {
  172. coords[argCoordName] = argAxis.getTranslator().translate(argument)
  173. }!(0, _type.isDefined)(pane) && (pane = argAxis.pane)
  174. }
  175. var value = axis && axis.validateUnit(annotation.value);
  176. if ((0, _type.isDefined)(value)) {
  177. coords[valCoordName] = axis && axis.getTranslator().translate(value);
  178. !(0, _type.isDefined)(pane) && (0, _type.isDefined)(axis) && (pane = axis.pane)
  179. }
  180. coords.canvas = this._getCanvasForPane(pane);
  181. if ((0, _type.isDefined)(coords[argCoordName]) && !(0, _type.isDefined)(value)) {
  182. if (!(0, _type.isDefined)(axis) && !(0, _type.isDefined)(series)) {
  183. coords[valCoordName] = argAxis.getAxisPosition()
  184. } else {
  185. if ((0, _type.isDefined)(axis) && !(0, _type.isDefined)(series)) {
  186. coords[valCoordName] = this._argumentAxes.filter(function(a) {
  187. return a.pane === axis.pane
  188. })[0].getAxisPosition()
  189. } else {
  190. if ((0, _type.isDefined)(series) && series.checkSeriesViewportCoord(argAxis, coords[argCoordName])) {
  191. coords[valCoordName] = series.getSeriesPairCoord(coords[argCoordName], true)
  192. }
  193. }
  194. }
  195. }
  196. if (!(0, _type.isDefined)(argument) && (0, _type.isDefined)(coords[valCoordName])) {
  197. if ((0, _type.isDefined)(axis) && !(0, _type.isDefined)(series)) {
  198. coords[argCoordName] = axis.getAxisPosition()
  199. } else {
  200. if ((0, _type.isDefined)(series)) {
  201. if (series.checkSeriesViewportCoord(axis, coords[valCoordName])) {
  202. coords[argCoordName] = series.getSeriesPairCoord(coords[valCoordName], false)
  203. }
  204. }
  205. }
  206. }
  207. return coords
  208. },
  209. _annotationsPointerEventHandler: function(event) {
  210. var originalEvent = event.originalEvent || {};
  211. var touch = originalEvent.touches && originalEvent.touches[0] || {};
  212. var rootOffset = this._renderer.getRootOffset();
  213. var coords = {
  214. x: touch.pageX || originalEvent.pageX || event.pageX,
  215. y: touch.pageY || originalEvent.pageY || event.pageY
  216. };
  217. var annotation = this._annotations.items.filter(function(a) {
  218. return a.hitTest(coords.x - rootOffset.left, coords.y - rootOffset.top)
  219. })[0];
  220. if (!annotation || !annotation.options.tooltipEnabled) {
  221. this._annotations.hideTooltip();
  222. return
  223. }
  224. this.hideTooltip();
  225. this.clearHover();
  226. if (annotation.options.allowDragging && event.type === _pointer2.default.down) {
  227. this._annotations._hideToolTipForDrag = true
  228. }
  229. if (!this._annotations._hideToolTipForDrag) {
  230. annotation.showTooltip(this._annotations.tooltip, coords);
  231. event.stopPropagation()
  232. }
  233. }
  234. }
  235. };
  236. var corePlugin = {
  237. name: "annotations_core",
  238. init: function() {
  239. this._annotations = {
  240. items: [],
  241. _hideToolTipForDrag: false,
  242. tooltip: new _tooltip.Tooltip({
  243. cssClass: "".concat(this._rootClassPrefix, "-annotation-tooltip"),
  244. eventTrigger: this._eventTrigger,
  245. widgetRoot: this.element()
  246. }),
  247. hideTooltip: function() {
  248. this.tooltip.annotation = null;
  249. this.tooltip.hide()
  250. }
  251. };
  252. this._annotations.tooltip.setRendererOptions(this._getRendererOptions());
  253. var tooltipOptions = (0, _extend.extend)({}, this._themeManager.getOptions("tooltip"));
  254. tooltipOptions.customizeTooltip = void 0;
  255. this._annotations.tooltip.update(tooltipOptions)
  256. },
  257. dispose: function() {
  258. this._annotationsGroup.linkRemove().linkOff();
  259. _events_engine2.default.off((0, _dom_adapter.getDocument)(), DOT_EVENT_NS);
  260. this._annotationsGroup.off(DOT_EVENT_NS);
  261. this._annotations.tooltip && this._annotations.tooltip.dispose()
  262. },
  263. extenders: {
  264. _createHtmlStructure: function() {
  265. var _this2 = this;
  266. this._annotationsGroup = this._renderer.g().attr({
  267. "class": "".concat(this._rootClassPrefix, "-annotations")
  268. }).linkOn(this._renderer.root, "annotations").linkAppend();
  269. _events_engine2.default.on((0, _dom_adapter.getDocument)(), POINTER_ACTION, function() {
  270. return _this2._annotations.hideTooltip()
  271. });
  272. _events_engine2.default.on((0, _dom_adapter.getDocument)(), POINTER_UP_EVENT_NAME, function(event) {
  273. _this2._annotations._hideToolTipForDrag = false;
  274. _this2._annotationsPointerEventHandler(event)
  275. });
  276. this._annotationsGroup.on(POINTER_ACTION, this._annotationsPointerEventHandler.bind(this))
  277. },
  278. _renderExtraElements: function() {
  279. var _this3 = this;
  280. this._annotationsGroup.clear();
  281. this._annotations.items.forEach(function(item) {
  282. return item.draw(_this3, _this3._annotationsGroup)
  283. })
  284. },
  285. _stopCurrentHandling: function() {
  286. this._annotations.hideTooltip()
  287. }
  288. },
  289. members: {
  290. _buildAnnotations: function() {
  291. this._annotations.items = [];
  292. var items = this._getOption("annotations");
  293. if (!items || !items.length) {
  294. return
  295. }
  296. this._annotations.items = createAnnotations(items, this._getOption("commonAnnotationSettings"), this._getOption("customizeAnnotation"))
  297. },
  298. _getAnnotationCoords: function() {
  299. return {}
  300. }
  301. },
  302. customize: function(constructor) {
  303. constructor.addChange({
  304. code: "ANNOTATIONITEMS",
  305. handler: function() {
  306. this._requestChange(["ANNOTATIONS"])
  307. },
  308. isOptionChange: true,
  309. option: "annotations"
  310. });
  311. constructor.addChange({
  312. code: "ANNOTATIONSSETTINGS",
  313. handler: function() {
  314. this._requestChange(["ANNOTATIONS"])
  315. },
  316. isOptionChange: true,
  317. option: "commonAnnotationSettings"
  318. });
  319. constructor.addChange({
  320. code: "ANNOTATIONS",
  321. handler: function() {
  322. this._buildAnnotations();
  323. this._change(["FORCE_RENDER"])
  324. },
  325. isThemeDependent: true,
  326. isOptionChange: true
  327. })
  328. },
  329. fontFields: ["commonAnnotationSettings.font"]
  330. };
  331. var plugins = exports.plugins = {
  332. core: corePlugin,
  333. chart: chartPlugin
  334. };