selection.strategy.deferred.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. /**
  2. * DevExtreme (ui/selection/selection.strategy.deferred.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 typeUtils = require("../../core/utils/type");
  11. var SelectionStrategy = require("./selection.strategy");
  12. var errors = require("../widget/ui.errors");
  13. var dataQuery = require("../../data/query");
  14. var Deferred = require("../../core/utils/deferred").Deferred;
  15. module.exports = SelectionStrategy.inherit({
  16. getSelectedItems: function() {
  17. return this._loadFilteredData(this.options.selectionFilter)
  18. },
  19. getSelectedItemKeys: function() {
  20. var d = new Deferred;
  21. var that = this;
  22. var key = this.options.key();
  23. var select = typeUtils.isString(key) ? [key] : key;
  24. this._loadFilteredData(this.options.selectionFilter, null, select).done(function(items) {
  25. var keys = items.map(function(item) {
  26. return that.options.keyOf(item)
  27. });
  28. d.resolve(keys)
  29. }).fail(d.reject);
  30. return d.promise()
  31. },
  32. selectedItemKeys: function(keys, preserve, isDeselect, isSelectAll) {
  33. if (isSelectAll) {
  34. var filter = this.options.filter();
  35. if (!filter) {
  36. this._setOption("selectionFilter", isDeselect ? [] : null)
  37. } else {
  38. this._addSelectionFilter(isDeselect, filter, isSelectAll)
  39. }
  40. } else {
  41. if (!preserve) {
  42. this._setOption("selectionFilter", [])
  43. }
  44. for (var i = 0; i < keys.length; i++) {
  45. if (isDeselect) {
  46. this.removeSelectedItem(keys[i])
  47. } else {
  48. this.addSelectedItem(keys[i])
  49. }
  50. }
  51. }
  52. this.onSelectionChanged();
  53. return (new Deferred).resolve()
  54. },
  55. setSelectedItems: function(keys) {
  56. this._setOption("selectionFilter", null);
  57. for (var i = 0; i < keys.length; i++) {
  58. this.addSelectedItem(keys[i])
  59. }
  60. },
  61. isItemDataSelected: function(itemData) {
  62. return this.isItemKeySelected(itemData)
  63. },
  64. isItemKeySelected: function(itemData) {
  65. var selectionFilter = this.options.selectionFilter;
  66. if (!selectionFilter) {
  67. return true
  68. }
  69. return !!dataQuery([itemData]).filter(selectionFilter).toArray().length
  70. },
  71. _getFilterByKey: function(key) {
  72. var keyField = this.options.key();
  73. var filter = [keyField, "=", key];
  74. if (Array.isArray(keyField)) {
  75. filter = [];
  76. for (var i = 0; i < keyField.length; i++) {
  77. filter.push([keyField[i], "=", key[keyField[i]]]);
  78. if (i !== keyField.length - 1) {
  79. filter.push("and")
  80. }
  81. }
  82. }
  83. return filter
  84. },
  85. addSelectedItem: function(key) {
  86. var filter = this._getFilterByKey(key);
  87. this._addSelectionFilter(false, filter)
  88. },
  89. removeSelectedItem: function(key) {
  90. var filter = this._getFilterByKey(key);
  91. this._addSelectionFilter(true, filter)
  92. },
  93. validate: function() {
  94. var key = this.options.key;
  95. if (key && void 0 === key()) {
  96. throw errors.Error("E1042", "Deferred selection")
  97. }
  98. },
  99. _findSubFilter: function(selectionFilter, filter) {
  100. if (!selectionFilter) {
  101. return -1
  102. }
  103. var filterString = JSON.stringify(filter);
  104. for (var index = 0; index < selectionFilter.length; index++) {
  105. var subFilter = selectionFilter[index];
  106. if (subFilter && JSON.stringify(subFilter) === filterString) {
  107. return index
  108. }
  109. }
  110. return -1
  111. },
  112. _isLastSubFilter: function(selectionFilter, filter) {
  113. if (selectionFilter && filter) {
  114. return this._findSubFilter(selectionFilter, filter) === selectionFilter.length - 1 || 0 === this._findSubFilter([selectionFilter], filter)
  115. }
  116. return false
  117. },
  118. _addFilterOperator: function(selectionFilter, filterOperator) {
  119. if (selectionFilter.length > 1 && typeUtils.isString(selectionFilter[1]) && selectionFilter[1] !== filterOperator) {
  120. selectionFilter = [selectionFilter]
  121. }
  122. if (selectionFilter.length) {
  123. selectionFilter.push(filterOperator)
  124. }
  125. return selectionFilter
  126. },
  127. _denormalizeFilter: function(filter) {
  128. if (filter && typeUtils.isString(filter[0])) {
  129. filter = [filter]
  130. }
  131. return filter
  132. },
  133. _addSelectionFilter: function(isDeselect, filter, isSelectAll) {
  134. var that = this;
  135. var currentFilter = isDeselect ? ["!", filter] : filter;
  136. var currentOperation = isDeselect ? "and" : "or";
  137. var needAddFilter = true;
  138. var selectionFilter = that.options.selectionFilter || [];
  139. selectionFilter = that._denormalizeFilter(selectionFilter);
  140. if (selectionFilter && selectionFilter.length) {
  141. that._removeSameFilter(selectionFilter, filter, isDeselect, isSelectAll);
  142. var filterIndex = that._removeSameFilter(selectionFilter, filter, !isDeselect);
  143. var isKeyOperatorsAfterRemoved = this._isKeyFilter(filter) && this._hasKeyFiltersOnlyStartingFromIndex(selectionFilter, filterIndex);
  144. needAddFilter = filter.length && !isKeyOperatorsAfterRemoved;
  145. if (needAddFilter) {
  146. selectionFilter = that._addFilterOperator(selectionFilter, currentOperation)
  147. }
  148. }
  149. if (needAddFilter) {
  150. selectionFilter.push(currentFilter)
  151. }
  152. selectionFilter = that._normalizeFilter(selectionFilter);
  153. that._setOption("selectionFilter", !isDeselect && !selectionFilter.length ? null : selectionFilter)
  154. },
  155. _normalizeFilter: function(filter) {
  156. if (filter && 1 === filter.length) {
  157. filter = filter[0]
  158. }
  159. return filter
  160. },
  161. _removeFilterByIndex: function(filter, filterIndex, isSelectAll) {
  162. var operation = filter[1];
  163. if (filterIndex > 0) {
  164. filter.splice(filterIndex - 1, 2)
  165. } else {
  166. filter.splice(filterIndex, 2)
  167. }
  168. if (isSelectAll && "and" === operation) {
  169. filter.splice(0, filter.length)
  170. }
  171. },
  172. _isSimpleKeyFilter: function(filter, key) {
  173. return 3 === filter.length && filter[0] === key && "=" === filter[1]
  174. },
  175. _isKeyFilter: function(filter) {
  176. if (2 === filter.length && "!" === filter[0]) {
  177. return this._isKeyFilter(filter[1])
  178. }
  179. var keyField = this.options.key();
  180. if (Array.isArray(keyField)) {
  181. if (filter.length !== 2 * keyField.length - 1) {
  182. return false
  183. }
  184. for (var i = 0; i < keyField.length; i++) {
  185. if (i > 0 && "and" !== filter[i]) {
  186. return false
  187. }
  188. if (!this._isSimpleKeyFilter(filter[2 * i], keyField[i])) {
  189. return false
  190. }
  191. }
  192. return true
  193. }
  194. return this._isSimpleKeyFilter(filter, keyField)
  195. },
  196. _hasKeyFiltersOnlyStartingFromIndex: function(selectionFilter, filterIndex) {
  197. if (filterIndex >= 0) {
  198. for (var i = filterIndex; i < selectionFilter.length; i++) {
  199. if ("string" !== typeof selectionFilter[i] && !this._isKeyFilter(selectionFilter[i])) {
  200. return false
  201. }
  202. }
  203. return true
  204. }
  205. return false
  206. },
  207. _removeSameFilter: function(selectionFilter, filter, inverted, isSelectAll) {
  208. filter = inverted ? ["!", filter] : filter;
  209. if (JSON.stringify(filter) === JSON.stringify(selectionFilter)) {
  210. selectionFilter.splice(0, selectionFilter.length);
  211. return 0
  212. }
  213. var filterIndex = this._findSubFilter(selectionFilter, filter);
  214. if (filterIndex >= 0) {
  215. this._removeFilterByIndex(selectionFilter, filterIndex, isSelectAll);
  216. return filterIndex
  217. } else {
  218. for (var i = 0; i < selectionFilter.length; i++) {
  219. if (Array.isArray(selectionFilter[i]) && selectionFilter[i].length > 2) {
  220. var _filterIndex = this._removeSameFilter(selectionFilter[i], filter, false, isSelectAll);
  221. if (_filterIndex >= 0) {
  222. if (!selectionFilter[i].length) {
  223. this._removeFilterByIndex(selectionFilter, i, isSelectAll)
  224. } else {
  225. if (1 === selectionFilter[i].length) {
  226. selectionFilter[i] = selectionFilter[i][0]
  227. }
  228. }
  229. return _filterIndex
  230. }
  231. }
  232. }
  233. return -1
  234. }
  235. },
  236. getSelectAllState: function() {
  237. var filter = this.options.filter();
  238. var selectionFilter = this.options.selectionFilter;
  239. if (!selectionFilter) {
  240. return true
  241. }
  242. if (!selectionFilter.length) {
  243. return false
  244. }
  245. if (!filter || !filter.length) {
  246. return
  247. }
  248. selectionFilter = this._denormalizeFilter(selectionFilter);
  249. if (this._isLastSubFilter(selectionFilter, filter)) {
  250. return true
  251. }
  252. if (this._isLastSubFilter(selectionFilter, ["!", filter])) {
  253. return false
  254. }
  255. return
  256. }
  257. });