ui.collection_widget.live_update.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. /**
  2. * DevExtreme (ui/collection/ui.collection_widget.live_update.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. Object.defineProperty(exports, "__esModule", {
  11. value: true
  12. });
  13. var _renderer = require("../../core/renderer");
  14. var _renderer2 = _interopRequireDefault(_renderer);
  15. var _uiCollection_widget = require("./ui.collection_widget.edit");
  16. var _uiCollection_widget2 = _interopRequireDefault(_uiCollection_widget);
  17. var _extend = require("../../core/utils/extend");
  18. var _type = require("../../core/utils/type");
  19. var _array_utils = require("../../data/array_utils");
  20. var _array_utils2 = _interopRequireDefault(_array_utils);
  21. var _utils = require("../../data/utils");
  22. var _deferred = require("../../core/utils/deferred");
  23. var _array_compare = require("../../core/utils/array_compare");
  24. var _dom_adapter = require("../../core/dom_adapter");
  25. var _common = require("../../core/utils/common");
  26. function _interopRequireDefault(obj) {
  27. return obj && obj.__esModule ? obj : {
  28. "default": obj
  29. }
  30. }
  31. function _defineProperty(obj, key, value) {
  32. if (key in obj) {
  33. Object.defineProperty(obj, key, {
  34. value: value,
  35. enumerable: true,
  36. configurable: true,
  37. writable: true
  38. })
  39. } else {
  40. obj[key] = value
  41. }
  42. return obj
  43. }
  44. var PRIVATE_KEY_FIELD = "__dx_key__";
  45. exports.default = _uiCollection_widget2.default.inherit({
  46. _getDefaultOptions: function() {
  47. return (0, _extend.extend)(this.callBase(), {
  48. repaintChangesOnly: false
  49. })
  50. },
  51. ctor: function() {
  52. var _this = this;
  53. this.callBase.apply(this, arguments);
  54. this._customizeStoreLoadOptions = function(e) {
  55. var dataSource = _this._dataSource;
  56. if (dataSource && !dataSource.isLoaded()) {
  57. _this._correctionIndex = 0
  58. }
  59. if (_this._correctionIndex && e.storeLoadOptions) {
  60. e.storeLoadOptions.skip += _this._correctionIndex
  61. }
  62. }, this._dataSource && this._dataSource.on("customizeStoreLoadOptions", this._customizeStoreLoadOptions)
  63. },
  64. reload: function() {
  65. this._correctionIndex = 0
  66. },
  67. _init: function() {
  68. this.callBase();
  69. this._refreshItemsCache();
  70. this._correctionIndex = 0
  71. },
  72. _findItemElementByKey: function(key) {
  73. var _this2 = this;
  74. var result = (0, _renderer2.default)();
  75. var keyExpr = this.key();
  76. this.itemElements().each(function(_, item) {
  77. var $item = (0, _renderer2.default)(item);
  78. var itemData = _this2._getItemData($item);
  79. if (keyExpr ? (0, _utils.keysEqual)(keyExpr, _this2.keyOf(itemData), key) : _this2._isItemEquals(itemData, key)) {
  80. result = $item;
  81. return false
  82. }
  83. });
  84. return result
  85. },
  86. _dataSourceChangedHandler: function(newItems, e) {
  87. e && e.changes ? this._modifyByChanges(e.changes) : this.callBase(newItems, e)
  88. },
  89. _isItemEquals: function(item1, item2) {
  90. if (item1 && item1[PRIVATE_KEY_FIELD]) {
  91. item1 = item1.data
  92. }
  93. try {
  94. return JSON.stringify(item1) === JSON.stringify(item2)
  95. } catch (e) {
  96. return item1 === item2
  97. }
  98. },
  99. _partialRefresh: function() {
  100. var _this3 = this;
  101. if (this.option("repaintChangesOnly")) {
  102. var keyOf = function(data) {
  103. if (data && void 0 !== data[PRIVATE_KEY_FIELD]) {
  104. return data[PRIVATE_KEY_FIELD]
  105. }
  106. return _this3.keyOf(data)
  107. };
  108. var result = (0, _array_compare.findChanges)(this._itemsCache, this._editStrategy.itemsGetter(), keyOf, this._isItemEquals);
  109. if (result && this._itemsCache.length) {
  110. this._modifyByChanges(result, true);
  111. this._renderEmptyMessage();
  112. return true
  113. } else {
  114. this._refreshItemsCache()
  115. }
  116. }
  117. return false
  118. },
  119. _refreshItemsCache: function() {
  120. if (this.option("repaintChangesOnly")) {
  121. var items = this._editStrategy.itemsGetter();
  122. try {
  123. this._itemsCache = (0, _extend.extend)(true, [], items);
  124. if (!this.key()) {
  125. this._itemsCache = this._itemsCache.map(function(itemCache, index) {
  126. var _ref;
  127. return _ref = {}, _defineProperty(_ref, PRIVATE_KEY_FIELD, items[index]), _defineProperty(_ref, "data", itemCache), _ref
  128. })
  129. }
  130. } catch (e) {
  131. this._itemsCache = (0, _extend.extend)([], items)
  132. }
  133. }
  134. },
  135. _dispose: function() {
  136. this._dataSource && this._dataSource.off("customizeStoreLoadOptions", this._customizeStoreLoadOptions);
  137. this.callBase()
  138. },
  139. _updateByChange: function(keyInfo, items, change, isPartialRefresh) {
  140. var _this4 = this;
  141. if (isPartialRefresh) {
  142. this._renderItem(change.index, change.data, null, this._findItemElementByKey(change.key))
  143. } else {
  144. var changedItem = items[_array_utils2.default.indexByKey(keyInfo, items, change.key)];
  145. if (changedItem) {
  146. _array_utils2.default.update(keyInfo, items, change.key, change.data).done(function() {
  147. _this4._renderItem(items.indexOf(changedItem), changedItem, null, _this4._findItemElementByKey(change.key))
  148. })
  149. }
  150. }
  151. },
  152. _insertByChange: function(keyInfo, items, change, isPartialRefresh) {
  153. var _this5 = this;
  154. (0, _deferred.when)(isPartialRefresh || _array_utils2.default.insert(keyInfo, items, change.data, change.index)).done(function() {
  155. _this5._beforeItemElementInserted(change);
  156. _this5._renderItem((0, _type.isDefined)(change.index) ? change.index : items.length, change.data);
  157. _this5._afterItemElementInserted();
  158. _this5._correctionIndex++
  159. })
  160. },
  161. _updateSelectionAfterRemoveByChange: function(removeIndex) {
  162. var selectedIndex = this.option("selectedIndex");
  163. if (selectedIndex > removeIndex) {
  164. this.option("selectedIndex", selectedIndex - 1)
  165. } else {
  166. if (selectedIndex === removeIndex && 1 === this.option("selectedItems").length) {
  167. this.option("selectedItems", [])
  168. } else {
  169. this._normalizeSelectedItems()
  170. }
  171. }
  172. },
  173. _beforeItemElementInserted: function(change) {
  174. var selectedIndex = this.option("selectedIndex");
  175. if (change.index <= selectedIndex) {
  176. this.option("selectedIndex", selectedIndex + 1)
  177. }
  178. },
  179. _afterItemElementInserted: _common.noop,
  180. _removeByChange: function(keyInfo, items, change, isPartialRefresh) {
  181. var _this6 = this;
  182. var index = isPartialRefresh ? change.index : _array_utils2.default.indexByKey(keyInfo, items, change.key);
  183. var removedItem = isPartialRefresh ? change.oldItem : items[index];
  184. if (removedItem) {
  185. var $removedItemElement = this._findItemElementByKey(change.key);
  186. var deletedActionArgs = this._extendActionArgs($removedItemElement);
  187. this._waitDeletingPrepare($removedItemElement).done(function() {
  188. if (isPartialRefresh) {
  189. _this6._updateIndicesAfterIndex(index - 1);
  190. _this6._afterItemElementDeleted($removedItemElement, deletedActionArgs);
  191. _this6._updateSelectionAfterRemoveByChange(index)
  192. } else {
  193. _this6._deleteItemElementByIndex(index);
  194. _this6._afterItemElementDeleted($removedItemElement, deletedActionArgs)
  195. }
  196. });
  197. this._correctionIndex--
  198. }
  199. },
  200. _modifyByChanges: function(changes, isPartialRefresh) {
  201. var _this7 = this;
  202. var items = this._editStrategy.itemsGetter();
  203. var keyInfo = {
  204. key: this.key.bind(this),
  205. keyOf: this.keyOf.bind(this)
  206. };
  207. var dataSource = this._dataSource;
  208. var paginate = dataSource && dataSource.paginate();
  209. var group = dataSource && dataSource.group();
  210. if (paginate || group) {
  211. changes = changes.filter(function(item) {
  212. return "insert" !== item.type || void 0 !== item.index
  213. })
  214. }
  215. changes.forEach(function(change) {
  216. return _this7["_".concat(change.type, "ByChange")](keyInfo, items, change, isPartialRefresh)
  217. });
  218. this._renderedItemsCount = items.length;
  219. this._refreshItemsCache();
  220. this._fireContentReadyAction()
  221. },
  222. _appendItemToContainer: function($container, $itemFrame, index) {
  223. var nextSiblingElement = $container.children(this._itemSelector()).get(index);
  224. (0, _dom_adapter.insertElement)($container.get(0), $itemFrame.get(0), nextSiblingElement)
  225. },
  226. _optionChanged: function(args) {
  227. switch (args.name) {
  228. case "items":
  229. var isItemsUpdated = this._partialRefresh(args.value);
  230. if (!isItemsUpdated) {
  231. this.callBase(args)
  232. }
  233. break;
  234. case "dataSource":
  235. if (!this.option("repaintChangesOnly") || !args.value) {
  236. this.option("items", [])
  237. }
  238. this.callBase(args);
  239. break;
  240. case "repaintChangesOnly":
  241. break;
  242. default:
  243. this.callBase(args)
  244. }
  245. }
  246. });