selection.js 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. /**
  2. * DevExtreme (ui/selection/selection.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 Class = require("../../core/class");
  11. var deferredStrategy = require("./selection.strategy.deferred");
  12. var standardStrategy = require("./selection.strategy.standard");
  13. var extend = require("../../core/utils/extend").extend;
  14. var noop = require("../../core/utils/common").noop;
  15. var isDefined = require("../../core/utils/type").isDefined;
  16. var Deferred = require("../../core/utils/deferred").Deferred;
  17. module.exports = Class.inherit({
  18. ctor: function(options) {
  19. this.options = extend(this._getDefaultOptions(), options, {
  20. selectedItemKeys: options.selectedKeys || []
  21. });
  22. this._selectionStrategy = this.options.deferred ? new deferredStrategy(this.options) : new standardStrategy(this.options);
  23. this._focusedItemIndex = -1;
  24. if (!this.options.equalByReference) {
  25. this._selectionStrategy.updateSelectedItemKeyHash(this.options.selectedItemKeys)
  26. }
  27. },
  28. _getDefaultOptions: function() {
  29. return {
  30. allowNullValue: false,
  31. deferred: false,
  32. equalByReference: false,
  33. mode: "multiple",
  34. selectedItems: [],
  35. selectionFilter: [],
  36. maxFilterLengthInRequest: 0,
  37. onSelectionChanged: noop,
  38. key: noop,
  39. keyOf: function(item) {
  40. return item
  41. },
  42. load: function() {
  43. return (new Deferred).resolve([])
  44. },
  45. totalCount: function() {
  46. return -1
  47. },
  48. isSelectableItem: function() {
  49. return true
  50. },
  51. isItemSelected: function() {
  52. return false
  53. },
  54. getItemData: function(item) {
  55. return item
  56. },
  57. dataFields: noop,
  58. filter: noop
  59. }
  60. },
  61. validate: function() {
  62. this._selectionStrategy.validate()
  63. },
  64. getSelectedItemKeys: function() {
  65. return this._selectionStrategy.getSelectedItemKeys()
  66. },
  67. getSelectedItems: function() {
  68. return this._selectionStrategy.getSelectedItems()
  69. },
  70. selectionFilter: function(value) {
  71. if (void 0 === value) {
  72. return this.options.selectionFilter
  73. }
  74. var filterIsChanged = this.options.selectionFilter !== value && JSON.stringify(this.options.selectionFilter) !== JSON.stringify(value);
  75. this.options.selectionFilter = value;
  76. filterIsChanged && this.onSelectionChanged()
  77. },
  78. setSelection: function(keys) {
  79. return this.selectedItemKeys(keys)
  80. },
  81. select: function(keys) {
  82. return this.selectedItemKeys(keys, true)
  83. },
  84. deselect: function(keys) {
  85. return this.selectedItemKeys(keys, true, true)
  86. },
  87. selectedItemKeys: function(keys, preserve, isDeselect, isSelectAll) {
  88. var that = this;
  89. keys = keys || [];
  90. keys = Array.isArray(keys) ? keys : [keys];
  91. that.validate();
  92. return this._selectionStrategy.selectedItemKeys(keys, preserve, isDeselect, isSelectAll)
  93. },
  94. clearSelection: function() {
  95. return this.selectedItemKeys([])
  96. },
  97. _addSelectedItem: function(itemData, key) {
  98. this._selectionStrategy.addSelectedItem(key, itemData)
  99. },
  100. _removeSelectedItem: function(key) {
  101. this._selectionStrategy.removeSelectedItem(key)
  102. },
  103. _setSelectedItems: function(keys, items) {
  104. this._selectionStrategy.setSelectedItems(keys, items)
  105. },
  106. onSelectionChanged: function() {
  107. this._selectionStrategy.onSelectionChanged()
  108. },
  109. changeItemSelection: function(itemIndex, keys) {
  110. var isSelectedItemsChanged;
  111. var items = this.options.plainItems();
  112. var item = items[itemIndex];
  113. if (!this.isSelectable() || !this.isDataItem(item)) {
  114. return false
  115. }
  116. var itemData = this.options.getItemData(item);
  117. var itemKey = this.options.keyOf(itemData);
  118. keys = keys || {};
  119. if (keys.shift && "multiple" === this.options.mode && this._focusedItemIndex >= 0) {
  120. isSelectedItemsChanged = this.changeItemSelectionWhenShiftKeyPressed(itemIndex, items)
  121. } else {
  122. if (keys.control) {
  123. this._resetItemSelectionWhenShiftKeyPressed();
  124. var isSelected = this._selectionStrategy.isItemDataSelected(itemData);
  125. if ("single" === this.options.mode) {
  126. this.clearSelectedItems()
  127. }
  128. if (isSelected) {
  129. this._removeSelectedItem(itemKey)
  130. } else {
  131. this._addSelectedItem(itemData, itemKey)
  132. }
  133. isSelectedItemsChanged = true
  134. } else {
  135. this._resetItemSelectionWhenShiftKeyPressed();
  136. var isKeysEqual = this._selectionStrategy.equalKeys(this.options.selectedItemKeys[0], itemKey);
  137. if (1 !== this.options.selectedItemKeys.length || !isKeysEqual) {
  138. this._setSelectedItems([itemKey], [itemData]);
  139. isSelectedItemsChanged = true
  140. }
  141. }
  142. }
  143. if (isSelectedItemsChanged) {
  144. this._focusedItemIndex = itemIndex;
  145. this.onSelectionChanged();
  146. return true
  147. }
  148. },
  149. isDataItem: function(item) {
  150. return this.options.isSelectableItem(item)
  151. },
  152. isSelectable: function() {
  153. return "single" === this.options.mode || "multiple" === this.options.mode
  154. },
  155. isItemDataSelected: function(data) {
  156. return this._selectionStrategy.isItemDataSelected(data)
  157. },
  158. isItemSelected: function(arg) {
  159. return this._selectionStrategy.isItemKeySelected(arg)
  160. },
  161. _resetItemSelectionWhenShiftKeyPressed: function() {
  162. delete this._shiftFocusedItemIndex
  163. },
  164. _resetFocusedItemIndex: function() {
  165. this._focusedItemIndex = -1
  166. },
  167. changeItemSelectionWhenShiftKeyPressed: function(itemIndex, items) {
  168. var isSelectedItemsChanged = false;
  169. var itemIndexStep;
  170. var index;
  171. var keyOf = this.options.keyOf;
  172. var focusedItem = items[this._focusedItemIndex];
  173. var focusedData = this.options.getItemData(focusedItem);
  174. var focusedKey = keyOf(focusedData);
  175. var isFocusedItemSelected = focusedItem && this.isItemDataSelected(focusedData);
  176. if (!isDefined(this._shiftFocusedItemIndex)) {
  177. this._shiftFocusedItemIndex = this._focusedItemIndex
  178. }
  179. var data;
  180. var itemKey;
  181. if (this._shiftFocusedItemIndex !== this._focusedItemIndex) {
  182. itemIndexStep = this._focusedItemIndex < this._shiftFocusedItemIndex ? 1 : -1;
  183. for (index = this._focusedItemIndex; index !== this._shiftFocusedItemIndex; index += itemIndexStep) {
  184. if (this.isDataItem(items[index])) {
  185. itemKey = keyOf(this.options.getItemData(items[index]));
  186. this._removeSelectedItem(itemKey);
  187. isSelectedItemsChanged = true
  188. }
  189. }
  190. }
  191. if (itemIndex !== this._shiftFocusedItemIndex) {
  192. itemIndexStep = itemIndex < this._shiftFocusedItemIndex ? 1 : -1;
  193. for (index = itemIndex; index !== this._shiftFocusedItemIndex; index += itemIndexStep) {
  194. if (this.isDataItem(items[index])) {
  195. data = this.options.getItemData(items[index]);
  196. itemKey = keyOf(data);
  197. this._addSelectedItem(data, itemKey);
  198. isSelectedItemsChanged = true
  199. }
  200. }
  201. }
  202. if (this.isDataItem(focusedItem) && !isFocusedItemSelected) {
  203. this._addSelectedItem(focusedData, focusedKey);
  204. isSelectedItemsChanged = true
  205. }
  206. return isSelectedItemsChanged
  207. },
  208. clearSelectedItems: function() {
  209. this._setSelectedItems([], [])
  210. },
  211. selectAll: function(isOnePage) {
  212. this._resetFocusedItemIndex();
  213. if (isOnePage) {
  214. return this._onePageSelectAll(false)
  215. } else {
  216. return this.selectedItemKeys([], true, false, true)
  217. }
  218. },
  219. deselectAll: function(isOnePage) {
  220. this._resetFocusedItemIndex();
  221. if (isOnePage) {
  222. return this._onePageSelectAll(true)
  223. } else {
  224. return this.selectedItemKeys([], true, true, true)
  225. }
  226. },
  227. _onePageSelectAll: function(isDeselect) {
  228. var items = this.options.plainItems();
  229. for (var i = 0; i < items.length; i++) {
  230. var item = items[i];
  231. if (this.isDataItem(item)) {
  232. var itemData = this.options.getItemData(item);
  233. var itemKey = this.options.keyOf(itemData);
  234. var isSelected = this.isItemSelected(itemKey);
  235. if (!isSelected && !isDeselect) {
  236. this._addSelectedItem(itemData, itemKey)
  237. }
  238. if (isSelected && isDeselect) {
  239. this._removeSelectedItem(itemKey)
  240. }
  241. }
  242. }
  243. this.onSelectionChanged();
  244. return (new Deferred).resolve()
  245. },
  246. getSelectAllState: function(visibleOnly) {
  247. return this._selectionStrategy.getSelectAllState(visibleOnly)
  248. }
  249. });