@blox/material
Version:
Material Components for Angular
150 lines • 17.7 kB
JavaScript
import { Directive, ElementRef, HostBinding, Input, Optional, Renderer2, Self, forwardRef, ContentChildren, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { NgControl } from '@angular/forms';
import { MDCRadioFoundation } from '@material/radio';
import { AbstractMdcRipple } from '../ripple/abstract.mdc.ripple';
import { AbstractMdcInput } from '../abstract/abstract.mdc.input';
import { asBoolean } from '../../utils/value.utils';
import { MdcEventRegistry } from '../../utils/mdc.event.registry';
/**
* Directive for the input element of an <code>MdcRadioDirective</code>.
*/
export class MdcRadioInputDirective extends AbstractMdcInput {
constructor(_elm, _cntr) {
super();
this._elm = _elm;
this._cntr = _cntr;
/** @internal */
this._cls = true;
this._id = null;
this._disabled = false;
}
/** @docs-private */
get id() {
return this._id;
}
set id(value) {
this._id = value;
}
/** @docs-private */
get disabled() {
return this._cntr ? !!this._cntr.disabled : this._disabled;
}
set disabled(value) {
this._disabled = asBoolean(value);
}
}
MdcRadioInputDirective.decorators = [
{ type: Directive, args: [{
selector: 'input[mdcRadioInput][type=radio]',
providers: [{ provide: AbstractMdcInput, useExisting: forwardRef(() => MdcRadioInputDirective) }]
},] }
];
MdcRadioInputDirective.ctorParameters = () => [
{ type: ElementRef },
{ type: NgControl, decorators: [{ type: Optional }, { type: Self }] }
];
MdcRadioInputDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-radio__native-control',] }],
id: [{ type: HostBinding }, { type: Input }],
disabled: [{ type: HostBinding }, { type: Input }]
};
/**
* Directive for creating a Material Design radio button. The radio button is driven by an
* underlying native radio input, which must use the <code>MdcRadioInputDirective</code>
* directive.
* The current implementation will add all other required DOM elements (such as the
* background).
* Future implementations will also support supplying (customized) background
* elements.
*
* This directive can be used together with an <code>mdcFormField</code> to
* easily position radio buttons and their labels, see
* <a href="/components/form-field">mdcFormField</a>.
*/
export class MdcRadioDirective extends AbstractMdcRipple {
constructor(renderer, root, registry, doc) {
super(root, renderer, registry, doc);
this.renderer = renderer;
this.root = root;
/** @internal */
this._cls = true;
this.mdcAdapter = {
// We can just ignore all adapter calls, since we have a HostBinding for the
// disabled classes, and never call foundation.setDisabled
addClass: () => undefined,
removeClass: () => undefined,
setNativeControlDisabled: () => undefined
};
this.foundation = new MDCRadioFoundation(this.mdcAdapter);
}
ngAfterContentInit() {
this.addBackground();
this.addRippleSurface('mdc-radio__ripple');
this.initRipple(true);
this.foundation.init();
this._inputs.changes.subscribe(() => {
this.reinitRipple();
});
}
ngOnDestroy() {
var _a;
this.destroyRipple();
(_a = this.foundation) === null || _a === void 0 ? void 0 : _a.destroy();
this.foundation = null;
}
addBackground() {
let outerCircle = this.renderer.createElement('div');
this.renderer.addClass(outerCircle, 'mdc-radio__outer-circle');
let innerCircle = this.renderer.createElement('div');
this.renderer.addClass(innerCircle, 'mdc-radio__inner-circle');
let bg = this.renderer.createElement('div');
this.renderer.appendChild(bg, outerCircle);
this.renderer.appendChild(bg, innerCircle);
this.renderer.addClass(bg, 'mdc-radio__background');
this.renderer.appendChild(this.root.nativeElement, bg);
}
/** @internal */
getRippleInteractionElement() {
var _a;
return (_a = this._input) === null || _a === void 0 ? void 0 : _a._elm;
}
/** @internal */
isRippleSurfaceActive() {
// This is what the @material/radio MDCRadio component does, with the following comment:
// "Radio buttons technically go 'active' whenever there is *any* keyboard interaction.
// This is not the UI we desire."
return false;
}
// instead of calling foundation.setDisabled on disabled state changes, we just
// bind the class to the property:
/** @internal */
get _disabled() {
return this._input == null || this._input.disabled;
}
/** @internal */
get _input() {
return this._inputs && this._inputs.length > 0 ? this._inputs.first : null;
}
}
MdcRadioDirective.decorators = [
{ type: Directive, args: [{
selector: '[mdcRadio]'
},] }
];
MdcRadioDirective.ctorParameters = () => [
{ type: Renderer2 },
{ type: ElementRef },
{ type: MdcEventRegistry },
{ type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] }
];
MdcRadioDirective.propDecorators = {
_cls: [{ type: HostBinding, args: ['class.mdc-radio',] }],
_inputs: [{ type: ContentChildren, args: [MdcRadioInputDirective,] }],
_disabled: [{ type: HostBinding, args: ['class.mdc-radio--disabled',] }]
};
export const RADIO_DIRECTIVES = [
MdcRadioInputDirective,
MdcRadioDirective
];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLnJhZGlvLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3JhZGlvL21kYy5yYWRpby5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFvQixTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFDM0QsS0FBSyxFQUFhLFFBQVEsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQWEsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGtCQUFrQixFQUFtQixNQUFNLGlCQUFpQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVsRTs7R0FFRztBQUtILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0I7SUFNeEQsWUFBbUIsSUFBZ0IsRUFBNkIsS0FBZ0I7UUFDNUUsS0FBSyxFQUFFLENBQUM7UUFETyxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQTZCLFVBQUssR0FBTCxLQUFLLENBQVc7UUFMaEYsZ0JBQWdCO1FBQ3lDLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDN0QsUUFBRyxHQUFrQixJQUFJLENBQUM7UUFDMUIsY0FBUyxHQUFHLEtBQUssQ0FBQztJQUkxQixDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLElBQ2EsRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDLEdBQUcs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OzttQkFaOUcsV0FBVyxTQUFDLGlCQUFpQjtzQkFFN0IsZUFBZSxTQUFDLHNCQUFzQjt3QkEwRHRDLFdBQVcsU0FBQywyQkFBMkI7O0FBVTVDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHO0lBQzVCLHNCQUFzQjtJQUN0QixpQkFBaUI7Q0FDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsXG4gIElucHV0LCBPbkRlc3Ryb3ksIE9wdGlvbmFsLCBSZW5kZXJlcjIsIFNlbGYsIGZvcndhcmRSZWYsIENvbnRlbnRDaGlsZHJlbiwgUXVlcnlMaXN0LCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1EQ1JhZGlvRm91bmRhdGlvbiwgTURDUmFkaW9BZGFwdGVyIH0gZnJvbSAnQG1hdGVyaWFsL3JhZGlvJztcbmltcG9ydCB7IEFic3RyYWN0TWRjUmlwcGxlIH0gZnJvbSAnLi4vcmlwcGxlL2Fic3RyYWN0Lm1kYy5yaXBwbGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZGNJbnB1dCB9IGZyb20gJy4uL2Fic3RyYWN0L2Fic3RyYWN0Lm1kYy5pbnB1dCc7XG5pbXBvcnQgeyBhc0Jvb2xlYW4gfSBmcm9tICcuLi8uLi91dGlscy92YWx1ZS51dGlscyc7XG5pbXBvcnQgeyBNZGNFdmVudFJlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vdXRpbHMvbWRjLmV2ZW50LnJlZ2lzdHJ5JztcblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIHRoZSBpbnB1dCBlbGVtZW50IG9mIGFuIDxjb2RlPk1kY1JhZGlvRGlyZWN0aXZlPC9jb2RlPi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdpbnB1dFttZGNSYWRpb0lucHV0XVt0eXBlPXJhZGlvXScsXG4gICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IEFic3RyYWN0TWRjSW5wdXQsIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1kY1JhZGlvSW5wdXREaXJlY3RpdmUpIH1dXG59KVxuZXhwb3J0IGNsYXNzIE1kY1JhZGlvSW5wdXREaXJlY3RpdmUgZXh0ZW5kcyBBYnN0cmFjdE1kY0lucHV0IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtcmFkaW9fX25hdGl2ZS1jb250cm9sJykgcmVhZG9ubHkgX2NscyA9IHRydWU7XG4gICAgcHJpdmF0ZSBfaWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgX2VsbTogRWxlbWVudFJlZiwgQE9wdGlvbmFsKCkgQFNlbGYoKSBwdWJsaWMgX2NudHI6IE5nQ29udHJvbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgQEhvc3RCaW5kaW5nKClcbiAgICBASW5wdXQoKSBnZXQgaWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pZDtcbiAgICB9XG4gIFxuICAgIHNldCBpZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgICAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKiBAZG9jcy1wcml2YXRlICovXG4gICAgQEhvc3RCaW5kaW5nKClcbiAgICBASW5wdXQoKSBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbnRyID8gISF0aGlzLl9jbnRyLmRpc2FibGVkIDogdGhpcy5fZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gYXNCb29sZWFuKHZhbHVlKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IGJvb2xlYW4gfCAnJztcbn1cblxuLyoqXG4gKiBEaXJlY3RpdmUgZm9yIGNyZWF0aW5nIGEgTWF0ZXJpYWwgRGVzaWduIHJhZGlvIGJ1dHRvbi4gVGhlIHJhZGlvIGJ1dHRvbiBpcyBkcml2ZW4gYnkgYW5cbiAqIHVuZGVybHlpbmcgbmF0aXZlIHJhZGlvIGlucHV0LCB3aGljaCBtdXN0IHVzZSB0aGUgPGNvZGU+TWRjUmFkaW9JbnB1dERpcmVjdGl2ZTwvY29kZT5cbiAqIGRpcmVjdGl2ZS5cbiAqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgYWRkIGFsbCBvdGhlciByZXF1aXJlZCBET00gZWxlbWVudHMgKHN1Y2ggYXMgdGhlXG4gKiBiYWNrZ3JvdW5kKS5cbiAqIEZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBhbHNvIHN1cHBvcnQgc3VwcGx5aW5nIChjdXN0b21pemVkKSBiYWNrZ3JvdW5kXG4gKiBlbGVtZW50cy5cbiAqIFxuICogVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBhbiA8Y29kZT5tZGNGb3JtRmllbGQ8L2NvZGU+IHRvXG4gKiBlYXNpbHkgcG9zaXRpb24gcmFkaW8gYnV0dG9ucyBhbmQgdGhlaXIgbGFiZWxzLCBzZWVcbiAqIDxhIGhyZWY9XCIvY29tcG9uZW50cy9mb3JtLWZpZWxkXCI+bWRjRm9ybUZpZWxkPC9hPi5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbbWRjUmFkaW9dJ1xufSlcbmV4cG9ydCBjbGFzcyBNZGNSYWRpb0RpcmVjdGl2ZSBleHRlbmRzIEFic3RyYWN0TWRjUmlwcGxlIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5tZGMtcmFkaW8nKSByZWFkb25seSBfY2xzID0gdHJ1ZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihNZGNSYWRpb0lucHV0RGlyZWN0aXZlKSBfaW5wdXRzPzogUXVlcnlMaXN0PE1kY1JhZGlvSW5wdXREaXJlY3RpdmU+O1xuICAgIHByaXZhdGUgbWRjQWRhcHRlcjogTURDUmFkaW9BZGFwdGVyID0ge1xuICAgICAgICAvLyBXZSBjYW4ganVzdCBpZ25vcmUgYWxsIGFkYXB0ZXIgY2FsbHMsIHNpbmNlIHdlIGhhdmUgYSBIb3N0QmluZGluZyBmb3IgdGhlXG4gICAgICAgIC8vIGRpc2FibGVkIGNsYXNzZXMsIGFuZCBuZXZlciBjYWxsIGZvdW5kYXRpb24uc2V0RGlzYWJsZWRcbiAgICAgICAgYWRkQ2xhc3M6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgcmVtb3ZlQ2xhc3M6ICgpID0+IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0TmF0aXZlQ29udHJvbERpc2FibGVkOiAoKSA9PiB1bmRlZmluZWRcbiAgICB9O1xuICAgIHByaXZhdGUgZm91bmRhdGlvbjogTURDUmFkaW9Gb3VuZGF0aW9uIHwgbnVsbCA9IG5ldyBNRENSYWRpb0ZvdW5kYXRpb24odGhpcy5tZGNBZGFwdGVyKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSByb290OiBFbGVtZW50UmVmLCByZWdpc3RyeTogTWRjRXZlbnRSZWdpc3RyeSwgQEluamVjdChET0NVTUVOVCkgZG9jOiBhbnkpIHtcbiAgICAgICAgc3VwZXIocm9vdCwgcmVuZGVyZXIsIHJlZ2lzdHJ5LCBkb2MgYXMgRG9jdW1lbnQpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5hZGRCYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMuYWRkUmlwcGxlU3VyZmFjZSgnbWRjLXJhZGlvX19yaXBwbGUnKTtcbiAgICAgICAgdGhpcy5pbml0UmlwcGxlKHRydWUpO1xuICAgICAgICB0aGlzLmZvdW5kYXRpb24hLmluaXQoKTtcbiAgICAgICAgdGhpcy5faW5wdXRzIS5jaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlaW5pdFJpcHBsZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5kZXN0cm95UmlwcGxlKCk7XG4gICAgICAgIHRoaXMuZm91bmRhdGlvbj8uZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmZvdW5kYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQmFja2dyb3VuZCgpIHtcbiAgICAgICAgbGV0IG91dGVyQ2lyY2xlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhvdXRlckNpcmNsZSwgJ21kYy1yYWRpb19fb3V0ZXItY2lyY2xlJyk7XG4gICAgICAgIGxldCBpbm5lckNpcmNsZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaW5uZXJDaXJjbGUsICdtZGMtcmFkaW9fX2lubmVyLWNpcmNsZScpO1xuICAgICAgICBsZXQgYmcgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGJnLCBvdXRlckNpcmNsZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoYmcsIGlubmVyQ2lyY2xlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhiZywgJ21kYy1yYWRpb19fYmFja2dyb3VuZCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucm9vdC5uYXRpdmVFbGVtZW50LCBiZyk7XG4gICAgfVxuXG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHByb3RlY3RlZCBnZXRSaXBwbGVJbnRlcmFjdGlvbkVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dD8uX2VsbTtcbiAgICB9XG5cbiAgICAvKiogQGludGVybmFsICovXG4gICAgaXNSaXBwbGVTdXJmYWNlQWN0aXZlKCkge1xuICAgICAgICAvLyBUaGlzIGlzIHdoYXQgdGhlIEBtYXRlcmlhbC9yYWRpbyBNRENSYWRpbyBjb21wb25lbnQgZG9lcywgd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1lbnQ6XG4gICAgICAgIC8vIFwiUmFkaW8gYnV0dG9ucyB0ZWNobmljYWxseSBnbyAnYWN0aXZlJyB3aGVuZXZlciB0aGVyZSBpcyAqYW55KiBrZXlib2FyZCBpbnRlcmFjdGlvbi5cbiAgICAgICAgLy8gIFRoaXMgaXMgbm90IHRoZSBVSSB3ZSBkZXNpcmUuXCJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGluc3RlYWQgb2YgY2FsbGluZyBmb3VuZGF0aW9uLnNldERpc2FibGVkIG9uIGRpc2FibGVkIHN0YXRlIGNoYW5nZXMsIHdlIGp1c3RcbiAgICAvLyBiaW5kIHRoZSBjbGFzcyB0byB0aGUgcHJvcGVydHk6XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MubWRjLXJhZGlvLS1kaXNhYmxlZCcpIGdldCBfZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnB1dCA9PSBudWxsIHx8IHRoaXMuX2lucHV0LmRpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICBnZXQgX2lucHV0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW5wdXRzICYmIHRoaXMuX2lucHV0cy5sZW5ndGggPiAwID8gdGhpcy5faW5wdXRzLmZpcnN0IDogbnVsbDtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSQURJT19ESVJFQ1RJVkVTID0gW1xuICAgIE1kY1JhZGlvSW5wdXREaXJlY3RpdmUsXG4gICAgTWRjUmFkaW9EaXJlY3RpdmVcbl07XG4iXX0=