financial_series.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /**
  2. * DevExtreme (viz/series/financial_series.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 scatterSeries = require("./scatter_series").chart;
  11. var barSeries = require("./bar_series").chart.bar;
  12. var _extend = require("../../core/utils/extend").extend;
  13. var _isDefined = require("../../core/utils/type").isDefined;
  14. var _normalizeEnum = require("../core/utils").normalizeEnum;
  15. var _noop = require("../../core/utils/common").noop;
  16. var DEFAULT_FINANCIAL_POINT_SIZE = 10;
  17. exports.stock = _extend({}, scatterSeries, {
  18. _animate: _noop,
  19. _applyMarkerClipRect: function(settings) {
  20. settings["clip-path"] = this._forceClipping ? this._paneClipRectID : this._widePaneClipRectID
  21. },
  22. _updatePointsVisibility: barSeries._updatePointsVisibility,
  23. _getOptionsForPoint: barSeries._getOptionsForPoint,
  24. _createErrorBarGroup: _noop,
  25. areErrorBarsVisible: _noop,
  26. _createGroups: scatterSeries._createGroups,
  27. _setMarkerGroupSettings: function() {
  28. var that = this;
  29. var markersGroup = that._markersGroup;
  30. var styles = that._createPointStyles(that._getMarkerGroupOptions());
  31. var defaultStyle = _extend(styles.normal, {
  32. "class": "default-markers"
  33. });
  34. var defaultPositiveStyle = _extend(styles.positive.normal, {
  35. "class": "default-positive-markers"
  36. });
  37. var reductionStyle = _extend(styles.reduction.normal, {
  38. "class": "reduction-markers"
  39. });
  40. var reductionPositiveStyle = _extend(styles.reductionPositive.normal, {
  41. "class": "reduction-positive-markers"
  42. });
  43. var markerSettings = {
  44. "class": "dxc-markers"
  45. };
  46. that._applyMarkerClipRect(markerSettings);
  47. markersGroup.attr(markerSettings);
  48. that._createGroup("defaultMarkersGroup", markersGroup, markersGroup, defaultStyle);
  49. that._createGroup("reductionMarkersGroup", markersGroup, markersGroup, reductionStyle);
  50. that._createGroup("defaultPositiveMarkersGroup", markersGroup, markersGroup, defaultPositiveStyle);
  51. that._createGroup("reductionPositiveMarkersGroup", markersGroup, markersGroup, reductionPositiveStyle)
  52. },
  53. _setGroupsSettings: function() {
  54. scatterSeries._setGroupsSettings.call(this, false)
  55. },
  56. _getCreatingPointOptions: function() {
  57. var that = this;
  58. var defaultPointOptions;
  59. var creatingPointOptions = that._predefinedPointOptions;
  60. if (!creatingPointOptions) {
  61. defaultPointOptions = this._getPointOptions();
  62. that._predefinedPointOptions = creatingPointOptions = _extend(true, {
  63. styles: {}
  64. }, defaultPointOptions);
  65. creatingPointOptions.styles.normal = creatingPointOptions.styles.positive.normal = creatingPointOptions.styles.reduction.normal = creatingPointOptions.styles.reductionPositive.normal = {
  66. "stroke-width": defaultPointOptions.styles && defaultPointOptions.styles.normal && defaultPointOptions.styles.normal["stroke-width"]
  67. }
  68. }
  69. return creatingPointOptions
  70. },
  71. _checkData: function(data, skippedFields) {
  72. var valueFields = this.getValueFields();
  73. return scatterSeries._checkData.call(this, data, skippedFields, {
  74. openValue: valueFields[0],
  75. highValue: valueFields[1],
  76. lowValue: valueFields[2],
  77. closeValue: valueFields[3]
  78. }) && data.highValue === data.highValue && data.lowValue === data.lowValue
  79. },
  80. _getPointDataSelector: function(data, options) {
  81. var _this = this;
  82. var that = this;
  83. var level;
  84. var valueFields = that.getValueFields();
  85. var argumentField = that.getArgumentField();
  86. var openValueField = valueFields[0];
  87. var highValueField = valueFields[1];
  88. var lowValueField = valueFields[2];
  89. var closeValueField = valueFields[3];
  90. that.level = that._options.reduction.level;
  91. switch (_normalizeEnum(that.level)) {
  92. case "open":
  93. level = openValueField;
  94. break;
  95. case "high":
  96. level = highValueField;
  97. break;
  98. case "low":
  99. level = lowValueField;
  100. break;
  101. default:
  102. level = closeValueField;
  103. that.level = "close"
  104. }
  105. var prevLevelValue;
  106. return function(data) {
  107. var reductionValue = data[level];
  108. var isReduction = false;
  109. if (_isDefined(reductionValue)) {
  110. if (_isDefined(prevLevelValue)) {
  111. isReduction = reductionValue < prevLevelValue
  112. }
  113. prevLevelValue = reductionValue
  114. }
  115. return {
  116. argument: data[argumentField],
  117. highValue: _this._processEmptyValue(data[highValueField]),
  118. lowValue: _this._processEmptyValue(data[lowValueField]),
  119. closeValue: _this._processEmptyValue(data[closeValueField]),
  120. openValue: _this._processEmptyValue(data[openValueField]),
  121. reductionValue: reductionValue,
  122. tag: data[that.getTagField()],
  123. isReduction: isReduction,
  124. data: data
  125. }
  126. }
  127. },
  128. _parsePointStyle: function(style, defaultColor, innerColor) {
  129. return {
  130. stroke: style.color || defaultColor,
  131. "stroke-width": style.width,
  132. fill: style.color || innerColor
  133. }
  134. },
  135. _getDefaultStyle: function(options) {
  136. var that = this;
  137. var mainPointColor = options.color || that._options.mainSeriesColor;
  138. return {
  139. normal: that._parsePointStyle(options, mainPointColor, mainPointColor),
  140. hover: that._parsePointStyle(options.hoverStyle, mainPointColor, mainPointColor),
  141. selection: that._parsePointStyle(options.selectionStyle, mainPointColor, mainPointColor)
  142. }
  143. },
  144. _getReductionStyle: function(options) {
  145. var that = this;
  146. var reductionColor = options.reduction.color;
  147. return {
  148. normal: that._parsePointStyle({
  149. color: reductionColor,
  150. width: options.width,
  151. hatching: options.hatching
  152. }, reductionColor, reductionColor),
  153. hover: that._parsePointStyle(options.hoverStyle, reductionColor, reductionColor),
  154. selection: that._parsePointStyle(options.selectionStyle, reductionColor, reductionColor)
  155. }
  156. },
  157. _createPointStyles: function(pointOptions) {
  158. var that = this;
  159. var innerColor = that._options.innerColor;
  160. var styles = that._getDefaultStyle(pointOptions);
  161. var positiveStyle = _extend(true, {}, styles);
  162. var reductionStyle = that._getReductionStyle(pointOptions);
  163. var reductionPositiveStyle = _extend(true, {}, reductionStyle);
  164. positiveStyle.normal.fill = positiveStyle.hover.fill = positiveStyle.selection.fill = innerColor;
  165. reductionPositiveStyle.normal.fill = reductionPositiveStyle.hover.fill = reductionPositiveStyle.selection.fill = innerColor;
  166. styles.positive = positiveStyle;
  167. styles.reduction = reductionStyle;
  168. styles.reductionPositive = reductionPositiveStyle;
  169. return styles
  170. },
  171. _endUpdateData: function() {
  172. delete this._predefinedPointOptions
  173. },
  174. _defaultAggregator: "ohlc",
  175. _aggregators: {
  176. ohlc: function(_ref, series) {
  177. var intervalStart = _ref.intervalStart,
  178. data = _ref.data;
  179. if (!data.length) {
  180. return
  181. }
  182. var result = {};
  183. var valueFields = series.getValueFields();
  184. var highValueField = valueFields[1];
  185. var lowValueField = valueFields[2];
  186. result[highValueField] = -(1 / 0);
  187. result[lowValueField] = 1 / 0;
  188. result = data.reduce(function(result, item) {
  189. if (null !== item[highValueField]) {
  190. result[highValueField] = Math.max(result[highValueField], item[highValueField])
  191. }
  192. if (null !== item[lowValueField]) {
  193. result[lowValueField] = Math.min(result[lowValueField], item[lowValueField])
  194. }
  195. return result
  196. }, result);
  197. result[valueFields[0]] = data[0][valueFields[0]];
  198. result[valueFields[3]] = data[data.length - 1][valueFields[3]];
  199. if (!isFinite(result[highValueField])) {
  200. result[highValueField] = null
  201. }
  202. if (!isFinite(result[lowValueField])) {
  203. result[lowValueField] = null
  204. }
  205. result[series.getArgumentField()] = intervalStart;
  206. return result
  207. }
  208. },
  209. getValueFields: function() {
  210. var options = this._options;
  211. return [options.openValueField || "open", options.highValueField || "high", options.lowValueField || "low", options.closeValueField || "close"]
  212. },
  213. getArgumentField: function() {
  214. return this._options.argumentField || "date"
  215. },
  216. _patchMarginOptions: function(options) {
  217. var pointOptions = this._getCreatingPointOptions();
  218. var styles = pointOptions.styles;
  219. var border = [styles.normal, styles.hover, styles.selection].reduce(function(max, style) {
  220. return Math.max(max, style["stroke-width"])
  221. }, 0);
  222. options.size = DEFAULT_FINANCIAL_POINT_SIZE + border;
  223. options.sizePointNormalState = DEFAULT_FINANCIAL_POINT_SIZE;
  224. return options
  225. },
  226. getSeriesPairCoord: function(coord, isArgument) {
  227. var oppositeCoord = null;
  228. var points = this.getVisiblePoints();
  229. for (var i = 0; i < points.length; i++) {
  230. var p = points[i];
  231. var tmpCoord = void 0;
  232. if (isArgument) {
  233. tmpCoord = p.vx === coord ? (p.openY + p.closeY) / 2 : void 0
  234. } else {
  235. var coords = [Math.min(p.lowY, p.highY), Math.max(p.lowY, p.highY)];
  236. tmpCoord = coord >= coords[0] && coord <= coords[1] ? p.vx : void 0
  237. }
  238. if (this.checkAxisVisibleAreaCoord(!isArgument, tmpCoord)) {
  239. oppositeCoord = tmpCoord;
  240. break
  241. }
  242. }
  243. return oppositeCoord
  244. },
  245. usePointsToDefineAutoHiding: function() {
  246. return false
  247. }
  248. });
  249. exports.candlestick = _extend({}, exports.stock, {
  250. _parsePointStyle: function(style, defaultColor, innerColor) {
  251. var color = style.color || innerColor;
  252. var base = exports.stock._parsePointStyle.call(this, style, defaultColor, color);
  253. base.fill = color;
  254. base.hatching = style.hatching;
  255. return base
  256. }
  257. });