base_axis.js 97 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250
  1. /**
  2. * DevExtreme (viz/axes/base_axis.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 _smart_formatter = require("./smart_formatter");
  11. var _utils = require("../core/utils");
  12. var _utils2 = _interopRequireDefault(_utils);
  13. var _type = require("../../core/utils/type");
  14. var _axes_constants = require("./axes_constants");
  15. var _axes_constants2 = _interopRequireDefault(_axes_constants);
  16. var _extend = require("../../core/utils/extend");
  17. var _array = require("../../core/utils/array");
  18. var _format_helper = require("../../format_helper");
  19. var _format_helper2 = _interopRequireDefault(_format_helper);
  20. var _parse_utils = require("../components/parse_utils");
  21. var _parse_utils2 = _interopRequireDefault(_parse_utils);
  22. var _tick_generator = require("./tick_generator");
  23. var _tick_generator2 = _interopRequireDefault(_tick_generator);
  24. var _translator2d = require("../translators/translator2d");
  25. var _translator2d2 = _interopRequireDefault(_translator2d);
  26. var _range = require("../translators/range");
  27. var _tick = require("./tick");
  28. var _math2 = require("../../core/utils/math");
  29. var _date = require("../../core/utils/date");
  30. var _common = require("../../core/utils/common");
  31. var _xy_axes = require("./xy_axes");
  32. var _xy_axes2 = _interopRequireDefault(_xy_axes);
  33. var _polar_axes = require("./polar_axes");
  34. var _polar_axes2 = _interopRequireDefault(_polar_axes);
  35. var _constant_line = require("./constant_line");
  36. var _constant_line2 = _interopRequireDefault(_constant_line);
  37. var _strip = require("./strip");
  38. var _strip2 = _interopRequireDefault(_strip);
  39. function _interopRequireDefault(obj) {
  40. return obj && obj.__esModule ? obj : {
  41. "default": obj
  42. }
  43. }
  44. function _defineProperty(obj, key, value) {
  45. if (key in obj) {
  46. Object.defineProperty(obj, key, {
  47. value: value,
  48. enumerable: true,
  49. configurable: true,
  50. writable: true
  51. })
  52. } else {
  53. obj[key] = value
  54. }
  55. return obj
  56. }
  57. var convertTicksToValues = _axes_constants2.default.convertTicksToValues;
  58. var patchFontOptions = _utils2.default.patchFontOptions;
  59. var getVizRangeObject = _utils2.default.getVizRangeObject;
  60. var _math = Math;
  61. var _abs = _math.abs;
  62. var _max = _math.max;
  63. var _min = _math.min;
  64. var _isArray = Array.isArray;
  65. var DEFAULT_AXIS_LABEL_SPACING = 5;
  66. var MAX_GRID_BORDER_ADHENSION = 4;
  67. var TOP = _axes_constants2.default.top;
  68. var BOTTOM = _axes_constants2.default.bottom;
  69. var LEFT = _axes_constants2.default.left;
  70. var RIGHT = _axes_constants2.default.right;
  71. var CENTER = _axes_constants2.default.center;
  72. var KEEP = "keep";
  73. var SHIFT = "shift";
  74. var RESET = "reset";
  75. var ROTATE = "rotate";
  76. var DEFAULT_AXIS_DIVISION_FACTOR = 50;
  77. var DEFAULT_MINOR_AXIS_DIVISION_FACTOR = 15;
  78. var SCROLL_THRESHOLD = 5;
  79. var MAX_MARGIN_VALUE = .8;
  80. var dateIntervals = {
  81. day: 864e5,
  82. week: 6048e5
  83. };
  84. function getTickGenerator(options, incidentOccurred, skipTickGeneration, rangeIsEmpty, adjustDivisionFactor) {
  85. return _tick_generator2.default.tickGenerator({
  86. axisType: options.type,
  87. dataType: options.dataType,
  88. logBase: options.logarithmBase,
  89. axisDivisionFactor: adjustDivisionFactor(options.axisDivisionFactor || DEFAULT_AXIS_DIVISION_FACTOR),
  90. minorAxisDivisionFactor: adjustDivisionFactor(options.minorAxisDivisionFactor || DEFAULT_MINOR_AXIS_DIVISION_FACTOR),
  91. numberMultipliers: options.numberMultipliers,
  92. calculateMinors: options.minorTick.visible || options.minorGrid.visible || options.calculateMinors,
  93. allowDecimals: options.allowDecimals,
  94. endOnTick: options.endOnTick,
  95. incidentOccurred: incidentOccurred,
  96. firstDayOfWeek: options.workWeek && options.workWeek[0],
  97. skipTickGeneration: skipTickGeneration,
  98. skipCalculationLimits: options.skipCalculationLimits,
  99. generateExtraTick: options.generateExtraTick,
  100. minTickInterval: options.minTickInterval,
  101. rangeIsEmpty: rangeIsEmpty
  102. })
  103. }
  104. function createMajorTick(axis, renderer, skippedCategory) {
  105. var options = axis.getOptions();
  106. return (0, _tick.tick)(axis, renderer, options.tick, options.grid, skippedCategory, false)
  107. }
  108. function createMinorTick(axis, renderer) {
  109. var options = axis.getOptions();
  110. return (0, _tick.tick)(axis, renderer, options.minorTick, options.minorGrid)
  111. }
  112. function createBoundaryTick(axis, renderer, isFirst) {
  113. var options = axis.getOptions();
  114. return (0, _tick.tick)(axis, renderer, (0, _extend.extend)({}, options.tick, {
  115. visible: options.showCustomBoundaryTicks
  116. }), options.grid, void 0, false, isFirst ? -1 : 1)
  117. }
  118. function callAction(elements, action, actionArgument1, actionArgument2) {
  119. (elements || []).forEach(function(e) {
  120. return e[action](actionArgument1, actionArgument2)
  121. })
  122. }
  123. function initTickCoords(ticks) {
  124. callAction(ticks, "initCoords")
  125. }
  126. function drawTickMarks(ticks, options) {
  127. callAction(ticks, "drawMark", options)
  128. }
  129. function drawGrids(ticks, drawLine) {
  130. callAction(ticks, "drawGrid", drawLine)
  131. }
  132. function updateTicksPosition(ticks, options, animate) {
  133. callAction(ticks, "updateTickPosition", options, animate)
  134. }
  135. function updateGridsPosition(ticks, animate) {
  136. callAction(ticks, "updateGridPosition", animate)
  137. }
  138. var measureLabels = exports.measureLabels = function(items) {
  139. items.forEach(function(item) {
  140. item.labelBBox = item.label ? item.label.getBBox() : {
  141. x: 0,
  142. y: 0,
  143. width: 0,
  144. height: 0
  145. }
  146. })
  147. };
  148. function cleanUpInvalidTicks(ticks) {
  149. var i = ticks.length - 1;
  150. for (i; i >= 0; i--) {
  151. if (!removeInvalidTick(ticks, i)) {
  152. break
  153. }
  154. }
  155. for (i = 0; i < ticks.length; i++) {
  156. if (removeInvalidTick(ticks, i)) {
  157. i--
  158. } else {
  159. break
  160. }
  161. }
  162. }
  163. function removeInvalidTick(ticks, i) {
  164. if (null === ticks[i].coords.x || null === ticks[i].coords.y) {
  165. ticks.splice(i, 1);
  166. return true
  167. }
  168. return false
  169. }
  170. function validateAxisOptions(options) {
  171. var labelOptions = options.label;
  172. var position = options.position;
  173. var defaultPosition = options.isHorizontal ? BOTTOM : LEFT;
  174. var secondaryPosition = options.isHorizontal ? TOP : RIGHT;
  175. if (position !== defaultPosition && position !== secondaryPosition) {
  176. position = defaultPosition
  177. }
  178. if (position === RIGHT && !labelOptions.userAlignment) {
  179. labelOptions.alignment = LEFT
  180. }
  181. options.position = position;
  182. options.hoverMode = options.hoverMode ? options.hoverMode.toLowerCase() : "none";
  183. labelOptions.minSpacing = (0, _type.isDefined)(labelOptions.minSpacing) ? labelOptions.minSpacing : DEFAULT_AXIS_LABEL_SPACING;
  184. options.type && (options.type = options.type.toLowerCase());
  185. options.argumentType && (options.argumentType = options.argumentType.toLowerCase());
  186. options.valueType && (options.valueType = options.valueType.toLowerCase())
  187. }
  188. function getOptimalAngle(boxes, labelOpt) {
  189. var angle = 180 * _math.asin((boxes[0].height + labelOpt.minSpacing) / (boxes[1].x - boxes[0].x)) / _math.PI;
  190. return angle < 45 ? -45 : -90
  191. }
  192. function updateLabels(ticks, step, func) {
  193. ticks.forEach(function(tick, index) {
  194. if (tick.label) {
  195. if (index % step !== 0) {
  196. tick.removeLabel()
  197. } else {
  198. if (func) {
  199. func(tick, index)
  200. }
  201. }
  202. }
  203. })
  204. }
  205. function valueOf(value) {
  206. return value.valueOf()
  207. }
  208. function getZoomBoundValue(optionValue, dataValue) {
  209. if (void 0 === optionValue) {
  210. return dataValue
  211. } else {
  212. if (null === optionValue) {
  213. return
  214. } else {
  215. return optionValue
  216. }
  217. }
  218. }
  219. function configureGenerator(options, axisDivisionFactor, viewPort, screenDelta, minTickInterval) {
  220. var tickGeneratorOptions = (0, _extend.extend)({}, options, {
  221. endOnTick: true,
  222. axisDivisionFactor: axisDivisionFactor,
  223. skipCalculationLimits: true,
  224. generateExtraTick: true,
  225. minTickInterval: minTickInterval
  226. });
  227. return function(tickInterval, skipTickGeneration, min, max, breaks) {
  228. return getTickGenerator(tickGeneratorOptions, _common.noop, skipTickGeneration, viewPort.isEmpty(), function(v) {
  229. return v
  230. })({
  231. min: min,
  232. max: max,
  233. categories: viewPort.categories,
  234. isSpacedMargin: viewPort.isSpacedMargin,
  235. checkMinDataVisibility: viewPort.checkMinDataVisibility,
  236. checkMaxDataVisibility: viewPort.checkMaxDataVisibility
  237. }, screenDelta, tickInterval, (0, _type.isDefined)(tickInterval), void 0, void 0, void 0, breaks)
  238. }
  239. }
  240. function convertVisualRangeObject(visualRange, optionValue) {
  241. return _utils2.default.convertVisualRangeObject(visualRange, !_isArray(optionValue))
  242. }
  243. function getConstantLineSharpDirection(coord, axisCanvas) {
  244. return Math.max(axisCanvas.start, axisCanvas.end) !== coord ? 1 : -1
  245. }
  246. var calculateCanvasMargins = exports.calculateCanvasMargins = function(bBoxes, canvas) {
  247. var cLeft = canvas.left;
  248. var cTop = canvas.top;
  249. var cRight = canvas.width - canvas.right;
  250. var cBottom = canvas.height - canvas.bottom;
  251. return bBoxes.reduce(function(margins, bBox) {
  252. if (!bBox || bBox.isEmpty) {
  253. return margins
  254. }
  255. return {
  256. left: _max(margins.left, cLeft - bBox.x),
  257. top: _max(margins.top, cTop - bBox.y),
  258. right: _max(margins.right, bBox.x + bBox.width - cRight),
  259. bottom: _max(margins.bottom, bBox.y + bBox.height - cBottom)
  260. }
  261. }, {
  262. left: 0,
  263. right: 0,
  264. top: 0,
  265. bottom: 0
  266. })
  267. };
  268. var Axis = exports.Axis = function(renderSettings) {
  269. var that = this;
  270. that._renderer = renderSettings.renderer;
  271. that._incidentOccurred = renderSettings.incidentOccurred;
  272. that._eventTrigger = renderSettings.eventTrigger;
  273. that._stripsGroup = renderSettings.stripsGroup;
  274. that._labelAxesGroup = renderSettings.labelAxesGroup;
  275. that._constantLinesGroup = renderSettings.constantLinesGroup;
  276. that._scaleBreaksGroup = renderSettings.scaleBreaksGroup;
  277. that._axesContainerGroup = renderSettings.axesContainerGroup;
  278. that._gridContainerGroup = renderSettings.gridGroup;
  279. that._axisCssPrefix = renderSettings.widgetClass + "-" + (renderSettings.axisClass ? renderSettings.axisClass + "-" : "");
  280. that._setType(renderSettings.axisType, renderSettings.drawingType);
  281. that._createAxisGroups();
  282. that._translator = that._createTranslator();
  283. that.isArgumentAxis = renderSettings.isArgumentAxis;
  284. that._viewport = {};
  285. that._firstDrawing = true;
  286. that._initRange = {}
  287. };
  288. Axis.prototype = {
  289. constructor: Axis,
  290. _drawAxis: function() {
  291. var options = this._options;
  292. if (!options.visible) {
  293. return
  294. }
  295. this._axisElement = this._createAxisElement();
  296. this._updateAxisElementPosition();
  297. this._axisElement.attr({
  298. "stroke-width": options.width,
  299. stroke: options.color,
  300. "stroke-opacity": options.opacity
  301. }).sharp(this._getSharpParam(true), this.getAxisSharpDirection()).append(this._axisLineGroup)
  302. },
  303. _createPathElement: function(points, attr, sharpDirection) {
  304. return this.sharp(this._renderer.path(points, "line").attr(attr), sharpDirection)
  305. },
  306. sharp: function(svgElement) {
  307. var sharpDirection = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 1;
  308. return svgElement.sharp(this._getSharpParam(), sharpDirection)
  309. },
  310. getAxisSharpDirection: function() {
  311. var position = this._options.position;
  312. return position === TOP || position === LEFT ? 1 : -1
  313. },
  314. getSharpDirectionByCoords: function(coords) {
  315. var canvas = this._getCanvasStartEnd();
  316. var maxCoord = Math.max(canvas.start, canvas.end);
  317. return this.getRadius ? 0 : maxCoord !== coords[this._isHorizontal ? "x" : "y"] ? 1 : -1
  318. },
  319. _getGridLineDrawer: function() {
  320. var that = this;
  321. return function(tick, gridStyle) {
  322. var grid = that._getGridPoints(tick.coords);
  323. if (grid.points) {
  324. return that._createPathElement(grid.points, gridStyle, that.getSharpDirectionByCoords(tick.coords))
  325. }
  326. return null
  327. }
  328. },
  329. _getGridPoints: function(coords) {
  330. var that = this;
  331. var isHorizontal = this._isHorizontal;
  332. var tickPositionField = isHorizontal ? "x" : "y";
  333. var orthogonalPositions = this._orthogonalPositions;
  334. var positionFrom = orthogonalPositions.start;
  335. var positionTo = orthogonalPositions.end;
  336. var borderOptions = that.borderOptions;
  337. var canvasStart = isHorizontal ? LEFT : TOP;
  338. var canvasEnd = isHorizontal ? RIGHT : BOTTOM;
  339. var axisCanvas = that.getCanvas();
  340. var canvas = {
  341. left: axisCanvas.left,
  342. right: axisCanvas.width - axisCanvas.right,
  343. top: axisCanvas.top,
  344. bottom: axisCanvas.height - axisCanvas.bottom
  345. };
  346. var firstBorderLinePosition = borderOptions.visible && borderOptions[canvasStart] ? canvas[canvasStart] : void 0;
  347. var lastBorderLinePosition = borderOptions.visible && borderOptions[canvasEnd] ? canvas[canvasEnd] : void 0;
  348. var minDelta = MAX_GRID_BORDER_ADHENSION + firstBorderLinePosition;
  349. var maxDelta = lastBorderLinePosition - MAX_GRID_BORDER_ADHENSION;
  350. if (that.areCoordsOutsideAxis(coords) || void 0 === coords[tickPositionField] || coords[tickPositionField] < minDelta || coords[tickPositionField] > maxDelta) {
  351. return {
  352. points: null
  353. }
  354. }
  355. return {
  356. points: isHorizontal ? null !== coords[tickPositionField] ? [coords[tickPositionField], positionFrom, coords[tickPositionField], positionTo] : null : null !== coords[tickPositionField] ? [positionFrom, coords[tickPositionField], positionTo, coords[tickPositionField]] : null
  357. }
  358. },
  359. _getConstantLinePos: function(parsedValue, canvasStart, canvasEnd) {
  360. var value = this._getTranslatedCoord(parsedValue);
  361. if (!(0, _type.isDefined)(value) || value < _min(canvasStart, canvasEnd) || value > _max(canvasStart, canvasEnd)) {
  362. return
  363. }
  364. return value
  365. },
  366. _getConstantLineGraphicAttributes: function(value) {
  367. var positionFrom = this._orthogonalPositions.start;
  368. var positionTo = this._orthogonalPositions.end;
  369. return {
  370. points: this._isHorizontal ? [value, positionFrom, value, positionTo] : [positionFrom, value, positionTo, value]
  371. }
  372. },
  373. _createConstantLine: function(value, attr) {
  374. return this._createPathElement(this._getConstantLineGraphicAttributes(value).points, attr, getConstantLineSharpDirection(value, this._getCanvasStartEnd()))
  375. },
  376. _drawConstantLineLabelText: function(text, x, y, _ref, group) {
  377. var font = _ref.font,
  378. cssClass = _ref.cssClass;
  379. return this._renderer.text(text, x, y).css(patchFontOptions((0, _extend.extend)({}, this._options.label.font, font))).attr({
  380. align: "center",
  381. "class": cssClass
  382. }).append(group)
  383. },
  384. _drawConstantLineLabels: function(parsedValue, lineLabelOptions, value, group) {
  385. var that = this;
  386. var text = lineLabelOptions.text;
  387. var options = that._options;
  388. var labelOptions = options.label;
  389. that._checkAlignmentConstantLineLabels(lineLabelOptions);
  390. text = (0, _type.isDefined)(text) ? text : that.formatLabel(parsedValue, labelOptions);
  391. var coords = that._getConstantLineLabelsCoords(value, lineLabelOptions);
  392. return that._drawConstantLineLabelText(text, coords.x, coords.y, lineLabelOptions, group)
  393. },
  394. _getStripPos: function(startValue, endValue, canvasStart, canvasEnd, range) {
  395. var isContinuous = !!(range.minVisible || range.maxVisible);
  396. var categories = (range.categories || []).reduce(function(result, cat) {
  397. result.push(cat.valueOf());
  398. return result
  399. }, []);
  400. var start;
  401. var end;
  402. if (!isContinuous) {
  403. if ((0, _type.isDefined)(startValue) && (0, _type.isDefined)(endValue)) {
  404. var parsedStartValue = this.parser(startValue);
  405. var parsedEndValue = this.parser(endValue);
  406. var startCategoryIndex = (0, _array.inArray)((0, _type.isDefined)(parsedStartValue) ? parsedStartValue.valueOf() : void 0, categories);
  407. var endCategoryIndex = (0, _array.inArray)((0, _type.isDefined)(parsedEndValue) ? parsedEndValue.valueOf() : void 0, categories);
  408. if (startCategoryIndex === -1 || endCategoryIndex === -1) {
  409. return {
  410. from: 0,
  411. to: 0,
  412. outOfCanvas: true
  413. }
  414. }
  415. if (startCategoryIndex > endCategoryIndex) {
  416. var swap = endValue;
  417. endValue = startValue;
  418. startValue = swap
  419. }
  420. }
  421. }
  422. if ((0, _type.isDefined)(startValue)) {
  423. startValue = this.validateUnit(startValue, "E2105", "strip");
  424. start = this._getTranslatedCoord(startValue, -1)
  425. } else {
  426. start = canvasStart
  427. }
  428. if ((0, _type.isDefined)(endValue)) {
  429. endValue = this.validateUnit(endValue, "E2105", "strip");
  430. end = this._getTranslatedCoord(endValue, 1)
  431. } else {
  432. end = canvasEnd
  433. }
  434. var stripPosition = start < end ? {
  435. from: start,
  436. to: end
  437. } : {
  438. from: end,
  439. to: start
  440. };
  441. var visibleArea = this.getVisibleArea();
  442. if (stripPosition.from <= visibleArea[0] && stripPosition.to <= visibleArea[0] || stripPosition.from >= visibleArea[1] && stripPosition.to >= visibleArea[1]) {
  443. stripPosition.outOfCanvas = true
  444. }
  445. return stripPosition
  446. },
  447. _getStripGraphicAttributes: function(fromPoint, toPoint) {
  448. var x;
  449. var y;
  450. var width;
  451. var height;
  452. var orthogonalPositions = this._orthogonalPositions;
  453. var positionFrom = orthogonalPositions.start;
  454. var positionTo = orthogonalPositions.end;
  455. if (this._isHorizontal) {
  456. x = fromPoint;
  457. y = _min(positionFrom, positionTo);
  458. width = toPoint - fromPoint;
  459. height = _abs(positionFrom - positionTo)
  460. } else {
  461. x = _min(positionFrom, positionTo);
  462. y = fromPoint;
  463. width = _abs(positionFrom - positionTo);
  464. height = _abs(fromPoint - toPoint)
  465. }
  466. return {
  467. x: x,
  468. y: y,
  469. width: width,
  470. height: height
  471. }
  472. },
  473. _createStrip: function(attrs) {
  474. return this._renderer.rect(attrs.x, attrs.y, attrs.width, attrs.height)
  475. },
  476. _adjustStripLabels: function() {
  477. var that = this;
  478. this._strips.forEach(function(strip) {
  479. if (strip.label) {
  480. strip.label.attr(that._getAdjustedStripLabelCoords(strip))
  481. }
  482. })
  483. },
  484. _adjustLabelsCoord: function(offset, maxWidth, checkCanvas) {
  485. var that = this;
  486. that._majorTicks.forEach(function(tick) {
  487. if (tick.label) {
  488. tick.label.attr(that._getLabelAdjustedCoord(tick, offset + (tick.labelOffset || 0), maxWidth, checkCanvas))
  489. }
  490. })
  491. },
  492. _adjustLabels: function(offset) {
  493. var that = this;
  494. var maxSize = that._majorTicks.reduce(function(size, tick) {
  495. if (!tick.label) {
  496. return size
  497. }
  498. var bBox = tick.labelRotationAngle ? _utils2.default.rotateBBox(tick.labelBBox, [tick.labelCoords.x, tick.labelCoords.y], -tick.labelRotationAngle) : tick.labelBBox;
  499. return {
  500. width: _max(size.width || 0, bBox.width),
  501. height: _max(size.height || 0, bBox.height),
  502. offset: _max(size.offset || 0, tick.labelOffset || 0)
  503. }
  504. }, {});
  505. var additionalOffset = that._isHorizontal ? maxSize.height : maxSize.width;
  506. that._adjustLabelsCoord(offset, maxSize.width);
  507. return offset + additionalOffset + (additionalOffset && that._options.label.indentFromAxis) + maxSize.offset
  508. },
  509. _getLabelAdjustedCoord: function(tick, offset, maxWidth) {
  510. offset = offset || 0;
  511. var that = this;
  512. var options = that._options;
  513. var box = _utils2.default.rotateBBox(tick.labelBBox, [tick.labelCoords.x, tick.labelCoords.y], -tick.labelRotationAngle || 0);
  514. var position = options.position;
  515. var textAlign = tick.labelAlignment || options.label.alignment;
  516. var isDiscrete = "discrete" === that._options.type;
  517. var isFlatLabel = tick.labelRotationAngle % 90 === 0;
  518. var indentFromAxis = options.label.indentFromAxis;
  519. var axisPosition = that._axisPosition;
  520. var labelCoords = tick.labelCoords;
  521. var labelX = labelCoords.x;
  522. var translateX;
  523. var translateY;
  524. if (that._isHorizontal) {
  525. if (position === BOTTOM) {
  526. translateY = axisPosition + indentFromAxis - box.y + offset
  527. } else {
  528. translateY = axisPosition - indentFromAxis - (box.y + box.height) - offset
  529. }
  530. if (textAlign === RIGHT) {
  531. translateX = isDiscrete && isFlatLabel ? tick.coords.x - (box.x + box.width) : labelX - box.x - box.width
  532. } else {
  533. if (textAlign === LEFT) {
  534. translateX = isDiscrete && isFlatLabel ? labelX - box.x - (tick.coords.x - labelX) : labelX - box.x
  535. } else {
  536. translateX = labelX - box.x - box.width / 2
  537. }
  538. }
  539. } else {
  540. translateY = labelCoords.y - box.y - box.height / 2;
  541. if (position === LEFT) {
  542. if (textAlign === LEFT) {
  543. translateX = axisPosition - indentFromAxis - maxWidth - box.x
  544. } else {
  545. if (textAlign === CENTER) {
  546. translateX = axisPosition - indentFromAxis - maxWidth / 2 - box.x - box.width / 2
  547. } else {
  548. translateX = axisPosition - indentFromAxis - box.x - box.width
  549. }
  550. }
  551. translateX -= offset
  552. } else {
  553. if (textAlign === RIGHT) {
  554. translateX = axisPosition + indentFromAxis + maxWidth - box.x - box.width
  555. } else {
  556. if (textAlign === CENTER) {
  557. translateX = axisPosition + indentFromAxis + maxWidth / 2 - box.x - box.width / 2
  558. } else {
  559. translateX = axisPosition + indentFromAxis - box.x
  560. }
  561. }
  562. translateX += offset
  563. }
  564. }
  565. return {
  566. translateX: translateX,
  567. translateY: translateY
  568. }
  569. },
  570. _createAxisConstantLineGroups: function() {
  571. var that = this;
  572. var renderer = that._renderer;
  573. var classSelector = that._axisCssPrefix;
  574. var constantLinesClass = classSelector + "constant-lines";
  575. var insideGroup = renderer.g().attr({
  576. "class": constantLinesClass
  577. });
  578. var outsideGroup1 = renderer.g().attr({
  579. "class": constantLinesClass
  580. });
  581. var outsideGroup2 = renderer.g().attr({
  582. "class": constantLinesClass
  583. });
  584. return {
  585. inside: insideGroup,
  586. outside1: outsideGroup1,
  587. left: outsideGroup1,
  588. top: outsideGroup1,
  589. outside2: outsideGroup2,
  590. right: outsideGroup2,
  591. bottom: outsideGroup2,
  592. remove: function() {
  593. this.inside.remove();
  594. this.outside1.remove();
  595. this.outside2.remove()
  596. },
  597. clear: function() {
  598. this.inside.clear();
  599. this.outside1.clear();
  600. this.outside2.clear()
  601. }
  602. }
  603. },
  604. _createAxisGroups: function() {
  605. var that = this;
  606. var renderer = that._renderer;
  607. var classSelector = that._axisCssPrefix;
  608. that._axisGroup = renderer.g().attr({
  609. "class": classSelector + "axis"
  610. });
  611. that._axisStripGroup = renderer.g().attr({
  612. "class": classSelector + "strips"
  613. });
  614. that._axisGridGroup = renderer.g().attr({
  615. "class": classSelector + "grid"
  616. });
  617. that._axisElementsGroup = renderer.g().attr({
  618. "class": classSelector + "elements"
  619. }).append(that._axisGroup);
  620. that._axisLineGroup = renderer.g().attr({
  621. "class": classSelector + "line"
  622. }).append(that._axisGroup);
  623. that._axisTitleGroup = renderer.g().attr({
  624. "class": classSelector + "title"
  625. }).append(that._axisGroup);
  626. that._axisConstantLineGroups = {
  627. above: that._createAxisConstantLineGroups(),
  628. under: that._createAxisConstantLineGroups()
  629. };
  630. that._axisStripLabelGroup = renderer.g().attr({
  631. "class": classSelector + "axis-labels"
  632. })
  633. },
  634. _clearAxisGroups: function() {
  635. var that = this;
  636. that._axisGroup.remove();
  637. that._axisStripGroup.remove();
  638. that._axisStripLabelGroup.remove();
  639. that._axisConstantLineGroups.above.remove();
  640. that._axisConstantLineGroups.under.remove();
  641. that._axisGridGroup.remove();
  642. that._axisTitleGroup.clear();
  643. that._axisElementsGroup.clear();
  644. that._axisLineGroup && that._axisLineGroup.clear();
  645. that._axisStripGroup && that._axisStripGroup.clear();
  646. that._axisGridGroup && that._axisGridGroup.clear();
  647. that._axisConstantLineGroups.above.clear();
  648. that._axisConstantLineGroups.under.clear();
  649. that._axisStripLabelGroup && that._axisStripLabelGroup.clear()
  650. },
  651. _getLabelFormatObject: function(value, labelOptions, range, point, tickInterval, ticks) {
  652. range = range || this._getViewportRange();
  653. var formatObject = {
  654. value: value,
  655. valueText: (0, _smart_formatter.smartFormatter)(value, {
  656. labelOptions: labelOptions,
  657. ticks: ticks || convertTicksToValues(this._majorTicks),
  658. tickInterval: (0, _type.isDefined)(tickInterval) ? tickInterval : this._tickInterval,
  659. dataType: this._options.dataType,
  660. logarithmBase: this._options.logarithmBase,
  661. type: this._options.type,
  662. showTransition: !this._options.marker.visible,
  663. point: point
  664. }) || "",
  665. min: range.minVisible,
  666. max: range.maxVisible
  667. };
  668. if (point) {
  669. formatObject.point = point
  670. }
  671. return formatObject
  672. },
  673. formatLabel: function(value, labelOptions, range, point, tickInterval, ticks) {
  674. var formatObject = this._getLabelFormatObject(value, labelOptions, range, point, tickInterval, ticks);
  675. return (0, _type.isFunction)(labelOptions.customizeText) ? labelOptions.customizeText.call(formatObject, formatObject) : formatObject.valueText
  676. },
  677. formatHint: function(value, labelOptions, range) {
  678. var formatObject = this._getLabelFormatObject(value, labelOptions, range);
  679. return (0, _type.isFunction)(labelOptions.customizeHint) ? labelOptions.customizeHint.call(formatObject, formatObject) : void 0
  680. },
  681. formatRange: function(startValue, endValue, interval) {
  682. return (0, _smart_formatter.formatRange)(startValue, endValue, interval, this.getOptions())
  683. },
  684. _setTickOffset: function() {
  685. var options = this._options;
  686. var discreteAxisDivisionMode = options.discreteAxisDivisionMode;
  687. this._tickOffset = +("crossLabels" !== discreteAxisDivisionMode || !discreteAxisDivisionMode)
  688. },
  689. getMargins: function() {
  690. var that = this;
  691. var options = that._options;
  692. var position = options.position;
  693. var placeholderSize = options.placeholderSize;
  694. var canvas = that.getCanvas();
  695. var cLeft = canvas.left;
  696. var cTop = canvas.top;
  697. var cRight = canvas.width - canvas.right;
  698. var cBottom = canvas.height - canvas.bottom;
  699. var edgeMarginCorrection = _max(options.grid.visible && options.grid.width || 0, options.tick.visible && options.tick.width || 0);
  700. var constantLineAboveSeries = that._axisConstantLineGroups.above;
  701. var constantLineUnderSeries = that._axisConstantLineGroups.under;
  702. var boxes = [that._axisElementsGroup, constantLineAboveSeries.outside1, constantLineAboveSeries.outside2, constantLineUnderSeries.outside1, constantLineUnderSeries.outside2, that._axisLineGroup].map(function(group) {
  703. return group && group.getBBox()
  704. }).concat(function(group) {
  705. var box = group && group.getBBox();
  706. if (!box || box.isEmpty) {
  707. return box
  708. }
  709. if (that._isHorizontal) {
  710. box.x = cLeft;
  711. box.width = cRight - cLeft
  712. } else {
  713. box.y = cTop;
  714. box.height = cBottom - cTop
  715. }
  716. return box
  717. }(that._axisTitleGroup));
  718. var margins = calculateCanvasMargins(boxes, canvas);
  719. margins[position] += options.crosshairMargin;
  720. if (placeholderSize) {
  721. margins[position] = placeholderSize
  722. }
  723. if (edgeMarginCorrection) {
  724. if (that._isHorizontal && canvas.right < edgeMarginCorrection && margins.right < edgeMarginCorrection) {
  725. margins.right = edgeMarginCorrection
  726. }
  727. if (!that._isHorizontal && canvas.bottom < edgeMarginCorrection && margins.bottom < edgeMarginCorrection) {
  728. margins.bottom = edgeMarginCorrection
  729. }
  730. }
  731. return margins
  732. },
  733. validateUnit: function(unit, idError, parameters) {
  734. var that = this;
  735. unit = that.parser(unit);
  736. if (void 0 === unit && idError) {
  737. that._incidentOccurred(idError, [parameters])
  738. }
  739. return unit
  740. },
  741. _setType: function(axisType, drawingType) {
  742. var that = this;
  743. var axisTypeMethods;
  744. switch (axisType) {
  745. case "xyAxes":
  746. axisTypeMethods = _xy_axes2.default;
  747. break;
  748. case "polarAxes":
  749. axisTypeMethods = _polar_axes2.default
  750. }(0, _extend.extend)(that, axisTypeMethods[drawingType])
  751. },
  752. _getSharpParam: function() {
  753. return true
  754. },
  755. _disposeBreaksGroup: _common.noop,
  756. dispose: function() {
  757. var that = this;
  758. [that._axisElementsGroup, that._axisStripGroup, that._axisGroup].forEach(function(g) {
  759. g.dispose()
  760. });
  761. that._strips = that._title = null;
  762. that._axisStripGroup = that._axisConstantLineGroups = that._axisStripLabelGroup = that._axisBreaksGroup = null;
  763. that._axisLineGroup = that._axisElementsGroup = that._axisGridGroup = null;
  764. that._axisGroup = that._axisTitleGroup = null;
  765. that._axesContainerGroup = that._stripsGroup = that._constantLinesGroup = null;
  766. that._renderer = that._options = that._textOptions = that._textFontStyles = null;
  767. that._translator = null;
  768. that._majorTicks = that._minorTicks = null;
  769. that._disposeBreaksGroup()
  770. },
  771. getOptions: function() {
  772. return this._options
  773. },
  774. setPane: function(pane) {
  775. this.pane = pane;
  776. this._options.pane = pane
  777. },
  778. setTypes: function(type, axisType, typeSelector) {
  779. this._options.type = type || this._options.type;
  780. this._options[typeSelector] = axisType || this._options[typeSelector];
  781. this._updateTranslator()
  782. },
  783. resetTypes: function(typeSelector) {
  784. this._options.type = this._initTypes.type;
  785. this._options[typeSelector] = this._initTypes[typeSelector]
  786. },
  787. getTranslator: function() {
  788. return this._translator
  789. },
  790. updateOptions: function(options) {
  791. var that = this;
  792. var labelOpt = options.label;
  793. validateAxisOptions(options);
  794. that._options = options;
  795. options.tick = options.tick || {};
  796. options.minorTick = options.minorTick || {};
  797. options.grid = options.grid || {};
  798. options.minorGrid = options.minorGrid || {};
  799. options.title = options.title || {};
  800. options.marker = options.marker || {};
  801. that._initTypes = {
  802. type: options.type,
  803. argumentType: options.argumentType,
  804. valueType: options.valueType
  805. };
  806. that._setTickOffset();
  807. that._isHorizontal = options.isHorizontal;
  808. that.pane = options.pane;
  809. that.name = options.name;
  810. that.priority = options.priority;
  811. that._hasLabelFormat = "" !== labelOpt.format && (0, _type.isDefined)(labelOpt.format);
  812. that._textOptions = {
  813. opacity: labelOpt.opacity,
  814. align: "center",
  815. "class": labelOpt.cssClass
  816. };
  817. that._textFontStyles = _utils2.default.patchFontOptions(labelOpt.font);
  818. if (options.type === _axes_constants2.default.logarithmic) {
  819. if (options.logarithmBaseError) {
  820. that._incidentOccurred("E2104");
  821. delete options.logarithmBaseError
  822. }
  823. }
  824. that._updateTranslator();
  825. that._createConstantLines();
  826. that._strips = (options.strips || []).map(function(o) {
  827. return (0, _strip2.default)(that, o)
  828. });
  829. that._majorTicks = that._minorTicks = null;
  830. that._firstDrawing = true
  831. },
  832. calculateInterval: function(value, prevValue) {
  833. var options = this._options;
  834. return !options || options.type !== _axes_constants2.default.logarithmic ? _abs(value - prevValue) : _utils2.default.getLog(value / prevValue, options.logarithmBase)
  835. },
  836. _processCanvas: function(canvas) {
  837. return canvas
  838. },
  839. updateCanvas: function(canvas) {
  840. var positions = this._orthogonalPositions = {
  841. start: !this._isHorizontal ? canvas.left : canvas.top,
  842. end: !this._isHorizontal ? canvas.width - canvas.right : canvas.height - canvas.bottom
  843. };
  844. this._canvas = canvas;
  845. positions.center = positions.start + (positions.end - positions.start) / 2;
  846. this._translator.updateCanvas(this._processCanvas(canvas));
  847. this._initAxisPositions()
  848. },
  849. getCanvas: function() {
  850. return this._canvas
  851. },
  852. getAxisShift: function() {
  853. return this._axisShift || 0
  854. },
  855. hideTitle: function() {
  856. var that = this;
  857. if (that._options.title.text) {
  858. that._incidentOccurred("W2105", [that._isHorizontal ? "horizontal" : "vertical"]);
  859. that._axisTitleGroup.clear()
  860. }
  861. },
  862. getTitle: function() {
  863. return this._title
  864. },
  865. hideOuterElements: function() {
  866. var that = this;
  867. var options = that._options;
  868. if ((options.label.visible || that._outsideConstantLines.length) && !that._translator.getBusinessRange().isEmpty()) {
  869. that._incidentOccurred("W2106", [that._isHorizontal ? "horizontal" : "vertical"]);
  870. that._axisElementsGroup.clear();
  871. callAction(that._outsideConstantLines, "removeLabel")
  872. }
  873. },
  874. adjustViewport: function(businessRange) {
  875. var that = this;
  876. var options = that._options;
  877. var isDiscrete = options.type === _axes_constants2.default.discrete;
  878. var categories = that._seriesData && that._seriesData.categories || [];
  879. var wholeRange = that.adjustRange(getVizRangeObject(options.wholeRange));
  880. var visualRange = that.getViewport() || {};
  881. var result = new _range.Range(businessRange);
  882. that._addConstantLinesToRange(result, "minVisible", "maxVisible");
  883. var minDefined = (0, _type.isDefined)(visualRange.startValue);
  884. var maxDefined = (0, _type.isDefined)(visualRange.endValue);
  885. if (!isDiscrete) {
  886. minDefined = minDefined && (!(0, _type.isDefined)(wholeRange.endValue) || visualRange.startValue < wholeRange.endValue);
  887. maxDefined = maxDefined && (!(0, _type.isDefined)(wholeRange.startValue) || visualRange.endValue > wholeRange.startValue)
  888. }
  889. var minVisible = minDefined ? visualRange.startValue : result.minVisible;
  890. var maxVisible = maxDefined ? visualRange.endValue : result.maxVisible;
  891. if (!isDiscrete) {
  892. result.min = (0, _type.isDefined)(wholeRange.startValue) ? wholeRange.startValue : result.min;
  893. result.max = (0, _type.isDefined)(wholeRange.endValue) ? wholeRange.endValue : result.max
  894. } else {
  895. var categoriesInfo = _utils2.default.getCategoriesInfo(categories, wholeRange.startValue, wholeRange.endValue);
  896. categories = categoriesInfo.categories;
  897. result.categories = categories
  898. }
  899. var adjustedVisualRange = _utils2.default.adjustVisualRange({
  900. axisType: options.type,
  901. dataType: options.dataType,
  902. base: options.logarithmBase
  903. }, {
  904. startValue: minDefined ? visualRange.startValue : void 0,
  905. endValue: maxDefined ? visualRange.endValue : void 0,
  906. length: visualRange.length
  907. }, {
  908. categories: categories,
  909. min: wholeRange.startValue,
  910. max: wholeRange.endValue
  911. }, {
  912. categories: categories,
  913. min: minVisible,
  914. max: maxVisible
  915. });
  916. result.minVisible = adjustedVisualRange.startValue;
  917. result.maxVisible = adjustedVisualRange.endValue;
  918. !(0, _type.isDefined)(result.min) && (result.min = result.minVisible);
  919. !(0, _type.isDefined)(result.max) && (result.max = result.maxVisible);
  920. result.addRange({});
  921. return result
  922. },
  923. adjustRange: function(range) {
  924. range = range || {};
  925. var isDiscrete = this._options.type === _axes_constants2.default.discrete;
  926. var isLogarithmic = this._options.type === _axes_constants2.default.logarithmic;
  927. if (isLogarithmic) {
  928. range.startValue = range.startValue <= 0 ? null : range.startValue;
  929. range.endValue = range.endValue <= 0 ? null : range.endValue
  930. }
  931. if (!isDiscrete && (0, _type.isDefined)(range.startValue) && (0, _type.isDefined)(range.endValue) && range.startValue > range.endValue) {
  932. var tmp = range.endValue;
  933. range.endValue = range.startValue;
  934. range.startValue = tmp
  935. }
  936. return range
  937. },
  938. _getVisualRangeUpdateMode: function(viewport, newRange, oppositeValue) {
  939. var value = this._options.visualRangeUpdateMode;
  940. var translator = this._translator;
  941. var range = this._seriesData;
  942. if (this.isArgumentAxis) {
  943. if ([SHIFT, KEEP, RESET].indexOf(value) === -1) {
  944. if (range.axisType === _axes_constants2.default.discrete) {
  945. var categories = range.categories;
  946. var newCategories = newRange.categories;
  947. var visualRange = this.visualRange();
  948. if (categories && newCategories && categories.length && newCategories.map(function(c) {
  949. return c.valueOf()
  950. }).join(",").indexOf(categories.map(function(c) {
  951. return c.valueOf()
  952. }).join(",")) !== -1 && (visualRange.startValue.valueOf() !== categories[0].valueOf() || visualRange.endValue.valueOf() !== categories[categories.length - 1].valueOf())) {
  953. value = KEEP
  954. } else {
  955. value = RESET
  956. }
  957. } else {
  958. var minPoint = translator.translate(range.min);
  959. var minVisiblePoint = translator.translate(viewport.startValue);
  960. var maxPoint = translator.translate(range.max);
  961. var maxVisiblePoint = translator.translate(viewport.endValue);
  962. if (minPoint === minVisiblePoint && maxPoint === maxVisiblePoint) {
  963. value = RESET
  964. } else {
  965. if (minPoint !== minVisiblePoint && maxPoint === maxVisiblePoint) {
  966. value = SHIFT
  967. } else {
  968. value = KEEP
  969. }
  970. }
  971. }
  972. }
  973. } else {
  974. if ([KEEP, RESET].indexOf(value) === -1) {
  975. if (oppositeValue === KEEP) {
  976. value = KEEP
  977. } else {
  978. value = RESET
  979. }
  980. }
  981. }
  982. return value
  983. },
  984. _handleBusinessRangeChanged: function(oppositeVisualRangeUpdateMode, axisReinitialized, newRange) {
  985. var that = this;
  986. var visualRange = this.visualRange();
  987. if (axisReinitialized || that._translator.getBusinessRange().isEmpty()) {
  988. return
  989. }
  990. var visualRangeUpdateMode = that._lastVisualRangeUpdateMode = that._getVisualRangeUpdateMode(visualRange, newRange, oppositeVisualRangeUpdateMode);
  991. if (!that.isArgumentAxis) {
  992. var viewport = that.getViewport();
  993. if (!(0, _type.isDefined)(viewport.startValue) && !(0, _type.isDefined)(viewport.endValue) && !(0, _type.isDefined)(viewport.length)) {
  994. visualRangeUpdateMode = RESET
  995. }
  996. }
  997. that._prevDataWasEmpty && (visualRangeUpdateMode = KEEP);
  998. if (visualRangeUpdateMode === KEEP) {
  999. that._setVisualRange([visualRange.startValue, visualRange.endValue])
  1000. }
  1001. if (visualRangeUpdateMode === RESET) {
  1002. that._setVisualRange([null, null])
  1003. }
  1004. if (visualRangeUpdateMode === SHIFT) {
  1005. that._setVisualRange({
  1006. length: that.getVisualRangeLength()
  1007. })
  1008. }
  1009. },
  1010. getVisualRangeLength: function(range) {
  1011. var currentBusinessRange = range || this._translator.getBusinessRange();
  1012. var _this$_options = this._options,
  1013. type = _this$_options.type,
  1014. logarithmBase = _this$_options.logarithmBase;
  1015. var length;
  1016. if (type === _axes_constants2.default.logarithmic) {
  1017. length = (0, _math2.adjust)(_utils2.default.getLog(currentBusinessRange.maxVisible / currentBusinessRange.minVisible, logarithmBase))
  1018. } else {
  1019. if (type === _axes_constants2.default.discrete) {
  1020. var categoriesInfo = _utils2.default.getCategoriesInfo(currentBusinessRange.categories, currentBusinessRange.minVisible, currentBusinessRange.maxVisible);
  1021. length = categoriesInfo.categories.length
  1022. } else {
  1023. length = currentBusinessRange.maxVisible - currentBusinessRange.minVisible
  1024. }
  1025. }
  1026. return length
  1027. },
  1028. getVisualRangeCenter: function(range) {
  1029. var businessRange = this._translator.getBusinessRange();
  1030. var currentBusinessRange = range || businessRange;
  1031. var _this$_options2 = this._options,
  1032. type = _this$_options2.type,
  1033. logarithmBase = _this$_options2.logarithmBase;
  1034. var center;
  1035. if (!(0, _type.isDefined)(currentBusinessRange.minVisible) || !(0, _type.isDefined)(currentBusinessRange.maxVisible)) {
  1036. return
  1037. }
  1038. if (type === _axes_constants2.default.logarithmic) {
  1039. center = _utils2.default.raiseTo((0, _math2.adjust)(_utils2.default.getLog(currentBusinessRange.maxVisible * currentBusinessRange.minVisible, logarithmBase)) / 2, logarithmBase)
  1040. } else {
  1041. if (type === _axes_constants2.default.discrete) {
  1042. var categoriesInfo = _utils2.default.getCategoriesInfo(currentBusinessRange.categories, currentBusinessRange.minVisible, currentBusinessRange.maxVisible);
  1043. var index = Math.ceil(categoriesInfo.categories.length / 2) - 1;
  1044. center = businessRange.categories.indexOf(categoriesInfo.categories[index])
  1045. } else {
  1046. center = (currentBusinessRange.maxVisible.valueOf() + currentBusinessRange.minVisible.valueOf()) / 2
  1047. }
  1048. }
  1049. return center
  1050. },
  1051. setBusinessRange: function(range, axisReinitialized, oppositeVisualRangeUpdateMode, argCategories) {
  1052. var that = this;
  1053. var options = that._options;
  1054. var isDiscrete = options.type === _axes_constants2.default.discrete;
  1055. that._handleBusinessRangeChanged(oppositeVisualRangeUpdateMode, axisReinitialized, range);
  1056. that._seriesData = new _range.Range(range);
  1057. var dataIsEmpty = that._seriesData.isEmpty();
  1058. that._prevDataWasEmpty = dataIsEmpty;
  1059. that._seriesData.addRange({
  1060. categories: options.categories,
  1061. dataType: options.dataType,
  1062. axisType: options.type,
  1063. base: options.logarithmBase,
  1064. invert: options.inverted
  1065. });
  1066. if (!isDiscrete) {
  1067. if (!(0, _type.isDefined)(that._seriesData.min) && !(0, _type.isDefined)(that._seriesData.max)) {
  1068. var visualRange = that.getViewport();
  1069. visualRange && that._seriesData.addRange({
  1070. min: visualRange.startValue,
  1071. max: visualRange.endValue
  1072. })
  1073. }
  1074. var synchronizedValue = options.synchronizedValue;
  1075. if ((0, _type.isDefined)(synchronizedValue)) {
  1076. that._seriesData.addRange({
  1077. min: synchronizedValue,
  1078. max: synchronizedValue
  1079. })
  1080. }
  1081. }
  1082. that._seriesData.minVisible = void 0 === that._seriesData.minVisible ? that._seriesData.min : that._seriesData.minVisible;
  1083. that._seriesData.maxVisible = void 0 === that._seriesData.maxVisible ? that._seriesData.max : that._seriesData.maxVisible;
  1084. if (!that.isArgumentAxis && options.showZero) {
  1085. that._seriesData.correctValueZeroLevel()
  1086. }
  1087. that._seriesData.sortCategories(that.getCategoriesSorter(argCategories));
  1088. that._seriesData.breaks = that._breaks = that._getScaleBreaks(options, that._seriesData, that._series, that.isArgumentAxis);
  1089. that._translator.updateBusinessRange(that.adjustViewport(that._seriesData))
  1090. },
  1091. _addConstantLinesToRange: function(dataRange, minValueField, maxValueField) {
  1092. this._outsideConstantLines.concat(this._insideConstantLines || []).forEach(function(cl) {
  1093. if (cl.options.extendAxis) {
  1094. var _dataRange$addRange;
  1095. var value = cl.getParsedValue();
  1096. dataRange.addRange((_dataRange$addRange = {}, _defineProperty(_dataRange$addRange, minValueField, value), _defineProperty(_dataRange$addRange, maxValueField, value), _dataRange$addRange))
  1097. }
  1098. })
  1099. },
  1100. setGroupSeries: function(series) {
  1101. this._series = series
  1102. },
  1103. getLabelsPosition: function() {
  1104. var that = this;
  1105. var options = that._options;
  1106. var position = options.position;
  1107. var labelShift = options.label.indentFromAxis + (that._axisShift || 0) + that._constantLabelOffset;
  1108. var axisPosition = that._axisPosition;
  1109. return position === TOP || position === LEFT ? axisPosition - labelShift : axisPosition + labelShift
  1110. },
  1111. getFormattedValue: function(value, options, point) {
  1112. var labelOptions = this._options.label;
  1113. return (0, _type.isDefined)(value) ? this.formatLabel(value, (0, _extend.extend)(true, {}, labelOptions, options), void 0, point) : null
  1114. },
  1115. _getBoundaryTicks: function(majors, viewPort) {
  1116. var that = this;
  1117. var length = majors.length;
  1118. var options = that._options;
  1119. var customBounds = options.customBoundTicks;
  1120. var min = viewPort.minVisible;
  1121. var max = viewPort.maxVisible;
  1122. var addMinMax = options.showCustomBoundaryTicks ? that._boundaryTicksVisibility : {};
  1123. var boundaryTicks = [];
  1124. if (options.type === _axes_constants2.default.discrete) {
  1125. if (that._tickOffset && 0 !== majors.length) {
  1126. boundaryTicks = [majors[0], majors[majors.length - 1]]
  1127. }
  1128. } else {
  1129. if (customBounds) {
  1130. if (addMinMax.min && (0, _type.isDefined)(customBounds[0])) {
  1131. boundaryTicks.push(customBounds[0])
  1132. }
  1133. if (addMinMax.max && (0, _type.isDefined)(customBounds[1])) {
  1134. boundaryTicks.push(customBounds[1])
  1135. }
  1136. } else {
  1137. if (addMinMax.min && (0 === length || majors[0] > min)) {
  1138. boundaryTicks.push(min)
  1139. }
  1140. if (addMinMax.max && (0 === length || majors[length - 1] < max)) {
  1141. boundaryTicks.push(max)
  1142. }
  1143. }
  1144. }
  1145. return boundaryTicks
  1146. },
  1147. setPercentLabelFormat: function() {
  1148. if (!this._hasLabelFormat) {
  1149. this._options.label.format = "percent"
  1150. }
  1151. },
  1152. resetAutoLabelFormat: function() {
  1153. if (!this._hasLabelFormat) {
  1154. delete this._options.label.format
  1155. }
  1156. },
  1157. getMultipleAxesSpacing: function() {
  1158. return this._options.multipleAxesSpacing || 0
  1159. },
  1160. getTicksValues: function() {
  1161. return {
  1162. majorTicksValues: convertTicksToValues(this._majorTicks),
  1163. minorTicksValues: convertTicksToValues(this._minorTicks)
  1164. }
  1165. },
  1166. setTicks: function(ticks) {
  1167. var majors = ticks.majorTicks || [];
  1168. this._majorTicks = majors.map(createMajorTick(this, this._renderer, this._getSkippedCategory(majors)));
  1169. this._minorTicks = (ticks.minorTicks || []).map(createMinorTick(this, this._renderer));
  1170. this._isSynchronized = true
  1171. },
  1172. _adjustDivisionFactor: function(val) {
  1173. return val
  1174. },
  1175. _getTicks: function(viewPort, incidentOccurred, skipTickGeneration) {
  1176. var that = this;
  1177. var options = that._options;
  1178. var customTicks = options.customTicks;
  1179. var customMinorTicks = options.customMinorTicks;
  1180. return getTickGenerator(options, incidentOccurred || that._incidentOccurred, skipTickGeneration, that._translator.getBusinessRange().isEmpty(), that._adjustDivisionFactor.bind(that))({
  1181. min: viewPort.minVisible,
  1182. max: viewPort.maxVisible,
  1183. categories: viewPort.categories,
  1184. isSpacedMargin: viewPort.isSpacedMargin,
  1185. checkMinDataVisibility: viewPort.checkMinDataVisibility,
  1186. checkMaxDataVisibility: viewPort.checkMaxDataVisibility
  1187. }, that._getScreenDelta(), options.tickInterval, "ignore" === options.label.overlappingBehavior || options.forceUserTickInterval, {
  1188. majors: customTicks,
  1189. minors: customMinorTicks
  1190. }, options.minorTickInterval, options.minorTickCount, that._breaks)
  1191. },
  1192. _createTicksAndLabelFormat: function(range, incidentOccurred) {
  1193. var options = this._options;
  1194. var ticks = this._getTicks(range, incidentOccurred, false);
  1195. if (!range.isEmpty() && options.type === _axes_constants2.default.discrete && "datetime" === options.dataType && !this._hasLabelFormat && ticks.ticks.length) {
  1196. options.label.format = _format_helper2.default.getDateFormatByTicks(ticks.ticks)
  1197. }
  1198. return ticks
  1199. },
  1200. getAggregationInfo: function(useAllAggregatedPoints, range) {
  1201. var that = this;
  1202. var options = that._options;
  1203. var marginOptions = that._marginOptions;
  1204. var businessRange = new _range.Range(that.getTranslator().getBusinessRange()).addRange(range);
  1205. var visualRange = that.getViewport();
  1206. var minVisible = visualRange && (0, _type.isDefined)(visualRange.startValue) ? visualRange.startValue : businessRange.minVisible;
  1207. var maxVisible = visualRange && (0, _type.isDefined)(visualRange.endValue) ? visualRange.endValue : businessRange.maxVisible;
  1208. var ticks = [];
  1209. var aggregationInterval = options.aggregationInterval;
  1210. var aggregationGroupWidth = options.aggregationGroupWidth;
  1211. if (!aggregationGroupWidth && marginOptions) {
  1212. if (marginOptions.checkInterval) {
  1213. aggregationGroupWidth = options.axisDivisionFactor
  1214. }
  1215. if (marginOptions.sizePointNormalState) {
  1216. aggregationGroupWidth = Math.min(marginOptions.sizePointNormalState, options.axisDivisionFactor)
  1217. }
  1218. }
  1219. var minInterval = !options.aggregationGroupWidth && !aggregationInterval && range.interval;
  1220. var generateTicks = configureGenerator(options, aggregationGroupWidth, businessRange, that._getScreenDelta(), minInterval);
  1221. var tickInterval = generateTicks(aggregationInterval, true, minVisible, maxVisible, that._breaks).tickInterval;
  1222. if (options.type !== _axes_constants2.default.discrete) {
  1223. var min = useAllAggregatedPoints ? businessRange.min : minVisible;
  1224. var max = useAllAggregatedPoints ? businessRange.max : maxVisible;
  1225. if ((0, _type.isDefined)(min) && (0, _type.isDefined)(max)) {
  1226. var add = _utils2.default.getAddFunction({
  1227. base: options.logarithmBase,
  1228. axisType: options.type,
  1229. dataType: options.dataType
  1230. }, false);
  1231. var start = min;
  1232. var end = max;
  1233. if (!useAllAggregatedPoints) {
  1234. var maxMinDistance = Math.max(that.calculateInterval(max, min), "datetime" === options.dataType ? (0, _date.dateToMilliseconds)(tickInterval) : tickInterval);
  1235. start = add(min, maxMinDistance, -1);
  1236. end = add(max, maxMinDistance)
  1237. }
  1238. start = start < businessRange.min ? businessRange.min : start;
  1239. end = end > businessRange.max ? businessRange.max : end;
  1240. var breaks = that._getScaleBreaks(options, {
  1241. minVisible: start,
  1242. maxVisible: end
  1243. }, that._series, that.isArgumentAxis);
  1244. ticks = generateTicks(tickInterval, false, start, end, breaks).ticks
  1245. }
  1246. }
  1247. that._aggregationInterval = tickInterval;
  1248. return {
  1249. interval: tickInterval,
  1250. ticks: ticks
  1251. }
  1252. },
  1253. createTicks: function(canvas) {
  1254. var that = this;
  1255. var renderer = that._renderer;
  1256. var options = that._options;
  1257. if (!canvas) {
  1258. return
  1259. }
  1260. that._isSynchronized = false;
  1261. that.updateCanvas(canvas);
  1262. that._estimatedTickInterval = that._getTicks(that.adjustViewport(this._seriesData), _common.noop, true).tickInterval;
  1263. var range = that._getViewportRange();
  1264. var margins = this._calculateValueMargins();
  1265. range.addRange({
  1266. minVisible: margins.minValue,
  1267. maxVisible: margins.maxValue,
  1268. isSpacedMargin: margins.isSpacedMargin,
  1269. checkMinDataVisibility: !this.isArgumentAxis && margins.checkInterval && !(0, _type.isDefined)(options.min) && margins.minValue.valueOf() > 0,
  1270. checkMaxDataVisibility: !this.isArgumentAxis && margins.checkInterval && !(0, _type.isDefined)(options.max) && margins.maxValue.valueOf() < 0
  1271. });
  1272. var ticks = that._createTicksAndLabelFormat(range);
  1273. var boundaryTicks = that._getBoundaryTicks(ticks.ticks, that._getViewportRange());
  1274. if (options.showCustomBoundaryTicks && boundaryTicks.length) {
  1275. that._boundaryTicks = [boundaryTicks[0]].map(createBoundaryTick(that, renderer, true));
  1276. if (boundaryTicks.length > 1) {
  1277. that._boundaryTicks = that._boundaryTicks.concat([boundaryTicks[1]].map(createBoundaryTick(that, renderer, false)))
  1278. }
  1279. } else {
  1280. that._boundaryTicks = []
  1281. }
  1282. var minors = (ticks.minorTicks || []).filter(function(minor) {
  1283. return !boundaryTicks.some(function(boundary) {
  1284. return valueOf(boundary) === valueOf(minor)
  1285. })
  1286. });
  1287. that._tickInterval = ticks.tickInterval;
  1288. that._minorTickInterval = ticks.minorTickInterval;
  1289. var oldMajorTicks = that._majorTicks || [];
  1290. var majorTicksByValues = oldMajorTicks.reduce(function(r, t) {
  1291. r[t.value.valueOf()] = t;
  1292. return r
  1293. }, {});
  1294. var sameType = (0, _type.type)(ticks.ticks[0]) === (0, _type.type)(oldMajorTicks[0] && oldMajorTicks[0].value);
  1295. var skippedCategory = that._getSkippedCategory(ticks.ticks);
  1296. var majorTicks = ticks.ticks.map(function(v) {
  1297. var tick = majorTicksByValues[v.valueOf()];
  1298. if (tick && sameType) {
  1299. delete majorTicksByValues[v.valueOf()];
  1300. tick.setSkippedCategory(skippedCategory);
  1301. return tick
  1302. } else {
  1303. return createMajorTick(that, renderer, skippedCategory)(v)
  1304. }
  1305. });
  1306. that._majorTicks = majorTicks;
  1307. var oldMinorTicks = that._minorTicks || [];
  1308. that._minorTicks = minors.map(function(v, i) {
  1309. var minorTick = oldMinorTicks[i];
  1310. if (minorTick) {
  1311. minorTick.updateValue(v);
  1312. return minorTick
  1313. }
  1314. return createMinorTick(that, renderer)(v)
  1315. });
  1316. that._ticksToRemove = Object.keys(majorTicksByValues).map(function(k) {
  1317. return majorTicksByValues[k]
  1318. }).concat(oldMinorTicks.slice(that._minorTicks.length, oldMinorTicks.length));
  1319. that._correctedBreaks = ticks.breaks;
  1320. that._reinitTranslator(that._getViewportRange())
  1321. },
  1322. _reinitTranslator: function(range) {
  1323. var that = this;
  1324. var translator = that._translator;
  1325. if (that._correctedBreaks) {
  1326. range.breaks = that._correctedBreaks
  1327. }
  1328. if (that._isSynchronized) {
  1329. return
  1330. }
  1331. translator.updateBusinessRange(that.adjustViewport(range))
  1332. },
  1333. _getViewportRange: function() {
  1334. return this.adjustViewport(this._seriesData)
  1335. },
  1336. setMarginOptions: function(options) {
  1337. this._marginOptions = options
  1338. },
  1339. getMarginOptions: function() {
  1340. return (0, _type.isDefined)(this._marginOptions) ? this._marginOptions : {}
  1341. },
  1342. allowToExtendVisualRange: function(isEnd) {
  1343. var wholeRange = this.adjustRange(getVizRangeObject(this._options.wholeRange));
  1344. var bound = isEnd ? wholeRange.endValue : wholeRange.startValue;
  1345. return !this.isArgumentAxis || !(0, _type.isDefined)(bound) && this.isExtremePosition(isEnd)
  1346. },
  1347. _calculateRangeInterval: function(interval) {
  1348. var isDateTime = "datetime" === this._options.dataType;
  1349. var minArgs = [];
  1350. var addToArgs = function(value) {
  1351. (0, _type.isDefined)(value) && minArgs.push(isDateTime ? (0, _date.dateToMilliseconds)(value) : value)
  1352. };
  1353. addToArgs(this._tickInterval);
  1354. addToArgs(this._estimatedTickInterval);
  1355. (0, _type.isDefined)(interval) && minArgs.push(interval);
  1356. addToArgs(this._aggregationInterval);
  1357. return this._calculateWorkWeekInterval(_min.apply(this, minArgs))
  1358. },
  1359. _calculateWorkWeekInterval: function(businessInterval) {
  1360. var options = this._options;
  1361. if ("datetime" === options.dataType && options.workdaysOnly && businessInterval) {
  1362. var workWeek = options.workWeek.length * dateIntervals.day;
  1363. var weekend = dateIntervals.week - workWeek;
  1364. if (workWeek !== businessInterval && weekend < businessInterval) {
  1365. var weekendsCount = Math.ceil(businessInterval / dateIntervals.week);
  1366. businessInterval = weekend >= businessInterval ? dateIntervals.day : businessInterval - weekend * weekendsCount
  1367. } else {
  1368. if (weekend >= businessInterval && businessInterval > dateIntervals.day) {
  1369. businessInterval = dateIntervals.day
  1370. }
  1371. }
  1372. }
  1373. return businessInterval
  1374. },
  1375. _calculateValueMargins: function(ticks) {
  1376. this._resetMargins();
  1377. var that = this;
  1378. var margins = that.getMarginOptions();
  1379. var marginSize = (margins.size || 0) / 2;
  1380. var options = that._options;
  1381. var dataRange = this._getViewportRange();
  1382. var viewPort = this.getViewport();
  1383. var screenDelta = that._getScreenDelta();
  1384. var isDiscrete = (options.type || "").indexOf(_axes_constants2.default.discrete) !== -1;
  1385. var valueMarginsEnabled = options.valueMarginsEnabled && !isDiscrete;
  1386. var translator = that._translator;
  1387. var minValueMargin = options.minValueMargin;
  1388. var maxValueMargin = options.maxValueMargin;
  1389. var minPadding = 0;
  1390. var maxPadding = 0;
  1391. var interval = 0;
  1392. var rangeInterval;
  1393. if (dataRange.stubData || !screenDelta) {
  1394. return {
  1395. startPadding: 0,
  1396. endPadding: 0
  1397. }
  1398. }
  1399. function getConvertIntervalCoefficient(intervalInPx) {
  1400. var ratioOfCanvasRange = translator.ratioOfCanvasRange();
  1401. return ratioOfCanvasRange / (ratioOfCanvasRange * screenDelta / (intervalInPx + screenDelta))
  1402. }
  1403. if (that.isArgumentAxis && margins.checkInterval) {
  1404. rangeInterval = that._calculateRangeInterval(dataRange.interval);
  1405. var pxInterval = translator.getInterval(rangeInterval);
  1406. if (isFinite(pxInterval)) {
  1407. interval = Math.ceil(pxInterval / (2 * getConvertIntervalCoefficient(pxInterval)))
  1408. } else {
  1409. rangeInterval = 0
  1410. }
  1411. }
  1412. var minPercentPadding;
  1413. var maxPercentPadding;
  1414. var maxPaddingValue = screenDelta * MAX_MARGIN_VALUE / 2;
  1415. if (valueMarginsEnabled) {
  1416. if ((0, _type.isDefined)(minValueMargin)) {
  1417. minPercentPadding = isFinite(minValueMargin) ? minValueMargin : 0
  1418. } else {
  1419. minPadding = Math.max(marginSize, interval);
  1420. minPadding = Math.min(maxPaddingValue, minPadding)
  1421. }
  1422. if ((0, _type.isDefined)(maxValueMargin)) {
  1423. maxPercentPadding = isFinite(maxValueMargin) ? maxValueMargin : 0
  1424. } else {
  1425. maxPadding = Math.max(marginSize, interval);
  1426. maxPadding = Math.min(maxPaddingValue, maxPadding)
  1427. }
  1428. }
  1429. var percentStick = margins.percentStick && !this.isArgumentAxis;
  1430. if (percentStick) {
  1431. if (1 === _abs(dataRange.max)) {
  1432. maxPadding = 0
  1433. }
  1434. if (1 === _abs(dataRange.min)) {
  1435. minPadding = 0
  1436. }
  1437. }
  1438. var canvasStartEnd = that._getCanvasStartEnd();
  1439. var commonMargin = 1 + (minPercentPadding || 0) + (maxPercentPadding || 0);
  1440. var screenDeltaWithMargins = (screenDelta - minPadding - maxPadding) / commonMargin || screenDelta;
  1441. if (void 0 !== minPercentPadding || void 0 !== maxPercentPadding) {
  1442. if (void 0 !== minPercentPadding) {
  1443. minPadding = screenDeltaWithMargins * minPercentPadding
  1444. }
  1445. if (void 0 !== maxPercentPadding) {
  1446. maxPadding = screenDeltaWithMargins * maxPercentPadding
  1447. }
  1448. }
  1449. var minValue;
  1450. var maxValue;
  1451. if (options.type !== _axes_constants2.default.discrete && ticks && ticks.length > 1 && !options.skipViewportExtending && !viewPort.action && false !== options.endOnTick) {
  1452. var length = ticks.length;
  1453. var firstTickPosition = translator.translate(ticks[0].value);
  1454. var lastTickPosition = translator.translate(ticks[length - 1].value);
  1455. var invertMultiplier = firstTickPosition > lastTickPosition ? -1 : 1;
  1456. var minTickPadding = _max(invertMultiplier * (canvasStartEnd.start - firstTickPosition), 0);
  1457. var maxTickPadding = _max(invertMultiplier * (lastTickPosition - canvasStartEnd.end), 0);
  1458. if (minTickPadding > minPadding || maxTickPadding > maxPadding) {
  1459. var commonPadding = maxTickPadding + minTickPadding;
  1460. var coeff = getConvertIntervalCoefficient(commonPadding);
  1461. if (minTickPadding >= minPadding) {
  1462. minValue = ticks[0].value
  1463. }
  1464. if (maxTickPadding >= maxPadding) {
  1465. maxValue = ticks[length - 1].value
  1466. }
  1467. minPadding = _max(minTickPadding, minPadding) / coeff;
  1468. maxPadding = _max(maxTickPadding, maxPadding) / coeff
  1469. }
  1470. }
  1471. minPercentPadding = void 0 === minPercentPadding ? minPadding / screenDeltaWithMargins : minPercentPadding;
  1472. maxPercentPadding = void 0 === maxPercentPadding ? maxPadding / screenDeltaWithMargins : maxPercentPadding;
  1473. if (!isDiscrete) {
  1474. if (this._translator.isInverted()) {
  1475. minValue = (0, _type.isDefined)(minValue) ? minValue : translator.from(canvasStartEnd.start + screenDelta * minPercentPadding, -1);
  1476. maxValue = (0, _type.isDefined)(maxValue) ? maxValue : translator.from(canvasStartEnd.end - screenDelta * maxPercentPadding, 1)
  1477. } else {
  1478. minValue = (0, _type.isDefined)(minValue) ? minValue : translator.from(canvasStartEnd.start - screenDelta * minPercentPadding, -1);
  1479. maxValue = (0, _type.isDefined)(maxValue) ? maxValue : translator.from(canvasStartEnd.end + screenDelta * maxPercentPadding, 1)
  1480. }
  1481. }
  1482. function correctZeroLevel(minPoint, maxPoint) {
  1483. var minExpectedPadding = _abs(canvasStartEnd.start - minPoint);
  1484. var maxExpectedPadding = _abs(canvasStartEnd.end - maxPoint);
  1485. var coeff = getConvertIntervalCoefficient(minExpectedPadding + maxExpectedPadding);
  1486. minPadding = minExpectedPadding / coeff;
  1487. maxPadding = maxExpectedPadding / coeff
  1488. }
  1489. if (!that.isArgumentAxis) {
  1490. if (minValue * dataRange.min <= 0 && minValue * dataRange.minVisible <= 0) {
  1491. correctZeroLevel(translator.translate(0), translator.translate(maxValue));
  1492. minValue = 0
  1493. }
  1494. if (maxValue * dataRange.max <= 0 && maxValue * dataRange.maxVisible <= 0) {
  1495. correctZeroLevel(translator.translate(minValue), translator.translate(0));
  1496. maxValue = 0
  1497. }
  1498. }
  1499. return {
  1500. startPadding: this._translator.isInverted() ? maxPadding : minPadding,
  1501. endPadding: this._translator.isInverted() ? minPadding : maxPadding,
  1502. minValue: minValue,
  1503. maxValue: maxValue,
  1504. interval: rangeInterval,
  1505. isSpacedMargin: minPadding === maxPadding && 0 !== minPadding
  1506. }
  1507. },
  1508. applyMargins: function() {
  1509. if (this._isSynchronized) {
  1510. return
  1511. }
  1512. var margins = this._calculateValueMargins(this._majorTicks);
  1513. var canvas = (0, _extend.extend)({}, this._canvas, {
  1514. startPadding: margins.startPadding,
  1515. endPadding: margins.endPadding
  1516. });
  1517. this._translator.updateCanvas(this._processCanvas(canvas));
  1518. if (isFinite(margins.interval)) {
  1519. var br = this._translator.getBusinessRange();
  1520. br.addRange({
  1521. interval: margins.interval
  1522. });
  1523. this._translator.updateBusinessRange(br)
  1524. }
  1525. },
  1526. _resetMargins: function() {
  1527. this._reinitTranslator(this._getViewportRange());
  1528. if (this._canvas) {
  1529. this._translator.updateCanvas(this._processCanvas(this._canvas))
  1530. }
  1531. },
  1532. _createConstantLines: function() {
  1533. var _this = this;
  1534. var constantLines = (this._options.constantLines || []).map(function(o) {
  1535. return (0, _constant_line2.default)(_this, o)
  1536. });
  1537. this._outsideConstantLines = constantLines.filter(function(l) {
  1538. return "outside" === l.labelPosition
  1539. });
  1540. this._insideConstantLines = constantLines.filter(function(l) {
  1541. return "inside" === l.labelPosition
  1542. })
  1543. },
  1544. draw: function(canvas, borderOptions) {
  1545. var that = this;
  1546. var options = this._options;
  1547. that.borderOptions = borderOptions || {
  1548. visible: false
  1549. };
  1550. that._resetMargins();
  1551. that.createTicks(canvas);
  1552. that.applyMargins();
  1553. that._clearAxisGroups();
  1554. initTickCoords(that._majorTicks);
  1555. initTickCoords(that._minorTicks);
  1556. initTickCoords(that._boundaryTicks);
  1557. that._axisGroup.append(that._axesContainerGroup);
  1558. that._drawAxis();
  1559. that._drawTitle();
  1560. drawTickMarks(that._majorTicks, options.tick);
  1561. drawTickMarks(that._minorTicks, options.minorTick);
  1562. drawTickMarks(that._boundaryTicks, options.tick);
  1563. var drawGridLine = that._getGridLineDrawer();
  1564. drawGrids(that._majorTicks, drawGridLine);
  1565. drawGrids(that._minorTicks, drawGridLine);
  1566. callAction(that._majorTicks, "drawLabel", that._getViewportRange());
  1567. that._majorTicks.forEach(function(tick) {
  1568. tick.labelRotationAngle = 0;
  1569. tick.labelAlignment = void 0;
  1570. tick.labelOffset = 0
  1571. });
  1572. callAction(that._outsideConstantLines.concat(that._insideConstantLines), "draw");
  1573. callAction(that._strips, "draw");
  1574. that._dateMarkers = that._drawDateMarkers() || [];
  1575. that._labelAxesGroup && that._axisStripLabelGroup.append(that._labelAxesGroup);
  1576. that._gridContainerGroup && that._axisGridGroup.append(that._gridContainerGroup);
  1577. that._stripsGroup && that._axisStripGroup.append(that._stripsGroup);
  1578. if (that._constantLinesGroup) {
  1579. that._axisConstantLineGroups.above.inside.append(that._constantLinesGroup.above);
  1580. that._axisConstantLineGroups.above.outside1.append(that._constantLinesGroup.above);
  1581. that._axisConstantLineGroups.above.outside2.append(that._constantLinesGroup.above);
  1582. that._axisConstantLineGroups.under.inside.append(that._constantLinesGroup.under);
  1583. that._axisConstantLineGroups.under.outside1.append(that._constantLinesGroup.under);
  1584. that._axisConstantLineGroups.under.outside2.append(that._constantLinesGroup.under)
  1585. }
  1586. that._measureTitle();
  1587. measureLabels(that._majorTicks);
  1588. var textWidth;
  1589. var textHeight;
  1590. var convertedTickInterval;
  1591. var tickInterval = that._tickInterval;
  1592. if ((0, _type.isDefined)(tickInterval)) {
  1593. convertedTickInterval = that.getTranslator().getInterval("datetime" === options.dataType ? (0, _date.dateToMilliseconds)(tickInterval) : tickInterval)
  1594. }
  1595. if (that._isHorizontal) {
  1596. textWidth = convertedTickInterval;
  1597. textHeight = options.placeholderSize
  1598. } else {
  1599. textWidth = options.placeholderSize;
  1600. textHeight = convertedTickInterval
  1601. }
  1602. var displayMode = that._validateDisplayMode(options.label.displayMode);
  1603. var overlappingMode = that._validateOverlappingMode(options.label.overlappingBehavior, displayMode);
  1604. var wordWrapMode = options.label.wordWrap || "none";
  1605. var overflowMode = options.label.textOverflow || "none";
  1606. if (("none" !== wordWrapMode || "none" !== overflowMode) && displayMode !== ROTATE && overlappingMode !== ROTATE && "auto" !== overlappingMode) {
  1607. var correctByWidth = false;
  1608. var correctByHeight = false;
  1609. if (textWidth) {
  1610. if (that._majorTicks.some(function(tick) {
  1611. return tick.labelBBox.width > textWidth
  1612. })) {
  1613. correctByWidth = true
  1614. }
  1615. }
  1616. if (textHeight) {
  1617. if (that._majorTicks.some(function(tick) {
  1618. return tick.labelBBox.height > textHeight
  1619. })) {
  1620. correctByHeight = true
  1621. }
  1622. }
  1623. if (correctByWidth || correctByHeight) {
  1624. that._majorTicks.forEach(function(tick) {
  1625. tick.label && tick.label.setMaxSize(textWidth, textHeight, options.label)
  1626. });
  1627. measureLabels(that._majorTicks)
  1628. }
  1629. }
  1630. measureLabels(that._outsideConstantLines);
  1631. measureLabels(that._insideConstantLines);
  1632. measureLabels(that._strips);
  1633. measureLabels(that._dateMarkers);
  1634. that._adjustConstantLineLabels(that._insideConstantLines);
  1635. that._adjustStripLabels();
  1636. var offset = that._constantLabelOffset = that._adjustConstantLineLabels(that._outsideConstantLines);
  1637. if (!that._translator.getBusinessRange().isEmpty()) {
  1638. that._setLabelsPlacement();
  1639. offset = that._adjustLabels(offset)
  1640. }
  1641. offset = that._adjustDateMarkers(offset);
  1642. that._adjustTitle(offset)
  1643. },
  1644. _measureTitle: _common.noop,
  1645. animate: function() {
  1646. callAction(this._majorTicks, "animateLabels")
  1647. },
  1648. updateSize: function(canvas, animate) {
  1649. var updateTitle = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : true;
  1650. var that = this;
  1651. that.updateCanvas(canvas);
  1652. if (updateTitle) {
  1653. that._checkTitleOverflow();
  1654. that._measureTitle();
  1655. that._updateTitleCoords()
  1656. }
  1657. that._reinitTranslator(that._getViewportRange());
  1658. that.applyMargins();
  1659. var animationEnabled = !that._firstDrawing && animate;
  1660. var options = this._options;
  1661. initTickCoords(that._majorTicks);
  1662. initTickCoords(that._minorTicks);
  1663. initTickCoords(that._boundaryTicks);
  1664. cleanUpInvalidTicks(that._majorTicks);
  1665. cleanUpInvalidTicks(that._minorTicks);
  1666. cleanUpInvalidTicks(that._boundaryTicks);
  1667. if (this._axisElement) {
  1668. that._updateAxisElementPosition()
  1669. }
  1670. updateTicksPosition(that._majorTicks, options.tick, animationEnabled);
  1671. updateTicksPosition(that._minorTicks, options.minorTick, animationEnabled);
  1672. updateTicksPosition(that._boundaryTicks, options.tick);
  1673. callAction(that._majorTicks, "updateLabelPosition", animationEnabled);
  1674. that._outsideConstantLines.concat(that._insideConstantLines || []).forEach(function(l) {
  1675. return l.updatePosition(animationEnabled)
  1676. });
  1677. callAction(that._strips, "updatePosition", animationEnabled);
  1678. updateGridsPosition(that._majorTicks, animationEnabled);
  1679. updateGridsPosition(that._minorTicks, animationEnabled);
  1680. if (animationEnabled) {
  1681. callAction(that._ticksToRemove || [], "fadeOutElements")
  1682. }
  1683. that.prepareAnimation();
  1684. that._ticksToRemove = null;
  1685. if (!that._translator.getBusinessRange().isEmpty()) {
  1686. that._firstDrawing = false
  1687. }
  1688. },
  1689. prepareAnimation: function() {
  1690. var that = this;
  1691. var action = "saveCoords";
  1692. callAction(that._majorTicks, action);
  1693. callAction(that._minorTicks, action);
  1694. callAction(that._insideConstantLines, action);
  1695. callAction(that._outsideConstantLines, action);
  1696. callAction(that._strips, action)
  1697. },
  1698. applyClipRects: function(elementsClipID, canvasClipID) {
  1699. this._axisGroup.attr({
  1700. "clip-path": canvasClipID
  1701. });
  1702. this._axisStripGroup.attr({
  1703. "clip-path": elementsClipID
  1704. })
  1705. },
  1706. _mergeViewportOptions: function() {
  1707. var that = this;
  1708. var options = that._options;
  1709. var visualRange = {};
  1710. var visualRangeOptionValue = options._customVisualRange;
  1711. if (((0, _type.isDefined)(options.max) || (0, _type.isDefined)(options.min)) && !(0, _type.isDefined)(visualRangeOptionValue.startValue) && !(0, _type.isDefined)(visualRangeOptionValue.endValue) && !(0, _type.isDefined)(visualRangeOptionValue.length)) {
  1712. visualRange = {
  1713. startValue: options.min,
  1714. endValue: options.max
  1715. }
  1716. } else {
  1717. visualRange = visualRangeOptionValue
  1718. }
  1719. that._setVisualRange(visualRange)
  1720. },
  1721. _validateVisualRange: function(visualRange) {
  1722. var range = getVizRangeObject(visualRange);
  1723. if (void 0 !== range.startValue) {
  1724. range.startValue = this.validateUnit(range.startValue)
  1725. }
  1726. if (void 0 !== range.endValue) {
  1727. range.endValue = this.validateUnit(range.endValue)
  1728. }
  1729. return convertVisualRangeObject(range, visualRange)
  1730. },
  1731. _validateOptions: function(options) {
  1732. var that = this;
  1733. if (void 0 !== options.min) {
  1734. options.min = that.validateUnit(options.min, "E2106")
  1735. }
  1736. if (void 0 !== options.max) {
  1737. options.max = that.validateUnit(options.max, "E2106")
  1738. }
  1739. options.wholeRange = that._validateVisualRange(options.wholeRange);
  1740. options.visualRange = options._customVisualRange = that._validateVisualRange(options._customVisualRange);
  1741. that._mergeViewportOptions()
  1742. },
  1743. validate: function() {
  1744. var that = this;
  1745. var options = that._options;
  1746. var dataType = that.isArgumentAxis ? options.argumentType : options.valueType;
  1747. var parser = dataType ? _parse_utils2.default.getParser(dataType) : function(unit) {
  1748. return unit
  1749. };
  1750. that.parser = parser;
  1751. options.dataType = dataType;
  1752. that._validateOptions(options)
  1753. },
  1754. resetVisualRange: function(isSilent) {
  1755. this._seriesData.minVisible = this._seriesData.min;
  1756. this._seriesData.maxVisible = this._seriesData.max;
  1757. this.handleZooming([null, null], {
  1758. start: !!isSilent,
  1759. end: !!isSilent
  1760. })
  1761. },
  1762. _applyZooming: function(visualRange, allowPartialUpdate) {
  1763. var that = this;
  1764. that._resetVisualRangeOption();
  1765. that._setVisualRange(visualRange, allowPartialUpdate);
  1766. var viewPort = that.getViewport();
  1767. that._breaks = that._getScaleBreaks(that._options, {
  1768. minVisible: viewPort.startValue,
  1769. maxVisible: viewPort.endValue
  1770. }, that._series, that.isArgumentAxis);
  1771. that._translator.updateBusinessRange(that._getViewportRange())
  1772. },
  1773. getZoomStartEventArg: function(event, actionType) {
  1774. return {
  1775. axis: this,
  1776. range: this.visualRange(),
  1777. cancel: false,
  1778. event: event,
  1779. actionType: actionType
  1780. }
  1781. },
  1782. getZoomEndEventArg: function(previousRange, event, actionType, zoomFactor, shift) {
  1783. var newRange = this.visualRange();
  1784. return {
  1785. axis: this,
  1786. previousRange: previousRange,
  1787. range: newRange,
  1788. cancel: false,
  1789. event: event,
  1790. actionType: actionType,
  1791. zoomFactor: zoomFactor,
  1792. shift: shift,
  1793. rangeStart: newRange.startValue,
  1794. rangeEnd: newRange.endValue
  1795. }
  1796. },
  1797. getZoomBounds: function() {
  1798. var wholeRange = _utils2.default.getVizRangeObject(this._options.wholeRange);
  1799. var range = this.getTranslator().getBusinessRange();
  1800. var secondPriorityRange = {
  1801. startValue: getZoomBoundValue(this._initRange.startValue, range.min),
  1802. endValue: getZoomBoundValue(this._initRange.endValue, range.max)
  1803. };
  1804. return {
  1805. startValue: getZoomBoundValue(wholeRange.startValue, secondPriorityRange.startValue),
  1806. endValue: getZoomBoundValue(wholeRange.endValue, secondPriorityRange.endValue)
  1807. }
  1808. },
  1809. setInitRange: function() {
  1810. this._initRange = {};
  1811. if (0 === Object.keys(this._options.wholeRange || {}).length) {
  1812. this._initRange = this.getZoomBounds()
  1813. }
  1814. },
  1815. _resetVisualRangeOption: function() {
  1816. this._options._customVisualRange = {}
  1817. },
  1818. setCustomVisualRange: function(range) {
  1819. this._options._customVisualRange = range
  1820. },
  1821. visualRange: function visualRange() {
  1822. var that = this;
  1823. var args = arguments;
  1824. var visualRange;
  1825. if (0 === args.length) {
  1826. var adjustedRange = that._getAdjustedBusinessRange();
  1827. var startValue = adjustedRange.minVisible;
  1828. var endValue = adjustedRange.maxVisible;
  1829. if (that._options.type === _axes_constants2.default.discrete) {
  1830. startValue = (0, _type.isDefined)(startValue) ? startValue : adjustedRange.categories[0];
  1831. endValue = (0, _type.isDefined)(endValue) ? endValue : adjustedRange.categories[adjustedRange.categories.length - 1];
  1832. return {
  1833. startValue: startValue,
  1834. endValue: endValue,
  1835. categories: _utils2.default.getCategoriesInfo(adjustedRange.categories, startValue, endValue).categories
  1836. }
  1837. }
  1838. return {
  1839. startValue: startValue,
  1840. endValue: endValue
  1841. }
  1842. } else {
  1843. if (_isArray(args[0])) {
  1844. visualRange = args[0]
  1845. } else {
  1846. if ((0, _type.isPlainObject)(args[0])) {
  1847. visualRange = (0, _extend.extend)({}, args[0])
  1848. } else {
  1849. visualRange = [args[0], args[1]]
  1850. }
  1851. }
  1852. }
  1853. var zoomResults = that.handleZooming(visualRange, args[1]);
  1854. if (!zoomResults.isPrevented) {
  1855. that._visualRange(that, zoomResults)
  1856. }
  1857. },
  1858. handleZooming: function(visualRange, preventEvents, domEvent, action) {
  1859. var that = this;
  1860. preventEvents = preventEvents || {};
  1861. if ((0, _type.isDefined)(visualRange)) {
  1862. visualRange = that._validateVisualRange(visualRange);
  1863. visualRange.action = action
  1864. }
  1865. var zoomStartEvent = that.getZoomStartEventArg(domEvent, action);
  1866. var previousRange = zoomStartEvent.range;
  1867. !preventEvents.start && that._eventTrigger("zoomStart", zoomStartEvent);
  1868. var zoomResults = {
  1869. isPrevented: zoomStartEvent.cancel,
  1870. skipEventRising: preventEvents.skipEventRising,
  1871. range: visualRange || zoomStartEvent.range
  1872. };
  1873. if (!zoomStartEvent.cancel) {
  1874. (0, _type.isDefined)(visualRange) && that._applyZooming(visualRange, preventEvents.allowPartialUpdate);
  1875. if (!(0, _type.isDefined)(that._storedZoomEndParams)) {
  1876. that._storedZoomEndParams = {
  1877. startRange: previousRange,
  1878. type: this.getOptions().type
  1879. }
  1880. }
  1881. that._storedZoomEndParams.event = domEvent;
  1882. that._storedZoomEndParams.action = action;
  1883. that._storedZoomEndParams.prevent = !!preventEvents.end
  1884. }
  1885. return zoomResults
  1886. },
  1887. handleZoomEnd: function() {
  1888. var that = this;
  1889. if ((0, _type.isDefined)(that._storedZoomEndParams) && !that._storedZoomEndParams.prevent) {
  1890. var previousRange = that._storedZoomEndParams.startRange;
  1891. var domEvent = that._storedZoomEndParams.event;
  1892. var action = that._storedZoomEndParams.action;
  1893. var previousBusinessRange = {
  1894. minVisible: previousRange.startValue,
  1895. maxVisible: previousRange.endValue,
  1896. categories: previousRange.categories
  1897. };
  1898. var typeIsNotChanged = that.getOptions().type === that._storedZoomEndParams.type;
  1899. var shift = typeIsNotChanged ? (0, _math2.adjust)(that.getVisualRangeCenter() - that.getVisualRangeCenter(previousBusinessRange)) : NaN;
  1900. var zoomFactor = typeIsNotChanged ? +(Math.round(that.getVisualRangeLength(previousBusinessRange) / that.getVisualRangeLength() + "e+2") + "e-2") : NaN;
  1901. var zoomEndEvent = that.getZoomEndEventArg(previousRange, domEvent, action, zoomFactor, shift);
  1902. zoomEndEvent.cancel = that.isZoomingLowerLimitOvercome(1 === zoomFactor ? "pan" : "zoom", zoomFactor);
  1903. that._eventTrigger("zoomEnd", zoomEndEvent);
  1904. if (zoomEndEvent.cancel) {
  1905. that.restorePreviousVisualRange(previousRange)
  1906. }
  1907. that._storedZoomEndParams = null
  1908. }
  1909. },
  1910. restorePreviousVisualRange: function(previousRange) {
  1911. var that = this;
  1912. that._storedZoomEndParams = null;
  1913. that._applyZooming(previousRange);
  1914. that._visualRange(that, previousRange)
  1915. },
  1916. isZoomingLowerLimitOvercome: function(actionType, zoomFactor, range) {
  1917. var that = this;
  1918. var options = that._options;
  1919. var minZoom = options.minVisualRangeLength;
  1920. var isOvercoming = "zoom" === actionType && zoomFactor >= 1;
  1921. var businessRange = that._translator.getBusinessRange();
  1922. var visualRange;
  1923. if ((0, _type.isDefined)(range)) {
  1924. visualRange = that.adjustRange(_utils2.default.getVizRangeObject(range));
  1925. visualRange = {
  1926. minVisible: visualRange.startValue,
  1927. maxVisible: visualRange.endValue,
  1928. categories: businessRange.categories
  1929. }
  1930. }
  1931. var visualRangeLength = that.getVisualRangeLength(visualRange);
  1932. if ("discrete" !== options.type) {
  1933. if ((0, _type.isDefined)(minZoom)) {
  1934. if ("datetime" === options.dataType && !(0, _type.isNumeric)(minZoom)) {
  1935. minZoom = (0, _date.dateToMilliseconds)(minZoom)
  1936. }
  1937. isOvercoming &= minZoom >= visualRangeLength
  1938. } else {
  1939. var canvasLength = that._translator.canvasLength;
  1940. var fullRange = {
  1941. minVisible: businessRange.min,
  1942. maxVisible: businessRange.max,
  1943. categories: businessRange.categories
  1944. };
  1945. isOvercoming &= that.getVisualRangeLength(fullRange) / canvasLength >= visualRangeLength
  1946. }
  1947. } else {
  1948. !(0, _type.isDefined)(minZoom) && (minZoom = 1);
  1949. isOvercoming &= (0, _type.isDefined)(range) && that.getVisualRangeLength() === minZoom && visualRangeLength <= minZoom
  1950. }
  1951. return !!isOvercoming
  1952. },
  1953. dataVisualRangeIsReduced: function() {
  1954. var minDataValue;
  1955. var maxDataValue;
  1956. var translator = this.getTranslator();
  1957. if ("discrete" === this._options.type) {
  1958. var categories = translator.getBusinessRange().categories;
  1959. minDataValue = categories[0];
  1960. maxDataValue = categories[categories.length - 1]
  1961. } else {
  1962. var seriesData = this._seriesData;
  1963. minDataValue = seriesData.min;
  1964. maxDataValue = seriesData.max
  1965. }
  1966. if (!(0, _type.isDefined)(minDataValue) || !(0, _type.isDefined)(maxDataValue)) {
  1967. return false
  1968. }
  1969. var startPoint = translator.translate(minDataValue);
  1970. var endPoint = translator.translate(maxDataValue);
  1971. var edges = [Math.min(startPoint, endPoint), Math.max(startPoint, endPoint)];
  1972. var visualRange = this.visualRange();
  1973. var visualRangeStartPoint = translator.translate(visualRange.startValue);
  1974. var visualRangeEndPoint = translator.translate(visualRange.endValue);
  1975. return visualRangeStartPoint > edges[0] && visualRangeStartPoint < edges[1] || visualRangeEndPoint > edges[0] && visualRangeEndPoint < edges[1] || visualRangeStartPoint === visualRangeEndPoint && edges[0] !== edges[1]
  1976. },
  1977. isExtremePosition: function(isMax) {
  1978. var extremeDataValue;
  1979. var seriesData;
  1980. if ("discrete" === this._options.type) {
  1981. seriesData = this._translator.getBusinessRange();
  1982. extremeDataValue = isMax ? seriesData.categories[seriesData.categories.length - 1] : seriesData.categories[0]
  1983. } else {
  1984. seriesData = this.getZoomBounds();
  1985. extremeDataValue = isMax ? seriesData.endValue : seriesData.startValue
  1986. }
  1987. var translator = this.getTranslator();
  1988. var extremePoint = translator.translate(extremeDataValue);
  1989. var visualRange = this.visualRange();
  1990. var visualRangePoint = isMax ? translator.translate(visualRange.endValue) : translator.translate(visualRange.startValue);
  1991. return _abs(visualRangePoint - extremePoint) < SCROLL_THRESHOLD
  1992. },
  1993. getViewport: function() {
  1994. return this._viewport
  1995. },
  1996. getFullTicks: function() {
  1997. var majors = this._majorTicks || [];
  1998. if (this._options.type === _axes_constants2.default.discrete) {
  1999. return convertTicksToValues(majors)
  2000. } else {
  2001. return convertTicksToValues(majors.concat(this._minorTicks, this._boundaryTicks)).sort(function(a, b) {
  2002. return valueOf(a) - valueOf(b)
  2003. })
  2004. }
  2005. },
  2006. measureLabels: function(canvas, withIndents) {
  2007. var that = this;
  2008. var options = that._options;
  2009. var widthAxis = options.visible ? options.width : 0;
  2010. var ticks;
  2011. var indent = withIndents ? options.label.indentFromAxis + .5 * options.tick.length : 0;
  2012. var tickInterval;
  2013. var viewportRange = that._getViewportRange();
  2014. if (viewportRange.isEmpty() || !options.label.visible || !that._axisElementsGroup) {
  2015. return {
  2016. height: widthAxis,
  2017. width: widthAxis,
  2018. x: 0,
  2019. y: 0
  2020. }
  2021. }
  2022. if (that._majorTicks) {
  2023. ticks = convertTicksToValues(that._majorTicks)
  2024. } else {
  2025. this.updateCanvas(canvas);
  2026. ticks = that._createTicksAndLabelFormat(viewportRange, _common.noop);
  2027. tickInterval = ticks.tickInterval;
  2028. ticks = ticks.ticks
  2029. }
  2030. var maxText = ticks.reduce(function(prevLabel, tick, index) {
  2031. var label = that.formatLabel(tick, options.label, viewportRange, void 0, tickInterval, ticks);
  2032. if (prevLabel.length < label.length) {
  2033. return label
  2034. } else {
  2035. return prevLabel
  2036. }
  2037. }, that.formatLabel(ticks[0], options.label, viewportRange, void 0, tickInterval, ticks));
  2038. var text = that._renderer.text(maxText, 0, 0).css(that._textFontStyles).attr(that._textOptions).append(that._renderer.root);
  2039. var box = text.getBBox();
  2040. text.remove();
  2041. return {
  2042. x: box.x,
  2043. y: box.y,
  2044. width: box.width + indent,
  2045. height: box.height + indent
  2046. }
  2047. },
  2048. _setLabelsPlacement: function() {
  2049. if (!this._options.label.visible) {
  2050. return
  2051. }
  2052. var that = this;
  2053. var labelOpt = that._options.label;
  2054. var displayMode = that._validateDisplayMode(labelOpt.displayMode);
  2055. var overlappingMode = that._validateOverlappingMode(labelOpt.overlappingBehavior, displayMode);
  2056. var ignoreOverlapping = "none" === overlappingMode || "ignore" === overlappingMode;
  2057. var behavior = {
  2058. rotationAngle: labelOpt.rotationAngle,
  2059. staggeringSpacing: labelOpt.staggeringSpacing
  2060. };
  2061. var notRecastStep;
  2062. var boxes = that._majorTicks.map(function(tick) {
  2063. return tick.labelBBox
  2064. });
  2065. var step;
  2066. step = that._getStep(boxes);
  2067. switch (displayMode) {
  2068. case ROTATE:
  2069. if (ignoreOverlapping) {
  2070. notRecastStep = true;
  2071. step = 1
  2072. }
  2073. that._applyLabelMode(displayMode, step, boxes, labelOpt, notRecastStep);
  2074. break;
  2075. case "stagger":
  2076. if (ignoreOverlapping) {
  2077. step = 2
  2078. }
  2079. that._applyLabelMode(displayMode, _max(step, 2), boxes, labelOpt);
  2080. break;
  2081. default:
  2082. that._applyLabelOverlapping(boxes, overlappingMode, step, behavior)
  2083. }
  2084. },
  2085. _applyLabelOverlapping: function(boxes, mode, step, behavior) {
  2086. var that = this;
  2087. var labelOpt = that._options.label;
  2088. var majorTicks = that._majorTicks;
  2089. if ("none" === mode || "ignore" === mode) {
  2090. return
  2091. }
  2092. var checkLabels = function(box, index, array) {
  2093. if (0 === index) {
  2094. return false
  2095. }
  2096. return _axes_constants2.default.areLabelsOverlap(box, array[index - 1], labelOpt.minSpacing, labelOpt.alignment)
  2097. };
  2098. if (step > 1 && boxes.some(checkLabels)) {
  2099. that._applyLabelMode(mode, step, boxes, behavior)
  2100. }
  2101. that._checkBoundedLabelsOverlapping(majorTicks, boxes, mode)
  2102. },
  2103. _applyLabelMode: function(mode, step, boxes, behavior, notRecastStep) {
  2104. var that = this;
  2105. var majorTicks = that._majorTicks;
  2106. var labelOpt = that._options.label;
  2107. var angle = behavior.rotationAngle;
  2108. var alignment;
  2109. var func;
  2110. switch (mode) {
  2111. case ROTATE:
  2112. if (!labelOpt.userAlignment) {
  2113. alignment = angle < 0 ? RIGHT : LEFT;
  2114. if (angle % 90 === 0) {
  2115. alignment = CENTER
  2116. }
  2117. }
  2118. step = notRecastStep ? step : that._getStep(boxes, angle);
  2119. func = function(tick) {
  2120. tick.label.rotate(angle);
  2121. tick.labelRotationAngle = angle;
  2122. alignment && (tick.labelAlignment = alignment)
  2123. };
  2124. updateLabels(majorTicks, step, func);
  2125. break;
  2126. case "stagger":
  2127. var labelHeight = that._getMaxLabelHeight(boxes, behavior.staggeringSpacing);
  2128. func = function(tick, index) {
  2129. if (index / (step - 1) % 2 !== 0) {
  2130. tick.labelOffset = labelHeight
  2131. }
  2132. };
  2133. updateLabels(majorTicks, step - 1, func);
  2134. break;
  2135. case "auto":
  2136. case "_auto":
  2137. if (2 === step) {
  2138. that._applyLabelMode("stagger", step, boxes, behavior)
  2139. } else {
  2140. that._applyLabelMode(ROTATE, step, boxes, {
  2141. rotationAngle: getOptimalAngle(boxes, labelOpt)
  2142. })
  2143. }
  2144. break;
  2145. default:
  2146. updateLabels(majorTicks, step)
  2147. }
  2148. },
  2149. getMarkerTrackers: _common.noop,
  2150. _drawDateMarkers: _common.noop,
  2151. _adjustDateMarkers: _common.noop,
  2152. coordsIn: _common.noop,
  2153. areCoordsOutsideAxis: _common.noop,
  2154. _getSkippedCategory: _common.noop,
  2155. _initAxisPositions: _common.noop,
  2156. _drawTitle: _common.noop,
  2157. _updateTitleCoords: _common.noop,
  2158. _adjustConstantLineLabels: _common.noop,
  2159. _createTranslator: function() {
  2160. return new _translator2d2.default.Translator2D({}, {}, {})
  2161. },
  2162. _updateTranslator: function() {
  2163. var translator = this._translator;
  2164. translator.update(translator.getBusinessRange(), this._canvas || {}, this._getTranslatorOptions())
  2165. },
  2166. _getTranslatorOptions: function() {
  2167. var options = this._options;
  2168. return {
  2169. isHorizontal: this._isHorizontal,
  2170. shiftZeroValue: !this.isArgumentAxis,
  2171. interval: options.semiDiscreteInterval,
  2172. stick: this._getStick(),
  2173. breaksSize: options.breakStyle ? options.breakStyle.width : 0
  2174. }
  2175. },
  2176. getVisibleArea: function() {
  2177. var canvas = this._getCanvasStartEnd();
  2178. return [canvas.start, canvas.end].sort(function(a, b) {
  2179. return a - b
  2180. })
  2181. },
  2182. _getCanvasStartEnd: function() {
  2183. var isHorizontal = this._isHorizontal;
  2184. var canvas = this._canvas || {};
  2185. var invert = this._translator.getBusinessRange().invert;
  2186. var coords = isHorizontal ? [canvas.left, canvas.width - canvas.right] : [canvas.height - canvas.bottom, canvas.top];
  2187. invert && coords.reverse();
  2188. return {
  2189. start: coords[0],
  2190. end: coords[1]
  2191. }
  2192. },
  2193. _getScreenDelta: function() {
  2194. var that = this;
  2195. var canvas = that._getCanvasStartEnd();
  2196. var breaks = that._breaks;
  2197. var breaksLength = breaks ? breaks.length : 0;
  2198. var screenDelta = _abs(canvas.start - canvas.end);
  2199. return screenDelta - (breaksLength ? breaks[breaksLength - 1].cumulativeWidth : 0)
  2200. },
  2201. _getScaleBreaks: function() {
  2202. return []
  2203. },
  2204. _adjustTitle: _common.noop,
  2205. _checkTitleOverflow: _common.noop,
  2206. getSpiderTicks: _common.noop,
  2207. setSpiderTicks: _common.noop,
  2208. _checkBoundedLabelsOverlapping: _common.noop,
  2209. drawScaleBreaks: _common.noop,
  2210. _visualRange: _common.noop,
  2211. _rotateConstantLine: _common.noop,
  2212. applyVisualRangeSetter: _common.noop,
  2213. getCategoriesSorter: function(argCategories) {
  2214. var sort;
  2215. if (this.isArgumentAxis) {
  2216. sort = argCategories
  2217. } else {
  2218. var categoriesSortingMethod = this._options.categoriesSortingMethod;
  2219. sort = (0, _type.isDefined)(categoriesSortingMethod) ? categoriesSortingMethod : this._options.categories
  2220. }
  2221. return sort
  2222. },
  2223. _getAdjustedBusinessRange: function() {
  2224. return this.adjustViewport(this._translator.getBusinessRange())
  2225. }
  2226. };