ui.pivot_grid.chart_integration.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /**
  2. * DevExtreme (ui/pivot_grid/ui.pivot_grid.chart_integration.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 _renderer = require("../../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _extend = require("../../core/utils/extend");
  13. var _uiPivot_grid = require("./ui.pivot_grid.utils");
  14. var _iterator = require("../../core/utils/iterator");
  15. function _interopRequireDefault(obj) {
  16. return obj && obj.__esModule ? obj : {
  17. "default": obj
  18. }
  19. }
  20. var FORMAT_DICTIONARY = {
  21. number: "numeric",
  22. date: "datetime"
  23. };
  24. var UNBIND_KEY = "dxPivotGridUnbinding";
  25. function getFormattedValue(path, fields) {
  26. var value = [];
  27. var lastFieldIndex = fields.length - 1;
  28. (0, _iterator.each)(path, function(i, item) {
  29. value.push(item.text || (0, _uiPivot_grid.formatValue)(item.value, fields[lastFieldIndex - i]))
  30. });
  31. return value.reverse()
  32. }
  33. function getExpandedLevel(node) {
  34. var level = 0;
  35. (0, _uiPivot_grid.foreachTree)(node, function(members) {
  36. level = Math.max(level, members.length - 1)
  37. });
  38. return level
  39. }
  40. function processDataCell(processCellArgs, processCell) {
  41. var chartDataItem = processCellArgs.chartDataItem;
  42. var processedCell = processCell && processCell(processCellArgs);
  43. if (processedCell) {
  44. chartDataItem = (0, _extend.extend)({}, chartDataItem, processedCell.chartDataItem);
  45. processedCell = (0, _extend.extend)({}, processCellArgs, processedCell, {
  46. chartDataItem: chartDataItem
  47. });
  48. return processedCell
  49. }
  50. return processCellArgs
  51. }
  52. function createChartDataSource(pivotGridDataSource, mapOptions, axisDictionary) {
  53. var data = pivotGridDataSource.getData();
  54. var dataSource = [];
  55. var dataFields = pivotGridDataSource.getAreaFields("data");
  56. var rowFields = pivotGridDataSource.getAreaFields("row");
  57. var columnFields = pivotGridDataSource.getAreaFields("column");
  58. var columnElements = [{
  59. index: data.grandTotalColumnIndex,
  60. children: data.columns
  61. }];
  62. var rowElements = [{
  63. index: data.grandTotalRowIndex,
  64. children: data.rows
  65. }];
  66. var rowLevel = getExpandedLevel(rowElements);
  67. var columnLevel = getExpandedLevel(columnElements);
  68. var measureIndex;
  69. var dataField;
  70. var rowMemberIndex;
  71. var rowVisibility;
  72. var rowPathFormatted;
  73. var rowPath;
  74. var columnMemberIndex;
  75. var columnVisibility;
  76. var columnPath;
  77. var columnPathFormatted;
  78. function createDataItem() {
  79. var dataCell = (data.values[rowMemberIndex] || [])[columnMemberIndex] || [];
  80. var value = dataCell[measureIndex];
  81. var axis;
  82. var processCellArgs = {
  83. rowPath: rowPath,
  84. maxRowLevel: rowLevel,
  85. rowPathFormatted: rowPathFormatted,
  86. rowFields: rowFields,
  87. columnPathFormatted: columnPathFormatted,
  88. maxColumnLevel: columnLevel,
  89. columnPath: columnPath,
  90. columnFields: columnFields,
  91. dataFields: dataFields,
  92. dataIndex: measureIndex,
  93. dataValues: dataCell,
  94. visible: columnVisibility && rowVisibility
  95. };
  96. var seriesName = (mapOptions.inverted ? columnPathFormatted : rowPathFormatted).join(" - ");
  97. var argument = (mapOptions.inverted ? rowPathFormatted : columnPathFormatted).join("/");
  98. if (dataFields.length > 1) {
  99. if ("args" === mapOptions.putDataFieldsInto || "both" === mapOptions.putDataFieldsInto) {
  100. argument += " | " + dataField.caption
  101. }
  102. if ("args" !== mapOptions.putDataFieldsInto) {
  103. seriesName += " | " + dataField.caption;
  104. if ("singleAxis" !== mapOptions.dataFieldsDisplayMode) {
  105. axis = dataField.caption
  106. }
  107. }
  108. }
  109. processCellArgs.chartDataItem = {
  110. val: void 0 === value ? null : value,
  111. series: seriesName,
  112. arg: argument
  113. };
  114. processCellArgs = processDataCell(processCellArgs, mapOptions.processCell);
  115. if (processCellArgs.visible) {
  116. axisDictionary[processCellArgs.chartDataItem.series] = axisDictionary[processCellArgs.chartDataItem.series] || axis;
  117. dataSource.push(processCellArgs.chartDataItem)
  118. }
  119. }
  120. function foreachRowColumn(callBack) {
  121. (0, _uiPivot_grid.foreachTree)(rowElements, function(rowMembers) {
  122. rowMemberIndex = rowMembers[0].index;
  123. rowMembers = rowMembers.slice(0, rowMembers.length - 1);
  124. rowVisibility = rowLevel === rowMembers.length;
  125. rowPath = (0, _uiPivot_grid.createPath)(rowMembers);
  126. rowPathFormatted = getFormattedValue(rowMembers, rowFields);
  127. if (0 === rowPath.length) {
  128. rowPathFormatted = [mapOptions.grandTotalText]
  129. }(0, _uiPivot_grid.foreachTree)(columnElements, function(columnMembers) {
  130. columnMemberIndex = columnMembers[0].index;
  131. columnMembers = columnMembers.slice(0, columnMembers.length - 1);
  132. columnVisibility = columnLevel === columnMembers.length;
  133. columnPath = (0, _uiPivot_grid.createPath)(columnMembers);
  134. columnPathFormatted = getFormattedValue(columnMembers, columnFields);
  135. if (0 === columnPath.length) {
  136. columnPathFormatted = [mapOptions.grandTotalText]
  137. }
  138. callBack()
  139. })
  140. })
  141. }
  142. function foreachDataField(callback) {
  143. (0, _iterator.each)(dataFields, function(index, field) {
  144. dataField = field;
  145. measureIndex = index;
  146. callback()
  147. })
  148. }
  149. if (false === mapOptions.alternateDataFields) {
  150. foreachDataField(function() {
  151. foreachRowColumn(createDataItem)
  152. })
  153. } else {
  154. foreachRowColumn(function() {
  155. foreachDataField(createDataItem)
  156. })
  157. }
  158. return dataSource
  159. }
  160. function createValueAxisOptions(dataSource, options) {
  161. var dataFields = dataSource.getAreaFields("data");
  162. if ("args" !== options.putDataFieldsInto && "singleAxis" !== options.dataFieldsDisplayMode || 1 === dataFields.length) {
  163. var valueAxisSettings = [];
  164. (0, _iterator.each)(dataFields, function(_, dataField) {
  165. var valueAxisOptions = {
  166. name: dataField.caption,
  167. title: dataField.caption,
  168. valueType: FORMAT_DICTIONARY[dataField.dataType] || dataField.dataType,
  169. label: {
  170. format: dataField.format
  171. }
  172. };
  173. if (dataField.customizeText) {
  174. valueAxisOptions.label.customizeText = function(formatObject) {
  175. return dataField.customizeText.call(dataField, formatObject)
  176. }
  177. }
  178. if ("splitPanes" === options.dataFieldsDisplayMode) {
  179. valueAxisOptions.pane = dataField.caption
  180. }
  181. valueAxisSettings.push(valueAxisOptions)
  182. });
  183. return valueAxisSettings
  184. }
  185. return [{}]
  186. }
  187. function createPanesOptions(dataSource, options) {
  188. var panes = [];
  189. var dataFields = dataSource.getAreaFields("data");
  190. if (dataFields.length > 1 && "splitPanes" === options.dataFieldsDisplayMode && "args" !== options.putDataFieldsInto) {
  191. (0, _iterator.each)(dataFields, function(_, dataField) {
  192. panes.push({
  193. name: dataField.caption
  194. })
  195. })
  196. }
  197. if (!panes.length) {
  198. panes.push({})
  199. }
  200. return panes
  201. }
  202. function createChartOptions(dataSource, options) {
  203. var _customizeSeries = options.customizeSeries;
  204. var customizeChart = options.customizeChart;
  205. var chartOptions = {
  206. valueAxis: createValueAxisOptions(dataSource, options),
  207. panes: createPanesOptions(dataSource, options)
  208. };
  209. var axisDictionary = {};
  210. if (customizeChart) {
  211. chartOptions = (0, _extend.extend)(true, {}, chartOptions, customizeChart(chartOptions))
  212. }
  213. chartOptions.dataSource = createChartDataSource(dataSource, options, axisDictionary);
  214. chartOptions.seriesTemplate = {
  215. nameField: "series",
  216. customizeSeries: function(seriesName) {
  217. var seriesOptions = {};
  218. if ("splitPanes" === options.dataFieldsDisplayMode) {
  219. seriesOptions.pane = axisDictionary[seriesName]
  220. } else {
  221. if ("singleAxis" !== options.dataFieldsDisplayMode) {
  222. seriesOptions.axis = axisDictionary[seriesName]
  223. }
  224. }
  225. if (_customizeSeries) {
  226. seriesOptions = (0, _extend.extend)(seriesOptions, _customizeSeries(seriesName, seriesOptions))
  227. }
  228. return seriesOptions
  229. }
  230. };
  231. return chartOptions
  232. }
  233. function getChartInstance(chartElement) {
  234. if (!chartElement) {
  235. return false
  236. }
  237. if (chartElement.NAME) {
  238. return "dxChart" === chartElement.NAME && chartElement
  239. }
  240. var element = (0, _renderer2.default)(chartElement);
  241. return element.data("dxChart") && element.dxChart("instance")
  242. }
  243. function removeBinding(chart) {
  244. var unbind = chart.$element().data(UNBIND_KEY);
  245. unbind && unbind()
  246. }
  247. module.exports = {
  248. bindChart: function(chart, integrationOptions) {
  249. integrationOptions = (0, _extend.extend)({}, integrationOptions);
  250. var that = this;
  251. var updateChart = function() {
  252. integrationOptions.grandTotalText = that.option("texts.grandTotal");
  253. var chartOptions = createChartOptions(that.getDataSource(), integrationOptions);
  254. chart.option(chartOptions)
  255. };
  256. chart = getChartInstance(chart);
  257. if (!chart) {
  258. return null
  259. }
  260. removeBinding(chart);
  261. that.on("changed", updateChart);
  262. updateChart();
  263. var disposeBinding = function() {
  264. chart.$element().removeData(UNBIND_KEY);
  265. that.off("changed", updateChart)
  266. };
  267. chart.on("disposing", disposeBinding);
  268. this.on("disposing", disposeBinding);
  269. chart.$element().data(UNBIND_KEY, disposeBinding);
  270. return disposeBinding
  271. }
  272. };