tick.js 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. /**
  2. * DevExtreme (viz/axes/tick.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 isDefined = require("../../core/utils/type").isDefined;
  11. var extend = require("../../core/utils/extend").extend;
  12. function getPathStyle(options) {
  13. return {
  14. stroke: options.color,
  15. "stroke-width": options.width,
  16. "stroke-opacity": options.opacity,
  17. opacity: 1
  18. }
  19. }
  20. function createTick(axis, renderer, tickOptions, gridOptions, skippedCategory, skipLabels, offset) {
  21. var tickOffset = offset || axis._tickOffset;
  22. var lineGroup = axis._axisLineGroup;
  23. var elementsGroup = axis._axisElementsGroup;
  24. var tickStyle = getPathStyle(tickOptions);
  25. var gridStyle = getPathStyle(gridOptions);
  26. var emptyStrRegExp = /^\s+$/;
  27. var axisOptions = axis.getOptions();
  28. var labelOptions = axisOptions.label;
  29. var labelStyle = axis._textOptions;
  30. function getLabelFontStyle(tick) {
  31. var fontStyle = axis._textFontStyles;
  32. var customizeColor = labelOptions.customizeColor;
  33. if (customizeColor && customizeColor.call) {
  34. fontStyle = extend({}, axis._textFontStyles, {
  35. fill: customizeColor.call(tick, tick)
  36. })
  37. }
  38. return fontStyle
  39. }
  40. function createLabelHint(tick, range) {
  41. var labelHint = axis.formatHint(tick.value, labelOptions, range);
  42. if (isDefined(labelHint) && "" !== labelHint) {
  43. tick.label.setTitle(labelHint)
  44. }
  45. }
  46. return function(value) {
  47. var tick = {
  48. value: value,
  49. updateValue: function(newValue) {
  50. this.value = value = newValue
  51. },
  52. initCoords: function() {
  53. this.coords = axis._getTranslatedValue(value, tickOffset);
  54. this.labelCoords = axis._getTranslatedValue(value)
  55. },
  56. saveCoords: function() {
  57. this._storedCoords = this.coords;
  58. this._storedLabelsCoords = this.labelCoords
  59. },
  60. drawMark: function(options) {
  61. if (!tickOptions.visible || skippedCategory === value) {
  62. return
  63. }
  64. if (axis.areCoordsOutsideAxis(this.coords)) {
  65. return
  66. }
  67. if (this.mark) {
  68. this.mark.append(lineGroup);
  69. axis.sharp(this.mark, axis.getSharpDirectionByCoords(this.coords));
  70. this.updateTickPosition(options)
  71. } else {
  72. this.mark = axis._createPathElement([], tickStyle, axis.getSharpDirectionByCoords(this.coords)).append(lineGroup);
  73. this.updateTickPosition(options)
  74. }
  75. },
  76. setSkippedCategory: function(category) {
  77. skippedCategory = category
  78. },
  79. _updateLine: function(lineElement, settings, storedSettings, animate, isGridLine) {
  80. if (!lineElement) {
  81. return
  82. }
  83. if (null === settings.points || null === settings.r) {
  84. lineElement.remove();
  85. return
  86. }
  87. if (animate && storedSettings && null !== storedSettings.points) {
  88. settings.opacity = 1;
  89. lineElement.attr(storedSettings);
  90. lineElement.animate(settings)
  91. } else {
  92. settings.opacity = animate ? 0 : 1;
  93. lineElement.attr(settings);
  94. animate && lineElement.animate({
  95. opacity: 1
  96. }, {
  97. delay: .5,
  98. partitionDuration: .5
  99. })
  100. }
  101. this.coords.angle && axis._rotateTick(lineElement, this.coords, isGridLine)
  102. },
  103. updateTickPosition: function(options, animate) {
  104. this._updateLine(this.mark, {
  105. points: axis._getTickMarkPoints(tick.coords, tickOptions.length, options)
  106. }, this._storedCoords && {
  107. points: axis._getTickMarkPoints(tick._storedCoords, tickOptions.length, options)
  108. }, animate, false)
  109. },
  110. drawLabel: function(range) {
  111. var labelIsVisible = labelOptions.visible && !skipLabels && !axis.getTranslator().getBusinessRange().isEmpty() && !axis.areCoordsOutsideAxis(this.labelCoords);
  112. if (!labelIsVisible) {
  113. if (this.label) {
  114. this.label.remove()
  115. }
  116. return
  117. }
  118. var text = axis.formatLabel(value, labelOptions, range);
  119. if (this.label) {
  120. this.label.attr({
  121. text: text,
  122. rotate: 0
  123. }).append(elementsGroup);
  124. createLabelHint(this, range);
  125. this.updateLabelPosition();
  126. return
  127. }
  128. if (isDefined(text) && "" !== text && !emptyStrRegExp.test(text)) {
  129. this.label = renderer.text(text).css(getLabelFontStyle(this)).attr(labelStyle).data("chart-data-argument", this.value).append(elementsGroup);
  130. this.updateLabelPosition();
  131. createLabelHint(this, range)
  132. }
  133. },
  134. fadeOutElements: function() {
  135. var startSettings = {
  136. opacity: 1
  137. };
  138. var endSettings = {
  139. opacity: 0
  140. };
  141. var animationSettings = {
  142. partitionDuration: .5
  143. };
  144. if (this.label) {
  145. this._fadeOutLabel()
  146. }
  147. if (this.grid) {
  148. this.grid.append(axis._axisGridGroup).attr(startSettings).animate(endSettings, animationSettings)
  149. }
  150. if (this.mark) {
  151. this.mark.append(axis._axisLineGroup).attr(startSettings).animate(endSettings, animationSettings)
  152. }
  153. },
  154. _fadeInLabel: function() {
  155. var group = axis._renderer.g().attr({
  156. opacity: 0
  157. }).append(axis._axisElementsGroup).animate({
  158. opacity: 1
  159. }, {
  160. delay: .5,
  161. partitionDuration: .5
  162. });
  163. this.label.append(group)
  164. },
  165. _fadeOutLabel: function() {
  166. var group = axis._renderer.g().attr({
  167. opacity: 1
  168. }).animate({
  169. opacity: 0
  170. }, {
  171. partitionDuration: .5
  172. }).append(axis._axisElementsGroup);
  173. this.label.append(group)
  174. },
  175. updateLabelPosition: function(animate) {
  176. if (!this.label) {
  177. return
  178. }
  179. if (animate && this._storedLabelsCoords) {
  180. this.label.attr({
  181. x: this._storedLabelsCoords.x,
  182. y: this._storedLabelsCoords.y
  183. });
  184. this.label.animate({
  185. x: this.labelCoords.x,
  186. y: this.labelCoords.y
  187. })
  188. } else {
  189. this.label.attr({
  190. x: this.labelCoords.x,
  191. y: this.labelCoords.y
  192. });
  193. if (animate) {
  194. this._fadeInLabel()
  195. }
  196. }
  197. },
  198. drawGrid: function(drawLine) {
  199. if (gridOptions.visible && skippedCategory !== this.value) {
  200. if (this.grid) {
  201. this.grid.append(axis._axisGridGroup);
  202. axis.sharp(this.grid, axis.getSharpDirectionByCoords(this.coords));
  203. this.updateGridPosition()
  204. } else {
  205. this.grid = drawLine(this, gridStyle);
  206. this.grid && this.grid.append(axis._axisGridGroup)
  207. }
  208. }
  209. },
  210. updateGridPosition: function(animate) {
  211. this._updateLine(this.grid, axis._getGridPoints(tick.coords), this._storedCoords && axis._getGridPoints(this._storedCoords), animate, true)
  212. },
  213. removeLabel: function() {
  214. this.label.remove();
  215. this.label = null
  216. }
  217. };
  218. return tick
  219. }
  220. }
  221. exports.tick = createTick;