UNPKG

materialize-angular

Version:
265 lines 18.7 kB
/** * @fileoverview added by tsickle * Generated from: app/completed-components/common/ripple.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Workylab. All Rights Reserved. * * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE */ import { Directive, ElementRef, HostListener, Input, Renderer2 } from '@angular/core'; import { config } from '../../config'; /** * @record */ function Coordinate() { } if (false) { /** @type {?} */ Coordinate.prototype.x; /** @type {?} */ Coordinate.prototype.y; } var RippleDirective = /** @class */ (function () { function RippleDirective(elementRef, renderer) { this.elementRef = elementRef; this.renderer = renderer; this.rippleDuration = 500; this.isRippleActive = true; this.isRippleCenter = false; this.prefix = config.components.prefix; this.createRipple = this.createRipple.bind(this); this.element = this.elementRef.nativeElement; this.renderer.addClass(this.element, this.prefix + "-ripple-element"); } /** * @return {?} */ RippleDirective.prototype.ngOnInit = /** * @return {?} */ function () { if (!this.isRippleActive) { this.renderer.addClass(this.element, 'disabled'); } }; /** * @param {?} event * @return {?} */ RippleDirective.prototype.createRipple = /** * @param {?} event * @return {?} */ function (event) { if (!this.isRippleActive) { return; } /** @type {?} */ var coordinates = this.isRippleCenter ? this.getCoordinatesByCenter() : this.getCoordinatesByEvent(event); /** @type {?} */ var radio = this.getRippleRadio(coordinates); this.renderRipple(radio, coordinates); }; /** * @param {?} radio * @param {?} coordinate * @return {?} */ RippleDirective.prototype.renderRipple = /** * @param {?} radio * @param {?} coordinate * @return {?} */ function (radio, coordinate) { /** @type {?} */ var ripple = this.renderer.createElement('div'); /** @type {?} */ var centerY = coordinate.y - radio; /** @type {?} */ var centerX = coordinate.x - radio; this.renderer.addClass(ripple, 'ripple'); this.renderer.setStyle(ripple, 'height', radio * 2 + "px"); this.renderer.setStyle(ripple, 'width', radio * 2 + "px"); this.renderer.setStyle(ripple, 'top', centerY + "px"); this.renderer.setStyle(ripple, 'left', centerX + "px"); this.renderer.insertBefore(this.element, ripple, this.element.firstChild); this.scaleRipple(ripple); }; /** * @return {?} */ RippleDirective.prototype.getCoordinatesByCenter = /** * @return {?} */ function () { var _a = this.element, offsetHeight = _a.offsetHeight, offsetWidth = _a.offsetWidth; /** @type {?} */ var y = offsetHeight / 2; /** @type {?} */ var x = offsetWidth / 2; return { x: x, y: y }; }; /** * @param {?} event * @return {?} */ RippleDirective.prototype.getCoordinatesByEvent = /** * @param {?} event * @return {?} */ function (event) { /** @type {?} */ var offset = this.getOffset(this.element); /** @type {?} */ var y = event.pageY - offset.top; /** @type {?} */ var x = event.pageX - offset.left; return { x: x, y: y }; }; /** * @param {?} coordinate * @return {?} */ RippleDirective.prototype.getRippleRadio = /** * @param {?} coordinate * @return {?} */ function (coordinate) { /** @type {?} */ var height = Math.max(this.element.offsetHeight - coordinate.y, coordinate.y); /** @type {?} */ var width = Math.max(this.element.offsetWidth - coordinate.x, coordinate.x); /** @type {?} */ var radio = Math.hypot(height, width); return radio; }; /** * @param {?} ripple * @return {?} */ RippleDirective.prototype.scaleRipple = /** * @param {?} ripple * @return {?} */ function (ripple) { var _this = this; setTimeout((/** * @return {?} */ function () { ripple.style.transitionDuration = _this.rippleDuration + "ms"; ripple.style.transform = 'scale(1)'; _this.hideRipple(ripple); }), 0); }; /** * @param {?} ripple * @return {?} */ RippleDirective.prototype.hideRipple = /** * @param {?} ripple * @return {?} */ function (ripple) { var _this = this; setTimeout((/** * @return {?} */ function () { _this.renderer.setStyle(ripple, 'transitionDuration', _this.rippleDuration + "ms"); _this.renderer.setStyle(ripple, 'opacity', '0'); _this.removeRipple(ripple); }), this.rippleDuration); }; /** * @param {?} ripple * @return {?} */ RippleDirective.prototype.removeRipple = /** * @param {?} ripple * @return {?} */ function (ripple) { var _this = this; setTimeout((/** * @return {?} */ function () { _this.renderer.removeChild(_this.element, ripple); }), this.rippleDuration); }; /** * @param {?} element * @return {?} */ RippleDirective.prototype.getOffset = /** * @param {?} element * @return {?} */ function (element) { /** @type {?} */ var rect = element.getBoundingClientRect(); /** @type {?} */ var top = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; /** @type {?} */ var left = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; /** @type {?} */ var offset = { left: rect.left + left, top: rect.top + top }; return offset; }; RippleDirective.decorators = [ { type: Directive, args: [{ selector: "[" + config.components.prefix + "Ripple]" },] } ]; /** @nocollapse */ RippleDirective.ctorParameters = function () { return [ { type: ElementRef }, { type: Renderer2 } ]; }; RippleDirective.propDecorators = { rippleDuration: [{ type: Input }], isRippleActive: [{ type: Input }], isRippleCenter: [{ type: Input }], createRipple: [{ type: HostListener, args: ['mousedown', ['$event'],] }] }; return RippleDirective; }()); export { RippleDirective }; if (false) { /** @type {?} */ RippleDirective.prototype.rippleDuration; /** @type {?} */ RippleDirective.prototype.isRippleActive; /** @type {?} */ RippleDirective.prototype.isRippleCenter; /** * @type {?} * @private */ RippleDirective.prototype.element; /** * @type {?} * @private */ RippleDirective.prototype.prefix; /** * @type {?} * @private */ RippleDirective.prototype.elementRef; /** * @type {?} * @private */ RippleDirective.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmlwcGxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL21hdGVyaWFsaXplLWFuZ3VsYXIvIiwic291cmNlcyI6WyJhcHAvY29tcGxldGVkLWNvbXBvbmVudHMvY29tbW9uL3JpcHBsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQzs7OztBQUV0Qyx5QkFHQzs7O0lBRkMsdUJBQVU7O0lBQ1YsdUJBQVU7O0FBR1o7SUFXRSx5QkFBb0IsVUFBc0IsRUFBVSxRQUFtQjtRQUFuRCxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQVA5RCxtQkFBYyxHQUFHLEdBQUcsQ0FBQztRQUNyQixtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN0QixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUd4QixXQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFHeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQU0sSUFBSSxDQUFDLE1BQU0sb0JBQWtCLENBQUMsQ0FBQztJQUMxRSxDQUFDOzs7O0lBRUQsa0NBQVE7OztJQUFSO1FBQ0UsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFV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V0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUM7O1lBQzlGLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUM7O1lBRWpHLE1BQU0sR0FBRztZQUNiLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7WUFDdEIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRztTQUNwQjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O2dCQXBIRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLE1BQUssTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLFlBQVU7aUJBQ2xEOzs7O2dCQVZtQixVQUFVO2dCQUErQixTQUFTOzs7aUNBWW5FLEtBQUs7aUNBQ0wsS0FBSztpQ0FDTCxLQUFLOytCQWtCTCxZQUFZLFNBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDOztJQTZGdkMsc0JBQUM7Q0FBQSxBQXJIRCxJQXFIQztTQWxIWSxlQUFlOzs7SUFDMUIseUNBQThCOztJQUM5Qix5Q0FBK0I7O0lBQy9CLHlDQUFnQzs7Ozs7SUFFaEMsa0NBQTZCOzs7OztJQUM3QixpQ0FBMEM7Ozs7O0lBRTlCLHFDQUE4Qjs7Ozs7SUFBRSxtQ0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjb25maWcgfSBmcm9tICcuLi8uLi9jb25maWcnO1xuXG5pbnRlcmZhY2UgQ29vcmRpbmF0ZSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6IGBbJHsgY29uZmlnLmNvbXBvbmVudHMucHJlZml4IH1SaXBwbGVdYFxufSlcbmV4cG9ydCBjbGFzcyBSaXBwbGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSByaXBwbGVEdXJhdGlvbiA9IDUwMDtcbiAgQElucHV0KCkgaXNSaXBwbGVBY3RpdmUgPSB0cnVlO1xuICBASW5wdXQoKSBpc1JpcHBsZUNlbnRlciA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcHJlZml4ID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7XG4gICAgdGhpcy5jcmVhdGVSaXBwbGUgPSB0aGlzLmNyZWF0ZVJpcHBsZS5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsIGAkeyB0aGlzLnByZWZpeCB9LXJpcHBsZS1lbGVtZW50YCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoIXRoaXMuaXNSaXBwbGVBY3RpdmUpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50LCAnZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdtb3VzZWRvd24nLCBbJyRldmVudCddKVxuICBjcmVhdGVSaXBwbGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1JpcHBsZUFjdGl2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gdGhpcy5pc1JpcHBsZUNlbnRlclxuICAgICAgPyB0aGlzLmdldENvb3JkaW5hdGVzQnlDZW50ZXIoKVxuICAgICAgOiB0aGlzLmdldENvb3JkaW5hdGVzQnlFdmVudChldmVudCk7XG5cbiAgICBjb25zdCByYWRpbyA9IHRoaXMuZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZXMpO1xuXG4gICAgdGhpcy5yZW5kZXJSaXBwbGUocmFkaW8sIGNvb3JkaW5hdGVzKTtcbiAgfVxuXG4gIHJlbmRlclJpcHBsZShyYWRpbzogbnVtYmVyLCBjb29yZGluYXRlOiBDb29yZGluYXRlKSB7XG4gICAgY29uc3QgcmlwcGxlID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCBjZW50ZXJZID0gY29vcmRpbmF0ZS55IC0gcmFkaW87XG4gICAgY29uc3QgY2VudGVyWCA9IGNvb3JkaW5hdGUueCAtIHJhZGlvO1xuXG4gICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhyaXBwbGUsICdyaXBwbGUnKTtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnaGVpZ2h0JywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3dpZHRoJywgYCR7IHJhZGlvICogMiB9cHhgKTtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RvcCcsIGAkeyBjZW50ZXJZIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUocmlwcGxlLCAnbGVmdCcsIGAkeyBjZW50ZXJYIH1weGApO1xuICAgIHRoaXMucmVuZGVyZXIuaW5zZXJ0QmVmb3JlKHRoaXMuZWxlbWVudCwgcmlwcGxlLCB0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk7XG5cbiAgICB0aGlzLnNjYWxlUmlwcGxlKHJpcHBsZSk7XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5Q2VudGVyKCkge1xuICAgIGNvbnN0IHsgb2Zmc2V0SGVpZ2h0LCBvZmZzZXRXaWR0aCB9ID0gdGhpcy5lbGVtZW50O1xuICAgIGNvbnN0IHkgPSBvZmZzZXRIZWlnaHQgLyAyO1xuICAgIGNvbnN0IHggPSBvZmZzZXRXaWR0aCAvIDI7XG5cbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH1cblxuICBnZXRDb29yZGluYXRlc0J5RXZlbnQoZXZlbnQ6IGFueSk6IENvb3JkaW5hdGUge1xuICAgIGNvbnN0IG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0KHRoaXMuZWxlbWVudCk7XG5cbiAgICBjb25zdCB5ID0gZXZlbnQucGFnZVkgLSBvZmZzZXQudG9wO1xuICAgIGNvbnN0IHggPSBldmVudC5wYWdlWCAtIG9mZnNldC5sZWZ0O1xuXG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgZ2V0UmlwcGxlUmFkaW8oY29vcmRpbmF0ZTogQ29vcmRpbmF0ZSk6IG51bWJlciB7XG4gICAgY29uc3QgaGVpZ2h0ID0gTWF0aC5tYXgodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIGNvb3JkaW5hdGUueSwgY29vcmRpbmF0ZS55KTtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIGNvb3JkaW5hdGUueCwgY29vcmRpbmF0ZS54KTtcblxuICAgIGNvbnN0IHJhZGlvID0gTWF0aC5oeXBvdChoZWlnaHQsIHdpZHRoKTtcblxuICAgIHJldHVybiByYWRpbztcbiAgfVxuXG4gIHNjYWxlUmlwcGxlKHJpcHBsZTogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJpcHBsZS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSBgJHsgdGhpcy5yaXBwbGVEdXJhdGlvbiB9bXNgO1xuICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7XG5cbiAgICAgIHRoaXMuaGlkZVJpcHBsZShyaXBwbGUpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgaGlkZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHJpcHBsZSwgJ3RyYW5zaXRpb25EdXJhdGlvbicsIGAkeyB0aGlzLnJpcHBsZUR1cmF0aW9uIH1tc2ApO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShyaXBwbGUsICdvcGFjaXR5JywgJzAnKTtcblxuICAgICAgdGhpcy5yZW1vdmVSaXBwbGUocmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIHJlbW92ZVJpcHBsZShyaXBwbGU6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKHRoaXMuZWxlbWVudCwgcmlwcGxlKTtcbiAgICB9LCB0aGlzLnJpcHBsZUR1cmF0aW9uKTtcbiAgfVxuXG4gIGdldE9mZnNldChlbGVtZW50OiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wIHx8IDA7XG4gICAgY29uc3QgbGVmdCA9IHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgfHwgMDtcblxuICAgIGNvbnN0IG9mZnNldCA9IHtcbiAgICAgIGxlZnQ6IHJlY3QubGVmdCArIGxlZnQsXG4gICAgICB0b3A6IHJlY3QudG9wICsgdG9wXG4gICAgfTtcblxuICAgIHJldHVybiBvZmZzZXQ7XG4gIH1cbn1cbiJdfQ==