toolbar.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. /**
  2. * DevExtreme (ui/toolbar.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 themes = require("./themes");
  12. var registerComponent = require("../core/component_registrator");
  13. var grep = require("../core/utils/common").grep;
  14. var extend = require("../core/utils/extend").extend;
  15. var arrayUtils = require("../core/utils/array");
  16. var iteratorUtils = require("../core/utils/iterator");
  17. var ActionSheetStrategy = require("./toolbar/ui.toolbar.strategy.action_sheet");
  18. var DropDownMenuStrategy = require("./toolbar/ui.toolbar.strategy.drop_down_menu");
  19. var ToolbarBase = require("./toolbar/ui.toolbar.base");
  20. var ChildDefaultTemplate = require("./widget/child_default_template");
  21. var STRATEGIES = {
  22. actionSheet: ActionSheetStrategy,
  23. dropDownMenu: DropDownMenuStrategy
  24. };
  25. var TOOLBAR_AUTO_HIDE_ITEM_CLASS = "dx-toolbar-item-auto-hide";
  26. var TOOLBAR_AUTO_HIDE_TEXT_CLASS = "dx-toolbar-text-auto-hide";
  27. var TOOLBAR_HIDDEN_ITEM = "dx-toolbar-item-invisible";
  28. var Toolbar = ToolbarBase.inherit({
  29. _getDefaultOptions: function() {
  30. return extend(this.callBase(), {
  31. menuItemTemplate: "menuItem",
  32. submenuType: "dropDownMenu",
  33. menuContainer: void 0
  34. })
  35. },
  36. _defaultOptionsRules: function() {
  37. var themeName = themes.current();
  38. return this.callBase().concat([{
  39. device: function() {
  40. return themes.isIos7(themeName)
  41. },
  42. options: {
  43. submenuType: "actionSheet"
  44. }
  45. }])
  46. },
  47. _dimensionChanged: function(dimension) {
  48. if ("height" === dimension) {
  49. return
  50. }
  51. this._menuStrategy.toggleMenuVisibility(false, true);
  52. this.callBase();
  53. this._menuStrategy.renderMenuItems()
  54. },
  55. _initTemplates: function() {
  56. this.callBase();
  57. this._defaultTemplates.actionSheetItem = new ChildDefaultTemplate("item", this)
  58. },
  59. _initMarkup: function() {
  60. this.callBase();
  61. this._renderMenu()
  62. },
  63. _postProcessRenderItems: function() {
  64. this._hideOverflowItems();
  65. this._menuStrategy._updateMenuVisibility();
  66. this.callBase();
  67. this._menuStrategy.renderMenuItems()
  68. },
  69. _renderItem: function(index, item, itemContainer, $after) {
  70. var itemElement = this.callBase(index, item, itemContainer, $after);
  71. if ("auto" === item.locateInMenu) {
  72. itemElement.addClass(TOOLBAR_AUTO_HIDE_ITEM_CLASS)
  73. }
  74. if ("dxButton" === item.widget && "inMenu" === item.showText) {
  75. itemElement.toggleClass(TOOLBAR_AUTO_HIDE_TEXT_CLASS)
  76. }
  77. return itemElement
  78. },
  79. _getItemsWidth: function() {
  80. return this._getSummaryItemsWidth([this._$beforeSection, this._$centerSection, this._$afterSection])
  81. },
  82. _hideOverflowItems: function(elementWidth) {
  83. var overflowItems = this.$element().find("." + TOOLBAR_AUTO_HIDE_ITEM_CLASS);
  84. if (!overflowItems.length) {
  85. return
  86. }
  87. elementWidth = elementWidth || this.$element().width();
  88. $(overflowItems).removeClass(TOOLBAR_HIDDEN_ITEM);
  89. var itemsWidth = this._getItemsWidth();
  90. while (overflowItems.length && elementWidth < itemsWidth) {
  91. var $item = overflowItems.eq(-1);
  92. itemsWidth -= $item.outerWidth();
  93. $item.addClass(TOOLBAR_HIDDEN_ITEM);
  94. overflowItems.splice(-1, 1)
  95. }
  96. },
  97. _getMenuItems: function() {
  98. var that = this;
  99. var menuItems = grep(this.option("items") || [], function(item) {
  100. return that._isMenuItem(item)
  101. });
  102. var $hiddenItems = this._itemContainer().children("." + TOOLBAR_AUTO_HIDE_ITEM_CLASS + "." + TOOLBAR_HIDDEN_ITEM).not(".dx-state-invisible");
  103. this._restoreItems = this._restoreItems || [];
  104. var overflowItems = [].slice.call($hiddenItems).map(function(item) {
  105. var itemData = that._getItemData(item);
  106. var $itemContainer = $(item).children();
  107. var $itemMarkup = $itemContainer.children();
  108. return extend({
  109. menuItemTemplate: function() {
  110. that._restoreItems.push({
  111. container: $itemContainer,
  112. item: $itemMarkup
  113. });
  114. var $container = $("<div>").addClass(TOOLBAR_AUTO_HIDE_ITEM_CLASS);
  115. return $container.append($itemMarkup)
  116. }
  117. }, itemData)
  118. });
  119. return arrayUtils.merge(overflowItems, menuItems)
  120. },
  121. _getToolbarItems: function() {
  122. var that = this;
  123. return grep(this.option("items") || [], function(item) {
  124. return !that._isMenuItem(item)
  125. })
  126. },
  127. _renderMenu: function() {
  128. this._renderMenuStrategy();
  129. this._menuStrategy.render()
  130. },
  131. _renderMenuStrategy: function() {
  132. var strategyName = this.option("submenuType");
  133. if (this._requireDropDownStrategy()) {
  134. strategyName = "dropDownMenu"
  135. }
  136. var strategy = STRATEGIES[strategyName];
  137. if (!(this._menuStrategy && this._menuStrategy.NAME === strategyName)) {
  138. this._menuStrategy = new strategy(this)
  139. }
  140. },
  141. _requireDropDownStrategy: function() {
  142. var items = this.option("items") || [];
  143. var result = false;
  144. iteratorUtils.each(items, function(index, item) {
  145. if ("auto" === item.locateInMenu) {
  146. result = true
  147. } else {
  148. if ("always" === item.locateInMenu && item.widget) {
  149. result = true
  150. }
  151. }
  152. });
  153. return result
  154. },
  155. _arrangeItems: function() {
  156. if (this.$element().is(":hidden")) {
  157. return
  158. }
  159. this._$centerSection.css({
  160. margin: "0 auto",
  161. "float": "none"
  162. });
  163. iteratorUtils.each(this._restoreItems || [], function(_, obj) {
  164. $(obj.container).append(obj.item)
  165. });
  166. this._restoreItems = [];
  167. var elementWidth = this.$element().width();
  168. this._hideOverflowItems(elementWidth);
  169. this.callBase(elementWidth)
  170. },
  171. _itemOptionChanged: function(item, property, value) {
  172. if (this._isMenuItem(item)) {
  173. this._menuStrategy.renderMenuItems()
  174. } else {
  175. if (this._isToolbarItem(item)) {
  176. this.callBase(item, property, value)
  177. } else {
  178. this.callBase(item, property, value);
  179. this._menuStrategy.renderMenuItems()
  180. }
  181. }
  182. },
  183. _isMenuItem: function(itemData) {
  184. return "menu" === itemData.location || "always" === itemData.locateInMenu
  185. },
  186. _isToolbarItem: function(itemData) {
  187. return void 0 === itemData.location || "never" === itemData.locateInMenu
  188. },
  189. _optionChanged: function(args) {
  190. var name = args.name;
  191. var value = args.value;
  192. switch (name) {
  193. case "submenuType":
  194. this._invalidate();
  195. break;
  196. case "visible":
  197. this.callBase.apply(this, arguments);
  198. this._menuStrategy.handleToolbarVisibilityChange(value);
  199. break;
  200. case "menuItemTemplate":
  201. this._changeMenuOption("itemTemplate", this._getTemplate(value));
  202. break;
  203. case "onItemClick":
  204. this._changeMenuOption(name, value);
  205. this.callBase.apply(this, arguments);
  206. break;
  207. case "menuContainer":
  208. this._changeMenuOption("container", value);
  209. break;
  210. default:
  211. this.callBase.apply(this, arguments)
  212. }
  213. },
  214. _changeMenuOption: function(name, value) {
  215. this._menuStrategy.widgetOption(name, value)
  216. }
  217. });
  218. registerComponent("dxToolbar", Toolbar);
  219. module.exports = Toolbar;
  220. module.exports.default = module.exports;