UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

244 lines (237 loc) 10 kB
import { Platform, PlatformModule } from '@angular/cdk/platform'; import * as i0 from '@angular/core'; import { InjectionToken, PLATFORM_ID, Directive, Optional, Inject, Input, NgModule } from '@angular/core'; import { ANIMATION_MODULE_TYPE } from '@angular/platform-browser/animations'; /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzWaveRenderer { constructor(triggerElement, ngZone, insertExtraNode, platformId) { this.triggerElement = triggerElement; this.ngZone = ngZone; this.insertExtraNode = insertExtraNode; this.platformId = platformId; this.waveTransitionDuration = 400; this.styleForPseudo = null; this.extraNode = null; this.lastTime = 0; this.onClick = (event) => { if (!this.triggerElement || !this.triggerElement.getAttribute || this.triggerElement.getAttribute('disabled') || event.target.tagName === 'INPUT' || this.triggerElement.className.indexOf('disabled') >= 0) { return; } this.fadeOutWave(); }; this.platform = new Platform(this.platformId); this.clickHandler = this.onClick.bind(this); this.bindTriggerEvent(); } get waveAttributeName() { return this.insertExtraNode ? 'ant-click-animating' : 'ant-click-animating-without-extra-node'; } bindTriggerEvent() { if (this.platform.isBrowser) { this.ngZone.runOutsideAngular(() => { this.removeTriggerEvent(); if (this.triggerElement) { this.triggerElement.addEventListener('click', this.clickHandler, true); } }); } } removeTriggerEvent() { if (this.triggerElement) { this.triggerElement.removeEventListener('click', this.clickHandler, true); } } removeStyleAndExtraNode() { if (this.styleForPseudo && document.body.contains(this.styleForPseudo)) { document.body.removeChild(this.styleForPseudo); this.styleForPseudo = null; } if (this.insertExtraNode && this.triggerElement.contains(this.extraNode)) { this.triggerElement.removeChild(this.extraNode); } } destroy() { this.removeTriggerEvent(); this.removeStyleAndExtraNode(); } fadeOutWave() { const node = this.triggerElement; const waveColor = this.getWaveColor(node); node.setAttribute(this.waveAttributeName, 'true'); if (Date.now() < this.lastTime + this.waveTransitionDuration) { return; } if (this.isValidColor(waveColor)) { if (!this.styleForPseudo) { this.styleForPseudo = document.createElement('style'); } this.styleForPseudo.innerHTML = ` [ant-click-animating-without-extra-node='true']::after, .ant-click-animating-node { --antd-wave-shadow-color: ${waveColor}; }`; document.body.appendChild(this.styleForPseudo); } if (this.insertExtraNode) { if (!this.extraNode) { this.extraNode = document.createElement('div'); } this.extraNode.className = 'ant-click-animating-node'; node.appendChild(this.extraNode); } this.lastTime = Date.now(); this.runTimeoutOutsideZone(() => { node.removeAttribute(this.waveAttributeName); this.removeStyleAndExtraNode(); }, this.waveTransitionDuration); } isValidColor(color) { return (!!color && color !== '#ffffff' && color !== 'rgb(255, 255, 255)' && this.isNotGrey(color) && !/rgba\(\d*, \d*, \d*, 0\)/.test(color) && color !== 'transparent'); } isNotGrey(color) { const match = color.match(/rgba?\((\d*), (\d*), (\d*)(, [\.\d]*)?\)/); if (match && match[1] && match[2] && match[3]) { return !(match[1] === match[2] && match[2] === match[3]); } return true; } getWaveColor(node) { const nodeStyle = getComputedStyle(node); return (nodeStyle.getPropertyValue('border-top-color') || // Firefox Compatible nodeStyle.getPropertyValue('border-color') || nodeStyle.getPropertyValue('background-color')); } runTimeoutOutsideZone(fn, delay) { this.ngZone.runOutsideAngular(() => setTimeout(fn, delay)); } } /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ const NZ_WAVE_GLOBAL_DEFAULT_CONFIG = { disabled: false }; const NZ_WAVE_GLOBAL_CONFIG = new InjectionToken('nz-wave-global-options', { providedIn: 'root', factory: NZ_WAVE_GLOBAL_CONFIG_FACTORY }); function NZ_WAVE_GLOBAL_CONFIG_FACTORY() { return NZ_WAVE_GLOBAL_DEFAULT_CONFIG; } class NzWaveDirective { constructor(ngZone, elementRef, config, animationType, platformId) { this.ngZone = ngZone; this.elementRef = elementRef; this.config = config; this.animationType = animationType; this.platformId = platformId; this.nzWaveExtraNode = false; this.waveDisabled = false; this.waveDisabled = this.isConfigDisabled(); } get disabled() { return this.waveDisabled; } get rendererRef() { return this.waveRenderer; } isConfigDisabled() { let disabled = false; if (this.config && typeof this.config.disabled === 'boolean') { disabled = this.config.disabled; } if (this.animationType === 'NoopAnimations') { disabled = true; } return disabled; } ngOnDestroy() { if (this.waveRenderer) { this.waveRenderer.destroy(); } } ngOnInit() { this.renderWaveIfEnabled(); } renderWaveIfEnabled() { if (!this.waveDisabled && this.elementRef.nativeElement) { this.waveRenderer = new NzWaveRenderer(this.elementRef.nativeElement, this.ngZone, this.nzWaveExtraNode, this.platformId); } } disable() { this.waveDisabled = true; if (this.waveRenderer) { this.waveRenderer.removeTriggerEvent(); this.waveRenderer.removeStyleAndExtraNode(); } } enable() { // config priority this.waveDisabled = this.isConfigDisabled() || false; if (this.waveRenderer) { this.waveRenderer.bindTriggerEvent(); } } } NzWaveDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveDirective, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: NZ_WAVE_GLOBAL_CONFIG, optional: true }, { token: ANIMATION_MODULE_TYPE, optional: true }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Directive }); NzWaveDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.5", type: NzWaveDirective, selector: "[nz-wave],button[nz-button]:not([nzType=\"link\"]):not([nzType=\"text\"])", inputs: { nzWaveExtraNode: "nzWaveExtraNode" }, exportAs: ["nzWave"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveDirective, decorators: [{ type: Directive, args: [{ selector: '[nz-wave],button[nz-button]:not([nzType="link"]):not([nzType="text"])', exportAs: 'nzWave' }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [NZ_WAVE_GLOBAL_CONFIG] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [ANIMATION_MODULE_TYPE] }] }, { type: undefined, decorators: [{ type: Inject, args: [PLATFORM_ID] }] }]; }, propDecorators: { nzWaveExtraNode: [{ type: Input }] } }); /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ class NzWaveModule { } NzWaveModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); NzWaveModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveModule, declarations: [NzWaveDirective], imports: [PlatformModule], exports: [NzWaveDirective] }); NzWaveModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveModule, imports: [[PlatformModule]] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.5", ngImport: i0, type: NzWaveModule, decorators: [{ type: NgModule, args: [{ imports: [PlatformModule], exports: [NzWaveDirective], declarations: [NzWaveDirective] }] }] }); /** * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ /** * Generated bundle index. Do not edit. */ export { NZ_WAVE_GLOBAL_CONFIG, NZ_WAVE_GLOBAL_CONFIG_FACTORY, NZ_WAVE_GLOBAL_DEFAULT_CONFIG, NzWaveDirective, NzWaveModule, NzWaveRenderer }; //# sourceMappingURL=ng-zorro-antd-core-wave.mjs.map