common.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /**
  2. * DevExtreme (core/utils/common.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 _config = require("../config");
  11. var _config2 = _interopRequireDefault(_config);
  12. var _guid = require("../guid");
  13. var _guid2 = _interopRequireDefault(_guid);
  14. var _deferred = require("../utils/deferred");
  15. var _iterator = require("./iterator");
  16. var _data = require("./data");
  17. var _type = require("./type");
  18. function _interopRequireDefault(obj) {
  19. return obj && obj.__esModule ? obj : {
  20. "default": obj
  21. }
  22. }
  23. function _typeof(obj) {
  24. "@babel/helpers - typeof";
  25. return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
  26. return typeof obj
  27. } : function(obj) {
  28. return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
  29. }, _typeof(obj)
  30. }
  31. var ensureDefined = function(value, defaultValue) {
  32. return (0, _type.isDefined)(value) ? value : defaultValue
  33. };
  34. var executeAsync = function(action, context) {
  35. var deferred = new _deferred.Deferred;
  36. var normalizedContext = context || this;
  37. var task = {
  38. promise: deferred.promise(),
  39. abort: function() {
  40. clearTimeout(timerId);
  41. deferred.rejectWith(normalizedContext)
  42. }
  43. };
  44. var callback = function() {
  45. var result = action.call(normalizedContext);
  46. if (result && result.done && (0, _type.isFunction)(result.done)) {
  47. result.done(function() {
  48. deferred.resolveWith(normalizedContext)
  49. })
  50. } else {
  51. deferred.resolveWith(normalizedContext)
  52. }
  53. };
  54. var timerId = (arguments[2] || setTimeout)(callback, "number" === typeof context ? context : 0);
  55. return task
  56. };
  57. var delayedFuncs = [];
  58. var delayedNames = [];
  59. var delayedDeferreds = [];
  60. var executingName;
  61. var deferExecute = function(name, func, deferred) {
  62. if (executingName && executingName !== name) {
  63. delayedFuncs.push(func);
  64. delayedNames.push(name);
  65. deferred = deferred || new _deferred.Deferred;
  66. delayedDeferreds.push(deferred);
  67. return deferred
  68. } else {
  69. var oldExecutingName = executingName;
  70. var currentDelayedCount = delayedDeferreds.length;
  71. executingName = name;
  72. var result = func();
  73. if (!result) {
  74. if (delayedDeferreds.length > currentDelayedCount) {
  75. result = _deferred.when.apply(this, delayedDeferreds.slice(currentDelayedCount))
  76. } else {
  77. if (deferred) {
  78. deferred.resolve()
  79. }
  80. }
  81. }
  82. executingName = oldExecutingName;
  83. if (deferred && result && result.done) {
  84. result.done(deferred.resolve).fail(deferred.reject)
  85. }
  86. if (!executingName && delayedFuncs.length) {
  87. ("render" === delayedNames.shift() ? deferRender : deferUpdate)(delayedFuncs.shift(), delayedDeferreds.shift())
  88. }
  89. return result || (0, _deferred.when)()
  90. }
  91. };
  92. var deferRender = function(func, deferred) {
  93. return deferExecute("render", func, deferred)
  94. };
  95. var deferUpdate = function(func, deferred) {
  96. return deferExecute("update", func, deferred)
  97. };
  98. var deferRenderer = function(func) {
  99. return function() {
  100. var that = this;
  101. return deferExecute("render", function() {
  102. return func.call(that)
  103. })
  104. }
  105. };
  106. var deferUpdater = function(func) {
  107. return function() {
  108. var that = this;
  109. return deferExecute("update", function() {
  110. return func.call(that)
  111. })
  112. }
  113. };
  114. var findBestMatches = function(targetFilter, items, mapFn) {
  115. var bestMatches = [];
  116. var maxMatchCount = 0;
  117. (0, _iterator.each)(items, function(index, itemSrc) {
  118. var matchCount = 0;
  119. var item = mapFn ? mapFn(itemSrc) : itemSrc;
  120. (0, _iterator.each)(targetFilter, function(paramName, targetValue) {
  121. var value = item[paramName];
  122. if (void 0 === value) {
  123. return
  124. }
  125. if (match(value, targetValue)) {
  126. matchCount++;
  127. return
  128. }
  129. matchCount = -1;
  130. return false
  131. });
  132. if (matchCount < maxMatchCount) {
  133. return
  134. }
  135. if (matchCount > maxMatchCount) {
  136. bestMatches.length = 0;
  137. maxMatchCount = matchCount
  138. }
  139. bestMatches.push(itemSrc)
  140. });
  141. return bestMatches
  142. };
  143. var match = function(value, targetValue) {
  144. if (Array.isArray(value) && Array.isArray(targetValue)) {
  145. var mismatch = false;
  146. (0, _iterator.each)(value, function(index, valueItem) {
  147. if (valueItem !== targetValue[index]) {
  148. mismatch = true;
  149. return false
  150. }
  151. });
  152. if (mismatch) {
  153. return false
  154. }
  155. return true
  156. }
  157. if (value === targetValue) {
  158. return true
  159. }
  160. return false
  161. };
  162. var splitPair = function(raw) {
  163. switch (_typeof(raw)) {
  164. case "string":
  165. return raw.split(/\s+/, 2);
  166. case "object":
  167. return [raw.x || raw.h, raw.y || raw.v];
  168. case "number":
  169. return [raw];
  170. default:
  171. return raw
  172. }
  173. };
  174. var normalizeKey = function(id) {
  175. var key = (0, _type.isString)(id) ? id : id.toString();
  176. var arr = key.match(/[^a-zA-Z0-9_]/g);
  177. arr && (0, _iterator.each)(arr, function(_, sign) {
  178. key = key.replace(sign, "__" + sign.charCodeAt() + "__")
  179. });
  180. return key
  181. };
  182. var denormalizeKey = function(key) {
  183. var arr = key.match(/__\d+__/g);
  184. arr && arr.forEach(function(char) {
  185. var charCode = parseInt(char.replace("__", ""));
  186. key = key.replace(char, String.fromCharCode(charCode))
  187. });
  188. return key
  189. };
  190. var isArraysEqualByValue = function(array1, array2, deep) {
  191. if (array1.length !== array2.length) {
  192. return false
  193. }
  194. for (var i = 0; i < array1.length; i++) {
  195. if (!equalByValue(array1[i], array2[i], deep + 1)) {
  196. return false
  197. }
  198. }
  199. return true
  200. };
  201. var isObjectsEqualByValue = function(object1, object2, deep) {
  202. for (var propertyName in object1) {
  203. if (Object.prototype.hasOwnProperty.call(object1, propertyName) && !equalByValue(object1[propertyName], object2[propertyName], deep + 1)) {
  204. return false
  205. }
  206. }
  207. for (var _propertyName in object2) {
  208. if (!(_propertyName in object1)) {
  209. return false
  210. }
  211. }
  212. return true
  213. };
  214. var pairToObject = function(raw, preventRound) {
  215. var pair = splitPair(raw);
  216. var h = preventRound ? parseFloat(pair && pair[0]) : parseInt(pair && pair[0], 10);
  217. var v = preventRound ? parseFloat(pair && pair[1]) : parseInt(pair && pair[1], 10);
  218. if (!isFinite(h)) {
  219. h = 0
  220. }
  221. if (!isFinite(v)) {
  222. v = h
  223. }
  224. return {
  225. h: h,
  226. v: v
  227. }
  228. };
  229. var maxEqualityDeep = 3;
  230. var equalByValue = function(object1, object2, deep) {
  231. deep = deep || 0;
  232. object1 = (0, _data.toComparable)(object1, true);
  233. object2 = (0, _data.toComparable)(object2, true);
  234. if (object1 === object2 || deep >= maxEqualityDeep) {
  235. return true
  236. }
  237. if ((0, _type.isObject)(object1) && (0, _type.isObject)(object2)) {
  238. return isObjectsEqualByValue(object1, object2, deep)
  239. } else {
  240. if (Array.isArray(object1) && Array.isArray(object2)) {
  241. return isArraysEqualByValue(object1, object2, deep)
  242. }
  243. }
  244. return false
  245. };
  246. var getKeyHash = function(key) {
  247. if (key instanceof _guid2.default) {
  248. return key.toString()
  249. } else {
  250. if ((0, _type.isObject)(key) || Array.isArray(key)) {
  251. try {
  252. var keyHash = JSON.stringify(key);
  253. return "{}" === keyHash ? key : keyHash
  254. } catch (e) {
  255. return key
  256. }
  257. }
  258. }
  259. return key
  260. };
  261. var escapeRegExp = function(string) {
  262. return string.replace(/[[\]{}\-()*+?.\\^$|\s]/g, "\\$&")
  263. };
  264. var applyServerDecimalSeparator = function(value) {
  265. var separator = (0, _config2.default)().serverDecimalSeparator;
  266. if ((0, _type.isDefined)(value)) {
  267. value = value.toString().replace(".", separator)
  268. }
  269. return value
  270. };
  271. var noop = function() {};
  272. var asyncNoop = function() {
  273. return (new _deferred.Deferred).resolve().promise()
  274. };
  275. var grep = function(elements, checkFunction, invert) {
  276. var result = [];
  277. var expectedCheck = !invert;
  278. for (var i = 0; i < elements.length; i++) {
  279. var check = !!checkFunction(elements[i], i);
  280. if (check === expectedCheck) {
  281. result.push(elements[i])
  282. }
  283. }
  284. return result
  285. };
  286. exports.ensureDefined = ensureDefined;
  287. exports.executeAsync = executeAsync;
  288. exports.deferRender = deferRender;
  289. exports.deferRenderer = deferRenderer;
  290. exports.deferUpdate = deferUpdate;
  291. exports.deferUpdater = deferUpdater;
  292. exports.pairToObject = pairToObject;
  293. exports.splitPair = splitPair;
  294. exports.findBestMatches = findBestMatches;
  295. exports.normalizeKey = normalizeKey;
  296. exports.denormalizeKey = denormalizeKey;
  297. exports.equalByValue = equalByValue;
  298. exports.getKeyHash = getKeyHash;
  299. exports.escapeRegExp = escapeRegExp;
  300. exports.applyServerDecimalSeparator = applyServerDecimalSeparator;
  301. exports.noop = noop;
  302. exports.asyncNoop = asyncNoop;
  303. exports.grep = grep;