button_group.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /**
  2. * DevExtreme (ui/button_group.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 _ui = require("./widget/ui.widget");
  13. var _ui2 = _interopRequireDefault(_ui);
  14. var _button = require("./button");
  15. var _button2 = _interopRequireDefault(_button);
  16. var _uiCollection_widget = require("./collection/ui.collection_widget.edit");
  17. var _uiCollection_widget2 = _interopRequireDefault(_uiCollection_widget);
  18. var _component_registrator = require("../core/component_registrator");
  19. var _component_registrator2 = _interopRequireDefault(_component_registrator);
  20. var _extend = require("../core/utils/extend");
  21. var _type = require("../core/utils/type");
  22. var _bindable_template = require("./widget/bindable_template");
  23. var _bindable_template2 = _interopRequireDefault(_bindable_template);
  24. function _interopRequireDefault(obj) {
  25. return obj && obj.__esModule ? obj : {
  26. "default": obj
  27. }
  28. }
  29. var BUTTON_GROUP_CLASS = "dx-buttongroup";
  30. var BUTTON_GROUP_WRAPPER_CLASS = BUTTON_GROUP_CLASS + "-wrapper";
  31. var BUTTON_GROUP_ITEM_CLASS = BUTTON_GROUP_CLASS + "-item";
  32. var BUTTON_GROUP_FIRST_ITEM_CLASS = BUTTON_GROUP_CLASS + "-first-item";
  33. var BUTTON_GROUP_LAST_ITEM_CLASS = BUTTON_GROUP_CLASS + "-last-item";
  34. var BUTTON_GROUP_ITEM_HAS_WIDTH = BUTTON_GROUP_ITEM_CLASS + "-has-width";
  35. var SHAPE_STANDARD_CLASS = "dx-shape-standard";
  36. var ButtonCollection = _uiCollection_widget2.default.inherit({
  37. _renderItemContent: function(options) {
  38. options.container = (0, _renderer2.default)(options.container).parent();
  39. this.callBase(options)
  40. },
  41. _focusTarget: function() {
  42. return this.$element().parent()
  43. },
  44. _keyboardEventBindingTarget: function() {
  45. return this._focusTarget()
  46. },
  47. _refreshContent: function() {
  48. this._prepareContent();
  49. this._renderContent()
  50. },
  51. _itemClass: function() {
  52. return BUTTON_GROUP_ITEM_CLASS
  53. },
  54. _itemSelectHandler: function(e) {
  55. if ("single" === this.option("selectionMode") && this.isItemSelected(e.currentTarget)) {
  56. return
  57. }
  58. this.callBase(e)
  59. }
  60. });
  61. var ButtonGroup = _ui2.default.inherit({
  62. _getDefaultOptions: function() {
  63. return (0, _extend.extend)(this.callBase(), {
  64. hoverStateEnabled: true,
  65. focusStateEnabled: true,
  66. selectionMode: "single",
  67. selectedItems: [],
  68. selectedItemKeys: [],
  69. stylingMode: "contained",
  70. keyExpr: "text",
  71. items: [],
  72. itemTemplate: "item",
  73. onSelectionChanged: null,
  74. onItemClick: null
  75. })
  76. },
  77. _prepareItemStyles: function($item) {
  78. var itemIndex = $item.data("dxItemIndex");
  79. 0 === itemIndex && $item.addClass(BUTTON_GROUP_FIRST_ITEM_CLASS);
  80. var items = this.option("items");
  81. items && itemIndex === items.length - 1 && $item.addClass(BUTTON_GROUP_LAST_ITEM_CLASS);
  82. $item.addClass(SHAPE_STANDARD_CLASS)
  83. },
  84. _initTemplates: function() {
  85. var _this = this;
  86. this.callBase();
  87. this._defaultTemplates.item = new _bindable_template2.default(function($container, data, model) {
  88. _this._prepareItemStyles($container);
  89. _this._createComponent($container, _button2.default, (0, _extend.extend)({}, model, data, _this._getBasicButtonOptions()))
  90. }, ["text", "type", "icon", "disabled", "visible", "hint"], this.option("integrationOptions.watchMethod"))
  91. },
  92. _init: function() {
  93. this.callBase();
  94. this._createItemClickAction()
  95. },
  96. _createItemClickAction: function() {
  97. this._itemClickAction = this._createActionByOption("onItemClick")
  98. },
  99. _initMarkup: function() {
  100. this.setAria("role", "group");
  101. this.$element().addClass(BUTTON_GROUP_CLASS);
  102. this._renderButtons();
  103. this._syncSelectionOptions();
  104. this.callBase()
  105. },
  106. _fireSelectionChangeEvent: function(addedItems, removedItems) {
  107. this._createActionByOption("onSelectionChanged", {
  108. excludeValidators: ["disabled", "readOnly"]
  109. })({
  110. addedItems: addedItems,
  111. removedItems: removedItems
  112. })
  113. },
  114. _getBasicButtonOptions: function() {
  115. return {
  116. focusStateEnabled: false,
  117. stylingMode: this.option("stylingMode"),
  118. hoverStateEnabled: this.option("hoverStateEnabled"),
  119. activeStateEnabled: this.option("activeStateEnabled"),
  120. onClick: null
  121. }
  122. },
  123. _renderButtons: function() {
  124. var _this2 = this;
  125. var $buttons = (0, _renderer2.default)("<div>").addClass(BUTTON_GROUP_WRAPPER_CLASS).appendTo(this.$element());
  126. var selectedItems = this.option("selectedItems");
  127. var options = {
  128. selectionMode: this.option("selectionMode"),
  129. items: this.option("items"),
  130. keyExpr: this.option("keyExpr"),
  131. itemTemplate: this._getTemplateByOption("itemTemplate"),
  132. scrollingEnabled: false,
  133. selectedItemKeys: this.option("selectedItemKeys"),
  134. focusStateEnabled: this.option("focusStateEnabled"),
  135. accessKey: this.option("accessKey"),
  136. tabIndex: this.option("tabIndex"),
  137. noDataText: "",
  138. selectionRequired: false,
  139. onItemRendered: function(e) {
  140. var width = _this2.option("width");
  141. (0, _type.isDefined)(width) && (0, _renderer2.default)(e.itemElement).addClass(BUTTON_GROUP_ITEM_HAS_WIDTH)
  142. },
  143. onSelectionChanged: function(e) {
  144. _this2._syncSelectionOptions();
  145. _this2._fireSelectionChangeEvent(e.addedItems, e.removedItems)
  146. },
  147. onItemClick: function(e) {
  148. _this2._itemClickAction(e)
  149. }
  150. };
  151. if ((0, _type.isDefined)(selectedItems) && selectedItems.length) {
  152. options.selectedItems = selectedItems
  153. }
  154. this._buttonsCollection = this._createComponent($buttons, ButtonCollection, options)
  155. },
  156. _syncSelectionOptions: function() {
  157. this._setOptionSilent("selectedItems", this._buttonsCollection.option("selectedItems"));
  158. this._setOptionSilent("selectedItemKeys", this._buttonsCollection.option("selectedItemKeys"))
  159. },
  160. _optionChanged: function(args) {
  161. switch (args.name) {
  162. case "stylingMode":
  163. case "selectionMode":
  164. case "keyExpr":
  165. case "itemTemplate":
  166. case "items":
  167. case "activeStateEnabled":
  168. case "focusStateEnabled":
  169. case "hoverStateEnabled":
  170. case "tabIndex":
  171. this._invalidate();
  172. break;
  173. case "selectedItemKeys":
  174. case "selectedItems":
  175. this._buttonsCollection.option(args.name, args.value);
  176. break;
  177. case "onItemClick":
  178. this._createItemClickAction();
  179. break;
  180. case "onSelectionChanged":
  181. break;
  182. case "width":
  183. this.callBase(args);
  184. this._buttonsCollection.itemElements().toggleClass(BUTTON_GROUP_ITEM_HAS_WIDTH, !!args.value);
  185. break;
  186. default:
  187. this.callBase(args)
  188. }
  189. }
  190. });
  191. (0, _component_registrator2.default)("dxButtonGroup", ButtonGroup);
  192. module.exports = ButtonGroup;
  193. module.exports.default = module.exports;