iuap-design
Version:
UI Framework Used For Enterprise.
207 lines (172 loc) • 5.83 kB
JavaScript
u.Radio = u.BaseComponent.extend({
Constant_: {
TINY_TIMEOUT: 0.001
},
_CssClasses: {
IS_FOCUSED: 'is-focused',
IS_DISABLED: 'is-disabled',
IS_CHECKED: 'is-checked',
IS_UPGRADED: 'is-upgraded',
JS_RADIO: 'u-radio',
RADIO_BTN: 'u-radio-button',
RADIO_OUTER_CIRCLE: 'u-radio-outer-circle',
RADIO_INNER_CIRCLE: 'u-radio-inner-circle'
},
init: function () {
this._btnElement = this.element.querySelector('input');
this._boundChangeHandler = this._onChange.bind(this);
this._boundFocusHandler = this._onChange.bind(this);
this._boundBlurHandler = this._onBlur.bind(this);
this._boundMouseUpHandler = this._onMouseup.bind(this);
var outerCircle = document.createElement('span');
u.addClass(outerCircle, this._CssClasses.RADIO_OUTER_CIRCLE);
var innerCircle = document.createElement('span');
u.addClass(innerCircle, this._CssClasses.RADIO_INNER_CIRCLE);
this.element.appendChild(outerCircle);
this.element.appendChild(innerCircle);
var rippleContainer;
//if (this.element.classList.contains( this._CssClasses.RIPPLE_EFFECT)) {
// u.addClass(this.element,this._CssClasses.RIPPLE_IGNORE_EVENTS);
rippleContainer = document.createElement('span');
//rippleContainer.classList.add(this._CssClasses.RIPPLE_CONTAINER);
//rippleContainer.classList.add(this._CssClasses.RIPPLE_EFFECT);
//rippleContainer.classList.add(this._CssClasses.RIPPLE_CENTER);
rippleContainer.addEventListener('mouseup', this._boundMouseUpHandler);
//var ripple = document.createElement('span');
//ripple.classList.add(this._CssClasses.RIPPLE);
//rippleContainer.appendChild(ripple);
this.element.appendChild(rippleContainer);
new URipple(rippleContainer)
//}
this._btnElement.addEventListener('change', this._boundChangeHandler);
this._btnElement.addEventListener('focus', this._boundFocusHandler);
this._btnElement.addEventListener('blur', this._boundBlurHandler);
this.element.addEventListener('mouseup', this._boundMouseUpHandler);
this._updateClasses();
u.addClass(this.element, this._CssClasses.IS_UPGRADED);
},
_onChange: function (event) {
// Since other radio buttons don't get change events, we need to look for
// them to update their classes.
var radios = document.querySelectorAll('.' + this._CssClasses.JS_RADIO);
for (var i = 0; i < radios.length; i++) {
var button = radios[i].querySelector('.' + this._CssClasses.RADIO_BTN);
// Different name == different group, so no point updating those.
if (button.getAttribute('name') === this._btnElement.getAttribute('name')) {
if(radios[i]['u.Radio']){
radios[i]['u.Radio']._updateClasses();
}
}
}
this.trigger('change', {isChecked:this._btnElement.checked});
},
/**
* Handle focus.
*
* @param {Event} event The event that fired.
* @private
*/
_onFocus: function (event) {
u.addClass(this.element, this._CssClasses.IS_FOCUSED);
},
/**
* Handle lost focus.
*
* @param {Event} event The event that fired.
* @private
*/
_onBlur: function (event) {
u.removeClass(this.element, this._CssClasses.IS_FOCUSED);
},
/**
* Handle mouseup.
*
* @param {Event} event The event that fired.
* @private
*/
_onMouseup: function (event) {
this._blur();
},
/**
* Update classes.
*
* @private
*/
_updateClasses: function () {
this.checkDisabled();
this.checkToggleState();
},
/**
* Add blur.
*
* @private
*/
_blur: function () {
// TODO: figure out why there's a focus event being fired after our blur,
// so that we can avoid this hack.
window.setTimeout(function () {
this._btnElement.blur();
}.bind(this), /** @type {number} */ (this.Constant_.TINY_TIMEOUT));
},
// Public methods.
/**
* Check the components disabled state.
*
* @public
*/
checkDisabled: function () {
if (this._btnElement.disabled) {
u.addClass(this.element, this._CssClasses.IS_DISABLED);
} else {
u.removeClass(this.element, this._CssClasses.IS_DISABLED);
}
},
/**
* Check the components toggled state.
*
* @public
*/
checkToggleState: function () {
if (this._btnElement.checked) {
u.addClass(this.element, this._CssClasses.IS_CHECKED);
} else {
u.removeClass(this.element, this._CssClasses.IS_CHECKED);
}
},
/**
* Disable radio.
*
* @public
*/
disable: function () {
this._btnElement.disabled = true;
this._updateClasses();
},
/**
* Enable radio.
*
* @public
*/
enable: function () {
this._btnElement.disabled = false;
this._updateClasses();
},
/**
* Check radio.
*
* @public
*/
check: function () {
this._btnElement.checked = true;
this._updateClasses();
},
uncheck: function () {
this._btnElement.checked = false;
this._updateClasses();
}
});
u.compMgr.regComp({
comp: u.Radio,
compAsString: 'u.Radio',
css: 'u-radio'
});