selection.strategy.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. /**
  2. * DevExtreme (ui/selection/selection.strategy.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 dataQuery = require("../../data/query");
  11. var commonUtils = require("../../core/utils/common");
  12. var typeUtils = require("../../core/utils/type");
  13. var getKeyHash = commonUtils.getKeyHash;
  14. var Class = require("../../core/class");
  15. var Deferred = require("../../core/utils/deferred").Deferred;
  16. module.exports = Class.inherit({
  17. ctor: function(options) {
  18. this.options = options;
  19. this._clearItemKeys()
  20. },
  21. _clearItemKeys: function() {
  22. this._setOption("addedItemKeys", []);
  23. this._setOption("removedItemKeys", []);
  24. this._setOption("removedItems", []);
  25. this._setOption("addedItems", [])
  26. },
  27. validate: commonUtils.noop,
  28. _setOption: function(name, value) {
  29. this.options[name] = value
  30. },
  31. onSelectionChanged: function onSelectionChanged() {
  32. var addedItemKeys = this.options.addedItemKeys;
  33. var removedItemKeys = this.options.removedItemKeys;
  34. var addedItems = this.options.addedItems;
  35. var removedItems = this.options.removedItems;
  36. var selectedItems = this.options.selectedItems;
  37. var selectedItemKeys = this.options.selectedItemKeys;
  38. var onSelectionChanged = this.options.onSelectionChanged || commonUtils.noop;
  39. this._clearItemKeys();
  40. onSelectionChanged({
  41. selectedItems: selectedItems,
  42. selectedItemKeys: selectedItemKeys,
  43. addedItemKeys: addedItemKeys,
  44. removedItemKeys: removedItemKeys,
  45. addedItems: addedItems,
  46. removedItems: removedItems
  47. })
  48. },
  49. equalKeys: function(key1, key2) {
  50. if (this.options.equalByReference) {
  51. if (typeUtils.isObject(key1) && typeUtils.isObject(key2)) {
  52. return key1 === key2
  53. }
  54. }
  55. return commonUtils.equalByValue(key1, key2)
  56. },
  57. _clearSelection: function(keys, preserve, isDeselect, isSelectAll) {
  58. keys = keys || [];
  59. keys = Array.isArray(keys) ? keys : [keys];
  60. this.validate();
  61. return this.selectedItemKeys(keys, preserve, isDeselect, isSelectAll)
  62. },
  63. _loadFilteredData: function(remoteFilter, localFilter, select, isSelectAll) {
  64. var filterLength = encodeURI(JSON.stringify(remoteFilter)).length;
  65. var needLoadAllData = this.options.maxFilterLengthInRequest && filterLength > this.options.maxFilterLengthInRequest;
  66. var deferred = new Deferred;
  67. var loadOptions = {
  68. filter: needLoadAllData ? void 0 : remoteFilter,
  69. select: needLoadAllData ? this.options.dataFields() : select || this.options.dataFields()
  70. };
  71. if (remoteFilter && 0 === remoteFilter.length) {
  72. deferred.resolve([])
  73. } else {
  74. this.options.load(loadOptions).done(function(items) {
  75. var filteredItems = typeUtils.isPlainObject(items) ? items.data : items;
  76. if (localFilter && !isSelectAll) {
  77. filteredItems = filteredItems.filter(localFilter)
  78. } else {
  79. if (needLoadAllData) {
  80. filteredItems = dataQuery(filteredItems).filter(remoteFilter).toArray()
  81. }
  82. }
  83. deferred.resolve(filteredItems)
  84. }).fail(deferred.reject.bind(deferred))
  85. }
  86. return deferred
  87. },
  88. updateSelectedItemKeyHash: function(keys) {
  89. for (var i = 0; i < keys.length; i++) {
  90. var keyHash = getKeyHash(keys[i]);
  91. if (!typeUtils.isObject(keyHash)) {
  92. this.options.keyHashIndices[keyHash] = this.options.keyHashIndices[keyHash] || [];
  93. var keyIndices = this.options.keyHashIndices[keyHash];
  94. keyIndices.push(i)
  95. }
  96. }
  97. },
  98. _isAnyItemSelected: function(items) {
  99. for (var i = 0; i < items.length; i++) {
  100. if (this.options.isItemSelected(items[i])) {
  101. return
  102. }
  103. }
  104. return false
  105. },
  106. _getFullSelectAllState: function() {
  107. var items = this.options.plainItems();
  108. var dataFilter = this.options.filter();
  109. var selectedItems = this.options.selectedItems;
  110. if (dataFilter) {
  111. selectedItems = dataQuery(selectedItems).filter(dataFilter).toArray()
  112. }
  113. var selectedItemsLength = selectedItems.length;
  114. if (!selectedItemsLength) {
  115. return this._isAnyItemSelected(items)
  116. }
  117. if (selectedItemsLength >= this.options.totalCount()) {
  118. return true
  119. }
  120. return
  121. },
  122. _getVisibleSelectAllState: function() {
  123. var items = this.options.plainItems();
  124. var hasSelectedItems = false;
  125. var hasUnselectedItems = false;
  126. for (var i = 0; i < items.length; i++) {
  127. var item = items[i];
  128. var itemData = this.options.getItemData(item);
  129. var key = this.options.keyOf(itemData);
  130. if (this.options.isSelectableItem(item)) {
  131. if (this.isItemKeySelected(key)) {
  132. hasSelectedItems = true
  133. } else {
  134. hasUnselectedItems = true
  135. }
  136. }
  137. }
  138. if (hasSelectedItems) {
  139. return !hasUnselectedItems ? true : void 0
  140. } else {
  141. return false
  142. }
  143. }
  144. });