/**
* DevExtreme (ui/drop_down_button.js)
* Version: 19.1.16
* Build date: Tue Oct 18 2022
*
* Copyright (c) 2012 - 2022 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var _renderer = require("../core/renderer");
var _renderer2 = _interopRequireDefault(_renderer);
var _ui = require("./widget/ui.widget");
var _ui2 = _interopRequireDefault(_ui);
var _function_template = require("./widget/function_template");
var _function_template2 = _interopRequireDefault(_function_template);
var _component_registrator = require("../core/component_registrator");
var _component_registrator2 = _interopRequireDefault(_component_registrator);
var _button_group = require("./button_group");
var _button_group2 = _interopRequireDefault(_button_group);
var _popup = require("./popup");
var _popup2 = _interopRequireDefault(_popup);
var _list = require("./list");
var _list2 = _interopRequireDefault(_list);
var _data = require("../core/utils/data");
var _dom = require("../core/utils/dom");
var _dom2 = _interopRequireDefault(_dom);
var _icon = require("../core/utils/icon");
var _data_helper = require("../data_helper");
var _data_helper2 = _interopRequireDefault(_data_helper);
var _data_source = require("../data/data_source/data_source");
var _array_store = require("../data/array_store");
var _array_store2 = _interopRequireDefault(_array_store);
var _deferred = require("../core/utils/deferred");
var _extend = require("../core/utils/extend");
var _type = require("../core/utils/type");
var _common = require("../core/utils/common");
var _guid = require("../core/guid");
var _guid2 = _interopRequireDefault(_guid);
var _message = require("../localization/message");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
"default": obj
}
}
var DROP_DOWN_BUTTON_CLASS = "dx-dropdownbutton";
var DROP_DOWN_BUTTON_CONTENT = "dx-dropdownbutton-content";
var DROP_DOWN_BUTTON_ACTION_CLASS = "dx-dropdownbutton-action";
var DROP_DOWN_BUTTON_TOGGLE_CLASS = "dx-dropdownbutton-toggle";
var DX_BUTTON_CONTENT_CLASS = "dx-button-content";
var DX_ICON_RIGHT_CLASS = "dx-icon-right";
var DROP_DOWN_BUTTON_POPUP_WRAPPER_CLASS = "dx-dropdownbutton-popup-wrapper";
var DropDownButton = _ui2.default.inherit({
_getDefaultOptions: function() {
return (0, _extend.extend)(this.callBase(), {
itemTemplate: "item",
keyExpr: "this",
displayExpr: "this",
selectedItem: null,
selectedItemKey: null,
stylingMode: "outlined",
deferRendering: true,
noDataText: (0, _message.format)("dxCollectionWidget-noDataText"),
useSelectMode: false,
splitButton: false,
showArrowIcon: true,
text: "",
icon: void 0,
onButtonClick: null,
onSelectionChanged: null,
onItemClick: null,
opened: false,
items: null,
dataSource: null,
focusStateEnabled: true,
hoverStateEnabled: true,
dropDownOptions: {},
dropDownContentTemplate: "content",
grouped: false,
groupTemplate: "group",
buttonGroupOptions: {}
})
},
_setOptionsByReference: function() {
this.callBase();
(0, _extend.extend)(this._optionsByReference, {
selectedItem: true
})
},
_init: function() {
this.callBase();
this._createItemClickAction();
this._createActionClickAction();
this._createSelectionChangedAction();
this._compileKeyGetter();
this._compileDisplayGetter();
this._initDataSource();
this._itemsToDataSource();
this._initInnerOptionCache("buttonGroupOptions");
this._initInnerOptionCache("dropDownOptions")
},
_initTemplates: function() {
var _this = this;
this.callBase();
this._defaultTemplates.content = new _function_template2.default(function(options) {
var $popupContent = (0, _renderer2.default)(options.container);
var $listContainer = (0, _renderer2.default)("
").appendTo($popupContent);
_this._list = _this._createComponent($listContainer, _list2.default, _this._listOptions());
_this._list.registerKeyHandler("escape", _this._escHandler.bind(_this));
_this._list.registerKeyHandler("tab", _this._escHandler.bind(_this));
_this._list.registerKeyHandler("leftArrow", _this._escHandler.bind(_this));
_this._list.registerKeyHandler("rightArrow", _this._escHandler.bind(_this))
})
},
_itemsToDataSource: function() {
if (!this._dataSource) {
this._dataSource = new _data_source.DataSource({
store: new _array_store2.default(this.option("items")),
pageSize: 0
})
}
},
_compileKeyGetter: function() {
this._keyGetter = (0, _data.compileGetter)(this.option("keyExpr"))
},
_compileDisplayGetter: function() {
this._displayGetter = (0, _data.compileGetter)(this.option("displayExpr"))
},
_initMarkup: function() {
this.callBase();
this.$element().addClass(DROP_DOWN_BUTTON_CLASS);
this._renderButtonGroup();
this._loadSelectedItem().done(this._updateActionButton.bind(this));
if (!this.option("deferRendering") || this.option("opened")) {
this._renderPopup()
}
},
_loadSelectedItem: function() {
var d = new _deferred.Deferred;
if (this._list) {
var cachedResult = this.option("useSelectMode") ? this._list.option("selectedItem") : this._lastSelectedItemData;
return d.resolve(cachedResult)
}
this._lastSelectedItemData = void 0;
var selectedItemKey = this.option("selectedItemKey");
this._loadSingle(this.option("keyExpr"), selectedItemKey).done(d.resolve).fail(function() {
d.resolve(null)
});
return d.promise()
},
_createActionClickAction: function() {
this._actionClickAction = this._createActionByOption("onButtonClick")
},
_createSelectionChangedAction: function() {
this._selectionChangedAction = this._createActionByOption("onSelectionChanged")
},
_createItemClickAction: function() {
this._itemClickAction = this._createActionByOption("onItemClick")
},
_fireSelectionChangedAction: function(_ref) {
var previousValue = _ref.previousValue,
value = _ref.value;
this._selectionChangedAction({
item: value,
previousItem: previousValue
})
},
_fireItemClickAction: function(_ref2) {
var event = _ref2.event,
itemElement = _ref2.itemElement,
itemData = _ref2.itemData;
return this._itemClickAction({
event: event,
itemElement: itemElement,
itemData: this._actionItem || itemData
})
},
_actionButtonConfig: function() {
return {
text: this.option("text"),
icon: this.option("icon"),
elementAttr: {
"class": DROP_DOWN_BUTTON_ACTION_CLASS
}
}
},
_getButtonGroupItems: function() {
var items = [];
items.push(this._actionButtonConfig());
if (this.option("splitButton")) {
items.push({
icon: "spindown",
width: 26,
elementAttr: {
"class": DROP_DOWN_BUTTON_TOGGLE_CLASS
}
})
}
return items
},
_buttonGroupItemClick: function(_ref3) {
var event = _ref3.event,
itemData = _ref3.itemData;
var isActionButton = itemData.elementAttr.class === DROP_DOWN_BUTTON_ACTION_CLASS;
var isToggleButton = itemData.elementAttr.class === DROP_DOWN_BUTTON_TOGGLE_CLASS;
if (isToggleButton) {
this.toggle()
} else {
if (isActionButton) {
this._actionClickAction({
event: event,
selectedItem: this.option("selectedItem")
});
if (!this.option("splitButton")) {
this.toggle()
}
}
}
},
_buttonGroupOptions: function() {
return (0, _extend.extend)({
items: this._getButtonGroupItems(),
focusStateEnabled: this.option("focusStateEnabled"),
hoverStateEnabled: this.option("hoverStateEnabled"),
onItemClick: this._buttonGroupItemClick.bind(this),
width: "100%",
height: "100%",
stylingMode: this.option("stylingMode"),
selectionMode: "none"
}, this._getInnerOptionsCache("buttonGroupOptions"))
},
_renderPopupContent: function() {
var $content = this._popup.$content();
var template = this._getTemplateByOption("dropDownContentTemplate");
$content.empty();
this._popupContentId = "dx-" + new _guid2.default;
this.setAria("id", this._popupContentId, $content);
return template.render({
container: _dom2.default.getPublicElement($content),
model: this.option("items") || this._dataSource
})
},
_popupOptions: function() {
var _this2 = this;
return (0, _extend.extend)({
dragEnabled: false,
focusStateEnabled: false,
deferRendering: this.option("deferRendering"),
minWidth: function() {
return _this2.$element().outerWidth()
},
closeOnOutsideClick: function(e) {
var $element = _this2.$element();
var $buttonClicked = (0, _renderer2.default)(e.target).closest(".".concat(DROP_DOWN_BUTTON_CLASS));
return !$buttonClicked.is($element)
},
showTitle: false,
animation: {
show: {
type: "fade",
duration: 0,
from: 0,
to: 1
},
hide: {
type: "fade",
duration: 400,
from: 1,
to: 0
}
},
width: function() {
return this.$element().outerWidth()
}.bind(this),
height: "auto",
shading: false,
visible: this.option("opened"),
position: {
of: this.$element(),
collision: "flipfit",
my: "top left",
at: "bottom left",
offset: {
y: -1
}
}
}, this._getInnerOptionsCache("dropDownOptions"))
},
_listOptions: function() {
var _this3 = this;
var selectedItemKey = this.option("selectedItemKey");
var useSelectMode = this.option("useSelectMode");
return {
selectionMode: useSelectMode ? "single" : "none",
focusStateEnabled: this.option("focusStateEnabled"),
hoverStateEnabled: this.option("hoverStateEnabled"),
selectedItemKeys: selectedItemKey && useSelectMode ? [selectedItemKey] : [],
grouped: this.option("grouped"),
keyExpr: this.option("keyExpr"),
noDataText: this.option("noDataText"),
displayExpr: this.option("displayExpr"),
itemTemplate: this.option("itemTemplate"),
items: this.option("items"),
dataSource: this._dataSource,
onItemClick: function(e) {
if (!_this3.option("useSelectMode")) {
_this3._lastSelectedItemData = e.itemData
}
_this3.option("selectedItemKey", _this3._keyGetter(e.itemData));
var actionResult = _this3._fireItemClickAction(e);
if (false !== actionResult) {
_this3.toggle(false);
_this3._buttonGroup.focus()
}
}
}
},
_upDownKeyHandler: function() {
if (this._popup && this._popup.option("visible") && this._list) {
this._list.focus()
} else {
this.open()
}
},
_escHandler: function() {
this.close();
this._buttonGroup.focus()
},
_renderPopup: function() {
var $popup = (0, _renderer2.default)("
");
this.$element().append($popup);
this._popup = this._createComponent($popup, _popup2.default, this._popupOptions());
this._popup.$content().addClass(DROP_DOWN_BUTTON_CONTENT);
this._popup._wrapper().addClass(DROP_DOWN_BUTTON_POPUP_WRAPPER_CLASS);
this._popup.on("hiding", this._popupHidingHandler.bind(this));
this._popup.on("showing", this._popupShowingHandler.bind(this));
this._renderPopupContent();
this._bindInnerWidgetOptions(this._popup, "dropDownOptions")
},
_popupHidingHandler: function() {
this.option("opened", false);
this.setAria({
expanded: false,
owns: void 0
})
},
_popupShowingHandler: function() {
this.option("opened", true);
this.setAria({
expanded: true,
owns: this._popupContentId
})
},
_renderAdditionalIcon: function() {
if (this.option("splitButton") || !this.option("showArrowIcon")) {
return
}
var $firstButtonContent = this._buttonGroup.$element().find(".".concat(DX_BUTTON_CONTENT_CLASS)).eq(0);
var $iconElement = (0, _icon.getImageContainer)("spindown");
$iconElement.addClass(DX_ICON_RIGHT_CLASS).appendTo($firstButtonContent)
},
_renderButtonGroup: function() {
var $buttonGroup = this._buttonGroup && this._buttonGroup.$element() || (0, _renderer2.default)("
");
if (!this._buttonGroup) {
this.$element().append($buttonGroup)
}
this._buttonGroup = this._createComponent($buttonGroup, _button_group2.default, this._buttonGroupOptions());
this._buttonGroup.registerKeyHandler("downArrow", this._upDownKeyHandler.bind(this));
this._buttonGroup.registerKeyHandler("tab", this.close.bind(this));
this._buttonGroup.registerKeyHandler("upArrow", this._upDownKeyHandler.bind(this));
this._buttonGroup.registerKeyHandler("escape", this._escHandler.bind(this));
this._renderAdditionalIcon();
this._bindInnerWidgetOptions(this._buttonGroup, "buttonGroupOptions")
},
toggle: function(visible) {
this._popup || this._renderPopup();
return this._popup.toggle(visible)
},
open: function() {
return this.toggle(true)
},
close: function() {
return this.toggle(false)
},
_setListOption: function(name, value) {
this._list && this._list.option(name, value)
},
_getDisplayValue: function(item) {
var isPrimitiveItem = !(0, _type.isPlainObject)(item);
var displayValue = isPrimitiveItem ? item : this._displayGetter(item);
return !(0, _type.isPlainObject)(displayValue) ? String((0, _common.ensureDefined)(displayValue, "")) : ""
},
_updateActionButton: function(selectedItem) {
if (this.option("useSelectMode")) {
this.option({
text: this._getDisplayValue(selectedItem),
icon: (0, _type.isPlainObject)(selectedItem) ? selectedItem.icon : void 0
})
}
this._setOptionSilent("selectedItem", selectedItem)
},
_clean: function() {
this._list && this._list.$element().remove();
this._popup && this._popup.$element().remove()
},
_selectedItemKeyChanged: function(value) {
var _this4 = this;
this._setListOption("selectedItemKeys", this.option("useSelectMode") && (0, _type.isDefined)(value) ? [value] : []);
var previousItem = this.option("selectedItem");
this._loadSelectedItem().done(function(selectedItem) {
_this4._updateActionButton(selectedItem);
if (_this4._displayGetter(previousItem) !== _this4._displayGetter(selectedItem)) {
_this4._fireSelectionChangedAction({
previousValue: previousItem,
value: selectedItem
})
}
})
},
_selectModeChanged: function(value) {
if (value) {
this._setListOption("selectionMode", "single");
var selectedItemKey = this.option("selectedItemKey");
this._setListOption("selectedItemKeys", selectedItemKey ? [selectedItemKey] : [])
} else {
this._setListOption("selectionMode", "none");
this.option({
selectedItemKey: void 0,
selectedItem: void 0
})
}
},
_updateItemCollection: function(optionName) {
this._setWidgetOption("_list", [optionName]);
this._setListOption("selectedItemKeys", []);
this._loadSelectedItem().done(this._updateActionButton.bind(this))
},
_optionChanged: function(args) {
var name = args.name,
value = args.value;
switch (args.name) {
case "useSelectMode":
this._selectModeChanged(args.value);
break;
case "splitButton":
this._renderButtonGroup();
break;
case "displayExpr":
this._compileDisplayGetter();
break;
case "keyExpr":
this._compileKeyGetter();
break;
case "buttonGroupOptions":
this._innerOptionChanged(this._buttonGroup, args);
break;
case "dropDownOptions":
this._innerOptionChanged(this._popup, args);
break;
case "opened":
this.toggle(value);
break;
case "focusStateEnabled":
case "hoverStateEnabled":
this._setListOption(name, value);
this._buttonGroup.option(name, value);
break;
case "items":
this._dataSource = null;
this._itemsToDataSource();
this._updateItemCollection(name);
break;
case "dataSource":
this._initDataSource();
this._updateItemCollection(name);
break;
case "icon":
this._buttonGroup.option("items[0]", (0, _extend.extend)({}, this._actionButtonConfig(), {
icon: value
}));
this._renderAdditionalIcon();
break;
case "text":
this._buttonGroup.option("items[0]", (0, _extend.extend)({}, this._actionButtonConfig(), {
text: value
}));
this._renderAdditionalIcon();
break;
case "showArrowIcon":
if (!value) {
this._buttonGroup.$element().find(".".concat(DX_ICON_RIGHT_CLASS)).remove()
}
this._renderAdditionalIcon();
break;
case "width":
case "height":
this.callBase(args);
this._popup && this._popup.repaint();
break;
case "stylingMode":
this._buttonGroup.option(name, value);
break;
case "itemTemplate":
case "grouped":
case "noDataText":
case "groupTemplate":
this._setListOption(name, value);
break;
case "dropDownContentTemplate":
this._popup && this._renderPopupContent();
break;
case "selectedItemKey":
this._selectedItemKeyChanged(value);
break;
case "selectedItem":
break;
case "onItemClick":
this._createItemClickAction();
break;
case "onButtonClick":
this._createActionClickAction();
break;
case "onSelectionChanged":
this._createSelectionChangedAction();
break;
case "deferRendering":
if (!value && !this._popup) {
this._renderPopup()
}
break;
default:
this.callBase(args)
}
}
}).include(_data_helper2.default);
(0, _component_registrator2.default)("dxDropDownButton", DropDownButton);
module.exports = DropDownButton;
module.exports.default = module.exports;