devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
145 lines (144 loc) • 4.92 kB
JavaScript
/**
* DevExtreme (ui/radio_group/radio_button.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"),
devices = require("../../core/devices"),
extend = require("../../core/utils/extend").extend,
inkRipple = require("../widget/utils.ink_ripple"),
registerComponent = require("../../core/component_registrator"),
Editor = require("../editor/editor"),
eventUtils = require("../../events/utils"),
themes = require("../themes"),
clickEvent = require("../../events/click");
var RADIO_BUTTON_CLASS = "dx-radiobutton",
RADIO_BUTTON_ICON_CLASS = "dx-radiobutton-icon",
RADIO_BUTTON_ICON_DOT_CLASS = "dx-radiobutton-icon-dot",
RADIO_BUTTON_CHECKED_CLASS = "dx-radiobutton-checked";
var RadioButton = Editor.inherit({
_supportedKeys: function() {
var click = function(e) {
e.preventDefault();
this._clickAction({
event: e
})
};
return extend(this.callBase(), {
space: click
})
},
_getDefaultOptions: function() {
return extend(this.callBase(), {
hoverStateEnabled: true,
activeStateEnabled: true,
value: false,
useInkRipple: false
})
},
_defaultOptionsRules: function() {
return this.callBase().concat([{
device: function() {
return "desktop" === devices.real().deviceType && !devices.isSimulator()
},
options: {
focusStateEnabled: true
}
}, {
device: function() {
return /android5/.test(themes.current())
},
options: {
useInkRipple: true
}
}])
},
_init: function() {
this.callBase();
this.$element().addClass(RADIO_BUTTON_CLASS)
},
_initMarkup: function() {
this.callBase();
this._renderIcon();
this.option("useInkRipple") && this._renderInkRipple();
this._renderCheckedState(this.option("value"));
this._renderClick();
this.setAria("role", "radio")
},
_renderInkRipple: function() {
this._inkRipple = inkRipple.render({
waveSizeCoefficient: 3.3,
useHoldAnimation: false,
wavesNumber: 2,
isCentered: true
})
},
_renderInkWave: function(element, dxEvent, doRender, waveIndex) {
if (!this._inkRipple) {
return
}
var config = {
element: element,
event: dxEvent,
wave: waveIndex
};
if (doRender) {
this._inkRipple.showWave(config)
} else {
this._inkRipple.hideWave(config)
}
},
_updateFocusState: function(e, value) {
this.callBase.apply(this, arguments);
this._renderInkWave(this._$icon, e, value, 0)
},
_toggleActiveState: function($element, value, e) {
this.callBase.apply(this, arguments);
this._renderInkWave(this._$icon, e, value, 1)
},
_renderIcon: function() {
this._$icon = $("<div>").addClass(RADIO_BUTTON_ICON_CLASS);
$("<div>").addClass(RADIO_BUTTON_ICON_DOT_CLASS).appendTo(this._$icon);
this.$element().append(this._$icon)
},
_renderCheckedState: function(checked) {
this.$element().toggleClass(RADIO_BUTTON_CHECKED_CLASS, checked);
this.setAria("checked", checked)
},
_renderClick: function() {
var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME);
this._clickAction = this._createAction(function(args) {
this._clickHandler(args.event)
}.bind(this));
eventsEngine.off(this.$element(), eventName);
eventsEngine.on(this.$element(), eventName, function(e) {
this._clickAction({
event: e
})
}.bind(this))
},
_clickHandler: function(e) {
this._saveValueChangeEvent(e);
this.option("value", true)
},
_optionChanged: function(args) {
switch (args.name) {
case "useInkRipple":
this._invalidate();
break;
case "value":
this._renderCheckedState(args.value);
this.callBase(args);
break;
default:
this.callBase(args)
}
}
});
registerComponent("dxRadioButton", RadioButton);
module.exports = RadioButton;