@xosue-utils/services 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,63 +1,15 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { input, booleanAttribute, computed, Component, PLATFORM_ID, Inject, Injectable, InjectionToken, inject, ChangeDetectorRef, HostListener, ViewChild, Input, ChangeDetectionStrategy, SimpleChange, signal } from '@angular/core';
|
|
3
|
+
import { LucideDynamicIcon } from '@lucide/angular';
|
|
3
4
|
import * as i2 from '@angular/common';
|
|
4
5
|
import { isPlatformBrowser, CommonModule } from '@angular/common';
|
|
5
6
|
import { Subject, BehaviorSubject } from 'rxjs';
|
|
6
7
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
7
|
-
import { LucideDynamicIcon } from '@lucide/angular';
|
|
8
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
9
|
import { DomSanitizer } from '@angular/platform-browser';
|
|
10
10
|
import * as i3 from '@angular/router';
|
|
11
11
|
import { RouterModule, Router, NavigationStart, NavigationEnd, NavigationCancel, NavigationError } from '@angular/router';
|
|
12
12
|
|
|
13
|
-
class AlertService {
|
|
14
|
-
platformId;
|
|
15
|
-
alertSubject = new Subject();
|
|
16
|
-
alert$ = this.alertSubject.asObservable();
|
|
17
|
-
idCounter = 0;
|
|
18
|
-
isBrowser;
|
|
19
|
-
constructor(platformId) {
|
|
20
|
-
this.platformId = platformId;
|
|
21
|
-
this.isBrowser = isPlatformBrowser(this.platformId);
|
|
22
|
-
}
|
|
23
|
-
showAlert(message) {
|
|
24
|
-
if (!this.isBrowser)
|
|
25
|
-
return Promise.resolve(false);
|
|
26
|
-
return new Promise((resolve) => {
|
|
27
|
-
const alert = {
|
|
28
|
-
id: ++this.idCounter,
|
|
29
|
-
message,
|
|
30
|
-
mode: 'normal',
|
|
31
|
-
resolve,
|
|
32
|
-
};
|
|
33
|
-
this.alertSubject.next(alert);
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
showConfirm(message, options) {
|
|
37
|
-
if (!this.isBrowser)
|
|
38
|
-
return Promise.resolve(false);
|
|
39
|
-
return new Promise((resolve) => {
|
|
40
|
-
const alert = {
|
|
41
|
-
id: ++this.idCounter,
|
|
42
|
-
message,
|
|
43
|
-
mode: 'actions',
|
|
44
|
-
resolve,
|
|
45
|
-
onAcceptClick: options?.onAcceptClick,
|
|
46
|
-
};
|
|
47
|
-
this.alertSubject.next(alert);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
51
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, providedIn: 'root' });
|
|
52
|
-
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, decorators: [{
|
|
54
|
-
type: Injectable,
|
|
55
|
-
args: [{ providedIn: 'root' }]
|
|
56
|
-
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
57
|
-
type: Inject,
|
|
58
|
-
args: [PLATFORM_ID]
|
|
59
|
-
}] }] });
|
|
60
|
-
|
|
61
13
|
/**
|
|
62
14
|
* Icono Lucide.
|
|
63
15
|
*
|
|
@@ -126,6 +78,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
|
|
|
126
78
|
}]
|
|
127
79
|
}] });
|
|
128
80
|
|
|
81
|
+
class AlertService {
|
|
82
|
+
platformId;
|
|
83
|
+
alertSubject = new Subject();
|
|
84
|
+
alert$ = this.alertSubject.asObservable();
|
|
85
|
+
idCounter = 0;
|
|
86
|
+
isBrowser;
|
|
87
|
+
constructor(platformId) {
|
|
88
|
+
this.platformId = platformId;
|
|
89
|
+
this.isBrowser = isPlatformBrowser(this.platformId);
|
|
90
|
+
}
|
|
91
|
+
showAlert(message) {
|
|
92
|
+
if (!this.isBrowser)
|
|
93
|
+
return Promise.resolve(false);
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
const alert = {
|
|
96
|
+
id: ++this.idCounter,
|
|
97
|
+
message,
|
|
98
|
+
mode: 'normal',
|
|
99
|
+
resolve,
|
|
100
|
+
};
|
|
101
|
+
this.alertSubject.next(alert);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
showConfirm(message, options) {
|
|
105
|
+
if (!this.isBrowser)
|
|
106
|
+
return Promise.resolve(false);
|
|
107
|
+
return new Promise((resolve) => {
|
|
108
|
+
const alert = {
|
|
109
|
+
id: ++this.idCounter,
|
|
110
|
+
message,
|
|
111
|
+
mode: 'actions',
|
|
112
|
+
resolve,
|
|
113
|
+
onAcceptClick: options?.onAcceptClick,
|
|
114
|
+
};
|
|
115
|
+
this.alertSubject.next(alert);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, deps: [{ token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
119
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, providedIn: 'root' });
|
|
120
|
+
}
|
|
121
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: AlertService, decorators: [{
|
|
122
|
+
type: Injectable,
|
|
123
|
+
args: [{ providedIn: 'root' }]
|
|
124
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
125
|
+
type: Inject,
|
|
126
|
+
args: [PLATFORM_ID]
|
|
127
|
+
}] }] });
|
|
128
|
+
|
|
129
129
|
const XOSUE_UTILS_SERVICES_DEFAULTS = {
|
|
130
130
|
alertAcceptLabel: 'Aceptar',
|
|
131
131
|
alertCancelLabel: 'Cancelar',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xosue-utils-services.mjs","sources":["../../src/lib/alert-service/alert.service.ts","../../src/vendor/lucide-icon/lucide-icon.component.ts","../../src/config/services-config.ts","../../src/lib/alert-service/alert-service.component.ts","../../src/lib/alert-service/alert-service.component.html","../../src/lib/toast-service/toast.service.ts","../../src/lib/toast-service/toast-service.component.ts","../../src/lib/toast-service/toast-service.component.html","../../src/lib/context-menu-service/context-menu.service.ts","../../src/lib/context-menu-service/context-menu-service.component.ts","../../src/lib/context-menu-service/context-menu-service.component.html","../../src/lib/field-help-tooltip/field-help-tooltip.component.ts","../../src/lib/field-help-tooltip/field-help-tooltip.component.html","../../src/lib/media-viewer-service/media-viewer.service.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.html","../../src/lib/media-viewer-service/items/video-player/video-player.component.ts","../../src/lib/media-viewer-service/items/video-player/video-player.component.html","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.ts","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.html","../../src/lib/media-viewer-service/media-viewer-service.component.ts","../../src/lib/media-viewer-service/media-viewer-service.component.html","../../src/lib/session-request-service/session-request.service.ts","../../src/lib/session-request-service/session-request-service.component.ts","../../src/lib/session-request-service/session-request-service.component.html","../../src/lib/global-loading-service/global-loading.service.ts","../../src/lib/global-loading-service/global-loading-service.component.ts","../../src/lib/global-loading-service/global-loading-service.component.html","../../src/lib/navigation-loading/navigation-loading.service.ts","../../src/lib/navigation-loading/navigation-loading-service.component.ts","../../src/lib/navigation-loading/navigation-loading-service.component.html","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay.service.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.html","../../src/lib/browser-notification/browser-notification.service.ts","../../src/public-api.ts","../../src/xosue-utils-services.ts"],"sourcesContent":["import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport type AlertMode = 'normal' | 'actions';\r\n\r\nexport type AlertConfirmOptions = {\r\n /** Se ejecuta en el mismo tick del clic en Aceptar (p. ej. Notification.requestPermission). */\r\n onAcceptClick?: () => void;\r\n};\r\n\r\nexport interface AlertMessage {\r\n id: number;\r\n message: string;\r\n mode: AlertMode;\r\n resolve: (value: boolean) => void;\r\n onAcceptClick?: () => void;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AlertService {\r\n private alertSubject = new Subject<AlertMessage>();\r\n alert$ = this.alertSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showAlert(message: string): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'normal',\r\n resolve,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n\r\n showConfirm(message: string, options?: AlertConfirmOptions): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'actions',\r\n resolve,\r\n onAcceptClick: options?.onAcceptClick,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n}\r\n","import { booleanAttribute, Component, computed, input } from '@angular/core';\r\nimport { LucideDynamicIcon } from '@lucide/angular';\r\n\r\n/**\r\n * Icono Lucide.\r\n *\r\n * HTML:\r\n * <lucide-icon name=\"star\"></lucide-icon>\r\n * <lucide-icon name=\"heart\" filled></lucide-icon> // relleno + trazo\r\n *\r\n * SASS — variables CSS (heredan del padre):\r\n * --lucide-stroke: var(--primary)\r\n * --lucide-fill: var(--accent)\r\n * --lucide-stroke-width: 2\r\n */\r\n@Component({\r\n selector: 'lucide-icon',\r\n standalone: true,\r\n imports: [LucideDynamicIcon],\r\n host: {\r\n '[class.lucide-icon--filled]': 'filled()',\r\n '[attr.filled]': 'filled() ? \"\" : null',\r\n },\r\n template: `\r\n <svg\r\n class=\"lucide-svg inline-block shrink-0 align-middle\"\r\n [class.lucide-svg--filled]=\"filled()\"\r\n [class.animate-spin]=\"spin()\"\r\n [style.width]=\"dimStyle()?.width\"\r\n [style.height]=\"dimStyle()?.height\"\r\n [lucideIcon]=\"name()\"\r\n aria-hidden=\"true\"\r\n />\r\n `,\r\n})\r\nexport class LucideIconComponent {\r\n readonly name = input.required<string>();\r\n readonly size = input<number | string | undefined>(undefined);\r\n readonly spin = input(false, { transform: booleanAttribute });\r\n /** Activa relleno (--lucide-fill); el trazo se conserva. */\r\n readonly filled = input(false, { transform: booleanAttribute });\r\n\r\n readonly dimStyle = computed(() => {\r\n const s = this.size();\r\n if (s === undefined || s === null || s === '') return null;\r\n if (typeof s === 'number') {\r\n return { width: `${s}px`, height: `${s}px` };\r\n }\r\n const trimmed = String(s).trim();\r\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\r\n return { width: `${trimmed}px`, height: `${trimmed}px` };\r\n }\r\n return { width: trimmed, height: trimmed };\r\n });\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport type ToastDurationKey = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface XosueUtilsServicesConfig {\r\n /** i18n / labels */\r\n alertAcceptLabel?: string;\r\n alertCancelLabel?: string;\r\n loadingDefaultMessage?: string;\r\n sessionRegisterPath?: string;\r\n sessionLoginPath?: string;\r\n sessionRegisterLabel?: string;\r\n sessionLoginLabel?: string;\r\n /** toast assets (absolute or app-root relative) */\r\n toastSoundUrl?: string;\r\n toastErrorSoundUrl?: string;\r\n toastSuccessGifUrl?: string;\r\n toastDurationsMs?: Partial<Record<ToastDurationKey, number>>;\r\n /** media viewer */\r\n mediaFileNameFallback?: string;\r\n /** browser notification */\r\n browserNotificationIconUrl?: string;\r\n browserNotificationSoundUrl?: string;\r\n browserNotificationPermissionPrompt?: string;\r\n}\r\n\r\nexport const XOSUE_UTILS_SERVICES_DEFAULTS: Required<\r\n Omit<XosueUtilsServicesConfig, 'toastDurationsMs' | 'toastSuccessGifUrl'>\r\n> & {\r\n toastSuccessGifUrl: string;\r\n toastDurationsMs: Record<ToastDurationKey, number>;\r\n} = {\r\n alertAcceptLabel: 'Aceptar',\r\n alertCancelLabel: 'Cancelar',\r\n loadingDefaultMessage: 'Cargando',\r\n sessionRegisterPath: '/auth/register',\r\n sessionLoginPath: '/auth/login',\r\n sessionRegisterLabel: 'Registrarse',\r\n sessionLoginLabel: 'Iniciar Sesión',\r\n toastSoundUrl: '/sounds/toast.mp3',\r\n toastErrorSoundUrl: '/sounds/error-toast.mp3',\r\n toastSuccessGifUrl: '/gifs/success-toast.gif',\r\n toastDurationsMs: {\r\n success: 1000,\r\n info: 1000,\r\n warning: 5000,\r\n error: 5000,\r\n },\r\n mediaFileNameFallback: 'Archivo',\r\n browserNotificationIconUrl: '/favicon.ico',\r\n browserNotificationSoundUrl: '/sounds/toast.mp3',\r\n browserNotificationPermissionPrompt:\r\n '¿Permitir notificaciones del navegador para avisarte cuando no estés en la pestaña?',\r\n};\r\n\r\nexport type ResolvedXosueUtilsServicesConfig = typeof XOSUE_UTILS_SERVICES_DEFAULTS;\r\n\r\nexport const XOSUE_UTILS_SERVICES_CONFIG = new InjectionToken<ResolvedXosueUtilsServicesConfig>(\r\n 'XOSUE_UTILS_SERVICES_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({ ...XOSUE_UTILS_SERVICES_DEFAULTS }),\r\n },\r\n);\r\n\r\nexport function resolveXosueUtilsServicesConfig(\r\n config?: XosueUtilsServicesConfig,\r\n): ResolvedXosueUtilsServicesConfig {\r\n return {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS,\r\n ...config,\r\n toastDurationsMs: {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS.toastDurationsMs,\r\n ...config?.toastDurationsMs,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Provide overlay services configuration in the host app.\r\n *\r\n * ```ts\r\n * providers: [\r\n * provideXosueUtilsServices({\r\n * sessionLoginPath: '/login',\r\n * toastSoundUrl: '/assets/sounds/toast.mp3',\r\n * }),\r\n * ]\r\n * ```\r\n */\r\nexport function provideXosueUtilsServices(config?: XosueUtilsServicesConfig): Provider[] {\r\n return [\r\n {\r\n provide: XOSUE_UTILS_SERVICES_CONFIG,\r\n useValue: resolveXosueUtilsServicesConfig(config),\r\n },\r\n ];\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertMessage, AlertService } from './alert.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'alert-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './alert-service.component.html',\r\n styleUrls: ['./alert-service.component.sass'],\r\n animations: [\r\n trigger('alertAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class AlertServiceComponent implements OnInit {\r\n alerts: AlertMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private alertService: AlertService) {}\r\n\r\n ngOnInit(): void {\r\n this.alertService.alert$.subscribe((alert) => {\r\n this.alerts.push(alert);\r\n });\r\n }\r\n\r\n removeAlert(id: number): void {\r\n this.alerts = this.alerts.filter((a) => a.id !== id);\r\n }\r\n\r\n accept(alert: AlertMessage): void {\r\n try {\r\n alert.onAcceptClick?.();\r\n } catch {\r\n /* ignore */\r\n }\r\n alert.resolve(true);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n cancel(alert: AlertMessage): void {\r\n alert.resolve(false);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n trackById(_index: number, item: AlertMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"AlertOverlay\" *ngIf=\"alerts.length > 0\">\r\n <div\r\n class=\"Alert\"\r\n *ngFor=\"let alert of alerts; trackBy: trackById\"\r\n [@alertAnimation]\r\n >\r\n <div class=\"AlertContent\">\r\n <div class=\"AlertIcon\">\r\n <lucide-icon name=\"circle-alert\"></lucide-icon>\r\n </div>\r\n <div class=\"AlertMessage\">\r\n {{ alert.message }}\r\n </div>\r\n <div class=\"AlertActions\">\r\n <button\r\n *ngIf=\"alert.mode === 'normal'\"\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n <ng-container *ngIf=\"alert.mode === 'actions'\">\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton CancelButton\"\r\n (click)=\"cancel(alert)\"\r\n >\r\n {{ config.alertCancelLabel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID, NgZone, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type ToastType = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface ToastMessage {\r\n id: number;\r\n type: ToastType;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n private toastSubject = new Subject<ToastMessage>();\r\n toast$ = this.toastSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n private ngZone: NgZone,\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showToast(type: ToastType, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const toast: ToastMessage = { id: ++this.idCounter, type, message };\r\n this.toastSubject.next(toast);\r\n this.ngZone.runOutsideAngular(() => this.playSound(type));\r\n }\r\n\r\n private playSound(type: ToastType): void {\r\n if (type === 'info') return;\r\n try {\r\n const src =\r\n type === 'error' ? this.config.toastErrorSoundUrl : this.config.toastSoundUrl;\r\n const audio = new Audio(src);\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToastMessage, ToastService, ToastType } from './toast.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'toast-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './toast-service.component.html',\r\n styleUrls: ['./toast-service.component.sass'],\r\n animations: [\r\n trigger('toastAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(-20px)' }),\r\n animate('300ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('300ms ease-in', style({ opacity: 0, transform: 'translateY(-20px)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class ToastServiceComponent implements OnInit {\r\n toasts: ToastMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private toastService: ToastService) {}\r\n\r\n ngOnInit(): void {\r\n this.toastService.toast$.subscribe((toast) => {\r\n this.toasts.push(toast);\r\n const durationMs = this.config.toastDurationsMs[toast.type as ToastType] ?? 5000;\r\n setTimeout(() => this.removeToast(toast.id), durationMs);\r\n });\r\n }\r\n\r\n successGifSrc(toast: ToastMessage): string {\r\n const base = this.config.toastSuccessGifUrl;\r\n const sep = base.includes('?') ? '&' : '?';\r\n return `${base}${sep}t=${toast.id}`;\r\n }\r\n\r\n removeToast(id: number): void {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: ToastMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"ToastOverlay\">\r\n <div class=\"ToastContainer\">\r\n <div\r\n class=\"Toast\"\r\n *ngFor=\"let toast of toasts; trackBy: trackById\"\r\n [@toastAnimation]\r\n [ngClass]=\"toast.type\"\r\n (click)=\"removeToast(toast.id)\"\r\n >\r\n <div class=\"Icon\" [ngSwitch]=\"toast.type\">\r\n <lucide-icon name=\"info\" *ngSwitchCase=\"'info'\"></lucide-icon>\r\n <lucide-icon name=\"circle-check\" *ngSwitchCase=\"'success'\"></lucide-icon>\r\n <lucide-icon name=\"circle-alert\" *ngSwitchCase=\"'error'\"></lucide-icon>\r\n <lucide-icon name=\"triangle-alert\" *ngSwitchCase=\"'warning'\"></lucide-icon>\r\n <lucide-icon name=\"bell\" *ngSwitchDefault></lucide-icon>\r\n </div>\r\n\r\n <div class=\"Text\">\r\n {{ toast.message }}\r\n </div>\r\n\r\n <img\r\n *ngIf=\"toast.type === 'success' && config.toastSuccessGifUrl\"\r\n class=\"SuccessToastGif\"\r\n [attr.src]=\"successGifSrc(toast)\"\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface ContextMenuOption<T = unknown> {\r\n icon: string;\r\n name: string;\r\n value: T;\r\n /** Estilo destructivo (rojo). */\r\n danger?: boolean;\r\n /** Separador visual antes de esta opción. */\r\n separatorBefore?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface ContextMenuInfo {\r\n icon: string;\r\n title: string;\r\n info: string;\r\n}\r\n\r\nexport type ContextMenuKind = 'menu' | 'info';\r\n\r\ninterface ContextMenuRequestBase {\r\n id: number;\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface ContextMenuMenuRequest extends ContextMenuRequestBase {\r\n kind: 'menu';\r\n title?: string;\r\n options: ContextMenuOption[];\r\n resolve: (value: ContextMenuOption | null) => void;\r\n}\r\n\r\nexport interface ContextMenuInfoRequest extends ContextMenuRequestBase {\r\n kind: 'info';\r\n info: ContextMenuInfo;\r\n resolve: () => void;\r\n}\r\n\r\nexport type ContextMenuRequest = ContextMenuMenuRequest | ContextMenuInfoRequest;\r\n\r\nexport type ContextMenuOpenEvent = MouseEvent | { clientX: number; clientY: number };\r\n\r\nexport interface ContextMenuOpenOptions {\r\n title?: string;\r\n /** Si true (default), evita el menú nativo del navegador cuando el evento es MouseEvent. */\r\n preventDefault?: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ContextMenuService {\r\n private readonly requestSubject = new Subject<ContextMenuRequest>();\r\n readonly request$ = this.requestSubject.asObservable();\r\n\r\n private readonly closeSubject = new Subject<void>();\r\n readonly close$ = this.closeSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /** Menú contextual en el punto del clic. Solo uno activo a la vez. */\r\n openMenu(\r\n event: ContextMenuOpenEvent,\r\n options: ContextMenuOption[],\r\n menuOptions?: ContextMenuOpenOptions,\r\n ): Promise<ContextMenuOption | null> {\r\n if (!this.isBrowser || options.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (event instanceof MouseEvent && menuOptions?.preventDefault !== false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuMenuRequest = {\r\n id: ++this.idCounter,\r\n kind: 'menu',\r\n x,\r\n y,\r\n title: menuOptions?.title,\r\n options,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Globo informativo en el punto del clic. */\r\n openInfo(event: ContextMenuOpenEvent, info: ContextMenuInfo): Promise<void> {\r\n if (!this.isBrowser) return Promise.resolve();\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuInfoRequest = {\r\n id: ++this.idCounter,\r\n kind: 'info',\r\n x,\r\n y,\r\n info,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Cierra el menú contextual activo desde código. */\r\n close(): void {\r\n if (!this.isBrowser) return;\r\n this.closeSubject.next();\r\n }\r\n\r\n private pointFromEvent(event: ContextMenuOpenEvent): { x: number; y: number } {\r\n if ('clientX' in event && 'clientY' in event) {\r\n return { x: event.clientX, y: event.clientY };\r\n }\r\n return { x: 0, y: 0 };\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n PLATFORM_ID,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser, CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n ContextMenuOption,\r\n ContextMenuRequest,\r\n ContextMenuService,\r\n} from './context-menu.service';\r\n\r\n@Component({\r\n selector: 'context-menu-service',\r\n standalone: true,\r\n imports: [CommonModule, LucideIconComponent],\r\n templateUrl: './context-menu-service.component.html',\r\n styleUrls: ['./context-menu-service.component.sass'],\r\n})\r\nexport class ContextMenuServiceComponent implements OnInit, OnDestroy {\r\n private static readonly VIEWPORT_EDGE_INSET = 5;\r\n private static readonly ANCHOR_OFFSET = 8;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLElement>;\r\n\r\n active: ContextMenuRequest | null = null;\r\n position = { x: 0, y: 0 };\r\n panelVisible = false;\r\n\r\n private anchor = { x: 0, y: 0 };\r\n /** Timestamp hasta el cual ignoramos cierres (evita que el gesto de apertura cierre el menú). */\r\n private ignoreOutsideUntil = 0;\r\n private sub?: Subscription;\r\n private closeSub?: Subscription;\r\n private readonly scrollListener = (): void => {\r\n if (this.active) this.dismissCurrent(null);\r\n };\r\n private readonly outsidePointerListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n private readonly outsideContextMenuListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n\r\n constructor(\r\n private contextMenuService: ContextMenuService,\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.contextMenuService.request$.subscribe((request) => {\r\n this.dismissCurrent(null);\r\n this.active = request;\r\n this.anchor = { x: request.x, y: request.y };\r\n this.position = {\r\n x: request.x + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n y: request.y + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n };\r\n this.panelVisible = true;\r\n // Ignorar el mismo gesto de apertura y el click sintético post-contextmenu.\r\n this.ignoreOutsideUntil = performance.now() + 180;\r\n this.cdr.detectChanges();\r\n this.applyClampedPosition();\r\n });\r\n\r\n this.closeSub = this.contextMenuService.close$.subscribe(() => {\r\n this.dismissCurrent(null);\r\n });\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.addEventListener('scroll', this.scrollListener, true);\r\n // Captura: no depende de que el click burbujee hasta document.\r\n document.addEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.addEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.dismissCurrent(null);\r\n this.sub?.unsubscribe();\r\n this.closeSub?.unsubscribe();\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.removeEventListener('scroll', this.scrollListener, true);\r\n document.removeEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.removeEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n if (this.active && this.panelVisible) {\r\n this.applyClampedPosition();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onEscape(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this.active) {\r\n this.dismissCurrent(null);\r\n }\r\n }\r\n\r\n selectOption(option: ContextMenuOption): void {\r\n if (!this.active || this.active.kind !== 'menu' || option.disabled) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n request.resolve(option);\r\n }\r\n\r\n private handleOutsideEvent(event: Event): void {\r\n if (!this.active) return;\r\n if (performance.now() < this.ignoreOutsideUntil) return;\r\n\r\n const target = event.target as Node | null;\r\n const panel = this.panelRef?.nativeElement;\r\n if (panel && target && panel.contains(target)) return;\r\n\r\n this.dismissCurrent(null);\r\n }\r\n\r\n private dismissCurrent(value: ContextMenuOption | null): void {\r\n if (!this.active) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n if (request.kind === 'menu') {\r\n request.resolve(value);\r\n } else {\r\n request.resolve();\r\n }\r\n }\r\n\r\n private clearMenu(): void {\r\n this.active = null;\r\n this.panelVisible = false;\r\n this.ignoreOutsideUntil = 0;\r\n }\r\n\r\n private applyClampedPosition(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel) return;\r\n\r\n const inset = ContextMenuServiceComponent.VIEWPORT_EDGE_INSET;\r\n const gap = ContextMenuServiceComponent.ANCHOR_OFFSET;\r\n const viewportW = document.documentElement.clientWidth;\r\n const viewportH = document.documentElement.clientHeight;\r\n const w = panel.offsetWidth || 220;\r\n const h = panel.offsetHeight || 120;\r\n\r\n const minX = inset;\r\n const maxX = Math.max(inset, viewportW - inset - w);\r\n const minY = inset;\r\n const maxY = Math.max(inset, viewportH - inset - h);\r\n\r\n let x = this.anchor.x + gap;\r\n let y = this.anchor.y + gap;\r\n\r\n if (x > maxX) {\r\n x = this.anchor.x - w - gap;\r\n }\r\n if (y > maxY) {\r\n y = this.anchor.y - h - gap;\r\n }\r\n\r\n this.position = {\r\n x: Math.max(minX, Math.min(x, maxX)),\r\n y: Math.max(minY, Math.min(y, maxY)),\r\n };\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n","@if (active) {\r\n <div class=\"ContextMenuOverlay\" aria-hidden=\"true\">\r\n <div\r\n #panel\r\n class=\"ContextMenuPanel\"\r\n [class.ContextMenuPanel--visible]=\"panelVisible\"\r\n [class.ContextMenuPanel--menu]=\"active.kind === 'menu'\"\r\n [class.ContextMenuPanel--info]=\"active.kind === 'info'\"\r\n [style.left.px]=\"position.x\"\r\n [style.top.px]=\"position.y\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"active.kind === 'info' ? active.info.title : (active.title || 'Opciones')\"\r\n [attr.aria-hidden]=\"!panelVisible\"\r\n (contextmenu)=\"$event.preventDefault()\"\r\n >\r\n @if (active.kind === 'menu') {\r\n @if (active.title) {\r\n <p class=\"ContextMenuMenuTitle\">{{ active.title }}</p>\r\n }\r\n @for (option of active.options; track $index) {\r\n @if (option.separatorBefore) {\r\n <div class=\"ContextMenuMenuSep\" aria-hidden=\"true\"></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"ContextMenuMenuItem\"\r\n [class.ContextMenuMenuItem--danger]=\"option.danger\"\r\n [class.ContextMenuMenuItem--disabled]=\"option.disabled\"\r\n [disabled]=\"option.disabled\"\r\n role=\"menuitem\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <lucide-icon [name]=\"option.icon\" [size]=\"14\"></lucide-icon>\r\n <span>{{ option.name }}</span>\r\n </button>\r\n }\r\n } @else {\r\n <div class=\"ContextMenuInfo\">\r\n <div class=\"ContextMenuInfoHeader\">\r\n <lucide-icon [name]=\"active.info.icon\" [size]=\"18\"></lucide-icon>\r\n <strong>{{ active.info.title }}</strong>\r\n </div>\r\n <p class=\"ContextMenuInfoBody\">{{ active.info.info }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import { Component, Input, inject } from '@angular/core';\r\n\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport { ContextMenuService } from '../context-menu-service/context-menu.service';\r\n\r\n@Component({\r\n selector: 'field-help-tooltip',\r\n standalone: true,\r\n imports: [LucideIconComponent],\r\n templateUrl: './field-help-tooltip.component.html',\r\n styleUrl: './field-help-tooltip.component.sass',\r\n})\r\nexport class FieldHelpTooltipComponent {\r\n private readonly contextMenuService = inject(ContextMenuService);\r\n\r\n @Input({ required: true }) text = '';\r\n @Input() title = 'Información del campo';\r\n\r\n showHelp(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n void this.contextMenuService.openInfo(event, {\r\n icon: 'info',\r\n title: this.title,\r\n info: this.text,\r\n });\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"HelpButton\"\r\n (click)=\"showHelp($event)\"\r\n aria-label=\"Información del campo\"\r\n>\r\n <lucide-icon name=\"info\"></lucide-icon>\r\n</button>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type GeneralViewerMode = 'image' | 'video' | 'audio' | 'document' | 'download';\r\n\r\nexport interface MediaViewerState {\r\n open: boolean;\r\n mode: GeneralViewerMode;\r\n /** Pasado al visor hijo; `null`/`undefined` = autodetección según `autoDetectType`. */\r\n type: GeneralViewerMode | null | undefined;\r\n url: string | null;\r\n urlSafe: SafeResourceUrl | null;\r\n downloadUrl: string | null;\r\n fileName: string;\r\n downloadContext: unknown | null;\r\n autoDetectType: boolean;\r\n}\r\n\r\nexport type MediaViewerOpenParams = Omit<\r\n MediaViewerState,\r\n 'open' | 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'\r\n> &\r\n Partial<Pick<MediaViewerState, 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'>> & {\r\n onDownloadRequested?: (context: unknown) => void;\r\n };\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MediaViewerService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n private closedState = (): MediaViewerState => ({\r\n open: false,\r\n mode: 'image',\r\n type: undefined,\r\n url: null,\r\n urlSafe: null,\r\n downloadUrl: null,\r\n fileName: this.config.mediaFileNameFallback,\r\n downloadContext: null,\r\n autoDetectType: true,\r\n });\r\n\r\n private readonly state = new BehaviorSubject<MediaViewerState>(this.closedState());\r\n readonly state$ = this.state.asObservable();\r\n\r\n private onDownloadRequestedCallback: ((context: unknown) => void) | null = null;\r\n\r\n /**\r\n * Opens the viewer with already-resolved URLs.\r\n * Host is responsible for CDN/crypto resolution before calling `open()`.\r\n */\r\n open(params: MediaViewerOpenParams): void {\r\n const { onDownloadRequested, type, downloadContext, autoDetectType, fileName, ...rest } =\r\n params;\r\n this.onDownloadRequestedCallback = onDownloadRequested ?? null;\r\n this.state.next({\r\n open: true,\r\n type: type ?? null,\r\n downloadContext: downloadContext ?? null,\r\n autoDetectType: autoDetectType ?? true,\r\n mode: rest.mode,\r\n url: rest.url,\r\n urlSafe: rest.urlSafe,\r\n downloadUrl: rest.downloadUrl,\r\n fileName: fileName?.trim() || this.config.mediaFileNameFallback,\r\n });\r\n }\r\n\r\n close(): void {\r\n this.onDownloadRequestedCallback = null;\r\n this.state.next(this.closedState());\r\n }\r\n\r\n handleDownloadRequested(context: unknown): void {\r\n this.onDownloadRequestedCallback?.(context);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Resoluciones usadas en el visor (referencia para otros componentes). */\r\nexport const IMAGE_MULTIRES_WIDTHS = [150, 400, 800] as const;\r\n\r\n/**\r\n * Visor de imagen: una sola carga del original, sin progresividad (sin versión pequeña previa).\r\n */\r\n@Component({\r\n selector: 'app-image-viewer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './image-viewer.component.html',\r\n styleUrls: ['./image-viewer.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ImageViewerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n\r\n ready = false;\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.ready = false;\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onLoad(): void {\r\n this.ready = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"ImageViewer\" *ngIf=\"src\">\r\n <div class=\"RainbowLoader\" *ngIf=\"!ready && !loadError\"></div>\r\n <img\r\n *ngIf=\"src\"\r\n class=\"Layer\"\r\n [class.visible]=\"ready\"\r\n [src]=\"src\"\r\n [alt]=\"\"\r\n decoding=\"async\"\r\n (load)=\"onLoad()\"\r\n (error)=\"onError()\"\r\n />\r\n <div *ngIf=\"loadError\" class=\"FallbackNote\">\r\n <span>Error al cargar la imagen</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/**\r\n * Lightweight native video player (no hls.js).\r\n * HLS (.m3u8) relies on browser Safari support; other browsers may need host-side remux.\r\n */\r\n@Component({\r\n selector: 'app-video-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './video-player.component.html',\r\n styleUrls: ['./video-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VideoPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n /** Informational; native player only. */\r\n @Input() videoFormat: 'hls' | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"VideoPlayer\" *ngIf=\"src\">\r\n <video\r\n class=\"VideoPlayerEl\"\r\n [src]=\"src\"\r\n controls\r\n playsinline\r\n (error)=\"onError()\"\r\n ></video>\r\n <p *ngIf=\"loadError\" class=\"VideoPlayerError\">No se pudo reproducir el video.</p>\r\n <p *ngIf=\"videoFormat === 'hls'\" class=\"VideoPlayerHint\">\r\n HLS: requiere soporte nativo del navegador.\r\n </p>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Lightweight native audio player (no wavesurfer / hls.js). */\r\n@Component({\r\n selector: 'app-audio-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './audio-player.component.html',\r\n styleUrls: ['./audio-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AudioPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n @Input() name: string | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"AudioPlayer\" *ngIf=\"src\">\r\n <p *ngIf=\"name\" class=\"AudioPlayerName\">{{ name }}</p>\r\n <audio class=\"AudioPlayerEl\" [src]=\"src\" controls (error)=\"onError()\"></audio>\r\n <p *ngIf=\"loadError\" class=\"AudioPlayerError\">No se pudo reproducir el audio.</p>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnDestroy,\r\n inject,\r\n PLATFORM_ID,\r\n SimpleChange,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { ImageViewerComponent } from './items/image-viewer/image-viewer.component';\r\nimport { VideoPlayerComponent } from './items/video-player/video-player.component';\r\nimport { AudioPlayerComponent } from './items/audio-player/audio-player.component';\r\nimport { GeneralViewerMode, MediaViewerService, MediaViewerState } from './media-viewer.service';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nconst DOCUMENT_LOAD_TIMEOUT_MS = 10000;\r\nconst VIEWER_DIFF_KEYS = ['open', 'mode', 'type', 'url', 'urlSafe', 'autoDetectType'] as const;\r\n\r\n/**\r\n * Host singleton media viewer.\r\n * Expects already-resolved public URLs from the host (no crypto / CDN decrypt).\r\n */\r\n@Component({\r\n selector: 'media-viewer-service',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,\r\n CommonModule,\r\n ImageViewerComponent,\r\n VideoPlayerComponent,\r\n AudioPlayerComponent,\r\n ],\r\n templateUrl: './media-viewer-service.component.html',\r\n styleUrls: ['./media-viewer-service.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MediaViewerServiceComponent implements OnDestroy {\r\n private platformId = inject(PLATFORM_ID);\r\n private readonly viewer = inject(MediaViewerService);\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private cdr = inject(ChangeDetectorRef);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n private _prevVm: MediaViewerState | null = null;\r\n\r\n open = false;\r\n mode: GeneralViewerMode = 'image';\r\n type: GeneralViewerMode | null | undefined = undefined;\r\n url: string | null = null;\r\n urlSafe: SafeResourceUrl | null = null;\r\n autoDetectType = true;\r\n downloadUrl: string | null = null;\r\n fileName = 'Archivo';\r\n downloadContext: unknown = null;\r\n\r\n detectedMode: GeneralViewerMode | null = null;\r\n detectingOrLoading = false;\r\n detectError = false;\r\n documentBlobUrl: string | null = null;\r\n documentRenderFailed = false;\r\n resolvedMediaUrl: string | null = null;\r\n private blobUrlsToRevoke: string[] = [];\r\n private documentLoadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private cachedDocumentUrlRaw: string | null = null;\r\n private cachedDocumentUrlSafe: SafeResourceUrl | null = null;\r\n\r\n constructor() {\r\n this.viewer.state$.pipe(takeUntilDestroyed()).subscribe((vm) => {\r\n const changes = this.diffViewerState(this._prevVm, vm);\r\n this.applyVmFields(vm);\r\n this._prevVm = vm;\r\n this.onViewerInputsChanged(changes);\r\n });\r\n }\r\n\r\n private diffViewerState(prev: MediaViewerState | null, curr: MediaViewerState): SimpleChanges {\r\n const out: SimpleChanges = {};\r\n for (const k of VIEWER_DIFF_KEYS) {\r\n const p = prev?.[k];\r\n const c = curr[k];\r\n if (p !== c) {\r\n out[k] = new SimpleChange(p, c, prev === null);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private applyVmFields(vm: MediaViewerState): void {\r\n this.open = vm.open;\r\n this.mode = vm.mode;\r\n this.type = vm.type;\r\n this.url = vm.url;\r\n this.urlSafe = vm.urlSafe;\r\n this.autoDetectType = vm.autoDetectType;\r\n this.downloadUrl = vm.downloadUrl;\r\n this.fileName = vm.fileName || this.config.mediaFileNameFallback;\r\n this.downloadContext = vm.downloadContext;\r\n }\r\n\r\n get effectiveMode(): GeneralViewerMode {\r\n return this.detectedMode ?? this.mode;\r\n }\r\n\r\n get videoPlayerFormat(): 'hls' | null {\r\n const u = (this.mediaSrc ?? '').trim().toLowerCase();\r\n return u.includes('.m3u8') ? 'hls' : null;\r\n }\r\n\r\n get typeLabel(): string {\r\n if (this.detectingOrLoading && !this.detectedMode) return 'Cargando...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n return labels[this.effectiveMode] ?? this.config.mediaFileNameFallback;\r\n }\r\n\r\n get loadingMessage(): string {\r\n if (!this.detectedMode) return 'Detectando tipo...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n const name = labels[this.detectedMode] ?? 'archivo';\r\n return `Cargando ${name.toLowerCase()}...`;\r\n }\r\n\r\n get mediaSrc(): string | null {\r\n if (this.resolvedMediaUrl) return this.resolvedMediaUrl;\r\n return this.url;\r\n }\r\n\r\n get documentUrlSafe(): SafeResourceUrl | null {\r\n if (this.urlSafe) return this.urlSafe;\r\n const url = this.documentBlobUrl ?? this.url ?? null;\r\n if (!url || this.effectiveMode !== 'document') {\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n return null;\r\n }\r\n if (this.cachedDocumentUrlRaw === url && this.cachedDocumentUrlSafe) {\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n this.cachedDocumentUrlRaw = url;\r\n this.cachedDocumentUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n\r\n private onViewerInputsChanged(changes: SimpleChanges): void {\r\n const docRelevant =\r\n (changes['open'] ??\r\n changes['mode'] ??\r\n changes['type'] ??\r\n changes['url'] ??\r\n changes['urlSafe'] ??\r\n changes['autoDetectType']) != null;\r\n if (!docRelevant) return;\r\n\r\n if (changes['url'] ?? changes['urlSafe']) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n }\r\n\r\n if (!this.open || !this.url) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.detectedMode = null;\r\n this.detectingOrLoading = false;\r\n this.detectError = false;\r\n }\r\n\r\n if (this.open && this.url) {\r\n const hasExplicitType = this.type != null && this.type !== undefined;\r\n if (hasExplicitType) {\r\n this.detectedMode = this.type;\r\n this.detectError = false;\r\n this.detectingOrLoading = false;\r\n this.resolvedMediaUrl = this.url;\r\n if (this.type === 'document') {\r\n void this.fetchAsBlob(this.url).then((blobUrl) => {\r\n if (blobUrl) {\r\n this.documentBlobUrl = blobUrl;\r\n this.blobUrlsToRevoke.push(blobUrl);\r\n }\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.cdr.markForCheck();\r\n } else if (this.autoDetectType) {\r\n this.detectAndLoadFromUrl(this.url);\r\n } else {\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = this.url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n }\r\n } else {\r\n this.resolvedMediaUrl = null;\r\n }\r\n\r\n this.clearDocumentLoadTimeout();\r\n if (\r\n this.open &&\r\n this.effectiveMode === 'document' &&\r\n (this.documentBlobUrl || this.url || this.urlSafe)\r\n ) {\r\n this.documentRenderFailed = false;\r\n this.documentLoadTimeout = setTimeout(() => {\r\n this.documentLoadTimeout = null;\r\n this.documentRenderFailed = true;\r\n this.cdr.markForCheck();\r\n }, DOCUMENT_LOAD_TIMEOUT_MS);\r\n } else {\r\n this.documentRenderFailed = false;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.revokeBlobUrls();\r\n }\r\n\r\n private detectAndLoadFromUrl(url: string): void {\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.documentBlobUrl = null;\r\n this.detectedMode = null;\r\n this.detectError = false;\r\n this.detectingOrLoading = true;\r\n this.cdr.markForCheck();\r\n\r\n this.fetchContentType(url)\r\n .then((contentType) => this.detectModeFromContentType(url, contentType))\r\n .then((mode) => {\r\n this.detectedMode = mode;\r\n this.cdr.markForCheck();\r\n if (mode === 'image' || mode === 'document') {\r\n return this.fetchAsBlob(url).then((blobUrl) => {\r\n if (mode === 'image') this.resolvedMediaUrl = blobUrl ?? url;\r\n else this.documentBlobUrl = blobUrl;\r\n if (blobUrl) this.blobUrlsToRevoke.push(blobUrl);\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.resolvedMediaUrl = url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n return undefined;\r\n })\r\n .catch(() => {\r\n this.detectError = true;\r\n this.detectingOrLoading = false;\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = url;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private fetchContentType(url: string): Promise<string> {\r\n const readCt = (r: Response) => (r.headers.get('content-type') ?? '').trim();\r\n\r\n const tryHead = (): Promise<string> =>\r\n fetch(url, { method: 'HEAD', mode: 'cors' }).then((r) => {\r\n if (!r.ok) return '';\r\n return readCt(r);\r\n });\r\n\r\n const tryGetRange = (): Promise<string> =>\r\n fetch(url, {\r\n method: 'GET',\r\n mode: 'cors',\r\n headers: { Range: 'bytes=0-0' },\r\n }).then((r) => {\r\n if (!(r.ok || r.status === 206)) return '';\r\n return readCt(r);\r\n });\r\n\r\n return tryHead()\r\n .then((ct) => ct || tryGetRange())\r\n .catch(() => tryGetRange())\r\n .catch(() => '');\r\n }\r\n\r\n private urlPathname(absUrl: string): string {\r\n try {\r\n const base =\r\n typeof window !== 'undefined' && window.location?.origin\r\n ? window.location.origin\r\n : 'https://invalid.local';\r\n return new URL(absUrl, base).pathname;\r\n } catch {\r\n return absUrl.split(/[?#]/)[0];\r\n }\r\n }\r\n\r\n private pathnameExtensionFromUrl(absUrl: string): string {\r\n const path = this.urlPathname(absUrl);\r\n const base = path.split('/').pop() ?? '';\r\n const dot = base.lastIndexOf('.');\r\n return dot > 0 ? base.slice(dot + 1).toLowerCase() : '';\r\n }\r\n\r\n private detectModeFromUrlPathOnly(absUrl: string): GeneralViewerMode | null {\r\n const pathLower = this.urlPathname(absUrl).toLowerCase();\r\n if (pathLower.endsWith('.m3u8') || pathLower.includes('/master.m3u8')) {\r\n return 'video';\r\n }\r\n const ext = this.pathnameExtensionFromUrl(absUrl);\r\n if (['webp', 'jpg', 'jpeg', 'png', 'gif', 'avif', 'bmp', 'svg'].includes(ext)) return 'image';\r\n if (['webm', 'mp4', 'ogg', 'ogv', 'mov', 'm4v', 'mkv'].includes(ext)) return 'video';\r\n if (['mp3', 'wav', 'oga', 'm4a', 'aac', 'flac', 'opus'].includes(ext)) return 'audio';\r\n if (['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp'].includes(ext)) {\r\n return 'document';\r\n }\r\n return null;\r\n }\r\n\r\n private detectModeFromContentType(url: string, contentType: string): GeneralViewerMode {\r\n const type = (contentType.split(';')[0] ?? '').trim().toLowerCase();\r\n const fromPath = this.detectModeFromUrlPathOnly(url);\r\n\r\n if (type.startsWith('image/')) return 'image';\r\n if (type.startsWith('video/')) return 'video';\r\n if (type.startsWith('audio/')) return 'audio';\r\n if (type === 'application/pdf' || type.includes('pdf')) return 'document';\r\n if (\r\n type.includes('document') ||\r\n type.includes('msword') ||\r\n type.includes('excel') ||\r\n type.includes('powerpoint') ||\r\n type.includes('officedocument') ||\r\n type.includes('opendocument')\r\n ) {\r\n return 'document';\r\n }\r\n\r\n if (fromPath) return fromPath;\r\n return 'download';\r\n }\r\n\r\n private fetchAsBlob(url: string): Promise<string | null> {\r\n return fetch(url, { mode: 'cors' })\r\n .then((r) => {\r\n if (!r.ok) throw new Error('Fetch failed');\r\n return r.blob();\r\n })\r\n .then((blob) => URL.createObjectURL(blob))\r\n .catch(() => null);\r\n }\r\n\r\n private revokeBlobUrls(): void {\r\n const toRevoke = [...this.blobUrlsToRevoke];\r\n this.blobUrlsToRevoke = [];\r\n if (this.resolvedMediaUrl && toRevoke.includes(this.resolvedMediaUrl)) {\r\n this.resolvedMediaUrl = null;\r\n }\r\n this.documentBlobUrl = null;\r\n for (const u of toRevoke) {\r\n try {\r\n URL.revokeObjectURL(u);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n }\r\n\r\n private clearDocumentLoadTimeout(): void {\r\n if (this.documentLoadTimeout != null) {\r\n clearTimeout(this.documentLoadTimeout);\r\n this.documentLoadTimeout = null;\r\n }\r\n }\r\n\r\n onDocumentIframeLoad(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onBackdropClick(): void {\r\n this.viewer.close();\r\n }\r\n\r\n onContentClick(event: Event): void {\r\n event.stopPropagation();\r\n }\r\n\r\n close(): void {\r\n this.viewer.close();\r\n }\r\n\r\n triggerDownload(): void {\r\n const url = this.downloadUrl ?? this.url;\r\n if (url && typeof url === 'string' && url.trim().startsWith('http')) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n window.open(url.trim(), '_blank');\r\n }\r\n } else if (this.downloadContext != null) {\r\n this.viewer.handleDownloadRequested(this.downloadContext);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"GeneralViewerBackdrop\" *ngIf=\"open\" (click)=\"onBackdropClick()\">\r\n <div class=\"GeneralViewerContent\" (click)=\"onContentClick($event)\">\r\n <div class=\"GeneralViewerHeader\">\r\n <span class=\"GeneralViewerTypeLabel\">{{ typeLabel }}</span>\r\n <button type=\"button\" class=\"GeneralViewerClose\" (click)=\"close()\" aria-label=\"Cerrar\">\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n </div>\r\n <div class=\"GeneralViewerBody\" [class.GeneralViewerBody--document]=\"effectiveMode === 'document'\">\r\n <div *ngIf=\"detectingOrLoading\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>{{ loadingMessage }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && detectError && !resolvedMediaUrl && effectiveMode === 'download'\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"triangle-alert\"></lucide-icon>\r\n <p>No se pudo detectar el tipo de archivo.</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"url\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">Descargar</button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <app-image-viewer\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'image' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n ></app-image-viewer>\r\n\r\n <app-video-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'video' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [videoFormat]=\"videoPlayerFormat\"\r\n ></app-video-player>\r\n\r\n <app-audio-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'audio' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [name]=\"fileName\"\r\n ></app-audio-player>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerDocument\">\r\n <iframe\r\n [src]=\"documentUrlSafe\"\r\n frameborder=\"0\"\r\n class=\"GeneralViewerIframe\"\r\n [attr.title]=\"fileName\"\r\n (load)=\"onDocumentIframeLoad()\"\r\n ></iframe>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentRenderFailed\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n No se pudo mostrar el documento. Puede descargarlo con el botón o cerrar.\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'download' && !detectError\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n {{ (downloadUrl || url || downloadContext) ? 'Este archivo no se puede previsualizar. Puede descargarlo con el botón o cerrar.' : 'No se pudo cargar la URL del archivo.' }}\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode === 'document' && !documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>Cargando documento...</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode !== 'download' && effectiveMode !== 'document' && !mediaSrc && !documentUrlSafe\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"file\"></lucide-icon>\r\n <p>No se pudo cargar el archivo</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Listo, Cerrar</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface SessionRequestMessage {\r\n id: number;\r\n lucideIcon: string;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionRequestService {\r\n private sessionRequestSubject = new Subject<SessionRequestMessage>();\r\n sessionRequest$ = this.sessionRequestSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /**\r\n * Muestra un overlay solicitando sesión.\r\n * @param lucideIcon Nombre del icono Lucide en kebab-case (ej: shopping-cart).\r\n */\r\n showSessionRequest(lucideIcon: string, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const sessionRequest: SessionRequestMessage = {\r\n id: ++this.idCounter,\r\n lucideIcon,\r\n message,\r\n };\r\n this.sessionRequestSubject.next(sessionRequest);\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SessionRequestMessage, SessionRequestService } from './session-request.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'session-request-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule, RouterModule],\r\n templateUrl: './session-request-service.component.html',\r\n styleUrls: ['./session-request-service.component.sass'],\r\n animations: [\r\n trigger('sessionRequestAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class SessionRequestServiceComponent implements OnInit {\r\n sessionRequests: SessionRequestMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private sessionRequestService: SessionRequestService) {}\r\n\r\n ngOnInit(): void {\r\n this.sessionRequestService.sessionRequest$.subscribe((sessionRequest) => {\r\n this.sessionRequests.push(sessionRequest);\r\n });\r\n }\r\n\r\n closeSessionRequest(id: number): void {\r\n this.sessionRequests = this.sessionRequests.filter((sr) => sr.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: SessionRequestMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"SessionRequestOverlay\" *ngIf=\"sessionRequests.length > 0\">\r\n <div\r\n class=\"SessionRequest\"\r\n *ngFor=\"let sessionRequest of sessionRequests; trackBy: trackById\"\r\n [@sessionRequestAnimation]\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"CloseButton\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n title=\"Cerrar\"\r\n >\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n <div class=\"SessionRequestContent\">\r\n <div class=\"SessionRequestIcon\">\r\n <lucide-icon [name]=\"sessionRequest.lucideIcon\"></lucide-icon>\r\n </div>\r\n <div class=\"SessionRequestMessage\">\r\n {{ sessionRequest.message }}\r\n </div>\r\n <div class=\"SessionRequestActions\">\r\n <a\r\n class=\"SessionRequestButton RegisterButton\"\r\n [routerLink]=\"config.sessionRegisterPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"user-plus\"></lucide-icon>\r\n {{ config.sessionRegisterLabel }}\r\n </a>\r\n <a\r\n class=\"SessionRequestButton LoginButton\"\r\n [routerLink]=\"config.sessionLoginPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"log-in\"></lucide-icon>\r\n {{ config.sessionLoginLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport interface GlobalLoadingProcess {\r\n id: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Capa global de carga: un mismo backdrop desde el primer `push` hasta el último `pop`.\r\n * Varios procesos concurrentes se listan con su mensaje.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalLoadingService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n get defaultMessage(): string {\r\n return this.config.loadingDefaultMessage;\r\n }\r\n\r\n private seq = 0;\r\n private readonly processes$ = new BehaviorSubject<GlobalLoadingProcess[]>([]);\r\n\r\n get snapshot(): GlobalLoadingProcess[] {\r\n return this.processes$.getValue();\r\n }\r\n\r\n readonly processes = this.processes$.asObservable();\r\n\r\n push(message?: string): string {\r\n const id = `gl-${++this.seq}`;\r\n const msg =\r\n message != null && String(message).trim() !== ''\r\n ? String(message).trim()\r\n : this.defaultMessage;\r\n const next = [...this.processes$.getValue(), { id, message: msg }];\r\n this.processes$.next(next);\r\n return id;\r\n }\r\n\r\n setMessage(id: string, message: string): void {\r\n const msg = String(message).trim() || this.defaultMessage;\r\n const cur = this.processes$.getValue();\r\n const idx = cur.findIndex((p) => p.id === id);\r\n if (idx < 0) return;\r\n const next = [...cur];\r\n next[idx] = { ...next[idx], message: msg };\r\n this.processes$.next(next);\r\n }\r\n\r\n pop(id: string): void {\r\n const cur = this.processes$.getValue();\r\n const next = cur.filter((p) => p.id !== id);\r\n if (next.length === cur.length) return;\r\n this.processes$.next(next);\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n GlobalLoadingProcess,\r\n GlobalLoadingService,\r\n} from './global-loading.service';\r\n\r\n@Component({\r\n selector: 'global-loading-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './global-loading-service.component.html',\r\n styleUrls: ['./global-loading-service.component.sass'],\r\n})\r\nexport class GlobalLoadingServiceComponent implements OnInit, OnDestroy {\r\n processes: GlobalLoadingProcess[] = [];\r\n private sub?: Subscription;\r\n\r\n constructor(private globalLoading: GlobalLoadingService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.globalLoading.processes.subscribe((list) => {\r\n this.processes = list;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n\r\n trackById(_index: number, item: GlobalLoadingProcess): string {\r\n return item.id;\r\n }\r\n}\r\n","<div\r\n *ngIf=\"processes.length > 0\"\r\n class=\"GlobalLoadingOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"GlobalLoadingCard\">\r\n <div class=\"GlobalLoadingSpinner\" aria-hidden=\"true\"></div>\r\n <ul class=\"GlobalLoadingList\">\r\n <li *ngFor=\"let p of processes; trackBy: trackById\" class=\"GlobalLoadingItem\">\r\n {{ p.message }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>\r\n","import { Injectable, PLATFORM_ID, inject, signal } from '@angular/core'\nimport { isPlatformBrowser } from '@angular/common'\nimport {\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationStart,\n Router,\n} from '@angular/router'\n\nconst SHOW_DELAY_MS = 120\nconst COMPLETE_HIDE_MS = 320\nconst PROGRESS_TICK_MS = 180\nconst MAX_SIMULATED_PROGRESS = 92\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationLoadingService {\n private readonly router = inject(Router)\n private readonly platformId = inject(PLATFORM_ID)\n\n /** Barra visible (solo tras superar el delay en navegaciones lentas). */\n readonly active = signal(false)\n /** Progreso 0–100 para la barra. */\n readonly progress = signal(0)\n\n private routerBound = false\n private navigationGeneration = 0\n private showDelayTimer: ReturnType<typeof setTimeout> | null = null\n private progressTimer: ReturnType<typeof setInterval> | null = null\n private hideTimer: ReturnType<typeof setTimeout> | null = null\n\n /** Llamar una vez desde el host (evita suscribirse en el constructor). */\n bindToRouter(): void {\n if (this.routerBound || !isPlatformBrowser(this.platformId)) {\n return\n }\n this.routerBound = true\n\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart) {\n this.onNavigationStart()\n return\n }\n if (\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError\n ) {\n this.onNavigationEnd()\n }\n })\n }\n\n private onNavigationStart(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearHideTimer()\n this.clearProgressTimer()\n this.clearShowDelayTimer()\n\n this.showDelayTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(true)\n this.progress.set(12)\n this.startProgressSimulation(generation)\n }, SHOW_DELAY_MS)\n }\n\n private onNavigationEnd(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearShowDelayTimer()\n this.clearProgressTimer()\n\n if (!this.active()) {\n this.progress.set(0)\n return\n }\n\n this.progress.set(100)\n\n this.clearHideTimer()\n this.hideTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(false)\n this.progress.set(0)\n }, COMPLETE_HIDE_MS)\n }\n\n private startProgressSimulation(generation: number): void {\n this.clearProgressTimer()\n this.progressTimer = setInterval(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n const current = this.progress()\n if (current >= MAX_SIMULATED_PROGRESS) {\n return\n }\n const step = current < 40 ? 14 : current < 70 ? 8 : 4\n this.progress.set(Math.min(MAX_SIMULATED_PROGRESS, current + step))\n }, PROGRESS_TICK_MS)\n }\n\n private clearShowDelayTimer(): void {\n if (this.showDelayTimer !== null) {\n clearTimeout(this.showDelayTimer)\n this.showDelayTimer = null\n }\n }\n\n private clearProgressTimer(): void {\n if (this.progressTimer !== null) {\n clearInterval(this.progressTimer)\n this.progressTimer = null\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer)\n this.hideTimer = null\n }\n }\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\nimport { NavigationLoadingService } from './navigation-loading.service';\n\n@Component({\n selector: 'navigation-loading-service',\n standalone: true,\n imports: [LucideIconComponent],\n templateUrl: './navigation-loading-service.component.html',\n styleUrl: './navigation-loading-service.component.sass',\n})\nexport class NavigationLoadingServiceComponent implements OnInit {\n readonly navLoading = inject(NavigationLoadingService);\n\n ngOnInit(): void {\n this.navLoading.bindToRouter();\n }\n}\n","@if (navLoading.active()) {\n <div\n class=\"NavigationLoadingBackdrop\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n aria-label=\"Navegando\"\n >\n <div class=\"NavigationLoadingCard\">\n <div class=\"NavigationLoadingIconWrap\" aria-hidden=\"true\">\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\n </div>\n <div class=\"NavigationLoadingCopy\">\n <p class=\"NavigationLoadingTitle\">Navegando...</p>\n <p class=\"NavigationLoadingHint\">Preparando la vista</p>\n </div>\n <div class=\"NavigationLoadingProgressTrack\" aria-hidden=\"true\">\n <div class=\"NavigationLoadingProgressFill\" [style.width.%]=\"navLoading.progress()\"></div>\n </div>\n </div>\n </div>\n}\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface AiAutofillOverlayState {\r\n id: string;\r\n title: string;\r\n logs: string[];\r\n startedAt: number;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AiAutofillOverlayService {\r\n private seq = 0;\r\n private readonly state$ = new BehaviorSubject<AiAutofillOverlayState | null>(null);\r\n\r\n readonly state = this.state$.asObservable();\r\n\r\n get snapshot(): AiAutofillOverlayState | null {\r\n return this.state$.getValue();\r\n }\r\n\r\n start(title: string = 'Autocompletando con IA...'): string {\r\n const id = `ai-${++this.seq}`;\r\n this.state$.next({\r\n id,\r\n title: String(title).trim() || 'Autocompletando con IA...',\r\n logs: [],\r\n startedAt: Date.now(),\r\n });\r\n return id;\r\n }\r\n\r\n log(id: string, line: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n const msg = String(line ?? '').trim();\r\n if (!msg) return;\r\n this.state$.next({ ...cur, logs: [...cur.logs, msg] });\r\n }\r\n\r\n replaceLogs(id: string, logs: string[]): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next({ ...cur, logs: Array.isArray(logs) ? logs.map((x) => String(x)) : [] });\r\n }\r\n\r\n end(id: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next(null);\r\n }\r\n}\r\n\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n AiAutofillOverlayService,\r\n AiAutofillOverlayState,\r\n} from './ai-autofill-overlay.service';\r\n\r\n@Component({\r\n selector: 'ai-autofill-overlay-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ai-autofill-overlay-service.component.html',\r\n styleUrls: ['./ai-autofill-overlay-service.component.sass'],\r\n})\r\nexport class AiAutofillOverlayServiceComponent implements OnInit, OnDestroy {\r\n state: AiAutofillOverlayState | null = null;\r\n private sub?: Subscription;\r\n\r\n constructor(private aiOverlay: AiAutofillOverlayService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.aiOverlay.state.subscribe((s) => {\r\n this.state = s;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n}\r\n\r\n","<div\r\n *ngIf=\"state\"\r\n class=\"AiAutofillOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"AiAutofillCard\">\r\n <div class=\"AiAutofillHeader\">\r\n <div class=\"AiAutofillSpinner\" aria-hidden=\"true\"></div>\r\n <div class=\"AiAutofillTitle\">{{ state.title }}</div>\r\n </div>\r\n\r\n <div class=\"AiAutofillLogs\" aria-label=\"Logs de IA en tiempo real\">\r\n <pre class=\"AiAutofillPre\">{{ state.logs.join('\\n') }}</pre>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Inject, Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\nimport { AlertService } from '../alert-service/alert.service';\r\n\r\nexport type BrowserNotificationPayload = {\r\n title: string;\r\n body: string;\r\n /** Agrupa/reemplaza notificaciones con el mismo tag. */\r\n tag: string;\r\n data?: Record<string, unknown>;\r\n onClick?: () => void;\r\n};\r\n\r\n/**\r\n * Thin wrapper around the Web Notifications API.\r\n * Host-agnostic: no chat/app coupling. Optional AlertService for permission prompt.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class BrowserNotificationService {\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private readonly alert = inject(AlertService, { optional: true });\r\n private permissionRequestInFlight: Promise<NotificationPermission> | null = null;\r\n private readonly pendingQueue: BrowserNotificationPayload[] = [];\r\n private readonly tracked = new Map<string, Notification>();\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n get isSupported(): boolean {\r\n return this.isBrowser && typeof Notification !== 'undefined';\r\n }\r\n\r\n get permission(): NotificationPermission {\r\n if (!this.isSupported) return 'denied';\r\n return Notification.permission;\r\n }\r\n\r\n get canShow(): boolean {\r\n return this.isSupported && this.permission === 'granted';\r\n }\r\n\r\n queuePending(payload: BrowserNotificationPayload): void {\r\n this.pendingQueue.push(payload);\r\n if (this.pendingQueue.length > 8) {\r\n this.pendingQueue.shift();\r\n }\r\n }\r\n\r\n /** Call from a user gesture (click) so the browser allows requestPermission. */\r\n beginPermissionRequest(): void {\r\n if (!this.isSupported || Notification.permission !== 'default') return;\r\n if (!this.permissionRequestInFlight) {\r\n this.permissionRequestInFlight = Notification.requestPermission().catch(\r\n () => 'denied' as NotificationPermission,\r\n );\r\n }\r\n }\r\n\r\n async completePermissionRequest(): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (Notification.permission === 'granted') return true;\r\n if (Notification.permission === 'denied') return false;\r\n if (!this.permissionRequestInFlight) return false;\r\n const perm = await this.permissionRequestInFlight;\r\n return perm === 'granted';\r\n }\r\n\r\n /**\r\n * Optional UX helper: confirm via AlertService then request permission on Accept click.\r\n * Returns whether permission was granted.\r\n */\r\n async requestPermissionWithPrompt(promptMessage?: string): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (this.permission === 'granted') return true;\r\n if (this.permission === 'denied') return false;\r\n\r\n if (!this.alert) {\r\n this.beginPermissionRequest();\r\n return this.completePermissionRequest();\r\n }\r\n\r\n const accepted = await this.alert.showConfirm(\r\n promptMessage ?? this.config.browserNotificationPermissionPrompt,\r\n { onAcceptClick: () => this.beginPermissionRequest() },\r\n );\r\n if (!accepted) return false;\r\n return this.completePermissionRequest();\r\n }\r\n\r\n drainPendingQueue(): number {\r\n const batch = [...this.pendingQueue];\r\n this.pendingQueue.length = 0;\r\n let shown = 0;\r\n for (const payload of batch) {\r\n if (this.show(payload)) shown += 1;\r\n }\r\n return shown;\r\n }\r\n\r\n showOrQueue(payload: BrowserNotificationPayload): boolean {\r\n if (!this.isSupported) return false;\r\n if (this.canShow) return this.show(payload);\r\n if (Notification.permission === 'denied') return false;\r\n this.queuePending(payload);\r\n return false;\r\n }\r\n\r\n show(payload: BrowserNotificationPayload): boolean {\r\n if (!this.canShow) return false;\r\n\r\n try {\r\n const icon = this.resolveIconUrl();\r\n const notification = new Notification(payload.title, {\r\n body: payload.body,\r\n tag: payload.tag,\r\n icon,\r\n badge: icon,\r\n requireInteraction: false,\r\n silent: false,\r\n data: payload.data,\r\n });\r\n\r\n this.tracked.set(payload.tag, notification);\r\n notification.onclose = () => this.tracked.delete(payload.tag);\r\n\r\n notification.onclick = (ev) => {\r\n ev.preventDefault();\r\n try {\r\n window.focus();\r\n } catch {\r\n /* ignore */\r\n }\r\n payload.onClick?.();\r\n notification.close();\r\n };\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n closeByTag(tag: string): void {\r\n const n = this.tracked.get(tag);\r\n if (n) {\r\n try {\r\n n.close();\r\n } catch {\r\n /* ignore */\r\n }\r\n this.tracked.delete(tag);\r\n }\r\n }\r\n\r\n playSound(): void {\r\n if (!this.isBrowser || !this.canShow) return;\r\n try {\r\n const audio = new Audio(this.config.browserNotificationSoundUrl);\r\n audio.volume = 0.45;\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n private resolveIconUrl(): string | undefined {\r\n if (!this.isBrowser) return undefined;\r\n try {\r\n return new URL(this.config.browserNotificationIconUrl, window.location.origin).href;\r\n } catch {\r\n return this.config.browserNotificationIconUrl;\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @xosue-utils/services\r\n */\r\n\r\nexport * from './lib/index';\r\n\r\nexport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n XOSUE_UTILS_SERVICES_DEFAULTS,\r\n provideXosueUtilsServices,\r\n resolveXosueUtilsServicesConfig,\r\n} from './config/services-config';\r\nexport type {\r\n XosueUtilsServicesConfig,\r\n ResolvedXosueUtilsServicesConfig,\r\n ToastDurationKey,\r\n} from './config/services-config';\r\n\r\nexport { LucideIconComponent } from './vendor/lucide-icon/lucide-icon.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AlertService","i1.ToastService","i1","i1.SessionRequestService","i1.GlobalLoadingService","i1.AiAutofillOverlayService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"xosue-utils-services.mjs","sources":["../../src/lib/lucide-icon/lucide-icon.component.ts","../../src/lib/alert-service/alert.service.ts","../../src/config/services-config.ts","../../src/lib/alert-service/alert-service.component.ts","../../src/lib/alert-service/alert-service.component.html","../../src/lib/toast-service/toast.service.ts","../../src/lib/toast-service/toast-service.component.ts","../../src/lib/toast-service/toast-service.component.html","../../src/lib/context-menu-service/context-menu.service.ts","../../src/lib/context-menu-service/context-menu-service.component.ts","../../src/lib/context-menu-service/context-menu-service.component.html","../../src/lib/field-help-tooltip/field-help-tooltip.component.ts","../../src/lib/field-help-tooltip/field-help-tooltip.component.html","../../src/lib/media-viewer-service/media-viewer.service.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.ts","../../src/lib/media-viewer-service/items/image-viewer/image-viewer.component.html","../../src/lib/media-viewer-service/items/video-player/video-player.component.ts","../../src/lib/media-viewer-service/items/video-player/video-player.component.html","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.ts","../../src/lib/media-viewer-service/items/audio-player/audio-player.component.html","../../src/lib/media-viewer-service/media-viewer-service.component.ts","../../src/lib/media-viewer-service/media-viewer-service.component.html","../../src/lib/session-request-service/session-request.service.ts","../../src/lib/session-request-service/session-request-service.component.ts","../../src/lib/session-request-service/session-request-service.component.html","../../src/lib/global-loading-service/global-loading.service.ts","../../src/lib/global-loading-service/global-loading-service.component.ts","../../src/lib/global-loading-service/global-loading-service.component.html","../../src/lib/navigation-loading/navigation-loading.service.ts","../../src/lib/navigation-loading/navigation-loading-service.component.ts","../../src/lib/navigation-loading/navigation-loading-service.component.html","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay.service.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.ts","../../src/lib/ai-autofill-overlay-service/ai-autofill-overlay-service.component.html","../../src/lib/browser-notification/browser-notification.service.ts","../../src/public-api.ts","../../src/xosue-utils-services.ts"],"sourcesContent":["import { booleanAttribute, Component, computed, input } from '@angular/core';\r\nimport { LucideDynamicIcon } from '@lucide/angular';\r\n\r\n/**\r\n * Icono Lucide.\r\n *\r\n * HTML:\r\n * <lucide-icon name=\"star\"></lucide-icon>\r\n * <lucide-icon name=\"heart\" filled></lucide-icon> // relleno + trazo\r\n *\r\n * SASS — variables CSS (heredan del padre):\r\n * --lucide-stroke: var(--primary)\r\n * --lucide-fill: var(--accent)\r\n * --lucide-stroke-width: 2\r\n */\r\n@Component({\r\n selector: 'lucide-icon',\r\n standalone: true,\r\n imports: [LucideDynamicIcon],\r\n host: {\r\n '[class.lucide-icon--filled]': 'filled()',\r\n '[attr.filled]': 'filled() ? \"\" : null',\r\n },\r\n template: `\r\n <svg\r\n class=\"lucide-svg inline-block shrink-0 align-middle\"\r\n [class.lucide-svg--filled]=\"filled()\"\r\n [class.animate-spin]=\"spin()\"\r\n [style.width]=\"dimStyle()?.width\"\r\n [style.height]=\"dimStyle()?.height\"\r\n [lucideIcon]=\"name()\"\r\n aria-hidden=\"true\"\r\n />\r\n `,\r\n})\r\nexport class LucideIconComponent {\r\n readonly name = input.required<string>();\r\n readonly size = input<number | string | undefined>(undefined);\r\n readonly spin = input(false, { transform: booleanAttribute });\r\n /** Activa relleno (--lucide-fill); el trazo se conserva. */\r\n readonly filled = input(false, { transform: booleanAttribute });\r\n\r\n readonly dimStyle = computed(() => {\r\n const s = this.size();\r\n if (s === undefined || s === null || s === '') return null;\r\n if (typeof s === 'number') {\r\n return { width: `${s}px`, height: `${s}px` };\r\n }\r\n const trimmed = String(s).trim();\r\n if (/^\\d+(\\.\\d+)?$/.test(trimmed)) {\r\n return { width: `${trimmed}px`, height: `${trimmed}px` };\r\n }\r\n return { width: trimmed, height: trimmed };\r\n });\r\n}\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport type AlertMode = 'normal' | 'actions';\r\n\r\nexport type AlertConfirmOptions = {\r\n /** Se ejecuta en el mismo tick del clic en Aceptar (p. ej. Notification.requestPermission). */\r\n onAcceptClick?: () => void;\r\n};\r\n\r\nexport interface AlertMessage {\r\n id: number;\r\n message: string;\r\n mode: AlertMode;\r\n resolve: (value: boolean) => void;\r\n onAcceptClick?: () => void;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AlertService {\r\n private alertSubject = new Subject<AlertMessage>();\r\n alert$ = this.alertSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showAlert(message: string): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'normal',\r\n resolve,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n\r\n showConfirm(message: string, options?: AlertConfirmOptions): Promise<boolean> {\r\n if (!this.isBrowser) return Promise.resolve(false);\r\n\r\n return new Promise<boolean>((resolve) => {\r\n const alert: AlertMessage = {\r\n id: ++this.idCounter,\r\n message,\r\n mode: 'actions',\r\n resolve,\r\n onAcceptClick: options?.onAcceptClick,\r\n };\r\n this.alertSubject.next(alert);\r\n });\r\n }\r\n}\r\n","import { InjectionToken, Provider } from '@angular/core';\r\n\r\nexport type ToastDurationKey = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface XosueUtilsServicesConfig {\r\n /** i18n / labels */\r\n alertAcceptLabel?: string;\r\n alertCancelLabel?: string;\r\n loadingDefaultMessage?: string;\r\n sessionRegisterPath?: string;\r\n sessionLoginPath?: string;\r\n sessionRegisterLabel?: string;\r\n sessionLoginLabel?: string;\r\n /** toast assets (absolute or app-root relative) */\r\n toastSoundUrl?: string;\r\n toastErrorSoundUrl?: string;\r\n toastSuccessGifUrl?: string;\r\n toastDurationsMs?: Partial<Record<ToastDurationKey, number>>;\r\n /** media viewer */\r\n mediaFileNameFallback?: string;\r\n /** browser notification */\r\n browserNotificationIconUrl?: string;\r\n browserNotificationSoundUrl?: string;\r\n browserNotificationPermissionPrompt?: string;\r\n}\r\n\r\nexport const XOSUE_UTILS_SERVICES_DEFAULTS: Required<\r\n Omit<XosueUtilsServicesConfig, 'toastDurationsMs' | 'toastSuccessGifUrl'>\r\n> & {\r\n toastSuccessGifUrl: string;\r\n toastDurationsMs: Record<ToastDurationKey, number>;\r\n} = {\r\n alertAcceptLabel: 'Aceptar',\r\n alertCancelLabel: 'Cancelar',\r\n loadingDefaultMessage: 'Cargando',\r\n sessionRegisterPath: '/auth/register',\r\n sessionLoginPath: '/auth/login',\r\n sessionRegisterLabel: 'Registrarse',\r\n sessionLoginLabel: 'Iniciar Sesión',\r\n toastSoundUrl: '/sounds/toast.mp3',\r\n toastErrorSoundUrl: '/sounds/error-toast.mp3',\r\n toastSuccessGifUrl: '/gifs/success-toast.gif',\r\n toastDurationsMs: {\r\n success: 1000,\r\n info: 1000,\r\n warning: 5000,\r\n error: 5000,\r\n },\r\n mediaFileNameFallback: 'Archivo',\r\n browserNotificationIconUrl: '/favicon.ico',\r\n browserNotificationSoundUrl: '/sounds/toast.mp3',\r\n browserNotificationPermissionPrompt:\r\n '¿Permitir notificaciones del navegador para avisarte cuando no estés en la pestaña?',\r\n};\r\n\r\nexport type ResolvedXosueUtilsServicesConfig = typeof XOSUE_UTILS_SERVICES_DEFAULTS;\r\n\r\nexport const XOSUE_UTILS_SERVICES_CONFIG = new InjectionToken<ResolvedXosueUtilsServicesConfig>(\r\n 'XOSUE_UTILS_SERVICES_CONFIG',\r\n {\r\n providedIn: 'root',\r\n factory: () => ({ ...XOSUE_UTILS_SERVICES_DEFAULTS }),\r\n },\r\n);\r\n\r\nexport function resolveXosueUtilsServicesConfig(\r\n config?: XosueUtilsServicesConfig,\r\n): ResolvedXosueUtilsServicesConfig {\r\n return {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS,\r\n ...config,\r\n toastDurationsMs: {\r\n ...XOSUE_UTILS_SERVICES_DEFAULTS.toastDurationsMs,\r\n ...config?.toastDurationsMs,\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Provide overlay services configuration in the host app.\r\n *\r\n * ```ts\r\n * providers: [\r\n * provideXosueUtilsServices({\r\n * sessionLoginPath: '/login',\r\n * toastSoundUrl: '/assets/sounds/toast.mp3',\r\n * }),\r\n * ]\r\n * ```\r\n */\r\nexport function provideXosueUtilsServices(config?: XosueUtilsServicesConfig): Provider[] {\r\n return [\r\n {\r\n provide: XOSUE_UTILS_SERVICES_CONFIG,\r\n useValue: resolveXosueUtilsServicesConfig(config),\r\n },\r\n ];\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { AlertMessage, AlertService } from './alert.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'alert-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './alert-service.component.html',\r\n styleUrls: ['./alert-service.component.sass'],\r\n animations: [\r\n trigger('alertAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class AlertServiceComponent implements OnInit {\r\n alerts: AlertMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private alertService: AlertService) {}\r\n\r\n ngOnInit(): void {\r\n this.alertService.alert$.subscribe((alert) => {\r\n this.alerts.push(alert);\r\n });\r\n }\r\n\r\n removeAlert(id: number): void {\r\n this.alerts = this.alerts.filter((a) => a.id !== id);\r\n }\r\n\r\n accept(alert: AlertMessage): void {\r\n try {\r\n alert.onAcceptClick?.();\r\n } catch {\r\n /* ignore */\r\n }\r\n alert.resolve(true);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n cancel(alert: AlertMessage): void {\r\n alert.resolve(false);\r\n this.removeAlert(alert.id);\r\n }\r\n\r\n trackById(_index: number, item: AlertMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"AlertOverlay\" *ngIf=\"alerts.length > 0\">\r\n <div\r\n class=\"Alert\"\r\n *ngFor=\"let alert of alerts; trackBy: trackById\"\r\n [@alertAnimation]\r\n >\r\n <div class=\"AlertContent\">\r\n <div class=\"AlertIcon\">\r\n <lucide-icon name=\"circle-alert\"></lucide-icon>\r\n </div>\r\n <div class=\"AlertMessage\">\r\n {{ alert.message }}\r\n </div>\r\n <div class=\"AlertActions\">\r\n <button\r\n *ngIf=\"alert.mode === 'normal'\"\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n <ng-container *ngIf=\"alert.mode === 'actions'\">\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton CancelButton\"\r\n (click)=\"cancel(alert)\"\r\n >\r\n {{ config.alertCancelLabel }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"AlertButton AcceptButton\"\r\n (click)=\"accept(alert)\"\r\n >\r\n {{ config.alertAcceptLabel }}\r\n </button>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID, NgZone, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type ToastType = 'success' | 'warning' | 'error' | 'info';\r\n\r\nexport interface ToastMessage {\r\n id: number;\r\n type: ToastType;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n private toastSubject = new Subject<ToastMessage>();\r\n toast$ = this.toastSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n private ngZone: NgZone,\r\n ) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n showToast(type: ToastType, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const toast: ToastMessage = { id: ++this.idCounter, type, message };\r\n this.toastSubject.next(toast);\r\n this.ngZone.runOutsideAngular(() => this.playSound(type));\r\n }\r\n\r\n private playSound(type: ToastType): void {\r\n if (type === 'info') return;\r\n try {\r\n const src =\r\n type === 'error' ? this.config.toastErrorSoundUrl : this.config.toastSoundUrl;\r\n const audio = new Audio(src);\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ToastMessage, ToastService, ToastType } from './toast.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'toast-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule],\r\n templateUrl: './toast-service.component.html',\r\n styleUrls: ['./toast-service.component.sass'],\r\n animations: [\r\n trigger('toastAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(-20px)' }),\r\n animate('300ms ease-out', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('300ms ease-in', style({ opacity: 0, transform: 'translateY(-20px)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class ToastServiceComponent implements OnInit {\r\n toasts: ToastMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private toastService: ToastService) {}\r\n\r\n ngOnInit(): void {\r\n this.toastService.toast$.subscribe((toast) => {\r\n this.toasts.push(toast);\r\n const durationMs = this.config.toastDurationsMs[toast.type as ToastType] ?? 5000;\r\n setTimeout(() => this.removeToast(toast.id), durationMs);\r\n });\r\n }\r\n\r\n successGifSrc(toast: ToastMessage): string {\r\n const base = this.config.toastSuccessGifUrl;\r\n const sep = base.includes('?') ? '&' : '?';\r\n return `${base}${sep}t=${toast.id}`;\r\n }\r\n\r\n removeToast(id: number): void {\r\n this.toasts = this.toasts.filter((t) => t.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: ToastMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"ToastOverlay\">\r\n <div class=\"ToastContainer\">\r\n <div\r\n class=\"Toast\"\r\n *ngFor=\"let toast of toasts; trackBy: trackById\"\r\n [@toastAnimation]\r\n [ngClass]=\"toast.type\"\r\n (click)=\"removeToast(toast.id)\"\r\n >\r\n <div class=\"Icon\" [ngSwitch]=\"toast.type\">\r\n <lucide-icon name=\"info\" *ngSwitchCase=\"'info'\"></lucide-icon>\r\n <lucide-icon name=\"circle-check\" *ngSwitchCase=\"'success'\"></lucide-icon>\r\n <lucide-icon name=\"circle-alert\" *ngSwitchCase=\"'error'\"></lucide-icon>\r\n <lucide-icon name=\"triangle-alert\" *ngSwitchCase=\"'warning'\"></lucide-icon>\r\n <lucide-icon name=\"bell\" *ngSwitchDefault></lucide-icon>\r\n </div>\r\n\r\n <div class=\"Text\">\r\n {{ toast.message }}\r\n </div>\r\n\r\n <img\r\n *ngIf=\"toast.type === 'success' && config.toastSuccessGifUrl\"\r\n class=\"SuccessToastGif\"\r\n [attr.src]=\"successGifSrc(toast)\"\r\n alt=\"\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface ContextMenuOption<T = unknown> {\r\n icon: string;\r\n name: string;\r\n value: T;\r\n /** Estilo destructivo (rojo). */\r\n danger?: boolean;\r\n /** Separador visual antes de esta opción. */\r\n separatorBefore?: boolean;\r\n disabled?: boolean;\r\n}\r\n\r\nexport interface ContextMenuInfo {\r\n icon: string;\r\n title: string;\r\n info: string;\r\n}\r\n\r\nexport type ContextMenuKind = 'menu' | 'info';\r\n\r\ninterface ContextMenuRequestBase {\r\n id: number;\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface ContextMenuMenuRequest extends ContextMenuRequestBase {\r\n kind: 'menu';\r\n title?: string;\r\n options: ContextMenuOption[];\r\n resolve: (value: ContextMenuOption | null) => void;\r\n}\r\n\r\nexport interface ContextMenuInfoRequest extends ContextMenuRequestBase {\r\n kind: 'info';\r\n info: ContextMenuInfo;\r\n resolve: () => void;\r\n}\r\n\r\nexport type ContextMenuRequest = ContextMenuMenuRequest | ContextMenuInfoRequest;\r\n\r\nexport type ContextMenuOpenEvent = MouseEvent | { clientX: number; clientY: number };\r\n\r\nexport interface ContextMenuOpenOptions {\r\n title?: string;\r\n /** Si true (default), evita el menú nativo del navegador cuando el evento es MouseEvent. */\r\n preventDefault?: boolean;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ContextMenuService {\r\n private readonly requestSubject = new Subject<ContextMenuRequest>();\r\n readonly request$ = this.requestSubject.asObservable();\r\n\r\n private readonly closeSubject = new Subject<void>();\r\n readonly close$ = this.closeSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /** Menú contextual en el punto del clic. Solo uno activo a la vez. */\r\n openMenu(\r\n event: ContextMenuOpenEvent,\r\n options: ContextMenuOption[],\r\n menuOptions?: ContextMenuOpenOptions,\r\n ): Promise<ContextMenuOption | null> {\r\n if (!this.isBrowser || options.length === 0) {\r\n return Promise.resolve(null);\r\n }\r\n\r\n if (event instanceof MouseEvent && menuOptions?.preventDefault !== false) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuMenuRequest = {\r\n id: ++this.idCounter,\r\n kind: 'menu',\r\n x,\r\n y,\r\n title: menuOptions?.title,\r\n options,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Globo informativo en el punto del clic. */\r\n openInfo(event: ContextMenuOpenEvent, info: ContextMenuInfo): Promise<void> {\r\n if (!this.isBrowser) return Promise.resolve();\r\n\r\n const { x, y } = this.pointFromEvent(event);\r\n return new Promise((resolve) => {\r\n const request: ContextMenuInfoRequest = {\r\n id: ++this.idCounter,\r\n kind: 'info',\r\n x,\r\n y,\r\n info,\r\n resolve,\r\n };\r\n this.requestSubject.next(request);\r\n });\r\n }\r\n\r\n /** Cierra el menú contextual activo desde código. */\r\n close(): void {\r\n if (!this.isBrowser) return;\r\n this.closeSubject.next();\r\n }\r\n\r\n private pointFromEvent(event: ContextMenuOpenEvent): { x: number; y: number } {\r\n if ('clientX' in event && 'clientY' in event) {\r\n return { x: event.clientX, y: event.clientY };\r\n }\r\n return { x: 0, y: 0 };\r\n }\r\n}\r\n","import {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostListener,\r\n Inject,\r\n OnDestroy,\r\n OnInit,\r\n PLATFORM_ID,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser, CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport {\r\n ContextMenuOption,\r\n ContextMenuRequest,\r\n ContextMenuService,\r\n} from './context-menu.service';\r\n\r\n@Component({\r\n selector: 'context-menu-service',\r\n standalone: true,\r\n imports: [CommonModule, LucideIconComponent],\r\n templateUrl: './context-menu-service.component.html',\r\n styleUrls: ['./context-menu-service.component.sass'],\r\n})\r\nexport class ContextMenuServiceComponent implements OnInit, OnDestroy {\r\n private static readonly VIEWPORT_EDGE_INSET = 5;\r\n private static readonly ANCHOR_OFFSET = 8;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @ViewChild('panel') panelRef?: ElementRef<HTMLElement>;\r\n\r\n active: ContextMenuRequest | null = null;\r\n position = { x: 0, y: 0 };\r\n panelVisible = false;\r\n\r\n private anchor = { x: 0, y: 0 };\r\n /** Timestamp hasta el cual ignoramos cierres (evita que el gesto de apertura cierre el menú). */\r\n private ignoreOutsideUntil = 0;\r\n private sub?: Subscription;\r\n private closeSub?: Subscription;\r\n private readonly scrollListener = (): void => {\r\n if (this.active) this.dismissCurrent(null);\r\n };\r\n private readonly outsidePointerListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n private readonly outsideContextMenuListener = (event: Event): void => {\r\n this.handleOutsideEvent(event);\r\n };\r\n\r\n constructor(\r\n private contextMenuService: ContextMenuService,\r\n @Inject(PLATFORM_ID) private platformId: object,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.contextMenuService.request$.subscribe((request) => {\r\n this.dismissCurrent(null);\r\n this.active = request;\r\n this.anchor = { x: request.x, y: request.y };\r\n this.position = {\r\n x: request.x + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n y: request.y + ContextMenuServiceComponent.ANCHOR_OFFSET,\r\n };\r\n this.panelVisible = true;\r\n // Ignorar el mismo gesto de apertura y el click sintético post-contextmenu.\r\n this.ignoreOutsideUntil = performance.now() + 180;\r\n this.cdr.detectChanges();\r\n this.applyClampedPosition();\r\n });\r\n\r\n this.closeSub = this.contextMenuService.close$.subscribe(() => {\r\n this.dismissCurrent(null);\r\n });\r\n\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.addEventListener('scroll', this.scrollListener, true);\r\n // Captura: no depende de que el click burbujee hasta document.\r\n document.addEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.addEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.dismissCurrent(null);\r\n this.sub?.unsubscribe();\r\n this.closeSub?.unsubscribe();\r\n if (isPlatformBrowser(this.platformId)) {\r\n document.removeEventListener('scroll', this.scrollListener, true);\r\n document.removeEventListener('pointerdown', this.outsidePointerListener, true);\r\n document.removeEventListener('contextmenu', this.outsideContextMenuListener, true);\r\n }\r\n }\r\n\r\n @HostListener('window:resize')\r\n onWindowResize(): void {\r\n if (this.active && this.panelVisible) {\r\n this.applyClampedPosition();\r\n }\r\n }\r\n\r\n @HostListener('document:keydown', ['$event'])\r\n onEscape(event: KeyboardEvent): void {\r\n if (event.key === 'Escape' && this.active) {\r\n this.dismissCurrent(null);\r\n }\r\n }\r\n\r\n selectOption(option: ContextMenuOption): void {\r\n if (!this.active || this.active.kind !== 'menu' || option.disabled) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n request.resolve(option);\r\n }\r\n\r\n private handleOutsideEvent(event: Event): void {\r\n if (!this.active) return;\r\n if (performance.now() < this.ignoreOutsideUntil) return;\r\n\r\n const target = event.target as Node | null;\r\n const panel = this.panelRef?.nativeElement;\r\n if (panel && target && panel.contains(target)) return;\r\n\r\n this.dismissCurrent(null);\r\n }\r\n\r\n private dismissCurrent(value: ContextMenuOption | null): void {\r\n if (!this.active) return;\r\n const request = this.active;\r\n this.clearMenu();\r\n this.cdr.detectChanges();\r\n if (request.kind === 'menu') {\r\n request.resolve(value);\r\n } else {\r\n request.resolve();\r\n }\r\n }\r\n\r\n private clearMenu(): void {\r\n this.active = null;\r\n this.panelVisible = false;\r\n this.ignoreOutsideUntil = 0;\r\n }\r\n\r\n private applyClampedPosition(): void {\r\n const panel = this.panelRef?.nativeElement;\r\n if (!panel) return;\r\n\r\n const inset = ContextMenuServiceComponent.VIEWPORT_EDGE_INSET;\r\n const gap = ContextMenuServiceComponent.ANCHOR_OFFSET;\r\n const viewportW = document.documentElement.clientWidth;\r\n const viewportH = document.documentElement.clientHeight;\r\n const w = panel.offsetWidth || 220;\r\n const h = panel.offsetHeight || 120;\r\n\r\n const minX = inset;\r\n const maxX = Math.max(inset, viewportW - inset - w);\r\n const minY = inset;\r\n const maxY = Math.max(inset, viewportH - inset - h);\r\n\r\n let x = this.anchor.x + gap;\r\n let y = this.anchor.y + gap;\r\n\r\n if (x > maxX) {\r\n x = this.anchor.x - w - gap;\r\n }\r\n if (y > maxY) {\r\n y = this.anchor.y - h - gap;\r\n }\r\n\r\n this.position = {\r\n x: Math.max(minX, Math.min(x, maxX)),\r\n y: Math.max(minY, Math.min(y, maxY)),\r\n };\r\n this.cdr.detectChanges();\r\n }\r\n}\r\n","@if (active) {\r\n <div class=\"ContextMenuOverlay\" aria-hidden=\"true\">\r\n <div\r\n #panel\r\n class=\"ContextMenuPanel\"\r\n [class.ContextMenuPanel--visible]=\"panelVisible\"\r\n [class.ContextMenuPanel--menu]=\"active.kind === 'menu'\"\r\n [class.ContextMenuPanel--info]=\"active.kind === 'info'\"\r\n [style.left.px]=\"position.x\"\r\n [style.top.px]=\"position.y\"\r\n role=\"menu\"\r\n [attr.aria-label]=\"active.kind === 'info' ? active.info.title : (active.title || 'Opciones')\"\r\n [attr.aria-hidden]=\"!panelVisible\"\r\n (contextmenu)=\"$event.preventDefault()\"\r\n >\r\n @if (active.kind === 'menu') {\r\n @if (active.title) {\r\n <p class=\"ContextMenuMenuTitle\">{{ active.title }}</p>\r\n }\r\n @for (option of active.options; track $index) {\r\n @if (option.separatorBefore) {\r\n <div class=\"ContextMenuMenuSep\" aria-hidden=\"true\"></div>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"ContextMenuMenuItem\"\r\n [class.ContextMenuMenuItem--danger]=\"option.danger\"\r\n [class.ContextMenuMenuItem--disabled]=\"option.disabled\"\r\n [disabled]=\"option.disabled\"\r\n role=\"menuitem\"\r\n (click)=\"selectOption(option)\"\r\n >\r\n <lucide-icon [name]=\"option.icon\" [size]=\"14\"></lucide-icon>\r\n <span>{{ option.name }}</span>\r\n </button>\r\n }\r\n } @else {\r\n <div class=\"ContextMenuInfo\">\r\n <div class=\"ContextMenuInfoHeader\">\r\n <lucide-icon [name]=\"active.info.icon\" [size]=\"18\"></lucide-icon>\r\n <strong>{{ active.info.title }}</strong>\r\n </div>\r\n <p class=\"ContextMenuInfoBody\">{{ active.info.info }}</p>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n}\r\n","import { Component, Input, inject } from '@angular/core';\r\n\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport { ContextMenuService } from '../context-menu-service/context-menu.service';\r\n\r\n@Component({\r\n selector: 'field-help-tooltip',\r\n standalone: true,\r\n imports: [LucideIconComponent],\r\n templateUrl: './field-help-tooltip.component.html',\r\n styleUrl: './field-help-tooltip.component.sass',\r\n})\r\nexport class FieldHelpTooltipComponent {\r\n private readonly contextMenuService = inject(ContextMenuService);\r\n\r\n @Input({ required: true }) text = '';\r\n @Input() title = 'Información del campo';\r\n\r\n showHelp(event: MouseEvent): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n void this.contextMenuService.openInfo(event, {\r\n icon: 'info',\r\n title: this.title,\r\n info: this.text,\r\n });\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"HelpButton\"\r\n (click)=\"showHelp($event)\"\r\n aria-label=\"Información del campo\"\r\n>\r\n <lucide-icon name=\"info\"></lucide-icon>\r\n</button>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport type GeneralViewerMode = 'image' | 'video' | 'audio' | 'document' | 'download';\r\n\r\nexport interface MediaViewerState {\r\n open: boolean;\r\n mode: GeneralViewerMode;\r\n /** Pasado al visor hijo; `null`/`undefined` = autodetección según `autoDetectType`. */\r\n type: GeneralViewerMode | null | undefined;\r\n url: string | null;\r\n urlSafe: SafeResourceUrl | null;\r\n downloadUrl: string | null;\r\n fileName: string;\r\n downloadContext: unknown | null;\r\n autoDetectType: boolean;\r\n}\r\n\r\nexport type MediaViewerOpenParams = Omit<\r\n MediaViewerState,\r\n 'open' | 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'\r\n> &\r\n Partial<Pick<MediaViewerState, 'type' | 'downloadContext' | 'autoDetectType' | 'fileName'>> & {\r\n onDownloadRequested?: (context: unknown) => void;\r\n };\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MediaViewerService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n private closedState = (): MediaViewerState => ({\r\n open: false,\r\n mode: 'image',\r\n type: undefined,\r\n url: null,\r\n urlSafe: null,\r\n downloadUrl: null,\r\n fileName: this.config.mediaFileNameFallback,\r\n downloadContext: null,\r\n autoDetectType: true,\r\n });\r\n\r\n private readonly state = new BehaviorSubject<MediaViewerState>(this.closedState());\r\n readonly state$ = this.state.asObservable();\r\n\r\n private onDownloadRequestedCallback: ((context: unknown) => void) | null = null;\r\n\r\n /**\r\n * Opens the viewer with already-resolved URLs.\r\n * Host is responsible for CDN/crypto resolution before calling `open()`.\r\n */\r\n open(params: MediaViewerOpenParams): void {\r\n const { onDownloadRequested, type, downloadContext, autoDetectType, fileName, ...rest } =\r\n params;\r\n this.onDownloadRequestedCallback = onDownloadRequested ?? null;\r\n this.state.next({\r\n open: true,\r\n type: type ?? null,\r\n downloadContext: downloadContext ?? null,\r\n autoDetectType: autoDetectType ?? true,\r\n mode: rest.mode,\r\n url: rest.url,\r\n urlSafe: rest.urlSafe,\r\n downloadUrl: rest.downloadUrl,\r\n fileName: fileName?.trim() || this.config.mediaFileNameFallback,\r\n });\r\n }\r\n\r\n close(): void {\r\n this.onDownloadRequestedCallback = null;\r\n this.state.next(this.closedState());\r\n }\r\n\r\n handleDownloadRequested(context: unknown): void {\r\n this.onDownloadRequestedCallback?.(context);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Resoluciones usadas en el visor (referencia para otros componentes). */\r\nexport const IMAGE_MULTIRES_WIDTHS = [150, 400, 800] as const;\r\n\r\n/**\r\n * Visor de imagen: una sola carga del original, sin progresividad (sin versión pequeña previa).\r\n */\r\n@Component({\r\n selector: 'app-image-viewer',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './image-viewer.component.html',\r\n styleUrls: ['./image-viewer.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ImageViewerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n\r\n ready = false;\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.ready = false;\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onLoad(): void {\r\n this.ready = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"ImageViewer\" *ngIf=\"src\">\r\n <div class=\"RainbowLoader\" *ngIf=\"!ready && !loadError\"></div>\r\n <img\r\n *ngIf=\"src\"\r\n class=\"Layer\"\r\n [class.visible]=\"ready\"\r\n [src]=\"src\"\r\n [alt]=\"\"\r\n decoding=\"async\"\r\n (load)=\"onLoad()\"\r\n (error)=\"onError()\"\r\n />\r\n <div *ngIf=\"loadError\" class=\"FallbackNote\">\r\n <span>Error al cargar la imagen</span>\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/**\r\n * Lightweight native video player (no hls.js).\r\n * HLS (.m3u8) relies on browser Safari support; other browsers may need host-side remux.\r\n */\r\n@Component({\r\n selector: 'app-video-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './video-player.component.html',\r\n styleUrls: ['./video-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VideoPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n /** Informational; native player only. */\r\n @Input() videoFormat: 'hls' | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"VideoPlayer\" *ngIf=\"src\">\r\n <video\r\n class=\"VideoPlayerEl\"\r\n [src]=\"src\"\r\n controls\r\n playsinline\r\n (error)=\"onError()\"\r\n ></video>\r\n <p *ngIf=\"loadError\" class=\"VideoPlayerError\">No se pudo reproducir el video.</p>\r\n <p *ngIf=\"videoFormat === 'hls'\" class=\"VideoPlayerHint\">\r\n HLS: requiere soporte nativo del navegador.\r\n </p>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n/** Lightweight native audio player (no wavesurfer / hls.js). */\r\n@Component({\r\n selector: 'app-audio-player',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './audio-player.component.html',\r\n styleUrls: ['./audio-player.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AudioPlayerComponent implements OnChanges {\r\n @Input() src: string | null = null;\r\n @Input() name: string | null = null;\r\n\r\n loadError = false;\r\n\r\n constructor(private cdr: ChangeDetectorRef) {}\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['src']) {\r\n this.loadError = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onError(): void {\r\n this.loadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"AudioPlayer\" *ngIf=\"src\">\r\n <p *ngIf=\"name\" class=\"AudioPlayerName\">{{ name }}</p>\r\n <audio class=\"AudioPlayerEl\" [src]=\"src\" controls (error)=\"onError()\"></audio>\r\n <p *ngIf=\"loadError\" class=\"AudioPlayerError\">No se pudo reproducir el audio.</p>\r\n</div>\r\n","import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnDestroy,\r\n inject,\r\n PLATFORM_ID,\r\n SimpleChange,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { ImageViewerComponent } from './items/image-viewer/image-viewer.component';\r\nimport { VideoPlayerComponent } from './items/video-player/video-player.component';\r\nimport { AudioPlayerComponent } from './items/audio-player/audio-player.component';\r\nimport { GeneralViewerMode, MediaViewerService, MediaViewerState } from './media-viewer.service';\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nconst DOCUMENT_LOAD_TIMEOUT_MS = 10000;\r\nconst VIEWER_DIFF_KEYS = ['open', 'mode', 'type', 'url', 'urlSafe', 'autoDetectType'] as const;\r\n\r\n/**\r\n * Host singleton media viewer.\r\n * Expects already-resolved public URLs from the host (no crypto / CDN decrypt).\r\n */\r\n@Component({\r\n selector: 'media-viewer-service',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,\r\n CommonModule,\r\n ImageViewerComponent,\r\n VideoPlayerComponent,\r\n AudioPlayerComponent,\r\n ],\r\n templateUrl: './media-viewer-service.component.html',\r\n styleUrls: ['./media-viewer-service.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MediaViewerServiceComponent implements OnDestroy {\r\n private platformId = inject(PLATFORM_ID);\r\n private readonly viewer = inject(MediaViewerService);\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private cdr = inject(ChangeDetectorRef);\r\n private sanitizer = inject(DomSanitizer);\r\n\r\n private _prevVm: MediaViewerState | null = null;\r\n\r\n open = false;\r\n mode: GeneralViewerMode = 'image';\r\n type: GeneralViewerMode | null | undefined = undefined;\r\n url: string | null = null;\r\n urlSafe: SafeResourceUrl | null = null;\r\n autoDetectType = true;\r\n downloadUrl: string | null = null;\r\n fileName = 'Archivo';\r\n downloadContext: unknown = null;\r\n\r\n detectedMode: GeneralViewerMode | null = null;\r\n detectingOrLoading = false;\r\n detectError = false;\r\n documentBlobUrl: string | null = null;\r\n documentRenderFailed = false;\r\n resolvedMediaUrl: string | null = null;\r\n private blobUrlsToRevoke: string[] = [];\r\n private documentLoadTimeout: ReturnType<typeof setTimeout> | null = null;\r\n private cachedDocumentUrlRaw: string | null = null;\r\n private cachedDocumentUrlSafe: SafeResourceUrl | null = null;\r\n\r\n constructor() {\r\n this.viewer.state$.pipe(takeUntilDestroyed()).subscribe((vm) => {\r\n const changes = this.diffViewerState(this._prevVm, vm);\r\n this.applyVmFields(vm);\r\n this._prevVm = vm;\r\n this.onViewerInputsChanged(changes);\r\n });\r\n }\r\n\r\n private diffViewerState(prev: MediaViewerState | null, curr: MediaViewerState): SimpleChanges {\r\n const out: SimpleChanges = {};\r\n for (const k of VIEWER_DIFF_KEYS) {\r\n const p = prev?.[k];\r\n const c = curr[k];\r\n if (p !== c) {\r\n out[k] = new SimpleChange(p, c, prev === null);\r\n }\r\n }\r\n return out;\r\n }\r\n\r\n private applyVmFields(vm: MediaViewerState): void {\r\n this.open = vm.open;\r\n this.mode = vm.mode;\r\n this.type = vm.type;\r\n this.url = vm.url;\r\n this.urlSafe = vm.urlSafe;\r\n this.autoDetectType = vm.autoDetectType;\r\n this.downloadUrl = vm.downloadUrl;\r\n this.fileName = vm.fileName || this.config.mediaFileNameFallback;\r\n this.downloadContext = vm.downloadContext;\r\n }\r\n\r\n get effectiveMode(): GeneralViewerMode {\r\n return this.detectedMode ?? this.mode;\r\n }\r\n\r\n get videoPlayerFormat(): 'hls' | null {\r\n const u = (this.mediaSrc ?? '').trim().toLowerCase();\r\n return u.includes('.m3u8') ? 'hls' : null;\r\n }\r\n\r\n get typeLabel(): string {\r\n if (this.detectingOrLoading && !this.detectedMode) return 'Cargando...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n return labels[this.effectiveMode] ?? this.config.mediaFileNameFallback;\r\n }\r\n\r\n get loadingMessage(): string {\r\n if (!this.detectedMode) return 'Detectando tipo...';\r\n const labels: Record<GeneralViewerMode, string> = {\r\n image: 'Imagen',\r\n video: 'Video',\r\n audio: 'Audio',\r\n document: 'Documento',\r\n download: 'Archivo',\r\n };\r\n const name = labels[this.detectedMode] ?? 'archivo';\r\n return `Cargando ${name.toLowerCase()}...`;\r\n }\r\n\r\n get mediaSrc(): string | null {\r\n if (this.resolvedMediaUrl) return this.resolvedMediaUrl;\r\n return this.url;\r\n }\r\n\r\n get documentUrlSafe(): SafeResourceUrl | null {\r\n if (this.urlSafe) return this.urlSafe;\r\n const url = this.documentBlobUrl ?? this.url ?? null;\r\n if (!url || this.effectiveMode !== 'document') {\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n return null;\r\n }\r\n if (this.cachedDocumentUrlRaw === url && this.cachedDocumentUrlSafe) {\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n this.cachedDocumentUrlRaw = url;\r\n this.cachedDocumentUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(url);\r\n return this.cachedDocumentUrlSafe;\r\n }\r\n\r\n private onViewerInputsChanged(changes: SimpleChanges): void {\r\n const docRelevant =\r\n (changes['open'] ??\r\n changes['mode'] ??\r\n changes['type'] ??\r\n changes['url'] ??\r\n changes['urlSafe'] ??\r\n changes['autoDetectType']) != null;\r\n if (!docRelevant) return;\r\n\r\n if (changes['url'] ?? changes['urlSafe']) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n }\r\n\r\n if (!this.open || !this.url) {\r\n this.documentBlobUrl = null;\r\n this.cachedDocumentUrlRaw = null;\r\n this.cachedDocumentUrlSafe = null;\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.detectedMode = null;\r\n this.detectingOrLoading = false;\r\n this.detectError = false;\r\n }\r\n\r\n if (this.open && this.url) {\r\n const hasExplicitType = this.type != null && this.type !== undefined;\r\n if (hasExplicitType) {\r\n this.detectedMode = this.type;\r\n this.detectError = false;\r\n this.detectingOrLoading = false;\r\n this.resolvedMediaUrl = this.url;\r\n if (this.type === 'document') {\r\n void this.fetchAsBlob(this.url).then((blobUrl) => {\r\n if (blobUrl) {\r\n this.documentBlobUrl = blobUrl;\r\n this.blobUrlsToRevoke.push(blobUrl);\r\n }\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.cdr.markForCheck();\r\n } else if (this.autoDetectType) {\r\n this.detectAndLoadFromUrl(this.url);\r\n } else {\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = this.url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n }\r\n } else {\r\n this.resolvedMediaUrl = null;\r\n }\r\n\r\n this.clearDocumentLoadTimeout();\r\n if (\r\n this.open &&\r\n this.effectiveMode === 'document' &&\r\n (this.documentBlobUrl || this.url || this.urlSafe)\r\n ) {\r\n this.documentRenderFailed = false;\r\n this.documentLoadTimeout = setTimeout(() => {\r\n this.documentLoadTimeout = null;\r\n this.documentRenderFailed = true;\r\n this.cdr.markForCheck();\r\n }, DOCUMENT_LOAD_TIMEOUT_MS);\r\n } else {\r\n this.documentRenderFailed = false;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.revokeBlobUrls();\r\n }\r\n\r\n private detectAndLoadFromUrl(url: string): void {\r\n this.revokeBlobUrls();\r\n this.resolvedMediaUrl = null;\r\n this.documentBlobUrl = null;\r\n this.detectedMode = null;\r\n this.detectError = false;\r\n this.detectingOrLoading = true;\r\n this.cdr.markForCheck();\r\n\r\n this.fetchContentType(url)\r\n .then((contentType) => this.detectModeFromContentType(url, contentType))\r\n .then((mode) => {\r\n this.detectedMode = mode;\r\n this.cdr.markForCheck();\r\n if (mode === 'image' || mode === 'document') {\r\n return this.fetchAsBlob(url).then((blobUrl) => {\r\n if (mode === 'image') this.resolvedMediaUrl = blobUrl ?? url;\r\n else this.documentBlobUrl = blobUrl;\r\n if (blobUrl) this.blobUrlsToRevoke.push(blobUrl);\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n this.resolvedMediaUrl = url;\r\n this.detectingOrLoading = false;\r\n this.cdr.markForCheck();\r\n return undefined;\r\n })\r\n .catch(() => {\r\n this.detectError = true;\r\n this.detectingOrLoading = false;\r\n this.detectedMode = this.mode;\r\n this.resolvedMediaUrl = url;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private fetchContentType(url: string): Promise<string> {\r\n const readCt = (r: Response) => (r.headers.get('content-type') ?? '').trim();\r\n\r\n const tryHead = (): Promise<string> =>\r\n fetch(url, { method: 'HEAD', mode: 'cors' }).then((r) => {\r\n if (!r.ok) return '';\r\n return readCt(r);\r\n });\r\n\r\n const tryGetRange = (): Promise<string> =>\r\n fetch(url, {\r\n method: 'GET',\r\n mode: 'cors',\r\n headers: { Range: 'bytes=0-0' },\r\n }).then((r) => {\r\n if (!(r.ok || r.status === 206)) return '';\r\n return readCt(r);\r\n });\r\n\r\n return tryHead()\r\n .then((ct) => ct || tryGetRange())\r\n .catch(() => tryGetRange())\r\n .catch(() => '');\r\n }\r\n\r\n private urlPathname(absUrl: string): string {\r\n try {\r\n const base =\r\n typeof window !== 'undefined' && window.location?.origin\r\n ? window.location.origin\r\n : 'https://invalid.local';\r\n return new URL(absUrl, base).pathname;\r\n } catch {\r\n return absUrl.split(/[?#]/)[0];\r\n }\r\n }\r\n\r\n private pathnameExtensionFromUrl(absUrl: string): string {\r\n const path = this.urlPathname(absUrl);\r\n const base = path.split('/').pop() ?? '';\r\n const dot = base.lastIndexOf('.');\r\n return dot > 0 ? base.slice(dot + 1).toLowerCase() : '';\r\n }\r\n\r\n private detectModeFromUrlPathOnly(absUrl: string): GeneralViewerMode | null {\r\n const pathLower = this.urlPathname(absUrl).toLowerCase();\r\n if (pathLower.endsWith('.m3u8') || pathLower.includes('/master.m3u8')) {\r\n return 'video';\r\n }\r\n const ext = this.pathnameExtensionFromUrl(absUrl);\r\n if (['webp', 'jpg', 'jpeg', 'png', 'gif', 'avif', 'bmp', 'svg'].includes(ext)) return 'image';\r\n if (['webm', 'mp4', 'ogg', 'ogv', 'mov', 'm4v', 'mkv'].includes(ext)) return 'video';\r\n if (['mp3', 'wav', 'oga', 'm4a', 'aac', 'flac', 'opus'].includes(ext)) return 'audio';\r\n if (['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp'].includes(ext)) {\r\n return 'document';\r\n }\r\n return null;\r\n }\r\n\r\n private detectModeFromContentType(url: string, contentType: string): GeneralViewerMode {\r\n const type = (contentType.split(';')[0] ?? '').trim().toLowerCase();\r\n const fromPath = this.detectModeFromUrlPathOnly(url);\r\n\r\n if (type.startsWith('image/')) return 'image';\r\n if (type.startsWith('video/')) return 'video';\r\n if (type.startsWith('audio/')) return 'audio';\r\n if (type === 'application/pdf' || type.includes('pdf')) return 'document';\r\n if (\r\n type.includes('document') ||\r\n type.includes('msword') ||\r\n type.includes('excel') ||\r\n type.includes('powerpoint') ||\r\n type.includes('officedocument') ||\r\n type.includes('opendocument')\r\n ) {\r\n return 'document';\r\n }\r\n\r\n if (fromPath) return fromPath;\r\n return 'download';\r\n }\r\n\r\n private fetchAsBlob(url: string): Promise<string | null> {\r\n return fetch(url, { mode: 'cors' })\r\n .then((r) => {\r\n if (!r.ok) throw new Error('Fetch failed');\r\n return r.blob();\r\n })\r\n .then((blob) => URL.createObjectURL(blob))\r\n .catch(() => null);\r\n }\r\n\r\n private revokeBlobUrls(): void {\r\n const toRevoke = [...this.blobUrlsToRevoke];\r\n this.blobUrlsToRevoke = [];\r\n if (this.resolvedMediaUrl && toRevoke.includes(this.resolvedMediaUrl)) {\r\n this.resolvedMediaUrl = null;\r\n }\r\n this.documentBlobUrl = null;\r\n for (const u of toRevoke) {\r\n try {\r\n URL.revokeObjectURL(u);\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n }\r\n\r\n private clearDocumentLoadTimeout(): void {\r\n if (this.documentLoadTimeout != null) {\r\n clearTimeout(this.documentLoadTimeout);\r\n this.documentLoadTimeout = null;\r\n }\r\n }\r\n\r\n onDocumentIframeLoad(): void {\r\n this.clearDocumentLoadTimeout();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onBackdropClick(): void {\r\n this.viewer.close();\r\n }\r\n\r\n onContentClick(event: Event): void {\r\n event.stopPropagation();\r\n }\r\n\r\n close(): void {\r\n this.viewer.close();\r\n }\r\n\r\n triggerDownload(): void {\r\n const url = this.downloadUrl ?? this.url;\r\n if (url && typeof url === 'string' && url.trim().startsWith('http')) {\r\n if (isPlatformBrowser(this.platformId)) {\r\n window.open(url.trim(), '_blank');\r\n }\r\n } else if (this.downloadContext != null) {\r\n this.viewer.handleDownloadRequested(this.downloadContext);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<div class=\"GeneralViewerBackdrop\" *ngIf=\"open\" (click)=\"onBackdropClick()\">\r\n <div class=\"GeneralViewerContent\" (click)=\"onContentClick($event)\">\r\n <div class=\"GeneralViewerHeader\">\r\n <span class=\"GeneralViewerTypeLabel\">{{ typeLabel }}</span>\r\n <button type=\"button\" class=\"GeneralViewerClose\" (click)=\"close()\" aria-label=\"Cerrar\">\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n </div>\r\n <div class=\"GeneralViewerBody\" [class.GeneralViewerBody--document]=\"effectiveMode === 'document'\">\r\n <div *ngIf=\"detectingOrLoading\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>{{ loadingMessage }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && detectError && !resolvedMediaUrl && effectiveMode === 'download'\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"triangle-alert\"></lucide-icon>\r\n <p>No se pudo detectar el tipo de archivo.</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"url\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">Descargar</button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <app-image-viewer\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'image' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n ></app-image-viewer>\r\n\r\n <app-video-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'video' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [videoFormat]=\"videoPlayerFormat\"\r\n ></app-video-player>\r\n\r\n <app-audio-player\r\n *ngIf=\"!detectingOrLoading && effectiveMode === 'audio' && mediaSrc\"\r\n [src]=\"mediaSrc\"\r\n [name]=\"fileName\"\r\n ></app-audio-player>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerDocument\">\r\n <iframe\r\n [src]=\"documentUrlSafe\"\r\n frameborder=\"0\"\r\n class=\"GeneralViewerIframe\"\r\n [attr.title]=\"fileName\"\r\n (load)=\"onDocumentIframeLoad()\"\r\n ></iframe>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'document' && documentRenderFailed\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n No se pudo mostrar el documento. Puede descargarlo con el botón o cerrar.\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && effectiveMode === 'download' && !detectError\" class=\"GeneralViewerDownload\">\r\n <p class=\"GeneralViewerDownloadMessage\">\r\n {{ (downloadUrl || url || downloadContext) ? 'Este archivo no se puede previsualizar. Puede descargarlo con el botón o cerrar.' : 'No se pudo cargar la URL del archivo.' }}\r\n </p>\r\n <p class=\"GeneralViewerDownloadFileName\">{{ fileName }}</p>\r\n <button *ngIf=\"downloadUrl || url || downloadContext\" type=\"button\" class=\"GeneralViewerBtnDownload\" (click)=\"triggerDownload()\">\r\n Descargar\r\n </button>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">\r\n Listo, Cerrar\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode === 'document' && !documentUrlSafe && !documentRenderFailed\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\r\n <p>Cargando documento...</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Cerrar</button>\r\n </div>\r\n\r\n <div *ngIf=\"!detectingOrLoading && open && effectiveMode !== 'download' && effectiveMode !== 'document' && !mediaSrc && !documentUrlSafe\" class=\"GeneralViewerNoContent\">\r\n <lucide-icon name=\"file\"></lucide-icon>\r\n <p>No se pudo cargar el archivo</p>\r\n <p class=\"GeneralViewerFileName\">{{ fileName }}</p>\r\n <button type=\"button\" class=\"GeneralViewerBtnClose\" (click)=\"close()\">Listo, Cerrar</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { Subject } from 'rxjs';\r\n\r\nexport interface SessionRequestMessage {\r\n id: number;\r\n lucideIcon: string;\r\n message: string;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SessionRequestService {\r\n private sessionRequestSubject = new Subject<SessionRequestMessage>();\r\n sessionRequest$ = this.sessionRequestSubject.asObservable();\r\n\r\n private idCounter = 0;\r\n private readonly isBrowser: boolean;\r\n\r\n constructor(@Inject(PLATFORM_ID) private platformId: object) {\r\n this.isBrowser = isPlatformBrowser(this.platformId);\r\n }\r\n\r\n /**\r\n * Muestra un overlay solicitando sesión.\r\n * @param lucideIcon Nombre del icono Lucide en kebab-case (ej: shopping-cart).\r\n */\r\n showSessionRequest(lucideIcon: string, message: string): void {\r\n if (!this.isBrowser) return;\r\n\r\n const sessionRequest: SessionRequestMessage = {\r\n id: ++this.idCounter,\r\n lucideIcon,\r\n message,\r\n };\r\n this.sessionRequestSubject.next(sessionRequest);\r\n }\r\n}\r\n","import { Component, OnInit, inject } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { SessionRequestMessage, SessionRequestService } from './session-request.service';\r\nimport { trigger, transition, style, animate } from '@angular/animations';\r\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\n@Component({\r\n selector: 'session-request-service',\r\n standalone: true,\r\n imports: [LucideIconComponent, CommonModule, RouterModule],\r\n templateUrl: './session-request-service.component.html',\r\n styleUrls: ['./session-request-service.component.sass'],\r\n animations: [\r\n trigger('sessionRequestAnimation', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'scale(0.9)' }),\r\n animate('200ms ease-out', style({ opacity: 1, transform: 'scale(1)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('200ms ease-in', style({ opacity: 0, transform: 'scale(0.9)' })),\r\n ]),\r\n ]),\r\n ],\r\n})\r\nexport class SessionRequestServiceComponent implements OnInit {\r\n sessionRequests: SessionRequestMessage[] = [];\r\n readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n constructor(private sessionRequestService: SessionRequestService) {}\r\n\r\n ngOnInit(): void {\r\n this.sessionRequestService.sessionRequest$.subscribe((sessionRequest) => {\r\n this.sessionRequests.push(sessionRequest);\r\n });\r\n }\r\n\r\n closeSessionRequest(id: number): void {\r\n this.sessionRequests = this.sessionRequests.filter((sr) => sr.id !== id);\r\n }\r\n\r\n trackById(_index: number, item: SessionRequestMessage): number {\r\n return item.id;\r\n }\r\n}\r\n","<div class=\"SessionRequestOverlay\" *ngIf=\"sessionRequests.length > 0\">\r\n <div\r\n class=\"SessionRequest\"\r\n *ngFor=\"let sessionRequest of sessionRequests; trackBy: trackById\"\r\n [@sessionRequestAnimation]\r\n >\r\n <button\r\n type=\"button\"\r\n class=\"CloseButton\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n title=\"Cerrar\"\r\n >\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n <div class=\"SessionRequestContent\">\r\n <div class=\"SessionRequestIcon\">\r\n <lucide-icon [name]=\"sessionRequest.lucideIcon\"></lucide-icon>\r\n </div>\r\n <div class=\"SessionRequestMessage\">\r\n {{ sessionRequest.message }}\r\n </div>\r\n <div class=\"SessionRequestActions\">\r\n <a\r\n class=\"SessionRequestButton RegisterButton\"\r\n [routerLink]=\"config.sessionRegisterPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"user-plus\"></lucide-icon>\r\n {{ config.sessionRegisterLabel }}\r\n </a>\r\n <a\r\n class=\"SessionRequestButton LoginButton\"\r\n [routerLink]=\"config.sessionLoginPath\"\r\n (click)=\"closeSessionRequest(sessionRequest.id)\"\r\n >\r\n <lucide-icon name=\"log-in\"></lucide-icon>\r\n {{ config.sessionLoginLabel }}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\n\r\nexport interface GlobalLoadingProcess {\r\n id: string;\r\n message: string;\r\n}\r\n\r\n/**\r\n * Capa global de carga: un mismo backdrop desde el primer `push` hasta el último `pop`.\r\n * Varios procesos concurrentes se listan con su mensaje.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class GlobalLoadingService {\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n\r\n get defaultMessage(): string {\r\n return this.config.loadingDefaultMessage;\r\n }\r\n\r\n private seq = 0;\r\n private readonly processes$ = new BehaviorSubject<GlobalLoadingProcess[]>([]);\r\n\r\n get snapshot(): GlobalLoadingProcess[] {\r\n return this.processes$.getValue();\r\n }\r\n\r\n readonly processes = this.processes$.asObservable();\r\n\r\n push(message?: string): string {\r\n const id = `gl-${++this.seq}`;\r\n const msg =\r\n message != null && String(message).trim() !== ''\r\n ? String(message).trim()\r\n : this.defaultMessage;\r\n const next = [...this.processes$.getValue(), { id, message: msg }];\r\n this.processes$.next(next);\r\n return id;\r\n }\r\n\r\n setMessage(id: string, message: string): void {\r\n const msg = String(message).trim() || this.defaultMessage;\r\n const cur = this.processes$.getValue();\r\n const idx = cur.findIndex((p) => p.id === id);\r\n if (idx < 0) return;\r\n const next = [...cur];\r\n next[idx] = { ...next[idx], message: msg };\r\n this.processes$.next(next);\r\n }\r\n\r\n pop(id: string): void {\r\n const cur = this.processes$.getValue();\r\n const next = cur.filter((p) => p.id !== id);\r\n if (next.length === cur.length) return;\r\n this.processes$.next(next);\r\n }\r\n}\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n GlobalLoadingProcess,\r\n GlobalLoadingService,\r\n} from './global-loading.service';\r\n\r\n@Component({\r\n selector: 'global-loading-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './global-loading-service.component.html',\r\n styleUrls: ['./global-loading-service.component.sass'],\r\n})\r\nexport class GlobalLoadingServiceComponent implements OnInit, OnDestroy {\r\n processes: GlobalLoadingProcess[] = [];\r\n private sub?: Subscription;\r\n\r\n constructor(private globalLoading: GlobalLoadingService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.globalLoading.processes.subscribe((list) => {\r\n this.processes = list;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n\r\n trackById(_index: number, item: GlobalLoadingProcess): string {\r\n return item.id;\r\n }\r\n}\r\n","<div\r\n *ngIf=\"processes.length > 0\"\r\n class=\"GlobalLoadingOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"GlobalLoadingCard\">\r\n <div class=\"GlobalLoadingSpinner\" aria-hidden=\"true\"></div>\r\n <ul class=\"GlobalLoadingList\">\r\n <li *ngFor=\"let p of processes; trackBy: trackById\" class=\"GlobalLoadingItem\">\r\n {{ p.message }}\r\n </li>\r\n </ul>\r\n </div>\r\n</div>\r\n","import { Injectable, PLATFORM_ID, inject, signal } from '@angular/core'\nimport { isPlatformBrowser } from '@angular/common'\nimport {\n NavigationCancel,\n NavigationEnd,\n NavigationError,\n NavigationStart,\n Router,\n} from '@angular/router'\n\nconst SHOW_DELAY_MS = 120\nconst COMPLETE_HIDE_MS = 320\nconst PROGRESS_TICK_MS = 180\nconst MAX_SIMULATED_PROGRESS = 92\n\n@Injectable({ providedIn: 'root' })\nexport class NavigationLoadingService {\n private readonly router = inject(Router)\n private readonly platformId = inject(PLATFORM_ID)\n\n /** Barra visible (solo tras superar el delay en navegaciones lentas). */\n readonly active = signal(false)\n /** Progreso 0–100 para la barra. */\n readonly progress = signal(0)\n\n private routerBound = false\n private navigationGeneration = 0\n private showDelayTimer: ReturnType<typeof setTimeout> | null = null\n private progressTimer: ReturnType<typeof setInterval> | null = null\n private hideTimer: ReturnType<typeof setTimeout> | null = null\n\n /** Llamar una vez desde el host (evita suscribirse en el constructor). */\n bindToRouter(): void {\n if (this.routerBound || !isPlatformBrowser(this.platformId)) {\n return\n }\n this.routerBound = true\n\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationStart) {\n this.onNavigationStart()\n return\n }\n if (\n event instanceof NavigationEnd ||\n event instanceof NavigationCancel ||\n event instanceof NavigationError\n ) {\n this.onNavigationEnd()\n }\n })\n }\n\n private onNavigationStart(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearHideTimer()\n this.clearProgressTimer()\n this.clearShowDelayTimer()\n\n this.showDelayTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(true)\n this.progress.set(12)\n this.startProgressSimulation(generation)\n }, SHOW_DELAY_MS)\n }\n\n private onNavigationEnd(): void {\n this.navigationGeneration += 1\n const generation = this.navigationGeneration\n\n this.clearShowDelayTimer()\n this.clearProgressTimer()\n\n if (!this.active()) {\n this.progress.set(0)\n return\n }\n\n this.progress.set(100)\n\n this.clearHideTimer()\n this.hideTimer = setTimeout(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n this.active.set(false)\n this.progress.set(0)\n }, COMPLETE_HIDE_MS)\n }\n\n private startProgressSimulation(generation: number): void {\n this.clearProgressTimer()\n this.progressTimer = setInterval(() => {\n if (generation !== this.navigationGeneration) {\n return\n }\n const current = this.progress()\n if (current >= MAX_SIMULATED_PROGRESS) {\n return\n }\n const step = current < 40 ? 14 : current < 70 ? 8 : 4\n this.progress.set(Math.min(MAX_SIMULATED_PROGRESS, current + step))\n }, PROGRESS_TICK_MS)\n }\n\n private clearShowDelayTimer(): void {\n if (this.showDelayTimer !== null) {\n clearTimeout(this.showDelayTimer)\n this.showDelayTimer = null\n }\n }\n\n private clearProgressTimer(): void {\n if (this.progressTimer !== null) {\n clearInterval(this.progressTimer)\n this.progressTimer = null\n }\n }\n\n private clearHideTimer(): void {\n if (this.hideTimer !== null) {\n clearTimeout(this.hideTimer)\n this.hideTimer = null\n }\n }\n}\n","import { Component, OnInit, inject } from '@angular/core';\nimport { LucideIconComponent } from '../lucide-icon/lucide-icon.component';\nimport { NavigationLoadingService } from './navigation-loading.service';\n\n@Component({\n selector: 'navigation-loading-service',\n standalone: true,\n imports: [LucideIconComponent],\n templateUrl: './navigation-loading-service.component.html',\n styleUrl: './navigation-loading-service.component.sass',\n})\nexport class NavigationLoadingServiceComponent implements OnInit {\n readonly navLoading = inject(NavigationLoadingService);\n\n ngOnInit(): void {\n this.navLoading.bindToRouter();\n }\n}\n","@if (navLoading.active()) {\n <div\n class=\"NavigationLoadingBackdrop\"\n role=\"status\"\n aria-live=\"polite\"\n aria-busy=\"true\"\n aria-label=\"Navegando\"\n >\n <div class=\"NavigationLoadingCard\">\n <div class=\"NavigationLoadingIconWrap\" aria-hidden=\"true\">\n <lucide-icon name=\"loader-circle\" [spin]=\"true\"></lucide-icon>\n </div>\n <div class=\"NavigationLoadingCopy\">\n <p class=\"NavigationLoadingTitle\">Navegando...</p>\n <p class=\"NavigationLoadingHint\">Preparando la vista</p>\n </div>\n <div class=\"NavigationLoadingProgressTrack\" aria-hidden=\"true\">\n <div class=\"NavigationLoadingProgressFill\" [style.width.%]=\"navLoading.progress()\"></div>\n </div>\n </div>\n </div>\n}\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface AiAutofillOverlayState {\r\n id: string;\r\n title: string;\r\n logs: string[];\r\n startedAt: number;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AiAutofillOverlayService {\r\n private seq = 0;\r\n private readonly state$ = new BehaviorSubject<AiAutofillOverlayState | null>(null);\r\n\r\n readonly state = this.state$.asObservable();\r\n\r\n get snapshot(): AiAutofillOverlayState | null {\r\n return this.state$.getValue();\r\n }\r\n\r\n start(title: string = 'Autocompletando con IA...'): string {\r\n const id = `ai-${++this.seq}`;\r\n this.state$.next({\r\n id,\r\n title: String(title).trim() || 'Autocompletando con IA...',\r\n logs: [],\r\n startedAt: Date.now(),\r\n });\r\n return id;\r\n }\r\n\r\n log(id: string, line: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n const msg = String(line ?? '').trim();\r\n if (!msg) return;\r\n this.state$.next({ ...cur, logs: [...cur.logs, msg] });\r\n }\r\n\r\n replaceLogs(id: string, logs: string[]): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next({ ...cur, logs: Array.isArray(logs) ? logs.map((x) => String(x)) : [] });\r\n }\r\n\r\n end(id: string): void {\r\n const cur = this.state$.getValue();\r\n if (!cur || cur.id !== id) return;\r\n this.state$.next(null);\r\n }\r\n}\r\n\r\n","import { Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { Subscription } from 'rxjs';\r\nimport {\r\n AiAutofillOverlayService,\r\n AiAutofillOverlayState,\r\n} from './ai-autofill-overlay.service';\r\n\r\n@Component({\r\n selector: 'ai-autofill-overlay-service',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './ai-autofill-overlay-service.component.html',\r\n styleUrls: ['./ai-autofill-overlay-service.component.sass'],\r\n})\r\nexport class AiAutofillOverlayServiceComponent implements OnInit, OnDestroy {\r\n state: AiAutofillOverlayState | null = null;\r\n private sub?: Subscription;\r\n\r\n constructor(private aiOverlay: AiAutofillOverlayService) {}\r\n\r\n ngOnInit(): void {\r\n this.sub = this.aiOverlay.state.subscribe((s) => {\r\n this.state = s;\r\n });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n }\r\n}\r\n\r\n","<div\r\n *ngIf=\"state\"\r\n class=\"AiAutofillOverlay\"\r\n aria-live=\"polite\"\r\n aria-busy=\"true\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n>\r\n <div class=\"AiAutofillCard\">\r\n <div class=\"AiAutofillHeader\">\r\n <div class=\"AiAutofillSpinner\" aria-hidden=\"true\"></div>\r\n <div class=\"AiAutofillTitle\">{{ state.title }}</div>\r\n </div>\r\n\r\n <div class=\"AiAutofillLogs\" aria-label=\"Logs de IA en tiempo real\">\r\n <pre class=\"AiAutofillPre\">{{ state.logs.join('\\n') }}</pre>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n","import { Inject, Injectable, PLATFORM_ID, inject } from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n ResolvedXosueUtilsServicesConfig,\r\n} from '../../config/services-config';\r\nimport { AlertService } from '../alert-service/alert.service';\r\n\r\nexport type BrowserNotificationPayload = {\r\n title: string;\r\n body: string;\r\n /** Agrupa/reemplaza notificaciones con el mismo tag. */\r\n tag: string;\r\n data?: Record<string, unknown>;\r\n onClick?: () => void;\r\n};\r\n\r\n/**\r\n * Thin wrapper around the Web Notifications API.\r\n * Host-agnostic: no chat/app coupling. Optional AlertService for permission prompt.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class BrowserNotificationService {\r\n private readonly isBrowser: boolean;\r\n private readonly config: ResolvedXosueUtilsServicesConfig = inject(XOSUE_UTILS_SERVICES_CONFIG);\r\n private readonly alert = inject(AlertService, { optional: true });\r\n private permissionRequestInFlight: Promise<NotificationPermission> | null = null;\r\n private readonly pendingQueue: BrowserNotificationPayload[] = [];\r\n private readonly tracked = new Map<string, Notification>();\r\n\r\n constructor(@Inject(PLATFORM_ID) platformId: object) {\r\n this.isBrowser = isPlatformBrowser(platformId);\r\n }\r\n\r\n get isSupported(): boolean {\r\n return this.isBrowser && typeof Notification !== 'undefined';\r\n }\r\n\r\n get permission(): NotificationPermission {\r\n if (!this.isSupported) return 'denied';\r\n return Notification.permission;\r\n }\r\n\r\n get canShow(): boolean {\r\n return this.isSupported && this.permission === 'granted';\r\n }\r\n\r\n queuePending(payload: BrowserNotificationPayload): void {\r\n this.pendingQueue.push(payload);\r\n if (this.pendingQueue.length > 8) {\r\n this.pendingQueue.shift();\r\n }\r\n }\r\n\r\n /** Call from a user gesture (click) so the browser allows requestPermission. */\r\n beginPermissionRequest(): void {\r\n if (!this.isSupported || Notification.permission !== 'default') return;\r\n if (!this.permissionRequestInFlight) {\r\n this.permissionRequestInFlight = Notification.requestPermission().catch(\r\n () => 'denied' as NotificationPermission,\r\n );\r\n }\r\n }\r\n\r\n async completePermissionRequest(): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (Notification.permission === 'granted') return true;\r\n if (Notification.permission === 'denied') return false;\r\n if (!this.permissionRequestInFlight) return false;\r\n const perm = await this.permissionRequestInFlight;\r\n return perm === 'granted';\r\n }\r\n\r\n /**\r\n * Optional UX helper: confirm via AlertService then request permission on Accept click.\r\n * Returns whether permission was granted.\r\n */\r\n async requestPermissionWithPrompt(promptMessage?: string): Promise<boolean> {\r\n if (!this.isSupported) return false;\r\n if (this.permission === 'granted') return true;\r\n if (this.permission === 'denied') return false;\r\n\r\n if (!this.alert) {\r\n this.beginPermissionRequest();\r\n return this.completePermissionRequest();\r\n }\r\n\r\n const accepted = await this.alert.showConfirm(\r\n promptMessage ?? this.config.browserNotificationPermissionPrompt,\r\n { onAcceptClick: () => this.beginPermissionRequest() },\r\n );\r\n if (!accepted) return false;\r\n return this.completePermissionRequest();\r\n }\r\n\r\n drainPendingQueue(): number {\r\n const batch = [...this.pendingQueue];\r\n this.pendingQueue.length = 0;\r\n let shown = 0;\r\n for (const payload of batch) {\r\n if (this.show(payload)) shown += 1;\r\n }\r\n return shown;\r\n }\r\n\r\n showOrQueue(payload: BrowserNotificationPayload): boolean {\r\n if (!this.isSupported) return false;\r\n if (this.canShow) return this.show(payload);\r\n if (Notification.permission === 'denied') return false;\r\n this.queuePending(payload);\r\n return false;\r\n }\r\n\r\n show(payload: BrowserNotificationPayload): boolean {\r\n if (!this.canShow) return false;\r\n\r\n try {\r\n const icon = this.resolveIconUrl();\r\n const notification = new Notification(payload.title, {\r\n body: payload.body,\r\n tag: payload.tag,\r\n icon,\r\n badge: icon,\r\n requireInteraction: false,\r\n silent: false,\r\n data: payload.data,\r\n });\r\n\r\n this.tracked.set(payload.tag, notification);\r\n notification.onclose = () => this.tracked.delete(payload.tag);\r\n\r\n notification.onclick = (ev) => {\r\n ev.preventDefault();\r\n try {\r\n window.focus();\r\n } catch {\r\n /* ignore */\r\n }\r\n payload.onClick?.();\r\n notification.close();\r\n };\r\n\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n closeByTag(tag: string): void {\r\n const n = this.tracked.get(tag);\r\n if (n) {\r\n try {\r\n n.close();\r\n } catch {\r\n /* ignore */\r\n }\r\n this.tracked.delete(tag);\r\n }\r\n }\r\n\r\n playSound(): void {\r\n if (!this.isBrowser || !this.canShow) return;\r\n try {\r\n const audio = new Audio(this.config.browserNotificationSoundUrl);\r\n audio.volume = 0.45;\r\n void audio.play().catch(() => {});\r\n } catch {\r\n /* ignore */\r\n }\r\n }\r\n\r\n private resolveIconUrl(): string | undefined {\r\n if (!this.isBrowser) return undefined;\r\n try {\r\n return new URL(this.config.browserNotificationIconUrl, window.location.origin).href;\r\n } catch {\r\n return this.config.browserNotificationIconUrl;\r\n }\r\n }\r\n}\r\n","/*\r\n * Public API Surface of @xosue-utils/services\r\n */\r\n\r\nexport * from './lib/index';\r\n\r\nexport {\r\n XOSUE_UTILS_SERVICES_CONFIG,\r\n XOSUE_UTILS_SERVICES_DEFAULTS,\r\n provideXosueUtilsServices,\r\n resolveXosueUtilsServicesConfig,\r\n} from './config/services-config';\r\nexport type {\r\n XosueUtilsServicesConfig,\r\n ResolvedXosueUtilsServicesConfig,\r\n ToastDurationKey,\r\n} from './config/services-config';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AlertService","i1.ToastService","i1","i1.SessionRequestService","i1.GlobalLoadingService","i1.AiAutofillOverlayService"],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { LucideIconComponent } from './lucide-icon/lucide-icon.component';
|
|
1
2
|
export { AlertService } from './alert-service/alert.service';
|
|
2
3
|
export type { AlertMode, AlertConfirmOptions, AlertMessage } from './alert-service/alert.service';
|
|
3
4
|
export { AlertServiceComponent } from './alert-service/alert-service.component';
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
export * from './lib/index';
|
|
2
2
|
export { XOSUE_UTILS_SERVICES_CONFIG, XOSUE_UTILS_SERVICES_DEFAULTS, provideXosueUtilsServices, resolveXosueUtilsServicesConfig, } from './config/services-config';
|
|
3
3
|
export type { XosueUtilsServicesConfig, ResolvedXosueUtilsServicesConfig, ToastDurationKey, } from './config/services-config';
|
|
4
|
-
export { LucideIconComponent } from './vendor/lucide-icon/lucide-icon.component';
|
|
File without changes
|