mirror of https://github.com/ghostfolio/ghostfolio
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
144 lines
4.9 KiB
144 lines
4.9 KiB
import * as i0 from '@angular/core';
|
|
import { inject, DOCUMENT, NgZone, Injector, RendererFactory2, Injectable } from '@angular/core';
|
|
import { Platform, _getEventTarget } from '@angular/cdk/platform';
|
|
import { _animationsDisabled } from './_animation-chunk.mjs';
|
|
import { MAT_RIPPLE_GLOBAL_OPTIONS, RippleRenderer, defaultRippleAnimationConfig } from './_ripple-chunk.mjs';
|
|
|
|
const eventListenerOptions = {
|
|
capture: true
|
|
};
|
|
const rippleInteractionEvents = ['focus', 'mousedown', 'mouseenter', 'touchstart'];
|
|
const matRippleUninitialized = 'mat-ripple-loader-uninitialized';
|
|
const matRippleClassName = 'mat-ripple-loader-class-name';
|
|
const matRippleCentered = 'mat-ripple-loader-centered';
|
|
const matRippleDisabled = 'mat-ripple-loader-disabled';
|
|
class MatRippleLoader {
|
|
_document = inject(DOCUMENT);
|
|
_animationsDisabled = _animationsDisabled();
|
|
_globalRippleOptions = inject(MAT_RIPPLE_GLOBAL_OPTIONS, {
|
|
optional: true
|
|
});
|
|
_platform = inject(Platform);
|
|
_ngZone = inject(NgZone);
|
|
_injector = inject(Injector);
|
|
_eventCleanups;
|
|
_hosts = new Map();
|
|
constructor() {
|
|
const renderer = inject(RendererFactory2).createRenderer(null, null);
|
|
this._eventCleanups = this._ngZone.runOutsideAngular(() => rippleInteractionEvents.map(name => renderer.listen(this._document, name, this._onInteraction, eventListenerOptions)));
|
|
}
|
|
ngOnDestroy() {
|
|
const hosts = this._hosts.keys();
|
|
for (const host of hosts) {
|
|
this.destroyRipple(host);
|
|
}
|
|
this._eventCleanups.forEach(cleanup => cleanup());
|
|
}
|
|
configureRipple(host, config) {
|
|
host.setAttribute(matRippleUninitialized, this._globalRippleOptions?.namespace ?? '');
|
|
if (config.className || !host.hasAttribute(matRippleClassName)) {
|
|
host.setAttribute(matRippleClassName, config.className || '');
|
|
}
|
|
if (config.centered) {
|
|
host.setAttribute(matRippleCentered, '');
|
|
}
|
|
if (config.disabled) {
|
|
host.setAttribute(matRippleDisabled, '');
|
|
}
|
|
}
|
|
setDisabled(host, disabled) {
|
|
const ripple = this._hosts.get(host);
|
|
if (ripple) {
|
|
ripple.target.rippleDisabled = disabled;
|
|
if (!disabled && !ripple.hasSetUpEvents) {
|
|
ripple.hasSetUpEvents = true;
|
|
ripple.renderer.setupTriggerEvents(host);
|
|
}
|
|
} else if (disabled) {
|
|
host.setAttribute(matRippleDisabled, '');
|
|
} else {
|
|
host.removeAttribute(matRippleDisabled);
|
|
}
|
|
}
|
|
_onInteraction = event => {
|
|
const eventTarget = _getEventTarget(event);
|
|
if (eventTarget instanceof HTMLElement) {
|
|
const element = eventTarget.closest(`[${matRippleUninitialized}="${this._globalRippleOptions?.namespace ?? ''}"]`);
|
|
if (element) {
|
|
this._createRipple(element);
|
|
}
|
|
}
|
|
};
|
|
_createRipple(host) {
|
|
if (!this._document || this._hosts.has(host)) {
|
|
return;
|
|
}
|
|
host.querySelector('.mat-ripple')?.remove();
|
|
const rippleEl = this._document.createElement('span');
|
|
rippleEl.classList.add('mat-ripple', host.getAttribute(matRippleClassName));
|
|
host.append(rippleEl);
|
|
const globalOptions = this._globalRippleOptions;
|
|
const enterDuration = this._animationsDisabled ? 0 : globalOptions?.animation?.enterDuration ?? defaultRippleAnimationConfig.enterDuration;
|
|
const exitDuration = this._animationsDisabled ? 0 : globalOptions?.animation?.exitDuration ?? defaultRippleAnimationConfig.exitDuration;
|
|
const target = {
|
|
rippleDisabled: this._animationsDisabled || globalOptions?.disabled || host.hasAttribute(matRippleDisabled),
|
|
rippleConfig: {
|
|
centered: host.hasAttribute(matRippleCentered),
|
|
terminateOnPointerUp: globalOptions?.terminateOnPointerUp,
|
|
animation: {
|
|
enterDuration,
|
|
exitDuration
|
|
}
|
|
}
|
|
};
|
|
const renderer = new RippleRenderer(target, this._ngZone, rippleEl, this._platform, this._injector);
|
|
const hasSetUpEvents = !target.rippleDisabled;
|
|
if (hasSetUpEvents) {
|
|
renderer.setupTriggerEvents(host);
|
|
}
|
|
this._hosts.set(host, {
|
|
target,
|
|
renderer,
|
|
hasSetUpEvents
|
|
});
|
|
host.removeAttribute(matRippleUninitialized);
|
|
}
|
|
destroyRipple(host) {
|
|
const ripple = this._hosts.get(host);
|
|
if (ripple) {
|
|
ripple.renderer._removeTriggerEvents();
|
|
this._hosts.delete(host);
|
|
}
|
|
}
|
|
static ɵfac = i0.ɵɵngDeclareFactory({
|
|
minVersion: "12.0.0",
|
|
version: "21.0.3",
|
|
ngImport: i0,
|
|
type: MatRippleLoader,
|
|
deps: [],
|
|
target: i0.ɵɵFactoryTarget.Injectable
|
|
});
|
|
static ɵprov = i0.ɵɵngDeclareInjectable({
|
|
minVersion: "12.0.0",
|
|
version: "21.0.3",
|
|
ngImport: i0,
|
|
type: MatRippleLoader,
|
|
providedIn: 'root'
|
|
});
|
|
}
|
|
i0.ɵɵngDeclareClassMetadata({
|
|
minVersion: "12.0.0",
|
|
version: "21.0.3",
|
|
ngImport: i0,
|
|
type: MatRippleLoader,
|
|
decorators: [{
|
|
type: Injectable,
|
|
args: [{
|
|
providedIn: 'root'
|
|
}]
|
|
}],
|
|
ctorParameters: () => []
|
|
});
|
|
|
|
export { MatRippleLoader };
|
|
//# sourceMappingURL=_ripple-loader-chunk.mjs.map
|
|
|