ui.list.edit.js 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. /**
  2. * DevExtreme (ui/list/ui.list.edit.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 _renderer = require("../../core/renderer");
  11. var _renderer2 = _interopRequireDefault(_renderer);
  12. var _utils = require("../../events/utils");
  13. var _extend = require("../../core/utils/extend");
  14. var _uiListEditStrategy = require("./ui.list.edit.strategy.grouped");
  15. var _uiListEditStrategy2 = _interopRequireDefault(_uiListEditStrategy);
  16. var _message = require("../../localization/message");
  17. var _uiListEdit = require("./ui.list.edit.provider");
  18. var _uiListEdit2 = _interopRequireDefault(_uiListEdit);
  19. var _uiList = require("./ui.list.base");
  20. var _uiList2 = _interopRequireDefault(_uiList);
  21. function _interopRequireDefault(obj) {
  22. return obj && obj.__esModule ? obj : {
  23. "default": obj
  24. }
  25. }
  26. var LIST_ITEM_SELECTED_CLASS = "dx-list-item-selected";
  27. var LIST_ITEM_RESPONSE_WAIT_CLASS = "dx-list-item-response-wait";
  28. var ListEdit = _uiList2.default.inherit({
  29. _supportedKeys: function() {
  30. var _this = this;
  31. var that = this;
  32. var parent = this.callBase();
  33. var deleteFocusedItem = function(e) {
  34. if (that.option("allowItemDeleting")) {
  35. e.preventDefault();
  36. that.deleteItem(that.option("focusedElement"))
  37. }
  38. };
  39. var moveFocusedItem = function(e, moveUp) {
  40. var editStrategy = _this._editStrategy;
  41. var focusedElement = _this.option("focusedElement");
  42. var focusedItemIndex = editStrategy.getNormalizedIndex(focusedElement);
  43. var isLastIndexFocused = focusedItemIndex === _this._getLastItemIndex();
  44. if (isLastIndexFocused && _this._isDataSourceLoading()) {
  45. return
  46. }
  47. if (e.shiftKey && that.option("allowItemReordering")) {
  48. var nextItemIndex = focusedItemIndex + (moveUp ? -1 : 1);
  49. var $nextItem = editStrategy.getItemElement(nextItemIndex);
  50. _this.reorderItem(focusedElement, $nextItem);
  51. _this.scrollToItem(focusedElement);
  52. e.preventDefault()
  53. } else {
  54. var editProvider = _this._editProvider;
  55. var isInternalMoving = editProvider.handleKeyboardEvents(focusedItemIndex, moveUp);
  56. if (!isInternalMoving) {
  57. moveUp ? parent.upArrow(e) : parent.downArrow(e)
  58. }
  59. }
  60. };
  61. var enter = function(e) {
  62. if (!this._editProvider.handleEnterPressing()) {
  63. parent.enter.apply(this, arguments)
  64. }
  65. };
  66. var space = function(e) {
  67. if (!this._editProvider.handleEnterPressing()) {
  68. parent.space.apply(this, arguments)
  69. }
  70. };
  71. return (0, _extend.extend)({}, parent, {
  72. del: deleteFocusedItem,
  73. upArrow: function(e) {
  74. return moveFocusedItem(e, true)
  75. },
  76. downArrow: moveFocusedItem,
  77. enter: enter,
  78. space: space
  79. })
  80. },
  81. _updateSelection: function() {
  82. this._editProvider.afterItemsRendered();
  83. this.callBase()
  84. },
  85. _getLastItemIndex: function() {
  86. return this._itemElements().length - 1
  87. },
  88. _refreshItemElements: function() {
  89. this.callBase();
  90. var excludedSelectors = this._editProvider.getExcludedItemSelectors();
  91. if (excludedSelectors.length) {
  92. this._itemElementsCache = this._itemElementsCache.not(excludedSelectors)
  93. }
  94. },
  95. _getDefaultOptions: function() {
  96. return (0, _extend.extend)(this.callBase(), {
  97. showSelectionControls: false,
  98. selectionMode: "none",
  99. selectAllMode: "page",
  100. onSelectAllValueChanged: null,
  101. selectAllText: (0, _message.format)("dxList-selectAll"),
  102. menuItems: [],
  103. menuMode: "context",
  104. allowItemDeleting: false,
  105. itemDeleteMode: "static",
  106. allowItemReordering: false
  107. })
  108. },
  109. _defaultOptionsRules: function() {
  110. return this.callBase().concat([{
  111. device: function(_device) {
  112. return "ios" === _device.platform
  113. },
  114. options: {
  115. menuMode: "slide",
  116. itemDeleteMode: "slideItem"
  117. }
  118. }, {
  119. device: {
  120. platform: "android"
  121. },
  122. options: {
  123. itemDeleteMode: "swipe"
  124. }
  125. }, {
  126. device: {
  127. platform: "win"
  128. },
  129. options: {
  130. itemDeleteMode: "context"
  131. }
  132. }])
  133. },
  134. _init: function() {
  135. this.callBase();
  136. this._initEditProvider()
  137. },
  138. _initDataSource: function() {
  139. this.callBase();
  140. if (!this._isPageSelectAll()) {
  141. this._dataSource && this._dataSource.requireTotalCount(true)
  142. }
  143. },
  144. _isPageSelectAll: function() {
  145. return "page" === this.option("selectAllMode")
  146. },
  147. _initEditProvider: function() {
  148. this._editProvider = new _uiListEdit2.default(this)
  149. },
  150. _disposeEditProvider: function() {
  151. if (this._editProvider) {
  152. this._editProvider.dispose()
  153. }
  154. },
  155. _refreshEditProvider: function() {
  156. this._disposeEditProvider();
  157. this._initEditProvider()
  158. },
  159. _initEditStrategy: function() {
  160. if (this.option("grouped")) {
  161. this._editStrategy = new _uiListEditStrategy2.default(this)
  162. } else {
  163. this.callBase()
  164. }
  165. },
  166. _initMarkup: function() {
  167. this._refreshEditProvider();
  168. this.callBase()
  169. },
  170. _renderItems: function() {
  171. this.callBase.apply(this, arguments);
  172. this._editProvider.afterItemsRendered()
  173. },
  174. _selectedItemClass: function() {
  175. return LIST_ITEM_SELECTED_CLASS
  176. },
  177. _itemResponseWaitClass: function() {
  178. return LIST_ITEM_RESPONSE_WAIT_CLASS
  179. },
  180. _itemClickHandler: function(e) {
  181. var $itemElement = (0, _renderer2.default)(e.currentTarget);
  182. if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) {
  183. return
  184. }
  185. var handledByEditProvider = this._editProvider.handleClick($itemElement, e);
  186. if (handledByEditProvider) {
  187. return
  188. }
  189. this.callBase.apply(this, arguments)
  190. },
  191. _shouldFireContextMenuEvent: function() {
  192. return this.callBase.apply(this, arguments) || this._editProvider.contextMenuHandlerExists()
  193. },
  194. _itemHoldHandler: function(e) {
  195. var $itemElement = (0, _renderer2.default)(e.currentTarget);
  196. if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) {
  197. return
  198. }
  199. var handledByEditProvider = (0, _utils.isTouchEvent)(e) && this._editProvider.handleContextMenu($itemElement, e);
  200. if (handledByEditProvider) {
  201. e.handledByEditProvider = true;
  202. return
  203. }
  204. this.callBase.apply(this, arguments)
  205. },
  206. _itemContextMenuHandler: function(e) {
  207. var $itemElement = (0, _renderer2.default)(e.currentTarget);
  208. if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) {
  209. return
  210. }
  211. var handledByEditProvider = !e.handledByEditProvider && this._editProvider.handleContextMenu($itemElement, e);
  212. if (handledByEditProvider) {
  213. e.preventDefault();
  214. return
  215. }
  216. this.callBase.apply(this, arguments)
  217. },
  218. _postprocessRenderItem: function(args) {
  219. this.callBase.apply(this, arguments);
  220. this._editProvider.modifyItemElement(args)
  221. },
  222. _clean: function() {
  223. this._disposeEditProvider();
  224. this.callBase()
  225. },
  226. focusListItem: function(index) {
  227. var $item = this._editStrategy.getItemElement(index);
  228. this.option("focusedElement", $item);
  229. this.focus();
  230. this.scrollToItem(this.option("focusedElement"))
  231. },
  232. _optionChanged: function(args) {
  233. switch (args.name) {
  234. case "selectAllMode":
  235. this._initDataSource();
  236. this._dataSource.pageIndex(0);
  237. this._dataSource.load();
  238. break;
  239. case "grouped":
  240. this._clearSelectedItems();
  241. delete this._renderingGroupIndex;
  242. this._initEditStrategy();
  243. this.callBase(args);
  244. break;
  245. case "showSelectionControls":
  246. case "menuItems":
  247. case "menuMode":
  248. case "allowItemDeleting":
  249. case "itemDeleteMode":
  250. case "allowItemReordering":
  251. case "selectAllText":
  252. this._invalidate();
  253. break;
  254. case "onSelectAllValueChanged":
  255. break;
  256. default:
  257. this.callBase(args)
  258. }
  259. },
  260. selectAll: function() {
  261. return this._selection.selectAll(this._isPageSelectAll())
  262. },
  263. unselectAll: function() {
  264. return this._selection.deselectAll(this._isPageSelectAll())
  265. },
  266. isSelectAll: function() {
  267. return this._selection.getSelectAllState(this._isPageSelectAll())
  268. },
  269. getFlatIndexByItemElement: function(itemElement) {
  270. return this._itemElements().index(itemElement)
  271. },
  272. getItemElementByFlatIndex: function(flatIndex) {
  273. var $itemElements = this._itemElements();
  274. if (flatIndex < 0 || flatIndex >= $itemElements.length) {
  275. return (0, _renderer2.default)()
  276. }
  277. return $itemElements.eq(flatIndex)
  278. },
  279. getItemByIndex: function(index) {
  280. return this._editStrategy.getItemDataByIndex(index)
  281. }
  282. });
  283. module.exports = ListEdit;