devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
176 lines (175 loc) • 7.73 kB
JavaScript
/**
* DevExtreme (ui/list/ui.list.edit.decorator.selection.js)
* Version: 18.1.3
* Build date: Tue May 15 2018
*
* Copyright (c) 2012 - 2018 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var $ = require("../../core/renderer"),
eventsEngine = require("../../events/core/events_engine"),
clickEvent = require("../../events/click"),
extend = require("../../core/utils/extend").extend,
errors = require("../widget/ui.errors"),
CheckBox = require("../check_box"),
RadioButton = require("../radio_group/radio_button"),
eventUtils = require("../../events/utils"),
registerDecorator = require("./ui.list.edit.decorator_registry").register,
EditDecorator = require("./ui.list.edit.decorator");
var SELECT_DECORATOR_ENABLED_CLASS = "dx-list-select-decorator-enabled",
SELECT_DECORATOR_SELECT_ALL_CLASS = "dx-list-select-all",
SELECT_DECORATOR_SELECT_ALL_CHECKBOX_CLASS = "dx-list-select-all-checkbox",
SELECT_DECORATOR_SELECT_ALL_LABEL_CLASS = "dx-list-select-all-label",
SELECT_CHECKBOX_CONTAINER_CLASS = "dx-list-select-checkbox-container",
SELECT_CHECKBOX_CLASS = "dx-list-select-checkbox",
SELECT_RADIO_BUTTON_CONTAINER_CLASS = "dx-list-select-radiobutton-container",
SELECT_RADIO_BUTTON_CLASS = "dx-list-select-radiobutton",
FOCUSED_STATE_CLASS = "dx-state-focused";
var CLICK_EVENT_NAME = eventUtils.addNamespace(clickEvent.name, "dxListEditDecorator");
registerDecorator("selection", "default", EditDecorator.inherit({
_init: function() {
this.callBase.apply(this, arguments);
var selectionMode = this._list.option("selectionMode");
this._singleStrategy = "single" === selectionMode;
this._containerClass = this._singleStrategy ? SELECT_RADIO_BUTTON_CONTAINER_CLASS : SELECT_CHECKBOX_CONTAINER_CLASS;
this._controlClass = this._singleStrategy ? SELECT_RADIO_BUTTON_CLASS : SELECT_CHECKBOX_CLASS;
this._controlWidget = this._singleStrategy ? RadioButton : CheckBox;
this._list.$element().addClass(SELECT_DECORATOR_ENABLED_CLASS)
},
beforeBag: function(config) {
var $itemElement = config.$itemElement,
$container = config.$container;
var $control = $("<div>").addClass(this._controlClass);
new this._controlWidget($control, extend(this._commonOptions(), {
value: this._isSelected($itemElement),
focusStateEnabled: false,
hoverStateEnabled: false,
onValueChanged: function(e) {
this._processCheckedState($itemElement, e.value);
e.event && e.event.stopPropagation()
}.bind(this)
}));
$container.addClass(this._containerClass);
$container.append($control)
},
modifyElement: function(config) {
this.callBase.apply(this, arguments);
var $itemElement = config.$itemElement,
control = this._controlWidget.getInstance($itemElement.find("." + this._controlClass));
eventsEngine.on($itemElement, "stateChanged", function(e, state) {
control.option("value", state)
}.bind(this))
},
_updateSelectAllState: function() {
if (!this._$selectAll) {
return
}
this._selectAllCheckBox.option("value", this._list.isSelectAll())
},
afterRender: function() {
if ("all" !== this._list.option("selectionMode")) {
return
}
if (!this._$selectAll) {
this._renderSelectAll()
} else {
this._updateSelectAllState()
}
},
handleKeyboardEvents: function(itemIndex, focusOnList) {
if (this._$selectAll && this._needMoveFocus(itemIndex, focusOnList)) {
this._list.option("focusedElement", void 0);
this._selectAllCheckBox.$element().addClass(FOCUSED_STATE_CLASS);
return true
} else {
this._selectAllCheckBox.$element().removeClass(FOCUSED_STATE_CLASS);
this._list.focusListItem(itemIndex);
return false
}
},
_needMoveFocus: function(itemIndex, focusOnList) {
return !focusOnList && (0 === itemIndex || itemIndex === this._list._getLastItemIndex())
},
handleEnterPressing: function() {
if (this._selectAllCheckBox.$element().hasClass(FOCUSED_STATE_CLASS)) {
this._selectAllCheckBox.option("value", !this._selectAllCheckBox.option("value"));
return true
}
},
_renderSelectAll: function() {
var $selectAll = this._$selectAll = $("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_CLASS);
this._selectAllCheckBox = this._list._createComponent($("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_CHECKBOX_CLASS).appendTo($selectAll), CheckBox);
$("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_LABEL_CLASS).text(this._list.option("selectAllText")).appendTo($selectAll);
this._list.itemsContainer().prepend($selectAll);
this._updateSelectAllState();
this._attachSelectAllHandler()
},
_attachSelectAllHandler: function() {
this._selectAllCheckBox.option("onValueChanged", this._selectAllHandler.bind(this));
eventsEngine.off(this._$selectAll, CLICK_EVENT_NAME);
eventsEngine.on(this._$selectAll, CLICK_EVENT_NAME, this._selectAllClickHandler.bind(this))
},
_selectAllHandler: function(e) {
e.event && e.event.stopPropagation();
var isSelectedAll = this._selectAllCheckBox.option("value");
var result = this._list._createActionByOption("onSelectAllValueChanged")({
value: isSelectedAll
});
if (false === result) {
return
}
if (true === isSelectedAll) {
this._selectAllItems()
} else {
if (false === isSelectedAll) {
this._unselectAllItems()
}
}
},
_checkSelectAllCapability: function() {
var list = this._list,
dataSource = list.getDataSource();
if ("allPages" === list.option("selectAllMode") && list.option("grouped") && (!dataSource || !dataSource.group())) {
errors.log("W1010");
return false
}
return true
},
_selectAllItems: function() {
if (!this._checkSelectAllCapability()) {
return
}
this._list._selection.selectAll("page" === this._list.option("selectAllMode"))
},
_unselectAllItems: function() {
if (!this._checkSelectAllCapability()) {
return
}
this._list._selection.deselectAll("page" === this._list.option("selectAllMode"))
},
_selectAllClickHandler: function() {
this._selectAllCheckBox.option("value", !this._selectAllCheckBox.option("value"))
},
_isSelected: function($itemElement) {
return this._list.isItemSelected($itemElement)
},
_processCheckedState: function($itemElement, checked) {
if (checked) {
this._list.selectItem($itemElement)
} else {
this._list.unselectItem($itemElement)
}
},
dispose: function() {
this._disposeSelectAll();
this._list.$element().removeClass(SELECT_DECORATOR_ENABLED_CLASS);
this.callBase.apply(this, arguments)
},
_disposeSelectAll: function() {
if (this._$selectAll) {
this._$selectAll.remove();
this._$selectAll = null
}
}
}));