slide_out.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. /**
  2. * DevExtreme (ui/slide_out.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 $ = require("../core/renderer");
  11. var getPublicElement = require("../core/utils/dom").getPublicElement;
  12. var noop = require("../core/utils/common").noop;
  13. var isDefined = require("../core/utils/type").isDefined;
  14. var registerComponent = require("../core/component_registrator");
  15. var extend = require("../core/utils/extend").extend;
  16. var PlainEditStrategy = require("./collection/ui.collection_widget.edit.strategy.plain");
  17. var SlideOutView = require("./slide_out_view");
  18. var CollectionWidget = require("./collection/ui.collection_widget.edit");
  19. var List = require("./list");
  20. var ChildDefaultTemplate = require("./widget/child_default_template");
  21. var EmptyTemplate = require("./widget/empty_template");
  22. var DataConverterMixin = require("./shared/grouped_data_converter_mixin").default;
  23. var SLIDEOUT_CLASS = "dx-slideout";
  24. var SLIDEOUT_ITEM_CONTAINER_CLASS = "dx-slideout-item-container";
  25. var SLIDEOUT_MENU = "dx-slideout-menu";
  26. var SLIDEOUT_ITEM_CLASS = "dx-slideout-item";
  27. var SLIDEOUT_ITEM_DATA_KEY = "dxSlideoutItemData";
  28. var SlideOut = CollectionWidget.inherit({
  29. _getDefaultOptions: function() {
  30. return extend(this.callBase(), {
  31. activeStateEnabled: false,
  32. menuItemTemplate: "menuItem",
  33. swipeEnabled: true,
  34. menuVisible: false,
  35. menuPosition: "normal",
  36. menuGrouped: false,
  37. menuGroupTemplate: "menuGroup",
  38. onMenuItemRendered: null,
  39. onMenuGroupRendered: null,
  40. contentTemplate: "content",
  41. selectionMode: "single",
  42. selectedIndex: 0,
  43. selectionRequired: true
  44. })
  45. },
  46. _itemClass: function() {
  47. return SLIDEOUT_ITEM_CLASS
  48. },
  49. _itemDataKey: function() {
  50. return SLIDEOUT_ITEM_DATA_KEY
  51. },
  52. _itemContainer: function() {
  53. return $(this._slideOutView.content())
  54. },
  55. _init: function() {
  56. this._selectedItemContentRendered = false;
  57. this.callBase();
  58. this.$element().addClass(SLIDEOUT_CLASS);
  59. this._initSlideOutView()
  60. },
  61. _initTemplates: function() {
  62. this.callBase();
  63. this._defaultTemplates.menuItem = new ChildDefaultTemplate("item", this);
  64. this._defaultTemplates.menuGroup = new ChildDefaultTemplate("group", this);
  65. this._defaultTemplates.content = new EmptyTemplate(this)
  66. },
  67. _initEditStrategy: function() {
  68. if (this.option("menuGrouped")) {
  69. var strategy = PlainEditStrategy.inherit({
  70. _getPlainItems: function() {
  71. return this.callBase().reduce(function(result, group) {
  72. result.push.apply(result, group.items);
  73. return result
  74. }, [])
  75. }
  76. });
  77. this._editStrategy = new strategy(this)
  78. } else {
  79. this.callBase()
  80. }
  81. },
  82. _initSlideOutView: function() {
  83. this._slideOutView = this._createComponent(this.$element(), SlideOutView, {
  84. integrationOptions: {},
  85. menuVisible: this.option("menuVisible"),
  86. swipeEnabled: this.option("swipeEnabled"),
  87. menuPosition: this.option("menuPosition"),
  88. onOptionChanged: this._slideOutViewOptionChanged.bind(this)
  89. });
  90. this._itemContainer().addClass(SLIDEOUT_ITEM_CONTAINER_CLASS)
  91. },
  92. _slideOutViewOptionChanged: function(args) {
  93. if ("menuVisible" === args.name) {
  94. this.option(args.name, args.value)
  95. }
  96. },
  97. _initMarkup: function() {
  98. this._renderList();
  99. this._renderContentTemplate();
  100. this.callBase()
  101. },
  102. _render: function() {
  103. this._slideOutView._renderShield();
  104. this.callBase()
  105. },
  106. _renderList: function() {
  107. var $list = this._list && this._list.$element() || $("<div>").addClass(SLIDEOUT_MENU).appendTo($(this._slideOutView.menuContent()));
  108. this._renderItemClickAction();
  109. this._list = this._createComponent($list, List, {
  110. itemTemplateProperty: "menuTemplate",
  111. selectionMode: this.option("selectionMode"),
  112. selectionRequired: this.option("selectionRequired"),
  113. indicateLoading: false,
  114. onItemClick: this._listItemClickHandler.bind(this),
  115. items: this.option("items"),
  116. dataSource: this._dataSource,
  117. itemTemplate: this._getTemplateByOption("menuItemTemplate"),
  118. grouped: this.option("menuGrouped"),
  119. groupTemplate: this._getTemplateByOption("menuGroupTemplate"),
  120. onItemRendered: this.option("onMenuItemRendered"),
  121. onGroupRendered: this.option("onMenuGroupRendered"),
  122. onContentReady: this._updateSlideOutView.bind(this)
  123. });
  124. this._list.option("selectedIndex", this.option("selectedIndex"))
  125. },
  126. _getGroupedOption: function() {
  127. return this.option("menuGrouped")
  128. },
  129. _updateSlideOutView: function() {
  130. this._slideOutView._dimensionChanged()
  131. },
  132. _renderItemClickAction: function() {
  133. this._itemClickAction = this._createActionByOption("onItemClick")
  134. },
  135. _listItemClickHandler: function(e) {
  136. var selectedIndex = this._list.$element().find(".dx-list-item").index(e.itemElement);
  137. this.option("selectedIndex", selectedIndex);
  138. this._itemClickAction(e)
  139. },
  140. _renderContentTemplate: function() {
  141. if (isDefined(this._singleContent)) {
  142. return
  143. }
  144. var itemsLength = this._itemContainer().html().length;
  145. this._getTemplateByOption("contentTemplate").render({
  146. container: getPublicElement(this._itemContainer())
  147. });
  148. this._singleContent = this._itemContainer().html().length !== itemsLength
  149. },
  150. _itemClickHandler: noop,
  151. _renderContentImpl: function() {
  152. if (this._singleContent) {
  153. return
  154. }
  155. var items = this.option("items");
  156. var selectedIndex = this.option("selectedIndex");
  157. if (items.length && selectedIndex > -1) {
  158. this._selectedItemContentRendered = true;
  159. var selectedItem = this._list.getItemByIndex(selectedIndex);
  160. this._renderItems([selectedItem])
  161. }
  162. },
  163. _renderItem: function(index, item) {
  164. this._itemContainer().find("." + SLIDEOUT_ITEM_CLASS).remove();
  165. this.callBase(index, item)
  166. },
  167. _selectedItemElement: function() {
  168. return this._itemElements().eq(0)
  169. },
  170. _updateSelection: function() {
  171. this._prepareContent();
  172. this._renderContent()
  173. },
  174. _getListWidth: function() {
  175. return this._slideOutView._getMenuWidth()
  176. },
  177. _changeMenuOption: function(name, value) {
  178. this._list.option(name, value);
  179. this._updateSlideOutView()
  180. },
  181. _cleanItemContainer: function() {
  182. if (this._singleContent) {
  183. return
  184. }
  185. this.callBase()
  186. },
  187. beginUpdate: function() {
  188. this.callBase();
  189. this._list && this._list.beginUpdate()
  190. },
  191. endUpdate: function() {
  192. this._list && this._list.endUpdate();
  193. this.callBase()
  194. },
  195. _optionChanged: function(args) {
  196. var name = args.name;
  197. var value = args.value;
  198. switch (name) {
  199. case "menuVisible":
  200. case "swipeEnabled":
  201. case "rtlEnabled":
  202. case "menuPosition":
  203. this._slideOutView.option(name, value);
  204. break;
  205. case "width":
  206. this.callBase(args);
  207. this._updateSlideOutView();
  208. break;
  209. case "menuItemTemplate":
  210. this._changeMenuOption("itemTemplate", this._getTemplate(value));
  211. break;
  212. case "items":
  213. this._changeMenuOption("items", this.option("items"));
  214. if (!this._selectedItemContentRendered) {
  215. this._updateSelection()
  216. }
  217. break;
  218. case "dataSource":
  219. case "selectedIndex":
  220. case "selectedItem":
  221. this._changeMenuOption(name, value);
  222. this.callBase(args);
  223. break;
  224. case "menuGrouped":
  225. this._initEditStrategy();
  226. this._changeMenuOption("grouped", value);
  227. break;
  228. case "menuGroupTemplate":
  229. this._changeMenuOption("groupTemplate", this._getTemplate(value));
  230. break;
  231. case "onMenuItemRendered":
  232. this._changeMenuOption("onItemRendered", value);
  233. break;
  234. case "onMenuGroupRendered":
  235. this._changeMenuOption("onGroupRendered", value);
  236. break;
  237. case "onItemClick":
  238. this._renderItemClickAction();
  239. break;
  240. case "contentTemplate":
  241. this._singleContent = null;
  242. this._invalidate();
  243. break;
  244. default:
  245. this.callBase(args)
  246. }
  247. },
  248. showMenu: function() {
  249. return this._slideOutView.toggleMenuVisibility(true)
  250. },
  251. hideMenu: function() {
  252. return this._slideOutView.toggleMenuVisibility(false)
  253. },
  254. toggleMenuVisibility: function(showing) {
  255. return this._slideOutView.toggleMenuVisibility(showing)
  256. }
  257. }).include(DataConverterMixin);
  258. registerComponent("dxSlideOut", SlideOut);
  259. module.exports = SlideOut;
  260. module.exports.default = module.exports;