ui.pivot_grid.utils.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. /**
  2. * DevExtreme (ui/pivot_grid/ui.pivot_grid.utils.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 _type = require("../../core/utils/type");
  11. var _ajax = require("../../core/utils/ajax");
  12. var _data = require("../../core/utils/data");
  13. var _iterator = require("../../core/utils/iterator");
  14. var _extend = require("../../core/utils/extend");
  15. var _date = require("../../localization/date");
  16. var _format_helper = require("../../format_helper");
  17. var _data_source = require("../../data/data_source/data_source");
  18. var _array_store = require("../../data/array_store");
  19. var _array_store2 = _interopRequireDefault(_array_store);
  20. var _deferred = require("../../core/utils/deferred");
  21. function _interopRequireDefault(obj) {
  22. return obj && obj.__esModule ? obj : {
  23. "default": obj
  24. }
  25. }
  26. var setFieldProperty = exports.setFieldProperty = function(field, property, value, isInitialization) {
  27. var initProperties = field._initProperties = field._initProperties || {};
  28. var initValue = isInitialization ? value : field[property];
  29. if (!Object.prototype.hasOwnProperty.call(initProperties, property) || isInitialization) {
  30. initProperties[property] = initValue
  31. }
  32. field[property] = value
  33. };
  34. exports.sendRequest = function(options) {
  35. return (0, _ajax.sendRequest)(options)
  36. };
  37. var foreachTreeAsyncDate = new Date;
  38. function createForeachTreeFunc(isAsync) {
  39. var foreachTreeFunc = function foreachTreeFunc(items, callback, parentAtFirst, members, index, isChildrenProcessing) {
  40. members = members || [];
  41. items = items || [];
  42. var i;
  43. var deferred;
  44. index = index || 0;
  45. function createForeachTreeAsyncHandler(deferred, i, isChildrenProcessing) {
  46. (0, _deferred.when)(foreachTreeFunc(items, callback, parentAtFirst, members, i, isChildrenProcessing)).done(deferred.resolve)
  47. }
  48. for (i = index; i < items.length; i++) {
  49. if (isAsync && i > index && i % 1e4 === 0 && new Date - foreachTreeAsyncDate >= 300) {
  50. foreachTreeAsyncDate = new Date;
  51. deferred = new _deferred.Deferred;
  52. setTimeout(createForeachTreeAsyncHandler(deferred, i, false), 0);
  53. return deferred
  54. }
  55. var item = items[i];
  56. if (!isChildrenProcessing) {
  57. members.unshift(item);
  58. if (parentAtFirst && false === callback(members, i)) {
  59. return
  60. }
  61. if (item.children) {
  62. var childrenDeferred = foreachTreeFunc(item.children, callback, parentAtFirst, members);
  63. if (isAsync && childrenDeferred) {
  64. deferred = new _deferred.Deferred;
  65. childrenDeferred.done(createForeachTreeAsyncHandler(deferred, i, true));
  66. return deferred
  67. }
  68. }
  69. }
  70. isChildrenProcessing = false;
  71. if (!parentAtFirst && false === callback(members, i)) {
  72. return
  73. }
  74. members.shift();
  75. if (items[i] !== item) {
  76. i--
  77. }
  78. }
  79. };
  80. return foreachTreeFunc
  81. }
  82. exports.foreachTree = createForeachTreeFunc(false);
  83. exports.foreachTreeAsync = createForeachTreeFunc(true);
  84. exports.findField = function(fields, id) {
  85. if (fields && (0, _type.isDefined)(id)) {
  86. for (var i = 0; i < fields.length; i++) {
  87. var field = fields[i];
  88. if (field.name === id || field.caption === id || field.dataField === id || field.index === id) {
  89. return i
  90. }
  91. }
  92. }
  93. return -1
  94. };
  95. exports.formatValue = function(value, options) {
  96. var formatObject = {
  97. value: value,
  98. valueText: (0, _format_helper.format)(value, options.format) || ""
  99. };
  100. return options.customizeText ? options.customizeText.call(options, formatObject) : formatObject.valueText
  101. };
  102. exports.getCompareFunction = function(valueSelector) {
  103. return function(a, b) {
  104. var result = 0;
  105. var valueA = valueSelector(a);
  106. var valueB = valueSelector(b);
  107. var aIsDefined = (0, _type.isDefined)(valueA);
  108. var bIsDefined = (0, _type.isDefined)(valueB);
  109. if (aIsDefined && bIsDefined) {
  110. if (valueA > valueB) {
  111. result = 1
  112. } else {
  113. if (valueA < valueB) {
  114. result = -1
  115. }
  116. }
  117. }
  118. if (aIsDefined && !bIsDefined) {
  119. result = 1
  120. }
  121. if (!aIsDefined && bIsDefined) {
  122. result = -1
  123. }
  124. return result
  125. }
  126. };
  127. exports.createPath = function(items) {
  128. var result = [];
  129. for (var i = items.length - 1; i >= 0; i--) {
  130. result.push(items[i].key || items[i].value)
  131. }
  132. return result
  133. };
  134. exports.foreachDataLevel = function foreachDataLevel(data, callback, index, childrenField) {
  135. index = index || 0;
  136. childrenField = childrenField || "children";
  137. if (data.length) {
  138. callback(data, index)
  139. }
  140. for (var i = 0; i < data.length; i++) {
  141. var item = data[i];
  142. if (item[childrenField] && item[childrenField].length) {
  143. foreachDataLevel(item[childrenField], callback, index + 1, childrenField)
  144. }
  145. }
  146. };
  147. exports.mergeArraysByMaxValue = function(values1, values2) {
  148. var result = [];
  149. for (var i = 0; i < values1.length; i++) {
  150. result.push(Math.max(values1[i] || 0, values2[i] || 0))
  151. }
  152. return result
  153. };
  154. exports.getExpandedLevel = function(options, axisName) {
  155. var dimensions = options[axisName];
  156. var expandLevel = 0;
  157. var expandedPaths = ("columns" === axisName ? options.columnExpandedPaths : options.rowExpandedPaths) || [];
  158. if (options.headerName === axisName) {
  159. expandLevel = options.path.length
  160. } else {
  161. if (options.headerName && options.headerName !== axisName && options.oppositePath) {
  162. expandLevel = options.oppositePath.length
  163. } else {
  164. (0, _iterator.each)(expandedPaths, function(_, path) {
  165. expandLevel = Math.max(expandLevel, path.length)
  166. })
  167. }
  168. }
  169. while (dimensions[expandLevel + 1] && dimensions[expandLevel].expanded) {
  170. expandLevel++
  171. }
  172. return expandLevel
  173. };
  174. function createGroupFields(item) {
  175. return (0, _iterator.map)(["year", "quarter", "month"], function(value, index) {
  176. return (0, _extend.extend)({}, item, {
  177. groupInterval: value,
  178. groupIndex: index
  179. })
  180. })
  181. }
  182. function parseFields(dataSource, fieldsList, path, fieldsDataType) {
  183. var result = [];
  184. (0, _iterator.each)(fieldsList || [], function(field, value) {
  185. if (field && 0 === field.indexOf("__")) {
  186. return
  187. }
  188. var dataIndex = 1;
  189. var currentPath = path.length ? path + "." + field : field;
  190. var dataType = fieldsDataType[currentPath];
  191. var getter = (0, _data.compileGetter)(currentPath);
  192. var items;
  193. while (!(0, _type.isDefined)(value) && dataSource[dataIndex]) {
  194. value = getter(dataSource[dataIndex]);
  195. dataIndex++
  196. }
  197. if (!dataType && (0, _type.isDefined)(value)) {
  198. dataType = (0, _type.type)(value)
  199. }
  200. items = [{
  201. dataField: currentPath,
  202. dataType: dataType,
  203. groupName: "date" === dataType ? field : void 0,
  204. groupInterval: void 0,
  205. displayFolder: path
  206. }];
  207. if ("date" === dataType) {
  208. items = items.concat(createGroupFields(items[0]))
  209. } else {
  210. if ("object" === dataType) {
  211. items = parseFields(dataSource, value, currentPath, fieldsDataType)
  212. }
  213. }
  214. result.push.apply(result, items)
  215. });
  216. return result
  217. }
  218. exports.discoverObjectFields = function(items, fields) {
  219. var fieldsDataType = exports.getFieldsDataType(fields);
  220. return parseFields(items, items[0], "", fieldsDataType)
  221. };
  222. exports.getFieldsDataType = function(fields) {
  223. var result = {};
  224. (0, _iterator.each)(fields, function(_, field) {
  225. result[field.dataField] = result[field.dataField] || field.dataType
  226. });
  227. return result
  228. };
  229. var DATE_INTERVAL_FORMATS = {
  230. month: function(value) {
  231. return (0, _date.getMonthNames)()[value - 1]
  232. },
  233. quarter: function(value) {
  234. return (0, _date.format)(new Date(2e3, 3 * value - 1), "quarter")
  235. },
  236. dayOfWeek: function(value) {
  237. return (0, _date.getDayNames)()[value]
  238. }
  239. };
  240. exports.setDefaultFieldValueFormatting = function(field) {
  241. if ("date" === field.dataType) {
  242. if (!field.format) {
  243. setFieldProperty(field, "format", DATE_INTERVAL_FORMATS[field.groupInterval])
  244. }
  245. } else {
  246. if ("number" === field.dataType) {
  247. var groupInterval = (0, _type.isNumeric)(field.groupInterval) && field.groupInterval > 0 && field.groupInterval;
  248. if (groupInterval && !field.customizeText) {
  249. setFieldProperty(field, "customizeText", function(formatObject) {
  250. var secondValue = formatObject.value + groupInterval;
  251. var secondValueText = (0, _format_helper.format)(secondValue, field.format);
  252. return formatObject.valueText && secondValueText ? formatObject.valueText + " - " + secondValueText : ""
  253. })
  254. }
  255. }
  256. }
  257. };
  258. exports.getFiltersByPath = function(fields, path) {
  259. var result = [];
  260. path = path || [];
  261. for (var i = 0; i < path.length; i++) {
  262. result.push((0, _extend.extend)({}, fields[i], {
  263. groupIndex: null,
  264. groupName: null,
  265. filterType: "include",
  266. filterValues: [path[i]]
  267. }))
  268. }
  269. return result
  270. };
  271. exports.storeDrillDownMixin = {
  272. createDrillDownDataSource: function(descriptions, params) {
  273. var arrayStore;
  274. function createCustomStoreMethod(methodName) {
  275. return function(options) {
  276. var d;
  277. if (arrayStore) {
  278. d = arrayStore[methodName](options)
  279. } else {
  280. d = new _deferred.Deferred;
  281. (0, _deferred.when)(items).done(function(data) {
  282. var arrayStore = new _array_store2.default(data);
  283. arrayStore[methodName](options).done(d.resolve).fail(d.reject)
  284. }).fail(d.reject)
  285. }
  286. return d
  287. }
  288. }
  289. var items = this.getDrillDownItems(descriptions, params);
  290. var dataSource = new _data_source.DataSource({
  291. load: createCustomStoreMethod("load"),
  292. totalCount: createCustomStoreMethod("totalCount"),
  293. key: this.key()
  294. });
  295. return dataSource
  296. }
  297. };
  298. exports.capitalizeFirstLetter = function(string) {
  299. return string.charAt(0).toUpperCase() + string.slice(1)
  300. };