@xosue-utils/inputs 0.1.0
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.
- package/README.md +169 -0
- package/config/inputs-config.d.ts +18 -0
- package/config/media-adapters.d.ts +24 -0
- package/fesm2022/xosue-utils-inputs.mjs +11332 -0
- package/fesm2022/xosue-utils-inputs.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/boolean-entry/boolean-entry.component.d.ts +35 -0
- package/lib/color-picker/color-picker.component.d.ts +49 -0
- package/lib/color-picker/services/color-picker-modal/color-picker-modal.service.d.ts +23 -0
- package/lib/counter-entry/counter-entry.component.d.ts +37 -0
- package/lib/date-picker/date-picker.component.d.ts +85 -0
- package/lib/date-picker/date-picker.types.d.ts +6 -0
- package/lib/date-picker/services/date-picker-modal/date-picker-modal.service.d.ts +45 -0
- package/lib/datetime-picker/datetime-picker.component.d.ts +93 -0
- package/lib/datetime-picker/services/datetime-picker-modal/datetime-picker-modal.service.d.ts +51 -0
- package/lib/decimal-entry/decimal-entry.component.d.ts +31 -0
- package/lib/email-entry/email-entry.component.d.ts +29 -0
- package/lib/index.d.ts +84 -0
- package/lib/input-overlay-coordinator.service.d.ts +16 -0
- package/lib/integer-entry/integer-entry.component.d.ts +30 -0
- package/lib/media-entry/media-entry.component.d.ts +163 -0
- package/lib/month-picker/month-picker.component.d.ts +78 -0
- package/lib/month-picker/services/month-picker-modal/month-picker-modal.service.d.ts +38 -0
- package/lib/multichoice-entry/multichoice-entry.component.d.ts +28 -0
- package/lib/multiselect-combobox/multiselect-combobox.component.d.ts +100 -0
- package/lib/multiselect-combobox/services/multiselect-combobox-modal/multiselect-combobox-modal.service.d.ts +30 -0
- package/lib/only-select/only-select.component.d.ts +90 -0
- package/lib/only-select/only-select.types.d.ts +9 -0
- package/lib/only-select/services/only-select-modal/only-select-modal.service.d.ts +29 -0
- package/lib/onlychoice-entry/onlychoice-entry.component.d.ts +28 -0
- package/lib/otp-entry/otp-entry.component.d.ts +35 -0
- package/lib/password-entry/password-entry.component.d.ts +34 -0
- package/lib/phone-entry/phone-display.util.d.ts +19 -0
- package/lib/phone-entry/phone-entry.component.d.ts +80 -0
- package/lib/phone-entry/phone-entry.types.d.ts +6 -0
- package/lib/phone-entry/services/phone-entry-modal/phone-entry-modal.service.d.ts +24 -0
- package/lib/price-entry/price-entry.component.d.ts +42 -0
- package/lib/range-entry/range-entry.component.d.ts +74 -0
- package/lib/rating-entry/rating-entry.component.d.ts +25 -0
- package/lib/rich-text-entry/caludy-image.node.d.ts +36 -0
- package/lib/rich-text-entry/lexical-editor-theme.d.ts +3 -0
- package/lib/rich-text-entry/rich-text-entry.component.d.ts +92 -0
- package/lib/search-entry/search-entry.component.d.ts +65 -0
- package/lib/search-entry/search-entry.types.d.ts +8 -0
- package/lib/search-entry/services/search-entry-modal/search-entry-modal.service.d.ts +29 -0
- package/lib/signature-entry/signature-entry.component.d.ts +47 -0
- package/lib/slider-entry/slider-entry.component.d.ts +69 -0
- package/lib/switch-entry/switch-entry.component.d.ts +66 -0
- package/lib/tags-entry/tags-entry.component.d.ts +35 -0
- package/lib/text-area-entry/text-area-entry.component.d.ts +27 -0
- package/lib/text-entry/text-entry.component.d.ts +38 -0
- package/lib/time-picker/services/time-picker-modal/time-picker-modal.service.d.ts +30 -0
- package/lib/time-picker/time-picker.component.d.ts +70 -0
- package/lib/url-entry/url-entry.component.d.ts +29 -0
- package/package.json +55 -0
- package/public-api.d.ts +8 -0
- package/vendor/context-menu-service/context-menu-service.component.d.ts +37 -0
- package/vendor/context-menu-service/context-menu.service.d.ts +63 -0
- package/vendor/drag-scroll.directive.d.ts +10 -0
- package/vendor/field-help-tooltip/field-help-tooltip.component.d.ts +9 -0
- package/vendor/file-size.pipe.d.ts +7 -0
- package/vendor/lucide-icon/lucide-icon.component.d.ts +26 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xosue-utils-inputs.mjs","sources":["../../src/config/media-adapters.ts","../../src/config/inputs-config.ts","../../src/vendor/lucide-icon/lucide-icon.component.ts","../../src/vendor/context-menu-service/context-menu.service.ts","../../src/vendor/field-help-tooltip/field-help-tooltip.component.ts","../../src/vendor/field-help-tooltip/field-help-tooltip.component.html","../../src/lib/text-entry/text-entry.component.ts","../../src/lib/text-entry/text-entry.component.html","../../src/lib/text-area-entry/text-area-entry.component.ts","../../src/lib/text-area-entry/text-area-entry.component.html","../../src/lib/email-entry/email-entry.component.ts","../../src/lib/email-entry/email-entry.component.html","../../src/lib/url-entry/url-entry.component.ts","../../src/lib/url-entry/url-entry.component.html","../../src/lib/password-entry/password-entry.component.ts","../../src/lib/password-entry/password-entry.component.html","../../src/lib/search-entry/services/search-entry-modal/search-entry-modal.service.ts","../../src/lib/input-overlay-coordinator.service.ts","../../src/lib/search-entry/search-entry.component.ts","../../src/lib/search-entry/search-entry.component.html","../../src/lib/tags-entry/tags-entry.component.ts","../../src/lib/tags-entry/tags-entry.component.html","../../src/lib/integer-entry/integer-entry.component.ts","../../src/lib/integer-entry/integer-entry.component.html","../../src/lib/decimal-entry/decimal-entry.component.ts","../../src/lib/decimal-entry/decimal-entry.component.html","../../src/lib/counter-entry/counter-entry.component.ts","../../src/lib/counter-entry/counter-entry.component.html","../../src/lib/price-entry/price-entry.component.ts","../../src/lib/price-entry/price-entry.component.html","../../src/lib/range-entry/range-entry.component.ts","../../src/lib/range-entry/range-entry.component.html","../../src/lib/slider-entry/slider-entry.component.ts","../../src/lib/slider-entry/slider-entry.component.html","../../src/lib/rating-entry/rating-entry.component.ts","../../src/lib/rating-entry/rating-entry.component.html","../../src/lib/date-picker/services/date-picker-modal/date-picker-modal.service.ts","../../src/lib/date-picker/date-picker.component.ts","../../src/lib/date-picker/date-picker.component.html","../../src/lib/time-picker/services/time-picker-modal/time-picker-modal.service.ts","../../src/lib/time-picker/time-picker.component.ts","../../src/lib/time-picker/time-picker.component.html","../../src/lib/month-picker/services/month-picker-modal/month-picker-modal.service.ts","../../src/lib/month-picker/month-picker.component.ts","../../src/lib/month-picker/month-picker.component.html","../../src/lib/datetime-picker/services/datetime-picker-modal/datetime-picker-modal.service.ts","../../src/lib/datetime-picker/datetime-picker.component.ts","../../src/lib/datetime-picker/datetime-picker.component.html","../../src/lib/only-select/services/only-select-modal/only-select-modal.service.ts","../../src/lib/only-select/only-select.component.ts","../../src/lib/only-select/only-select.component.html","../../src/lib/multiselect-combobox/services/multiselect-combobox-modal/multiselect-combobox-modal.service.ts","../../src/lib/multiselect-combobox/multiselect-combobox.component.ts","../../src/lib/multiselect-combobox/multiselect-combobox.component.html","../../src/lib/boolean-entry/boolean-entry.component.ts","../../src/lib/boolean-entry/boolean-entry.component.html","../../src/lib/multichoice-entry/multichoice-entry.component.ts","../../src/lib/multichoice-entry/multichoice-entry.component.html","../../src/lib/onlychoice-entry/onlychoice-entry.component.ts","../../src/lib/onlychoice-entry/onlychoice-entry.component.html","../../src/lib/switch-entry/switch-entry.component.ts","../../src/lib/switch-entry/switch-entry.component.html","../../src/lib/phone-entry/services/phone-entry-modal/phone-entry-modal.service.ts","../../src/lib/phone-entry/phone-display.util.ts","../../src/lib/phone-entry/phone-entry.component.ts","../../src/lib/phone-entry/phone-entry.component.html","../../src/lib/color-picker/services/color-picker-modal/color-picker-modal.service.ts","../../src/lib/color-picker/color-picker.component.ts","../../src/lib/color-picker/color-picker.component.html","../../src/lib/otp-entry/otp-entry.component.ts","../../src/lib/otp-entry/otp-entry.component.html","../../src/vendor/drag-scroll.directive.ts","../../src/lib/rich-text-entry/caludy-image.node.ts","../../src/lib/rich-text-entry/lexical-editor-theme.ts","../../src/lib/rich-text-entry/rich-text-entry.component.ts","../../src/lib/rich-text-entry/rich-text-entry.component.html","../../src/lib/signature-entry/signature-entry.component.ts","../../src/lib/signature-entry/signature-entry.component.html","../../src/vendor/file-size.pipe.ts","../../src/lib/media-entry/media-entry.component.ts","../../src/lib/media-entry/media-entry.component.html","../../src/lib/index.ts","../../src/vendor/context-menu-service/context-menu-service.component.ts","../../src/vendor/context-menu-service/context-menu-service.component.html","../../src/public-api.ts","../../src/xosue-utils-inputs.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\n\r\n/** Estado mutable para resolver URLs de imagen desde el backend. */\r\nexport interface BackendMediaImageUrlState {\r\n cache: Record<string, string>;\r\n pending: Set<string>;\r\n failed: Set<string>;\r\n}\r\n\r\nexport function createBackendMediaImageUrlState(): BackendMediaImageUrlState {\r\n return { cache: {}, pending: new Set(), failed: new Set() };\r\n}\r\n\r\nexport type GeneralViewerMode = 'image' | 'video' | 'audio' | 'document' | 'download';\r\n\r\n/**\r\n * Contrato mínimo que el host debe implementar (adaptador sobre MediaPreviewService).\r\n */\r\nexport interface XosueUtilsMediaPreview {\r\n scheduleBackendImageDisplayUrl(\r\n hash: string,\r\n state: BackendMediaImageUrlState,\r\n onReady: () => void,\r\n ): string;\r\n resolveImageUrlForMetadata(hashOrUrl: string): Promise<string>;\r\n}\r\n\r\nexport const XOSUE_UTILS_MEDIA_PREVIEW = new InjectionToken<XosueUtilsMediaPreview>(\r\n 'XOSUE_UTILS_MEDIA_PREVIEW',\r\n);\r\n\r\n/**\r\n * Contrato mínimo del visor global (adaptador sobre MediaViewerService).\r\n */\r\nexport interface XosueUtilsMediaViewer {\r\n open(params: Record<string, unknown>): void;\r\n}\r\n\r\nexport const XOSUE_UTILS_MEDIA_VIEWER = new InjectionToken<XosueUtilsMediaViewer>(\r\n 'XOSUE_UTILS_MEDIA_VIEWER',\r\n);\r\n","import { InjectionToken, Provider } from '@angular/core';\r\nimport {\r\n XOSUE_UTILS_MEDIA_PREVIEW,\r\n XOSUE_UTILS_MEDIA_VIEWER,\r\n type XosueUtilsMediaPreview,\r\n type XosueUtilsMediaViewer,\r\n} from './media-adapters';\r\n\r\nexport * from './media-adapters';\r\n\r\n/**\r\n * Configuración que cada app host debe proveer al usar @xosue-utils/inputs.\r\n */\r\nexport interface XosueUtilsInputsConfig {\r\n /** Base URL del API (sin slash final), p.ej. https://api.ejemplo.com */\r\n apiUrl: string;\r\n /** Token Bearer actual, o null si no hay sesión. */\r\n getAuthToken: () => string | null;\r\n}\r\n\r\nexport const XOSUE_UTILS_INPUTS_CONFIG = new InjectionToken<XosueUtilsInputsConfig>(\r\n 'XOSUE_UTILS_INPUTS_CONFIG',\r\n);\r\n\r\nexport function provideXosueUtilsInputs(config: XosueUtilsInputsConfig): Provider[] {\r\n return [{ provide: XOSUE_UTILS_INPUTS_CONFIG, useValue: config }];\r\n}\r\n\r\nexport function provideXosueUtilsMedia(options: {\r\n preview: XosueUtilsMediaPreview;\r\n viewer: XosueUtilsMediaViewer;\r\n}): Provider[] {\r\n return [\r\n { provide: XOSUE_UTILS_MEDIA_PREVIEW, useValue: options.preview },\r\n { provide: XOSUE_UTILS_MEDIA_VIEWER, useValue: options.viewer },\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 { 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 { 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 { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n HostListener,\r\n ElementRef,\r\n OnInit,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\nimport { FieldHelpTooltipComponent } from '../../vendor/field-help-tooltip/field-help-tooltip.component';\r\n\r\n@Component({\r\n selector: 'text-entry',\r\n standalone: true,\r\n templateUrl: './text-entry.component.html',\r\n styleUrl: './text-entry.component.sass',\r\n imports: [CommonModule, FieldHelpTooltipComponent],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TextEntryComponent implements ControlValueAccessor, OnInit {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = '';\r\n @Input() prefix: string | null = null;\r\n @Input() suffix: string | null = null;\r\n @Input() concatPrefix: boolean = false;\r\n @Input() concatSuffix: boolean = false;\r\n /** Texto de ayuda mostrado al pulsar el botón de información. */\r\n @Input() fieldHelp: string = '';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n rawValue: string | null = null;\r\n outputValue: string | null = null;\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Ciclo de vida del componente)\r\n // ============================================================================\r\n ngOnInit(): void {}\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (value: string | null) => {};\r\n public onTouched = () => {};\r\n writeValue(value: string | null): void {\r\n this.rawValue = value ?? null;\r\n this.outputValue = this.buildOutputValue(this.rawValue);\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n private buildOutputValue(value: string | null): string | null {\r\n if (value == null) return null;\r\n\r\n let result = value;\r\n\r\n if (this.concatPrefix && this.prefix != null) {\r\n result = `${this.prefix}${result}`;\r\n }\r\n\r\n if (this.concatSuffix && this.suffix != null) {\r\n result = `${result}${this.suffix}`;\r\n }\r\n\r\n return result;\r\n }\r\n private emitValue(): void {\r\n this.onChange(this.outputValue);\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.rawValue = input?.value || null;\r\n this.outputValue = this.buildOutputValue(this.rawValue);\r\n this.emitValue();\r\n }\r\n onFocus(event: FocusEvent): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(event: FocusEvent): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<div\r\n *ngIf=\"label\"\r\n class=\"LabelRow\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n <p class=\"Label\">\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n </p>\r\n <field-help-tooltip\r\n *ngIf=\"fieldHelp\"\r\n [title]=\"label\"\r\n [text]=\"fieldHelp\"\r\n ></field-help-tooltip>\r\n</div>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\">\r\n <div\r\n class=\"Prefix\"\r\n *ngIf=\"prefix\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n >\r\n {{ prefix }}\r\n </div>\r\n <input\r\n type=\"text\"\r\n class=\"Input\"\r\n [class.Disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"rawValue || ''\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n [class.WithPrefix]=\"prefix\"\r\n [class.WithSuffix]=\"suffix\"\r\n />\r\n <div\r\n class=\"Suffix\"\r\n *ngIf=\"suffix\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n >\r\n {{ suffix }}\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n HostListener,\r\n ChangeDetectionStrategy,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'text-area-entry',\r\n standalone: true,\r\n templateUrl: './text-area-entry.component.html',\r\n styleUrls: ['./text-area-entry.component.sass'],\r\n imports: [CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextAreaEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TextAreaEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Escribe aquí';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n value: string = '';\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n this.value = value ?? '';\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLTextAreaElement;\r\n this.value = input.value;\r\n this.onChange(this.value || null);\r\n }\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('textarea');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div\r\n class=\"Entry\"\r\n [class.IsFocus]=\"isFocus\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n <textarea\r\n class=\"TextArea\"\r\n [placeholder]=\"placeholder\"\r\n [disabled]=\"isDisabled\"\r\n [value]=\"value\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n ></textarea>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'email-entry',\r\n standalone: true,\r\n templateUrl: './email-entry.component.html',\r\n styleUrl: './email-entry.component.sass',\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => EmailEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class EmailEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Correo electrónico';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n textValue: string = '';\r\n error: boolean = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n this.textValue = value ?? '';\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n \r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n\r\n this.error = !!this.textValue && !this.isValidEmail(this.textValue);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value.trim();\r\n\r\n this.textValue = raw;\r\n\r\n if (!raw) {\r\n this.error = false;\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n const isValid = this.isValidEmail(raw);\r\n this.error = !isValid;\r\n\r\n this.onChange(isValid ? raw : null);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private isValidEmail(value: string): boolean {\r\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\" [class.Error]=\"error\">\r\n <input\r\n type=\"text\"\r\n inputmode=\"email\"\r\n class=\"Input\"\r\n [class.Disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"textValue\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'url-entry',\r\n standalone: true,\r\n templateUrl: './url-entry.component.html',\r\n styleUrl: './url-entry.component.sass',\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => UrlEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class UrlEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'www.ejemplo.com';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n textValue: string = '';\r\n error: boolean = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n if (value?.startsWith('https://')) {\r\n this.textValue = value.replace(/^https:\\/\\//, '');\r\n } else {\r\n this.textValue = '';\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n\r\n const fullUrl = `https://${this.textValue}`;\r\n this.error = !!this.textValue && !this.isValidHttpsUrl(fullUrl);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value.trim();\r\n\r\n this.textValue = raw;\r\n\r\n if (!raw) {\r\n this.error = false;\r\n this.onChange(null);\r\n return;\r\n }\r\n\r\n const fullUrl = `https://${raw}`;\r\n const isValid = this.isValidHttpsUrl(fullUrl);\r\n\r\n this.error = !isValid;\r\n this.onChange(isValid ? fullUrl : null);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private isValidHttpsUrl(value: string): boolean {\r\n try {\r\n const url = new URL(value);\r\n return url.protocol === 'https:';\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const input: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (input && !this.isDisabled) {\r\n input.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\" [class.Error]=\"error\">\r\n <div class=\"Prefix\" (click)=\"manualClick($event); $event.stopPropagation()\">\r\n https://\r\n </div>\r\n <input\r\n type=\"text\"\r\n inputmode=\"url\"\r\n class=\"Input\"\r\n [class.Disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"textValue\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ElementRef,\r\n OnInit,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'password-entry',\r\n standalone: true,\r\n templateUrl: './password-entry.component.html',\r\n styleUrl: './password-entry.component.sass',\r\n imports: [CommonModule, LucideIconComponent],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PasswordEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PasswordEntryComponent implements ControlValueAccessor, OnInit {\r\n hostElement!: HTMLElement;\r\n\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUTS / OUTPUTS (Inputs / Outputs)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Contraseña';\r\n\r\n @Input() toggleVisibility: boolean = true;\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n value: string | null = null;\r\n isDisabled = false;\r\n isFocus = false;\r\n isPasswordVisible: boolean = false;\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {}\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (value: string | null) => {};\r\n public onTouched = () => {};\r\n writeValue(value: string | null): void {\r\n this.value = value ?? null;\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n this.value = input?.value || null;\r\n this.emitValue();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(event: FocusEvent): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(event: FocusEvent): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n private emitValue(): void {\r\n this.onChange(this.value);\r\n }\r\n togglePasswordVisibility(event?: Event): void {\r\n event?.preventDefault();\r\n event?.stopPropagation();\r\n if (this.isDisabled) return;\r\n this.isPasswordVisible = !this.isPasswordVisible;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\">\r\n <input\r\n class=\"Input\"\r\n [type]=\"isPasswordVisible ? 'text' : 'password'\"\r\n [class.Disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n [value]=\"value || ''\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n />\r\n <button\r\n type=\"button\"\r\n class=\"ToggleVisible\"\r\n *ngIf=\"toggleVisibility\"\r\n (click)=\"togglePasswordVisibility($event)\"\r\n [attr.aria-label]=\"isPasswordVisible ? 'Ocultar contraseña' : 'Mostrar contraseña'\"\r\n [attr.aria-pressed]=\"isPasswordVisible\"\r\n [disabled]=\"isDisabled\"\r\n tabindex=\"-1\"\r\n >\r\n <lucide-icon [name]=\"isPasswordVisible ? 'eye-off' : 'eye'\" [size]=\"18\"></lucide-icon>\r\n </button>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SearchOption } from '../../search-entry.types';\r\n\r\nexport interface SearchEntryModalViewModel {\r\n searchText: string;\r\n placeholder: string;\r\n filteredOptions: SearchOption[];\r\n loading: boolean;\r\n error: boolean;\r\n shouldShowSearch: boolean;\r\n}\r\n\r\nexport interface SearchEntryModalHandlers {\r\n onSearchInput: (e: Event) => void;\r\n onBackdropClick: (e: Event) => void;\r\n onCloseIconClick: (e: Event) => void;\r\n onResultNavigate: () => void;\r\n}\r\n\r\nexport interface SearchEntryModalSession {\r\n view: SearchEntryModalViewModel;\r\n handlers: SearchEntryModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class SearchEntryModalService {\r\n private readonly state = new BehaviorSubject<SearchEntryModalSession | null>(null);\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: SearchEntryModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<SearchEntryModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\n\r\n/**\r\n * Garantiza que solo un overlay de inputs (select, date picker, etc.) esté activo.\r\n * Cada overlay registra un token con `close`; al abrir otro, se invoca el anterior.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class InputOverlayCoordinatorService {\r\n private active: { close: () => void } | null = null;\r\n\r\n openExclusive(token: { close: () => void }): void {\r\n if (this.active && this.active !== token) {\r\n this.active.close();\r\n }\r\n this.active = token;\r\n }\r\n\r\n release(token: { close: () => void }): void {\r\n if (this.active === token) {\r\n this.active = null;\r\n }\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n ChangeDetectorRef,\r\n ChangeDetectionStrategy,\r\n forwardRef,\r\n OnInit,\r\n OnChanges,\r\n OnDestroy,\r\n SimpleChanges,\r\n ElementRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { XOSUE_UTILS_INPUTS_CONFIG } from '../../config/inputs-config';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { Router } from '@angular/router';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n Subject,\r\n switchMap,\r\n catchError,\r\n of,\r\n Subscription,\r\n} from 'rxjs';\r\nimport { SearchEntryModalService } from './services/search-entry-modal/search-entry-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { SearchOption } from './search-entry.types';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\nexport type { SearchOption } from './search-entry.types';\r\n\r\n@Component({\r\n selector: 'search-entry',\r\n standalone: true,\r\n templateUrl: './search-entry.component.html',\r\n styleUrls: ['./search-entry.component.sass'],\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SearchEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SearchEntryComponent\r\n implements ControlValueAccessor, OnInit, OnChanges, OnDestroy\r\n{\r\n private readonly inputsConfig = inject(XOSUE_UTILS_INPUTS_CONFIG);\r\n\r\n @Input() label = '';\r\n @Input() placeholder = 'Buscar...';\r\n @Input() opcional = false;\r\n @Input() options: SearchOption[] = [];\r\n @Input() api?: string;\r\n @Input() search: boolean = true;\r\n @Input() minSearch = 0;\r\n\r\n // --- Clase dinámica en el host ---\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n isOpen = false;\r\n isFocus = false;\r\n isDisabled = false;\r\n\r\n filteredOptions: SearchOption[] = [];\r\n internalOptions: SearchOption[] = [];\r\n searchText = '';\r\n loading = false;\r\n error = false;\r\n private pendingValue: string | null = null;\r\n private isExternalUpdate = false; // Flag para distinguir actualizaciones externas\r\n\r\n private search$ = new Subject<string>();\r\n private sub?: Subscription;\r\n\r\n private searchEntryModal = inject(SearchEntryModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private elementRef: ElementRef,\r\n private cdr: ChangeDetectorRef,\r\n private router: Router\r\n ) {}\r\n ngOnInit(): void {\r\n this.sub = this.search$\r\n .pipe(\r\n debounceTime(100), // Reducido a 100ms para respuesta más rápida\r\n distinctUntilChanged(),\r\n switchMap((q) => {\r\n const trimmedQuery = q.trim();\r\n\r\n // Si no hay texto, no buscar\r\n if (!trimmedQuery) {\r\n this.loading = false;\r\n this.error = false;\r\n this.filteredOptions = [];\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n return of([]);\r\n }\r\n\r\n if (this.api) {\r\n this.loading = true;\r\n this.error = false;\r\n this.cdr.markForCheck();\r\n // Usar switchMap para cancelar peticiones anteriores automáticamente\r\n return this.http\r\n .get<SearchOption[]>(\r\n `${this.inputsConfig.apiUrl}${this.api}?query=${encodeURIComponent(trimmedQuery)}`\r\n )\r\n .pipe(\r\n catchError((err) => {\r\n // Solo actualizar estado si no fue cancelado\r\n if (!err.name || err.name !== 'AbortError') {\r\n this.loading = false;\r\n this.error = true;\r\n this.cdr.markForCheck();\r\n console.error('Error en búsqueda:', err);\r\n }\r\n return of([]);\r\n })\r\n );\r\n } else {\r\n return of(this.filterLocalOptions(trimmedQuery));\r\n }\r\n })\r\n )\r\n .subscribe((results) => {\r\n // Actualizar resultados siempre, switchMap ya se encarga de cancelar peticiones anteriores\r\n this.filteredOptions = results;\r\n this.loading = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n\r\n // No cargar resultados iniciales si usa API\r\n if (!this.api) {\r\n this.loadLocalOptions();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['api'] && this.api) this.fetchFromApi('');\r\n if (changes['options'] && !this.api) this.loadLocalOptions();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.sub?.unsubscribe();\r\n this.search$.complete();\r\n if (this.isOpen) {\r\n this.isOpen = false;\r\n this.searchEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n searchText: this.searchText,\r\n placeholder: this.placeholder,\r\n filteredOptions: this.filteredOptions,\r\n loading: this.loading,\r\n error: this.error,\r\n shouldShowSearch: this.shouldShowSearchInput(),\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.isOpen) return;\r\n this.searchEntryModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.searchEntryModal.open({\r\n view: this.buildModalView(),\r\n handlers: {\r\n onSearchInput: (e) => this.onSearchChange(e),\r\n onBackdropClick: (e) => this.toggleOpenOptions(e),\r\n onCloseIconClick: (e) => this.toggleOpenOptions(e),\r\n onResultNavigate: () => {\r\n this.isOpen = false;\r\n this.closeModalPortal();\r\n },\r\n },\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.searchEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.isOpen) return;\r\n this.isOpen = false;\r\n this.searchEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n const newValue = value ?? '';\r\n\r\n // Solo actualizar si el valor realmente cambió\r\n if (this.searchText === newValue) {\r\n if (newValue === '' && this.isOpen) {\r\n this.isOpen = false;\r\n this.closeModalPortal();\r\n }\r\n return;\r\n }\r\n\r\n // Marcar como actualización externa para evitar disparar búsquedas\r\n this.isExternalUpdate = true;\r\n this.searchText = newValue;\r\n\r\n // Limpiar resultados y estados cuando se actualiza externamente\r\n this.filteredOptions = [];\r\n this.loading = false;\r\n this.error = false;\r\n\r\n // Si hay API y el valor no está vacío, buscar después de un pequeño delay\r\n // Esto permite que el usuario vea el valor actualizado antes de buscar\r\n if (this.api && newValue.trim()) {\r\n // No disparar inmediatamente, solo actualizar el texto\r\n // La búsqueda se hará cuando el usuario interactúe o cuando se abra el dropdown\r\n } else if (!this.api) {\r\n // Para opciones locales, filtrar inmediatamente\r\n this.filteredOptions = this.filterLocalOptions(newValue);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n // Resetear el flag después de un pequeño delay\r\n setTimeout(() => {\r\n this.isExternalUpdate = false;\r\n }, 100);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onSearchChange(e: Event): void {\r\n // Ignorar cambios si es una actualización externa\r\n if (this.isExternalUpdate) {\r\n return;\r\n }\r\n\r\n const q = (e.target as HTMLInputElement).value ?? '';\r\n const previousText = this.searchText;\r\n this.searchText = q;\r\n\r\n // Limpiar resultados anteriores inmediatamente cuando cambia el texto\r\n // Esto evita mostrar resultados obsoletos mientras se busca\r\n if (q.trim() !== previousText.trim()) {\r\n this.filteredOptions = [];\r\n this.loading = true; // Mostrar loading inmediatamente\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // Limpiar error cuando el usuario empieza a escribir\r\n if (this.error) {\r\n this.error = false;\r\n }\r\n\r\n // Emitir inmediatamente para que el switchMap cancele la petición anterior\r\n this.search$.next(q);\r\n this.onChange(q);\r\n this.syncModalView();\r\n }\r\n\r\n private filterLocalOptions(q: string): SearchOption[] {\r\n const lower = q.trim().toLowerCase();\r\n return !lower\r\n ? [...this.internalOptions]\r\n : this.internalOptions.filter(\r\n (opt) =>\r\n opt.name.toLowerCase().includes(lower) ||\r\n opt.description?.toLowerCase().includes(lower)\r\n );\r\n }\r\n\r\n private fetchFromApi(query: string): void {\r\n const trimmedQuery = query.trim();\r\n if (!trimmedQuery) {\r\n this.loading = false;\r\n this.error = false;\r\n this.filteredOptions = [];\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n this.loading = true;\r\n this.error = false;\r\n this.cdr.markForCheck();\r\n this.http\r\n .get<SearchOption[]>(`${this.inputsConfig.apiUrl}${this.api}?query=${encodeURIComponent(trimmedQuery)}`)\r\n .pipe(\r\n catchError((err) => {\r\n this.loading = false;\r\n this.error = true;\r\n this.cdr.markForCheck();\r\n console.error('Error en búsqueda:', err);\r\n return of([]);\r\n })\r\n )\r\n .subscribe((data) => {\r\n this.filteredOptions = data;\r\n this.loading = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n private loadLocalOptions(): void {\r\n this.internalOptions = [...this.options];\r\n this.filteredOptions = [...this.internalOptions];\r\n if (this.pendingValue) {\r\n this.searchText = this.pendingValue;\r\n this.pendingValue = null;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n toggleOpenOptions(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n\r\n const inLabel = target.closest('.Label');\r\n const inCombo =\r\n target.closest('.Input') && !target.classList.contains('RemoveIcon');\r\n const container = target.closest('.InputModalBackdrop');\r\n const inBox = target.closest('.Picker');\r\n const isClose = target.classList.contains('Close');\r\n const isOption = target.closest('.Option');\r\n\r\n const wasOpen = this.isOpen;\r\n\r\n if (inLabel || inCombo) {\r\n this.isOpen = true;\r\n } else {\r\n this.isOpen =\r\n !container || !inBox || isOption || isClose ? false : this.isOpen;\r\n }\r\n\r\n if (!wasOpen && this.isOpen) {\r\n this.openModalPortal();\r\n this.syncModalView();\r\n setTimeout(() => {\r\n const input = document.querySelector(\r\n 'search-entry-modal-service .SearchInput'\r\n ) as HTMLInputElement;\r\n if (input) {\r\n input.focus();\r\n if (input.value !== this.searchText) {\r\n input.value = this.searchText;\r\n }\r\n }\r\n }, 100);\r\n\r\n if (!this.isExternalUpdate) {\r\n if (this.api && this.searchText.trim()) {\r\n this.fetchFromApi(this.searchText);\r\n } else if (!this.api) {\r\n this.filteredOptions = this.filterLocalOptions(this.searchText);\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n } else if (wasOpen && !this.isOpen) {\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n clear(): void {\r\n this.searchText = '';\r\n this.filteredOptions = [...this.internalOptions];\r\n this.onChange(null);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n }\r\n\r\n blur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n\r\n shouldShowSearchInput(): boolean {\r\n return this.api\r\n ? this.search\r\n : this.search && this.minSearch <= this.internalOptions.length;\r\n }\r\n\r\n onChange: (value: string | null) => void = () => {};\r\n onTouched: () => void = () => {};\r\n\r\n @HostListener('keydown.enter', ['$event'])\r\n onEnter(event: Event): void {\r\n if (this.searchText && this.searchText.trim().length > 0) {\r\n event.preventDefault();\r\n const query = this.searchText.trim();\r\n this.router.navigate(['/search', query]);\r\n this.isOpen = false;\r\n this.closeModalPortal();\r\n }\r\n }\r\n}\r\n","<div\n *ngIf=\"label\"\n class=\"Label\"\n (click)=\"toggleOpenOptions($event)\"\n [class.Disabled]=\"isDisabled\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</div>\n\n<div\n class=\"Input\"\n (click)=\"toggleOpenOptions($event)\"\n [class.IsFocus]=\"isFocus\"\n [class.Disabled]=\"isDisabled\"\n (focus)=\"focus()\"\n (blur)=\"blur()\"\n>\n <div class=\"SelectedOptions\">\n <div class=\"SelectedOption\">\n <span class=\"Text\" *ngIf=\"searchText\">{{ searchText }}</span>\n <div class=\"Placeholder\" *ngIf=\"!searchText\">\n {{ placeholder }}\n </div>\n <lucide-icon class=\"RemoveIcon\" name=\"x\" *ngIf=\"searchText\"\n (click)=\"clear(); $event.preventDefault()\"></lucide-icon>\n </div>\n </div>\n <lucide-icon class=\"IconSort\" name=\"search\"></lucide-icon>\n</div>\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ElementRef,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n inject,\r\n HostBinding,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'tags-entry',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule, FormsModule],\r\n templateUrl: './tags-entry.component.html',\r\n styleUrl: './tags-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TagsEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TagsEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Etiquetas';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (Elementos de la vista)\r\n // ============================================================================\r\n @ViewChild('tagInput') tagInputRef!: ElementRef<HTMLInputElement>;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n tags: string[] | null = null;\r\n inputValue = '';\r\n isDisabled = false;\r\n isFocus = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (tags: string[] | null) => {};\r\n private onTouched = () => {};\r\n writeValue(value: string[] | null): void {\r\n this.tags =\r\n value == null || value.length === 0 ? [] : [...value];\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (tags: string[] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n private emitChange(): void {\r\n this.onChange(this.tags?.length ? [...this.tags] : []);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(event: FocusEvent): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(event: FocusEvent): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n onInputKeydown(event: KeyboardEvent): void {\r\n const input = this.inputValue.trim();\r\n if ((event.key === 'Enter' || event.key === ',') && input) {\r\n event.preventDefault();\r\n this.addTag(input);\r\n return;\r\n }\r\n if (!/^[a-zA-Z0-9]$/.test(event.key) && event.key.length === 1) {\r\n event.preventDefault();\r\n return;\r\n }\r\n if (event.key === 'Backspace' && !input && (this.tags?.length ?? 0) > 0) {\r\n this.tags = [...(this.tags ?? [])];\r\n this.tags.pop();\r\n this.emitChange();\r\n }\r\n }\r\n onPaste(event: ClipboardEvent): void {\r\n event.preventDefault();\r\n\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n const items = pasted\r\n .split(/[,\\s]+/)\r\n .map((i) => i.replace(/[^a-zA-Z0-9]/g, '').trim())\r\n .filter((i) => !!i);\r\n\r\n if (items.length) {\r\n const uniqueItems = items.filter((i) => !(this.tags ?? []).includes(i));\r\n this.tags = [...(this.tags ?? []), ...uniqueItems];\r\n this.emitChange();\r\n }\r\n\r\n this.inputValue = '';\r\n }\r\n\r\n // ============================================================================\r\n // COMPONENT METHODS (Métodos del componente)\r\n // ============================================================================\r\n addTag(tag: string): void {\r\n const clean = tag.replace(/[^a-zA-Z0-9]/g, '').trim();\r\n if (clean && !(this.tags ?? []).includes(clean)) {\r\n this.tags = [...(this.tags ?? []), clean];\r\n this.emitChange();\r\n }\r\n this.inputValue = '';\r\n }\r\n removeTag(index: number): void {\r\n if (!this.tags) return;\r\n this.tags.splice(index, 1);\r\n this.emitChange();\r\n }\r\n clearAll(): void {\r\n this.tags = [];\r\n this.emitChange();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.Disabled]=\"isDisabled\" [class.IsFocus]=\"isFocus\">\r\n <div class=\"Chip\" *ngFor=\"let tag of tags ?? []; let i = index\">\r\n {{ tag }}\r\n <button\r\n type=\"button\"\r\n (click)=\"removeTag(i)\"\r\n class=\"Remove\"\r\n aria-label=\"Eliminar\"\r\n >\r\n <lucide-icon name=\"x\"></lucide-icon>\r\n </button>\r\n </div>\r\n\r\n <input\r\n #tagInput\r\n type=\"text\"\r\n class=\"TagInput\"\r\n [disabled]=\"isDisabled\"\r\n [placeholder]=\"placeholder\"\r\n [(ngModel)]=\"inputValue\"\r\n (keydown)=\"onInputKeydown($event)\"\r\n (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus($event)\"\r\n (blur)=\"onBlur($event)\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"ClearAll\"\r\n *ngIf=\"(tags?.length ?? 0) > 0\"\r\n (click)=\"clearAll()\"\r\n aria-label=\"Limpiar todo\"\r\n >\r\n <lucide-icon name=\"brush-cleaning\"></lucide-icon>\r\n </button>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ElementRef,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'integer-entry',\r\n standalone: true,\r\n templateUrl: './integer-entry.component.html',\r\n styleUrl: './integer-entry.component.sass',\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => IntegerEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class IntegerEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Entero';\r\n @Input() description: string = '';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (Elementos de la vista)\r\n // ============================================================================\r\n @ViewChild('inputEl') inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n textValue = '';\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: number | null): void {\r\n if (typeof value === 'number' && Number.isInteger(value)) {\r\n this.textValue = value.toString();\r\n } else {\r\n this.textValue = '';\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value;\r\n\r\n if (!this.isValidInput(raw)) {\r\n input.value = this.textValue;\r\n return;\r\n }\r\n\r\n this.textValue = raw;\r\n\r\n const parsed = parseInt(raw, 10);\r\n this.onChange(Number.isNaN(parsed) ? null : parsed);\r\n }\r\n\r\n // ============================================================================\r\n // VALIDATION METHODS (Métodos de validación)\r\n // ============================================================================\r\n private isValidInput(value: string): boolean {\r\n if (!value) return true;\r\n\r\n if (value.includes(' ')) {\r\n console.log('Entrada inválida: contiene espacios.');\r\n return false;\r\n }\r\n\r\n if (/\\n|\\r/.test(value)) {\r\n console.log('Entrada inválida: contiene saltos de línea.');\r\n return false;\r\n }\r\n\r\n if (!/^\\d*$/.test(value)) {\r\n console.log('Entrada inválida: contiene caracteres no numéricos.');\r\n return false;\r\n }\r\n\r\n if (value.length > 10) {\r\n console.log('Entrada inválida: excede el máximo de 10 dígitos enteros.');\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (input && !this.isDisabled) {\r\n input.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.Disabled]=\"isDisabled\" [class.IsFocus]=\"isFocus\">\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n [value]=\"textValue\"\r\n [placeholder]=\"placeholder\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n class=\"Input\"\r\n [disabled]=\"isDisabled\"\r\n/>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ElementRef,\r\n ViewChild,\r\n ChangeDetectorRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'decimal-entry',\r\n standalone: true,\r\n templateUrl: './decimal-entry.component.html',\r\n styleUrl: './decimal-entry.component.sass',\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DecimalEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DecimalEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Decimal';\r\n @Input() decimals: number = 2;\r\n @Input() description: string = '';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (Elementos de la vista)\r\n // ============================================================================\r\n @ViewChild('inputEl') inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n textValue = '';\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: number | null): void {\r\n if (typeof value === 'number' && !isNaN(value)) {\r\n this.textValue = value.toFixed(this.decimals);\r\n } else {\r\n this.textValue = '';\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value;\r\n\r\n const isValid = this.isValidInput(raw);\r\n if (!isValid) {\r\n input.value = this.textValue;\r\n return;\r\n }\r\n\r\n this.textValue = raw;\r\n\r\n const parsed = parseFloat(raw);\r\n this.onChange(isNaN(parsed) ? null : parsed);\r\n }\r\n\r\n // ============================================================================\r\n // VALIDATION METHODS (Métodos de validación)\r\n // ============================================================================\r\n private isValidInput(value: string): boolean {\r\n if (!value) return true;\r\n\r\n if (value.includes(' ')) {\r\n console.log('Entrada inválida: contiene espacios.');\r\n return false;\r\n }\r\n\r\n if (/\\n|\\r/.test(value)) {\r\n console.log('Entrada inválida: contiene saltos de línea.');\r\n return false;\r\n }\r\n\r\n if (!/^\\d*\\.?\\d*$/.test(value)) {\r\n console.log(\r\n 'Entrada inválida: contiene caracteres no numéricos o múltiples puntos.'\r\n );\r\n return false;\r\n }\r\n\r\n const parts = value.split('.');\r\n const intPart = parts[0] || '';\r\n const decPart = parts[1] || '';\r\n\r\n if (parts.length > 2) {\r\n console.log('Entrada inválida: más de un punto decimal.');\r\n return false;\r\n }\r\n\r\n if (intPart.length > 10) {\r\n console.log('Entrada inválida: excede el máximo de 10 dígitos enteros.');\r\n return false;\r\n }\r\n\r\n if (decPart.length > this.decimals) {\r\n console.log(\r\n `Entrada inválida: excede el máximo de ${this.decimals} decimales.`\r\n );\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (input && !this.isDisabled) {\r\n input.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\">\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n [value]=\"textValue\"\r\n [placeholder]=\"placeholder\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n class=\"Input\"\r\n [disabled]=\"isDisabled\"\r\n/>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n ViewChild,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'counter-entry',\r\n standalone: true,\r\n templateUrl: './counter-entry.component.html',\r\n styleUrl: './counter-entry.component.sass',\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CounterEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class CounterEntryComponent implements ControlValueAccessor {\r\n hostElement!: HTMLElement;\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() placeholder: string = 'Cantidad';\r\n @Input() max: number | null = 5; // Limite opcional\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // REFERENCIAS DOM (Referencias a elementos del DOM)\r\n // ============================================================================\r\n @ViewChild('inputEl') inputRef!: ElementRef<HTMLInputElement>;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled: boolean = false;\r\n isFocus: boolean = false;\r\n textValue: string = '';\r\n value: number | null = null;\r\n\r\n /// ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: number | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(val: number | null): void {\r\n this.value = val ?? null;\r\n this.textValue = val != null ? val.toString() : '';\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value.trim();\r\n\r\n if (!/^\\d*$/.test(raw)) {\r\n console.log(\r\n 'Entrada inválida: solo se permiten números enteros positivos.'\r\n );\r\n input.value = this.textValue;\r\n return;\r\n }\r\n\r\n if (raw.length > 10) {\r\n console.log('Entrada inválida: máximo 10 dígitos enteros.');\r\n input.value = this.textValue;\r\n return;\r\n }\r\n\r\n const parsed = parseInt(raw, 10);\r\n const maxVal = this.max ?? 1_000_000;\r\n\r\n if (!isNaN(parsed)) {\r\n if (parsed > maxVal) {\r\n this.value = maxVal;\r\n } else if (parsed < 0) {\r\n this.value = 0;\r\n } else {\r\n this.value = parsed;\r\n }\r\n\r\n this.textValue = this.value.toString();\r\n input.value = this.textValue;\r\n } else {\r\n this.value = null;\r\n this.textValue = '';\r\n }\r\n\r\n this.emitValue();\r\n }\r\n\r\n // ============================================================================\r\n // COMPOPNENT METHODS (Métodos del componente)\r\n // ============================================================================\r\n increment(): void {\r\n const maxVal = this.max ?? 1_000_000;\r\n if (this.value == null) {\r\n this.value = 1;\r\n } else if (this.value < maxVal) {\r\n this.value++;\r\n }\r\n this.textValue = this.value.toString();\r\n this.emitValue();\r\n }\r\n\r\n decrement(): void {\r\n if (this.value == null || this.value <= 0) {\r\n this.value = 0;\r\n } else {\r\n this.value--;\r\n }\r\n this.textValue = this.value.toString();\r\n this.emitValue();\r\n }\r\n\r\n private emitValue(): void {\r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // COMPUTED PROPERTIES (Propiedades calculadas)\r\n // ============================================================================\r\n get isMax(): boolean {\r\n return this.value != null && this.value >= (this.max ?? 1000000);\r\n }\r\n\r\n get isMin(): boolean {\r\n return this.value === 0;\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (input && !this.isDisabled) {\r\n input.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\">\r\n <button\r\n type=\"button\"\r\n class=\"Btn BtnDecrement\"\r\n [class.IsMin]=\"isMin\"\r\n [disabled]=\"isDisabled || isMin\"\r\n (click)=\"decrement()\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n >\r\n <lucide-icon name=\"minus\"></lucide-icon>\r\n </button>\r\n\r\n <input\r\n #inputEl\r\n type=\"text\"\r\n inputmode=\"numeric\"\r\n [value]=\"textValue\"\r\n [placeholder]=\"placeholder\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n class=\"Input\"\r\n [disabled]=\"isDisabled\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"Btn BtnIncrement\"\r\n [class.IsMax]=\"isMax\"\r\n [disabled]=\"isDisabled || isMax\"\r\n (click)=\"increment()\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n >\r\n <lucide-icon name=\"plus\"></lucide-icon>\r\n </button>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n HostListener,\r\n ElementRef,\r\n OnInit,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'price-entry',\r\n standalone: true,\r\n templateUrl: './price-entry.component.html',\r\n styleUrl: './price-entry.component.sass',\r\n imports: [CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PriceEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PriceEntryComponent implements ControlValueAccessor, OnInit {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Precio';\r\n @Input() symbol: string = 'S/';\r\n @Input() decimals: number = 2;\r\n @Input() decimalSeparator: string = '.';\r\n @Input() thousandSeparator: string = ' ';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n internalValue: string | null = null;\r\n ansInternalValue: string | null = null;\r\n realValue: number | null = null;\r\n repValue: string | null = null;\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n this.updateView();\r\n }\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: number | null) => void = () => {};\r\n public onTouched: () => void = () => {};\r\n writeValue(value: number | null | undefined): void {\r\n if (typeof value !== 'number' || isNaN(value)) {\r\n this.internalValue = null;\r\n this.ansInternalValue = null;\r\n this.realValue = null;\r\n this.repValue = null;\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n const rounded = Math.round(value * 10 ** this.decimals) / 10 ** this.decimals;\r\n this.realValue = rounded;\r\n this.internalValue = this.formatToInternal(rounded);\r\n this.ansInternalValue = this.internalValue;\r\n this.repValue = this.formatNumber(rounded);\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this.onChange = fn ?? (() => {});\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn ?? (() => {});\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n private emitValue(): void {\r\n this.onChange(this.realValue);\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n @HostListener('keydown', ['$event'])\r\n handleKeyDown(event: KeyboardEvent): void {\r\n const input = this.elementRef.nativeElement.querySelector(\r\n 'input'\r\n ) as HTMLInputElement;\r\n if (!input) return;\r\n\r\n if (event.key === 'Backspace') {\r\n event.preventDefault();\r\n this.internalValue = (this.internalValue ?? '').slice(0, -1) || '';\r\n if (!this.internalValue || /^0*$/.test(this.internalValue)) {\r\n this.internalValue = null;\r\n this.ansInternalValue = null;\r\n } else {\r\n this.ansInternalValue = this.internalValue;\r\n }\r\n this.updateView();\r\n this.emitValue();\r\n return;\r\n }\r\n\r\n if (!/^\\d$/.test(event.key)) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if ((this.ansInternalValue ?? '') === '000' && event.key === '0') {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n let tempValue = /^0+$/.test(this.internalValue ?? '') ? '' : (this.internalValue ?? '');\r\n const newInternalValue = tempValue + event.key;\r\n\r\n if (newInternalValue.length > 11) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n const len = newInternalValue.length;\r\n const intPart = newInternalValue.slice(0, len - this.decimals) || '0';\r\n const decPart = newInternalValue.slice(len - this.decimals).padStart(this.decimals, '0');\r\n const numericValue = parseFloat(`${intPart}.${decPart}`);\r\n const MAX_VALUE = 999_000_000.0;\r\n\r\n if (numericValue > MAX_VALUE) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n this.internalValue = newInternalValue;\r\n this.ansInternalValue = newInternalValue;\r\n this.updateView();\r\n this.emitValue();\r\n this.forceCursorToEnd(input);\r\n }\r\n private forceCursorToEnd(input: HTMLInputElement): void {\r\n setTimeout(() => {\r\n input.selectionStart = input.selectionEnd = input.value.length;\r\n });\r\n }\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n private updateView(): void {\r\n this.realValue = this.parseInternalToDecimal();\r\n this.repValue = this.realValue == null ? null : this.formatNumber(this.realValue);\r\n }\r\n private formatToInternal(value: number): string {\r\n return value.toFixed(this.decimals).replace(/\\D/g, '') || '000';\r\n }\r\n private parseInternalToDecimal(): number | null {\r\n const val = this.internalValue ?? '';\r\n if (val === '' || /^0*$/.test(val)) {\r\n return null;\r\n }\r\n const len = val.length;\r\n const intPart = val.slice(0, len - this.decimals) || '0';\r\n const decPart = val.slice(len - this.decimals).padStart(this.decimals, '0');\r\n return parseFloat(`${intPart}.${decPart}`);\r\n }\r\n private formatNumber(num: number): string {\r\n const parts = num.toFixed(this.decimals).split('.');\r\n const intFormatted = parts[0].replace(\r\n /\\B(?=(\\d{3})+(?!\\d))/g,\r\n this.thousandSeparator\r\n );\r\n return intFormatted + this.decimalSeparator + parts[1];\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n input?.focus();\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\">\r\n <div class=\"Symbol\" (click)=\"manualClick($event); $event.stopPropagation()\">\r\n {{ symbol }}\r\n </div>\r\n <input\r\n type=\"text\"\r\n [value]=\"repValue || ''\"\r\n [placeholder]=\"placeholder\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n class=\"Input\"\r\n [class.Disabled]=\"isDisabled\"\r\n [disabled]=\"isDisabled\"\r\n />\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ViewChild,\r\n ElementRef,\r\n HostBinding,\r\n HostListener,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n PLATFORM_ID,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'range-entry',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './range-entry.component.html',\r\n styleUrl: './range-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RangeEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class RangeEntryComponent implements ControlValueAccessor, OnInit, OnDestroy {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (Referencias a elementos del DOM)\r\n // ============================================================================\r\n @ViewChild('trackWrapper', { static: false }) trackWrapper!: ElementRef<HTMLDivElement>;\r\n @ViewChild('trackRef', { static: false }) trackRef!: ElementRef<HTMLDivElement>;\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() min: number = 50;\r\n @Input() max: number = 25000;\r\n @Input() gap: number = 5;\r\n @Input() decimal: boolean = false;\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n minValue: number = this.min;\r\n maxValue: number = this.max;\r\n isDisabled = false;\r\n isDraggingMin = false;\r\n isDraggingMax = false;\r\n activeThumb: 'min' | 'max' | null = null;\r\n\r\n // Referencias a los handlers para poder removerlos correctamente\r\n private documentMouseMoveHandler = (event: MouseEvent) => this.handleDocumentMouseMove(event);\r\n private documentMouseUpHandler = (event: MouseEvent) => this.handleDocumentMouseUp(event);\r\n private documentTouchMoveHandler = (event: TouchEvent) => this.handleDocumentTouchMove(event);\r\n private documentTouchEndHandler = (event: TouchEvent) => this.handleDocumentTouchEnd(event);\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (value: [number, number]) => {};\r\n private onTouched = () => {};\r\n writeValue(value: [number, number] | null): void {\r\n const [minVal, maxVal] = value ?? [this.min, this.max];\r\n \r\n // Normalizar valores según el modo decimal\r\n this.minValue = this.normalizeValue(minVal);\r\n this.maxValue = this.normalizeValue(maxVal);\r\n \r\n // Asegurar que estén dentro de los límites\r\n this.minValue = Math.max(this.min, Math.min(this.minValue, this.max));\r\n this.maxValue = Math.max(this.min, Math.min(this.maxValue, this.max));\r\n \r\n // Asegurar que se respete el gap\r\n if (this.maxValue - this.minValue < this.gap) {\r\n if (this.minValue === this.min) {\r\n this.maxValue = this.normalizeValue(this.minValue + this.gap);\r\n } else {\r\n this.minValue = this.normalizeValue(this.maxValue - this.gap);\r\n }\r\n }\r\n \r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: [number, number]) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n private emit(): void {\r\n // Asegurar que los valores estén normalizados antes de emitir\r\n const normalizedMin = this.normalizeValue(this.minValue);\r\n const normalizedMax = this.normalizeValue(this.maxValue);\r\n this.onChange([normalizedMin, normalizedMax]);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onMinChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n \r\n // Protección: si el campo está vacío, establecer valor inicial inmediatamente\r\n if (input.value.trim() === '' || input.value === '-') {\r\n this.minValue = this.min;\r\n if (this.decimal) {\r\n input.value = this.minValue.toFixed(2);\r\n } else {\r\n input.value = this.minValue.toString();\r\n }\r\n this.emit();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n let val = parseFloat(input.value);\r\n \r\n // Protección adicional: si parseFloat devuelve NaN, establecer valor inicial\r\n if (isNaN(val)) {\r\n this.minValue = this.min;\r\n if (this.decimal) {\r\n input.value = this.minValue.toFixed(2);\r\n } else {\r\n input.value = this.minValue.toString();\r\n }\r\n this.emit();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n // Normalizar el valor\r\n val = this.normalizeValue(val);\r\n\r\n if (val + this.gap > this.maxValue) {\r\n const shift = val + this.gap - this.maxValue;\r\n if (this.maxValue + shift <= this.max) {\r\n this.maxValue = this.normalizeValue(this.maxValue + shift);\r\n } else {\r\n val = this.normalizeValue(this.maxValue - this.gap);\r\n }\r\n }\r\n this.minValue = this.normalizeValue(Math.max(this.min, Math.min(val, this.maxValue - this.gap)));\r\n \r\n // Formatear el valor para mostrarlo\r\n if (this.decimal) {\r\n input.value = this.minValue.toFixed(2);\r\n } else {\r\n input.value = this.minValue.toString();\r\n }\r\n \r\n this.emit();\r\n this.cdr.markForCheck();\r\n }\r\n \r\n onMaxChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n \r\n // Protección: si el campo está vacío, establecer valor inicial inmediatamente\r\n if (input.value.trim() === '' || input.value === '-') {\r\n this.maxValue = Math.max(this.min, this.minValue + this.gap);\r\n if (this.decimal) {\r\n input.value = this.maxValue.toFixed(2);\r\n } else {\r\n input.value = this.maxValue.toString();\r\n }\r\n this.emit();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n let val = parseFloat(input.value);\r\n \r\n // Protección adicional: si parseFloat devuelve NaN, establecer valor inicial\r\n if (isNaN(val)) {\r\n this.maxValue = Math.max(this.min, this.minValue + this.gap);\r\n if (this.decimal) {\r\n input.value = this.maxValue.toFixed(2);\r\n } else {\r\n input.value = this.maxValue.toString();\r\n }\r\n this.emit();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n // Normalizar el valor\r\n val = this.normalizeValue(val);\r\n\r\n if (val - this.gap < this.minValue) {\r\n const shift = this.minValue - (val - this.gap);\r\n if (this.minValue - shift >= this.min) {\r\n this.minValue = this.normalizeValue(this.minValue - shift);\r\n } else {\r\n val = this.normalizeValue(this.minValue + this.gap);\r\n }\r\n }\r\n\r\n this.maxValue = this.normalizeValue(Math.min(this.max, Math.max(val, this.minValue + this.gap)));\r\n \r\n // Formatear el valor para mostrarlo\r\n if (this.decimal) {\r\n input.value = this.maxValue.toFixed(2);\r\n } else {\r\n input.value = this.maxValue.toString();\r\n }\r\n \r\n this.emit();\r\n this.cdr.markForCheck();\r\n }\r\n onSliderRelease(): void {\r\n this.emit();\r\n }\r\n onValueKeydown(event: KeyboardEvent): void {\r\n const allowedKeys = [\r\n 'Backspace',\r\n 'Tab',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Delete',\r\n '.', // punto decimal\r\n ];\r\n\r\n const isNumber = /^\\d$/.test(event.key);\r\n const isAllowed = allowedKeys.includes(event.key);\r\n\r\n if (!isNumber && !isAllowed) {\r\n event.preventDefault();\r\n }\r\n\r\n // Evitar múltiples puntos\r\n if (event.key === '.') {\r\n const input = event.target as HTMLInputElement;\r\n if (input.value.includes('.')) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n // Si decimal está desactivado, no permitir el punto\r\n if (!this.decimal && event.key === '.') {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // VALUE NORMALIZATION (Normalización de valores)\r\n // ============================================================================\r\n /**\r\n * Normaliza un valor según el modo decimal.\r\n * - Si decimal es true: redondea a 2 decimales (o formatea enteros con .00)\r\n * - Si decimal es false: convierte a entero\r\n * @param value - Valor a normalizar\r\n * @returns Valor normalizado\r\n */\r\n private normalizeValue(value: number): number {\r\n if (this.decimal) {\r\n // Modo decimal: redondear a 2 decimales\r\n return Math.round(value * 100) / 100;\r\n } else {\r\n // Modo entero: convertir a entero\r\n return Math.round(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n /**\r\n * Retorna el step según el modo decimal.\r\n * - decimal true: 0.01 (2 decimales)\r\n * - decimal false: 1 (enteros)\r\n */\r\n get step(): number {\r\n return this.decimal ? 0.01 : 1;\r\n }\r\n\r\n get leftPercent(): number {\r\n return ((this.minValue - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n get rightPercent(): number {\r\n return ((this.maxValue - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n get rangeStyle(): { [key: string]: string } {\r\n const minRatio = (this.minValue - this.min) / (this.max - this.min);\r\n\r\n const maxRatio = (this.maxValue - this.min) / (this.max - this.min);\r\n\r\n const left = `${minRatio * 100}%`;\r\n\r\n const right = `${(1 - maxRatio) * 100}%`;\r\n\r\n return {\r\n left,\r\n right,\r\n };\r\n }\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks del ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n document.addEventListener('mousemove', this.documentMouseMoveHandler, true);\r\n document.addEventListener('mouseup', this.documentMouseUpHandler, true);\r\n document.addEventListener('touchmove', this.documentTouchMoveHandler, { passive: false, capture: true });\r\n document.addEventListener('touchend', this.documentTouchEndHandler, { passive: false, capture: true });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n document.removeEventListener('mousemove', this.documentMouseMoveHandler, true);\r\n document.removeEventListener('mouseup', this.documentMouseUpHandler, true);\r\n document.removeEventListener('touchmove', this.documentTouchMoveHandler, true);\r\n document.removeEventListener('touchend', this.documentTouchEndHandler, true);\r\n }\r\n\r\n // ============================================================================\r\n // DRAG HANDLERS (Manejadores de arrastre)\r\n // ============================================================================\r\n onThumbMouseDown(thumb: 'min' | 'max', event: MouseEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.activeThumb = thumb;\r\n if (thumb === 'min') {\r\n this.isDraggingMin = true;\r\n } else {\r\n this.isDraggingMax = true;\r\n }\r\n this.updateValueFromEvent(event);\r\n }\r\n\r\n onThumbTouchStart(thumb: 'min' | 'max', event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.activeThumb = thumb;\r\n if (thumb === 'min') {\r\n this.isDraggingMin = true;\r\n } else {\r\n this.isDraggingMax = true;\r\n }\r\n const touch = event.touches[0];\r\n if (touch) {\r\n const mouseEvent = this.touchToMouseEvent(touch, event);\r\n this.updateValueFromEvent(mouseEvent);\r\n }\r\n }\r\n\r\n onTrackClick(event: MouseEvent): void {\r\n if (this.isDisabled) return;\r\n if (this.isDraggingMin || this.isDraggingMax) return;\r\n\r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const percent = Math.max(0, Math.min(1, x / rect.width));\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Normalizar el valor según el modo decimal\r\n newValue = this.normalizeValue(newValue);\r\n\r\n // Determinar qué thumb mover (el más cercano)\r\n const distToMin = Math.abs(newValue - this.minValue);\r\n const distToMax = Math.abs(newValue - this.maxValue);\r\n\r\n if (distToMin < distToMax && newValue < this.maxValue) {\r\n this.minValue = this.normalizeValue(Math.max(this.min, Math.min(newValue, this.maxValue - this.gap)));\r\n } else if (newValue > this.minValue) {\r\n this.maxValue = this.normalizeValue(Math.min(this.max, Math.max(newValue, this.minValue + this.gap)));\r\n }\r\n\r\n this.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTrackTouchStart(event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const touch = event.touches[0];\r\n if (!touch) return;\r\n\r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n const x = touch.clientX - rect.left;\r\n const percent = Math.max(0, Math.min(1, x / rect.width));\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Normalizar el valor según el modo decimal\r\n newValue = this.normalizeValue(newValue);\r\n\r\n // Determinar qué thumb mover\r\n const distToMin = Math.abs(newValue - this.minValue);\r\n const distToMax = Math.abs(newValue - this.maxValue);\r\n\r\n if (distToMin < distToMax && newValue < this.maxValue) {\r\n this.activeThumb = 'min';\r\n this.isDraggingMin = true;\r\n this.minValue = this.normalizeValue(Math.max(this.min, Math.min(newValue, this.maxValue - this.gap)));\r\n } else if (newValue > this.minValue) {\r\n this.activeThumb = 'max';\r\n this.isDraggingMax = true;\r\n this.maxValue = this.normalizeValue(Math.min(this.max, Math.max(newValue, this.minValue + this.gap)));\r\n }\r\n\r\n this.emit();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private handleDocumentMouseMove(event: MouseEvent): void {\r\n if (this.isDisabled) return;\r\n if (this.isDraggingMin || this.isDraggingMax) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.updateValueFromEvent(event);\r\n }\r\n }\r\n\r\n private handleDocumentMouseUp(event: MouseEvent): void {\r\n if (this.isDraggingMin || this.isDraggingMax) {\r\n this.isDraggingMin = false;\r\n this.isDraggingMax = false;\r\n this.activeThumb = null;\r\n this.emit();\r\n }\r\n }\r\n\r\n private handleDocumentTouchMove(event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n if (this.isDraggingMin || this.isDraggingMax) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const touch = event.touches[0];\r\n if (touch) {\r\n const mouseEvent = this.touchToMouseEvent(touch, event);\r\n this.updateValueFromEvent(mouseEvent);\r\n }\r\n }\r\n }\r\n\r\n private handleDocumentTouchEnd(event: TouchEvent): void {\r\n if (this.isDraggingMin || this.isDraggingMax) {\r\n this.isDraggingMin = false;\r\n this.isDraggingMax = false;\r\n this.activeThumb = null;\r\n this.emit();\r\n }\r\n }\r\n\r\n private touchToMouseEvent(touch: Touch, originalEvent: TouchEvent): MouseEvent {\r\n return {\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n preventDefault: () => originalEvent.preventDefault(),\r\n stopPropagation: () => originalEvent.stopPropagation(),\r\n } as MouseEvent;\r\n }\r\n\r\n private updateValueFromEvent(event: MouseEvent): void {\r\n if (!this.trackRef?.nativeElement) return;\r\n\r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n let x = event.clientX - rect.left;\r\n\r\n // Clamp a los bordes del track\r\n x = Math.max(0, Math.min(rect.width, x));\r\n const percent = x / rect.width;\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Aplicar step para asegurar incrementos correctos\r\n if (this.step > 0) {\r\n newValue = Math.round(newValue / this.step) * this.step;\r\n }\r\n \r\n // Normalizar el valor según el modo decimal\r\n newValue = this.normalizeValue(newValue);\r\n\r\n if (this.activeThumb === 'min') {\r\n this.minValue = this.normalizeValue(Math.max(this.min, Math.min(newValue, this.maxValue - this.gap)));\r\n // Actualizar input range\r\n const minInput = this.elementRef.nativeElement.querySelector('input[type=\"range\"]:first-of-type') as HTMLInputElement;\r\n if (minInput) {\r\n minInput.value = this.minValue.toString();\r\n }\r\n // Actualizar input de texto\r\n const minTextInput = this.elementRef.nativeElement.querySelector('.MinValue') as HTMLInputElement;\r\n if (minTextInput) {\r\n if (this.decimal) {\r\n minTextInput.value = this.minValue.toFixed(2);\r\n } else {\r\n minTextInput.value = this.minValue.toString();\r\n }\r\n }\r\n } else if (this.activeThumb === 'max') {\r\n this.maxValue = this.normalizeValue(Math.min(this.max, Math.max(newValue, this.minValue + this.gap)));\r\n // Actualizar input range\r\n const maxInput = this.elementRef.nativeElement.querySelector('input[type=\"range\"]:last-of-type') as HTMLInputElement;\r\n if (maxInput) {\r\n maxInput.value = this.maxValue.toString();\r\n }\r\n // Actualizar input de texto\r\n const maxTextInput = this.elementRef.nativeElement.querySelector('.MaxValue') as HTMLInputElement;\r\n if (maxTextInput) {\r\n if (this.decimal) {\r\n maxTextInput.value = this.maxValue.toFixed(2);\r\n } else {\r\n maxTextInput.value = this.maxValue.toString();\r\n }\r\n }\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input[type=\"text\"]');\r\n input?.focus();\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"ValuePrint\">\r\n <input\r\n class=\"MinValue Value\"\r\n type=\"text\"\r\n [value]=\"decimal ? minValue.toFixed(2) : minValue.toString()\"\r\n (input)=\"onMinChange($event)\"\r\n (keydown)=\"onValueKeydown($event)\"\r\n [disabled]=\"isDisabled\"\r\n />\r\n -\r\n <input\r\n class=\"MaxValue Value\"\r\n type=\"text\"\r\n [value]=\"decimal ? maxValue.toFixed(2) : maxValue.toString()\"\r\n (input)=\"onMaxChange($event)\"\r\n (keydown)=\"onValueKeydown($event)\"\r\n [disabled]=\"isDisabled\"\r\n />\r\n</div>\r\n\r\n<div class=\"RangeEntry\">\r\n <div class=\"RangeWrapper\" #trackWrapper [class.Disabled]=\"isDisabled\">\r\n <div\r\n class=\"Track\"\r\n #trackRef\r\n (click)=\"onTrackClick($event)\"\r\n (touchstart)=\"onTrackTouchStart($event)\"\r\n >\r\n <div class=\"Range\" [ngStyle]=\"rangeStyle\"></div>\r\n </div>\r\n\r\n <!-- Thumb UI personalizado para min -->\r\n <div\r\n class=\"Thumb ThumbMin\"\r\n [style.left.%]=\"leftPercent\"\r\n (mousedown)=\"onThumbMouseDown('min', $event)\"\r\n (touchstart)=\"onThumbTouchStart('min', $event)\"\r\n [class.Dragging]=\"isDraggingMin\"\r\n ></div>\r\n\r\n <!-- Thumb UI personalizado para max -->\r\n <div\r\n class=\"Thumb ThumbMax\"\r\n [style.left.%]=\"rightPercent\"\r\n (mousedown)=\"onThumbMouseDown('max', $event)\"\r\n (touchstart)=\"onThumbTouchStart('max', $event)\"\r\n [class.Dragging]=\"isDraggingMax\"\r\n ></div>\r\n\r\n <!-- Inputs range ocultos (solo para sincronización) -->\r\n <input\r\n type=\"range\"\r\n class=\"HiddenRange\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"step\"\r\n [value]=\"minValue\"\r\n (input)=\"onMinChange($event)\"\r\n (change)=\"onSliderRelease()\"\r\n [disabled]=\"isDisabled\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n />\r\n\r\n <input\r\n type=\"range\"\r\n class=\"HiddenRange\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"step\"\r\n [value]=\"maxValue\"\r\n (input)=\"onMaxChange($event)\"\r\n (change)=\"onSliderRelease()\"\r\n [disabled]=\"isDisabled\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n HostListener,\r\n ViewChild,\r\n OnInit,\r\n OnDestroy,\r\n inject,\r\n ElementRef,\r\n PLATFORM_ID,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'slider-entry',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './slider-entry.component.html',\r\n styleUrl: './slider-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SliderEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SliderEntryComponent implements ControlValueAccessor, OnInit, OnDestroy {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (Referencias a elementos del DOM)\r\n // ============================================================================\r\n @ViewChild('trackRef', { static: false }) trackRef!: ElementRef<HTMLDivElement>;\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() min: number = 0;\r\n @Input() max: number = 100;\r\n @Input() decimal: boolean = false;\r\n @Input() step: number | null = null; // Si es null, se calcula automáticamente según decimal\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n value: number = 0;\r\n isDisabled = false;\r\n isDragging = false;\r\n\r\n // Referencias a los handlers para poder removerlos correctamente\r\n private documentMouseMoveHandler = (event: MouseEvent) => this.handleDocumentMouseMove(event);\r\n private documentMouseUpHandler = (event: MouseEvent) => this.handleDocumentMouseUp(event);\r\n private documentTouchMoveHandler = (event: TouchEvent) => this.handleDocumentTouchMove(event);\r\n private documentTouchEndHandler = (event: TouchEvent) => this.handleDocumentTouchEnd(event);\r\n\r\n // ============================================================================\r\n // VALUE NORMALIZATION (Normalización de valores)\r\n // ============================================================================\r\n /**\r\n * Normaliza un valor según el modo decimal.\r\n * - Si decimal es true: redondea a 2 decimales (o formatea enteros con .00)\r\n * - Si decimal es false: convierte a entero\r\n * @param value - Valor a normalizar\r\n * @returns Valor normalizado\r\n */\r\n private normalizeValue(value: number): number {\r\n if (this.decimal) {\r\n // Modo decimal: redondear a 2 decimales\r\n return Math.round(value * 100) / 100;\r\n } else {\r\n // Modo entero: convertir a entero\r\n return Math.round(value);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (val: number) => {};\r\n private onTouched = () => {};\r\n writeValue(value: number | null): void {\r\n const rawValue = value ?? this.min;\r\n \r\n // Normalizar valor según el modo decimal\r\n this.value = this.normalizeValue(rawValue);\r\n \r\n // Asegurar que esté dentro de los límites\r\n this.value = Math.max(this.min, Math.min(this.value, this.max));\r\n \r\n // Aplicar step si está definido\r\n const step = this.calculatedStep;\r\n if (step > 0) {\r\n this.value = this.normalizeValue(Math.round(this.value / step) * step);\r\n }\r\n \r\n this.updateRangeInput();\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (val: number) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onSliderInput(event: Event): void {\r\n const val = parseFloat((event.target as HTMLInputElement).value);\r\n this.value = this.normalizeValue(val);\r\n this.updateRangeInput();\r\n }\r\n \r\n onSliderChange(): void {\r\n // Asegurar normalización antes de emitir\r\n this.value = this.normalizeValue(this.value);\r\n this.onChange(this.value);\r\n }\r\n \r\n onInputChange(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n \r\n // Protección: si el campo está vacío, establecer valor inicial inmediatamente\r\n if (input.value.trim() === '' || input.value === '-') {\r\n this.value = this.min;\r\n if (this.decimal) {\r\n input.value = this.value.toFixed(2);\r\n } else {\r\n input.value = this.value.toString();\r\n }\r\n this.updateRangeInput();\r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n let val = parseFloat(input.value);\r\n\r\n // Protección adicional: si parseFloat devuelve NaN, establecer valor inicial\r\n if (isNaN(val)) {\r\n this.value = this.min;\r\n if (this.decimal) {\r\n input.value = this.value.toFixed(2);\r\n } else {\r\n input.value = this.value.toString();\r\n }\r\n this.updateRangeInput();\r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n \r\n val = Math.max(this.min, Math.min(this.max, val));\r\n\r\n // Normalizar el valor\r\n this.value = this.normalizeValue(val);\r\n \r\n // Aplicar step si está definido\r\n const step = this.calculatedStep;\r\n if (step > 0) {\r\n this.value = this.normalizeValue(Math.round(this.value / step) * step);\r\n }\r\n \r\n // Formatear el valor para mostrarlo\r\n if (this.decimal) {\r\n input.value = this.value.toFixed(2);\r\n } else {\r\n input.value = this.value.toString();\r\n }\r\n\r\n this.updateRangeInput();\r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n onKeydown(event: KeyboardEvent): void {\r\n const allowed = [\r\n 'Backspace',\r\n 'Tab',\r\n 'ArrowLeft',\r\n 'ArrowRight',\r\n 'Delete',\r\n '.', // solo si decimal\r\n ];\r\n const isNumber = /^\\d$/.test(event.key);\r\n\r\n if (!isNumber && !allowed.includes(event.key)) {\r\n event.preventDefault();\r\n }\r\n\r\n if (!this.decimal && event.key === '.') {\r\n event.preventDefault();\r\n }\r\n\r\n if (\r\n event.key === '.' &&\r\n (event.target as HTMLInputElement).value.includes('.')\r\n ) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks del ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n document.addEventListener('mousemove', this.documentMouseMoveHandler, true);\r\n document.addEventListener('mouseup', this.documentMouseUpHandler, true);\r\n document.addEventListener('touchmove', this.documentTouchMoveHandler, { passive: false, capture: true });\r\n document.addEventListener('touchend', this.documentTouchEndHandler, { passive: false, capture: true });\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n document.removeEventListener('mousemove', this.documentMouseMoveHandler, true);\r\n document.removeEventListener('mouseup', this.documentMouseUpHandler, true);\r\n document.removeEventListener('touchmove', this.documentTouchMoveHandler, true);\r\n document.removeEventListener('touchend', this.documentTouchEndHandler, true);\r\n }\r\n\r\n // ============================================================================\r\n // DRAG HANDLERS (Manejadores de arrastre)\r\n // ============================================================================\r\n onThumbMouseDown(event: MouseEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = true;\r\n this.updateValueFromEvent(event);\r\n }\r\n\r\n onThumbTouchStart(event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.isDragging = true;\r\n const touch = event.touches[0];\r\n if (touch) {\r\n const mouseEvent = this.touchToMouseEvent(touch, event);\r\n this.updateValueFromEvent(mouseEvent);\r\n }\r\n }\r\n\r\n onTrackClick(event: MouseEvent): void {\r\n if (this.isDisabled || this.isDragging) return;\r\n \r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n const x = event.clientX - rect.left;\r\n const percent = Math.max(0, Math.min(1, x / rect.width));\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Aplicar step si está definido\r\n const step = this.calculatedStep;\r\n if (step > 0) {\r\n newValue = Math.round(newValue / step) * step;\r\n }\r\n \r\n // Normalizar el valor\r\n this.value = this.normalizeValue(newValue);\r\n \r\n this.updateRangeInput();\r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTrackTouchStart(event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const touch = event.touches[0];\r\n if (!touch) return;\r\n\r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n const x = touch.clientX - rect.left;\r\n const percent = Math.max(0, Math.min(1, x / rect.width));\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Aplicar step si está definido\r\n const step = this.calculatedStep;\r\n if (step > 0) {\r\n newValue = Math.round(newValue / step) * step;\r\n }\r\n \r\n // Normalizar el valor\r\n this.value = this.normalizeValue(newValue);\r\n this.isDragging = true;\r\n \r\n this.updateRangeInput();\r\n \r\n // Actualizar input de texto\r\n const textInput = this.elementRef.nativeElement.querySelector('.Value') as HTMLInputElement;\r\n if (textInput) {\r\n if (this.decimal) {\r\n textInput.value = this.value.toFixed(2);\r\n } else {\r\n textInput.value = this.value.toString();\r\n }\r\n }\r\n \r\n this.onChange(this.value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private handleDocumentMouseMove(event: MouseEvent): void {\r\n if (this.isDisabled) return;\r\n if (this.isDragging) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n this.updateValueFromEvent(event);\r\n }\r\n }\r\n\r\n private handleDocumentMouseUp(event: MouseEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n // Asegurar normalización antes de emitir\r\n this.value = this.normalizeValue(this.value);\r\n this.onChange(this.value);\r\n }\r\n }\r\n\r\n private handleDocumentTouchMove(event: TouchEvent): void {\r\n if (this.isDisabled) return;\r\n if (this.isDragging) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const touch = event.touches[0];\r\n if (touch) {\r\n const mouseEvent = this.touchToMouseEvent(touch, event);\r\n this.updateValueFromEvent(mouseEvent);\r\n }\r\n }\r\n }\r\n\r\n private handleDocumentTouchEnd(event: TouchEvent): void {\r\n if (this.isDragging) {\r\n this.isDragging = false;\r\n // Asegurar normalización antes de emitir\r\n this.value = this.normalizeValue(this.value);\r\n this.onChange(this.value);\r\n }\r\n }\r\n\r\n private touchToMouseEvent(touch: Touch, originalEvent: TouchEvent): MouseEvent {\r\n return {\r\n clientX: touch.clientX,\r\n clientY: touch.clientY,\r\n preventDefault: () => originalEvent.preventDefault(),\r\n stopPropagation: () => originalEvent.stopPropagation(),\r\n } as MouseEvent;\r\n }\r\n\r\n private updateValueFromEvent(event: MouseEvent): void {\r\n if (!this.trackRef?.nativeElement) return;\r\n\r\n const rect = this.trackRef.nativeElement.getBoundingClientRect();\r\n let x = event.clientX - rect.left;\r\n\r\n // Clamp a los bordes del track\r\n x = Math.max(0, Math.min(rect.width, x));\r\n const percent = x / rect.width;\r\n let newValue = this.min + percent * (this.max - this.min);\r\n \r\n // Clamp al min/max\r\n newValue = Math.max(this.min, Math.min(this.max, newValue));\r\n \r\n // Aplicar step si está definido\r\n const step = this.calculatedStep;\r\n if (step > 0) {\r\n newValue = Math.round(newValue / step) * step;\r\n }\r\n \r\n // Normalizar el valor según el modo decimal\r\n this.value = this.normalizeValue(newValue);\r\n\r\n this.updateRangeInput();\r\n \r\n // Actualizar input de texto en tiempo real\r\n const textInput = this.elementRef.nativeElement.querySelector('.Value') as HTMLInputElement;\r\n if (textInput) {\r\n if (this.decimal) {\r\n textInput.value = this.value.toFixed(2);\r\n } else {\r\n textInput.value = this.value.toString();\r\n }\r\n }\r\n \r\n this.cdr.markForCheck();\r\n }\r\n\r\n private updateRangeInput(): void {\r\n const rangeInput = this.elementRef.nativeElement.querySelector('input[type=\"range\"]') as HTMLInputElement;\r\n if (rangeInput) {\r\n rangeInput.value = this.value.toString();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n /**\r\n * Retorna el step según el modo decimal o el step personalizado.\r\n * - Si step es null: 0.01 (decimal) o 1 (entero) según el modo\r\n * - Si step está definido: usa ese valor\r\n */\r\n get calculatedStep(): number {\r\n if (this.step !== null) {\r\n return this.step;\r\n }\r\n return this.decimal ? 0.01 : 1;\r\n }\r\n\r\n get fillStyle(): { [key: string]: string } {\r\n const percent = ((this.value - this.min) / (this.max - this.min)) * 100;\r\n return { width: `${percent}%` };\r\n }\r\n\r\n get thumbPosition(): number {\r\n return ((this.value - this.min) / (this.max - this.min)) * 100;\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n const input: HTMLInputElement | null =\r\n this.elementRef.nativeElement.querySelector('input[type=\"text\"]');\r\n input?.focus();\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"ValuePrint\">\r\n <input\r\n class=\"Value\"\r\n type=\"text\"\r\n [value]=\"decimal ? value.toFixed(2) : value.toString()\"\r\n (input)=\"onInputChange($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n [disabled]=\"disabled\"\r\n />\r\n</div>\r\n\r\n<div class=\"SliderEntry\">\r\n <div class=\"RangeWrapper\" [class.Disabled]=\"disabled\">\r\n <div\r\n class=\"Track\"\r\n #trackRef\r\n (click)=\"onTrackClick($event)\"\r\n (touchstart)=\"onTrackTouchStart($event)\"\r\n >\r\n <div class=\"Fill\" [ngStyle]=\"fillStyle\"></div>\r\n </div>\r\n\r\n <!-- Thumb UI personalizado -->\r\n <div\r\n class=\"Thumb\"\r\n [style.left.%]=\"thumbPosition\"\r\n (mousedown)=\"onThumbMouseDown($event)\"\r\n (touchstart)=\"onThumbTouchStart($event)\"\r\n [class.Dragging]=\"isDragging\"\r\n ></div>\r\n\r\n <!-- Input range oculto (solo para sincronización) -->\r\n <input\r\n type=\"range\"\r\n class=\"HiddenRange\"\r\n [min]=\"min\"\r\n [max]=\"max\"\r\n [step]=\"calculatedStep\"\r\n [value]=\"value\"\r\n (input)=\"onSliderInput($event)\"\r\n (change)=\"onSliderChange()\"\r\n [disabled]=\"disabled\"\r\n tabindex=\"-1\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n</div>\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'rating-entry',\r\n standalone: true,\r\n templateUrl: './rating-entry.component.html',\r\n styleUrl: './rating-entry.component.sass',\r\n imports: [CommonModule, LucideIconComponent],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RatingEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class RatingEntryComponent implements ControlValueAccessor {\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() maxStars: number = 5;\r\n\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n value: number | null = null;\r\n isDisabled = false;\r\n\r\n get stars(): number[] {\r\n return Array.from({ length: Math.max(1, this.maxStars) }, (_, i) => i);\r\n }\r\n\r\n private onChange = (_: number | null) => {};\r\n private onTouched = () => {};\r\n\r\n writeValue(value: number | null): void {\r\n this.value = value ?? null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: number | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n select(value: number): void {\r\n if (this.isDisabled) return;\r\n this.value = value;\r\n this.onChange(value);\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n const firstStar: HTMLButtonElement | null =\r\n this.elementRef.nativeElement.querySelector('.StarButton');\r\n if (firstStar && !this.isDisabled) {\r\n firstStar.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div\r\n class=\"RatingDisplay\"\r\n [class.Disabled]=\"isDisabled\"\r\n role=\"radiogroup\"\r\n [attr.aria-label]=\"label || 'Calificación'\"\r\n>\r\n <button\r\n type=\"button\"\r\n class=\"StarButton\"\r\n *ngFor=\"let star of stars; let i = index\"\r\n [disabled]=\"isDisabled\"\r\n role=\"radio\"\r\n [attr.aria-checked]=\"value === i + 1\"\r\n [attr.aria-label]=\"'Calificar con ' + (i + 1) + ' estrellas'\"\r\n (click)=\"select(i + 1)\"\r\n >\r\n <lucide-icon\r\n class=\"Icon\"\r\n [class.Muted]=\"value === null || i >= value\"\r\n name=\"star\"\r\n [size]=\"24\"\r\n [filled]=\"value !== null && i < value\"\r\n ></lucide-icon>\r\n </button>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { CalendarDay } from '../../date-picker.types';\r\n\r\nexport interface DatePickerModalViewModel {\r\n selectedValue: string;\r\n years: number[];\r\n months: number[];\r\n calendarDays: CalendarDay[];\r\n showYears: boolean;\r\n showMonths: boolean;\r\n selectedYear: number;\r\n selectedMonth: number;\r\n selectedDay: number | null;\r\n MONTH_NAMES: readonly string[];\r\n formattedMonthAndYear: string;\r\n selectedValueExtended: string;\r\n formattedSelected: string;\r\n}\r\n\r\nexport interface DatePickerModalHandlers {\r\n toggleShowPicker: (e: Event) => void;\r\n onSelectYear: (y: number, e: Event) => void;\r\n onDecrementYear: (e: Event) => void;\r\n onIncrementYear: (e: Event) => void;\r\n onSelectMonth: (m: number, e: Event) => void;\r\n openYears: (e: Event) => void;\r\n openMonths: (e: Event) => void;\r\n onDecrementMonth: (e: Event) => void;\r\n onIncrementMonth: (e: Event) => void;\r\n onClickDay: (d: CalendarDay, e: Event) => void;\r\n onCancel: () => void;\r\n onClear: () => void;\r\n onAccept: () => void;\r\n}\r\n\r\nexport interface DatePickerModalSession {\r\n view: DatePickerModalViewModel;\r\n handlers: DatePickerModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DatePickerModalService {\r\n private readonly state = new BehaviorSubject<DatePickerModalSession | null>(\r\n null\r\n );\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: DatePickerModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<DatePickerModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n ElementRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { DatePickerModalService } from './services/date-picker-modal/date-picker-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { CalendarDay } from './date-picker.types';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'date-picker',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n templateUrl: './date-picker.component.html',\r\n styleUrls: ['./date-picker.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DatePickerComponent\r\n implements ControlValueAccessor, OnInit, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private datePickerModal = inject(DatePickerModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n private static readonly modalRootSelector = 'date-picker-modal-service';\r\n\r\n private get hostElement(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() format: string = 'yyyy-MM-dd';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n if (value) {\r\n this.setFromDate(value);\r\n } else {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.updateCalendar();\r\n this.closePicker();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selectedValue: string = '';\r\n private previousSelectedValue: string = ''; // Valor antes de abrir el picker (para cancelar)\r\n selectedYear: number = DateTime.now().year;\r\n selectedMonth: number = DateTime.now().month;\r\n selectedDay: number | null = null;\r\n currentYear = DateTime.now().year;\r\n // ============================================================================\r\n // UI STATE (Estado de la interfaz de usuario)\r\n // ============================================================================\r\n isFocus: boolean = false;\r\n isDisabled: boolean = false;\r\n showPicker: boolean = false;\r\n showMonths: boolean = false;\r\n showYears: boolean = false;\r\n // ============================================================================\r\n // CALENDAR STATE (Estado del calendario)\r\n // ============================================================================\r\n years: number[] = [];\r\n months: number[] = Array.from({ length: 12 }, (_, i) => i + 1);\r\n calendarDays: CalendarDay[] = [];\r\n readonly MONTH_NAMES = [\r\n 'enero',\r\n 'febrero',\r\n 'marzo',\r\n 'abril',\r\n 'mayo',\r\n 'junio',\r\n 'julio',\r\n 'agosto',\r\n 'septiembre',\r\n 'octubre',\r\n 'noviembre',\r\n 'diciembre',\r\n ];\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n this.generateYears();\r\n }\r\n ngOnDestroy(): void {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.datePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n this.onChange = () => {};\r\n this.onTouched = () => {};\r\n this.selectionChange.complete();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n private setFromDate(dateStr: string): void {\r\n const dt = this.parseDate(dateStr);\r\n if (!dt.isValid) return;\r\n this.selectedYear = dt.year;\r\n this.selectedMonth = dt.month;\r\n this.selectedDay = dt.day;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n private updateSelectedValue(): void {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n ) {\r\n // Si falta algún valor, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n return;\r\n }\r\n \r\n const dt = DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n });\r\n \r\n if (dt.isValid) {\r\n this.selectedValue = dt.toFormat(this.format);\r\n this.onChange(this.selectedValue);\r\n this.selectionChange.emit(this.selectedValue);\r\n } else {\r\n // Si la fecha no es válida, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n }\r\n private parseDate(dateStr: string): DateTime {\r\n const isISO = this.format.includes('T') || this.format.includes(\"'T'\");\r\n let dt = isISO\r\n ? DateTime.fromISO(dateStr)\r\n : DateTime.fromFormat(dateStr, this.format);\r\n\r\n if (!dt.isValid) {\r\n dt = isISO\r\n ? DateTime.fromFormat(dateStr, this.format)\r\n : DateTime.fromISO(dateStr);\r\n }\r\n\r\n return dt;\r\n }\r\n private updateCalendar(): void {\r\n this.generateCalendarDays();\r\n\r\n const maxDay =\r\n DateTime.fromObject({\r\n year: this.selectedYear!,\r\n month: this.selectedMonth!,\r\n }).daysInMonth ?? 31;\r\n\r\n if (this.selectedDay! > maxDay) {\r\n this.selectedDay = maxDay;\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // NAVIGATION METHODS (Métodos de navegación)\r\n // ============================================================================\r\n onIncrementMonth(): void {\r\n if (this.selectedMonth === 12) {\r\n if (this.selectedYear! < 2125) {\r\n this.selectedYear!++;\r\n this.selectedMonth = 1;\r\n }\r\n } else {\r\n this.selectedMonth!++;\r\n }\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n onDecrementMonth(): void {\r\n if (this.selectedMonth === 1) {\r\n if (this.selectedYear! > 1) {\r\n this.selectedYear!--;\r\n this.selectedMonth = 12;\r\n }\r\n } else {\r\n this.selectedMonth!--;\r\n }\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n onIncrementYear(): void {\r\n if (this.selectedYear! < 2125) {\r\n this.selectedYear!++;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n onDecrementYear(): void {\r\n if (this.selectedYear! > 1) {\r\n this.selectedYear!--;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n onClickDay(d: CalendarDay): void {\r\n if (!d.isCurrentMonth || this.isDisabled) return;\r\n this.selectedDay = d.day;\r\n this.updateSelectedValue();\r\n }\r\n\r\n onSelectMonth(month: number): void {\r\n this.selectedMonth = month;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n this.showMonths = false;\r\n }\r\n\r\n onSelectYear(year: number): void {\r\n this.selectedYear = year;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n this.showYears = false;\r\n }\r\n\r\n scrollToCurrentMonth(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatePickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.months > div');\r\n const el = els[this.selectedMonth! - 1] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n scrollToCurrentYear(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatePickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const index = this.years.indexOf(this.selectedYear!);\r\n const els = root.querySelectorAll('.years > div');\r\n const el = els[index] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n openMonths(): void {\r\n this.showMonths = !this.showMonths;\r\n if (this.showMonths) {\r\n this.showYears = false;\r\n this.scrollToCurrentMonth();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n openYears(): void {\r\n this.showYears = !this.showYears;\r\n if (this.showYears) {\r\n this.scrollToCurrentYear();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // TOGGLE METHODS (Métodos de toggle)\r\n // ============================================================================\r\n toggleShowPicker(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n\r\n const isLabel = target.closest('.Label');\r\n const isDescription = target.closest('.Description');\r\n const isInput = target.closest('.Entry');\r\n const isBackdrop = target.closest('.Backdrop');\r\n const isCloseBtn = target.classList.contains('Close');\r\n const picker =\r\n this.hostElement.querySelector('.Picker') ||\r\n document.querySelector(\r\n `${DatePickerComponent.modalRootSelector} .Picker`\r\n );\r\n const isInsideBox = picker?.contains(target) ?? false;\r\n\r\n if (isLabel || isInput || isDescription) {\r\n this.showYears = false;\r\n this.showMonths = false;\r\n this.previousSelectedValue = this.selectedValue;\r\n this.showPicker = true;\r\n this.openModalPortal();\r\n this.scrollToCurrentMonth();\r\n this.scrollToCurrentYear();\r\n } else if (isBackdrop) {\r\n if (!isInsideBox || isCloseBtn) {\r\n this.onCancel();\r\n }\r\n } else {\r\n this.onCancel();\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private applyCancelState(): void {\r\n if (this.previousSelectedValue) {\r\n this.setFromDate(this.previousSelectedValue);\r\n } else {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.updateCalendar();\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.applyCancelState();\r\n this.closePicker();\r\n }\r\n\r\n onAccept(): void {\r\n this.previousSelectedValue = this.selectedValue;\r\n this.closePicker();\r\n }\r\n\r\n onClear(): void {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.updateCalendar();\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.closePicker();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n selectedValue: this.selectedValue,\r\n years: this.years,\r\n months: this.months,\r\n calendarDays: this.calendarDays,\r\n showYears: this.showYears,\r\n showMonths: this.showMonths,\r\n selectedYear: this.selectedYear,\r\n selectedMonth: this.selectedMonth,\r\n selectedDay: this.selectedDay,\r\n MONTH_NAMES: this.MONTH_NAMES,\r\n formattedMonthAndYear: this.formattedMonthAndYear,\r\n selectedValueExtended: this.selectedValueExtended,\r\n formattedSelected: this.formattedSelected,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.showPicker) return;\r\n this.datePickerModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.datePickerModal.open({\r\n view: this.buildModalView(),\r\n handlers: this.buildHandlers(),\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.datePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.showPicker) return;\r\n this.onCancel();\r\n }\r\n\r\n private closePicker(): void {\r\n if (!this.showPicker) return;\r\n this.showPicker = false;\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildHandlers() {\r\n const sync = () => this.syncModalView();\r\n return {\r\n toggleShowPicker: (e: Event) => this.toggleShowPicker(e),\r\n onSelectYear: (y: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectYear(y);\r\n sync();\r\n },\r\n onDecrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementYear();\r\n sync();\r\n },\r\n onIncrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementYear();\r\n sync();\r\n },\r\n onSelectMonth: (m: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectMonth(m);\r\n sync();\r\n },\r\n openYears: (e: Event) => {\r\n e.stopPropagation();\r\n this.openYears();\r\n sync();\r\n },\r\n openMonths: (e: Event) => {\r\n e.stopPropagation();\r\n this.openMonths();\r\n sync();\r\n },\r\n onDecrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementMonth();\r\n sync();\r\n },\r\n onIncrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementMonth();\r\n sync();\r\n },\r\n onClickDay: (d: CalendarDay, e: Event) => {\r\n e.stopPropagation();\r\n this.onClickDay(d);\r\n sync();\r\n },\r\n onCancel: () => this.onCancel(),\r\n onClear: () => this.onClear(),\r\n onAccept: () => this.onAccept(),\r\n };\r\n }\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n if (this.isDisabled) return;\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n get selectedValueExtended(): string {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n )\r\n return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n })\r\n .setLocale('es')\r\n .toFormat(\"cccc dd 'de' LLLL '-' yyyy\");\r\n }\r\n\r\n get formattedMonthAndYear(): string {\r\n if (this.selectedMonth == null || this.selectedYear == null) return '';\r\n const month = this.MONTH_NAMES[this.selectedMonth - 1];\r\n return `${month.charAt(0).toUpperCase() + month.slice(1)} de ${\r\n this.selectedYear\r\n }`;\r\n }\r\n\r\n get formattedSelected(): string {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n )\r\n return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n }).toFormat(this.format);\r\n }\r\n\r\n private generateYears(): void {\r\n const start = this.currentYear - 100;\r\n const end = this.currentYear + 10;\r\n this.years = Array.from({ length: end - start + 1 }, (_, i) => start + i);\r\n }\r\n\r\n private generateCalendarDays(): void {\r\n const firstDay = DateTime.fromObject({\r\n year: this.selectedYear!,\r\n month: this.selectedMonth!,\r\n day: 1,\r\n });\r\n const startOffset = firstDay.weekday % 7;\r\n const start = firstDay.minus({ days: startOffset });\r\n const totalDays = 42;\r\n\r\n this.calendarDays = Array.from({ length: totalDays }, (_, i) => {\r\n const date = start.plus({ days: i });\r\n return {\r\n day: date.day,\r\n date,\r\n isCurrentMonth: date.month === this.selectedMonth,\r\n };\r\n });\r\n }\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div\n class=\"Entry\"\n (click)=\"toggleShowPicker($event)\"\n [class.focused]=\"isFocus\"\n [class.Disabled]=\"isDisabled\"\n tabindex=\"0\"\n (focus)=\"focus()\"\n (blur)=\"defocus()\"\n>\n <div class=\"Value\" *ngIf=\"selectedValue\">{{ formattedSelected }}</div>\n <div class=\"Placeholder\" *ngIf=\"!selectedValue\">{{ placeholder }}</div>\n <lucide-icon class=\"IconDate\" name=\"calendar\"></lucide-icon>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface TimePickerModalViewModel {\r\n selectedValue: string | null;\r\n selectedHour: number | null;\r\n selectedMinute: number | null;\r\n selectedDateExtended: string;\r\n HOURS: readonly number[];\r\n MINUTES: readonly number[];\r\n}\r\n\r\nexport interface TimePickerModalHandlers {\r\n toggleShowPicker: (e: Event) => void;\r\n onSelectHour: (h: number, e: Event) => void;\r\n onSelectMinute: (m: number, e: Event) => void;\r\n onCancel: () => void;\r\n onClear: () => void;\r\n onAccept: () => void;\r\n}\r\n\r\nexport interface TimePickerModalSession {\r\n view: TimePickerModalViewModel;\r\n handlers: TimePickerModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class TimePickerModalService {\r\n private readonly state = new BehaviorSubject<TimePickerModalSession | null>(\r\n null\r\n );\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: TimePickerModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<TimePickerModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n ElementRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { TimePickerModalService } from './services/time-picker-modal/time-picker-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'time-picker',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n templateUrl: './time-picker.component.html',\r\n styleUrls: ['./time-picker.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TimePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class TimePickerComponent\r\n implements ControlValueAccessor, OnInit, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private timePickerModal = inject(TimePickerModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n private static readonly modalRootSelector = 'time-picker-modal-service';\r\n\r\n private get hostElement(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n \r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() format = 'HH:mm';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null | undefined): void {\r\n if (!value || (typeof value === 'string' && !value.trim())) {\r\n this.clearSelection(false);\r\n return;\r\n }\r\n this.setFromDate(value);\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selectedValue: string | null = null;\r\n private previousSelectedValue: string | null = null; // Valor antes de abrir el picker (para cancelar)\r\n selectedHour: number | null = null;\r\n selectedMinute: number | null = null;\r\n // ============================================================================\r\n // UI STATE (Estado de la interfaz de usuario)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n showPicker = false;\r\n\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n }\r\n ngOnDestroy(): void {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.timePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n this.onChange = () => {};\r\n this.onTouched = () => {};\r\n this.selectionChange.complete();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n private setFromDate(timeStr: string): void {\r\n const dt = DateTime.fromFormat(timeStr, this.format);\r\n if (!dt.isValid) return;\r\n\r\n this.selectedHour = dt.hour;\r\n this.selectedMinute = dt.minute;\r\n this.updateSelectedValue();\r\n }\r\n\r\n /**\r\n * @param notifyModel si es `true`, notifica al `FormControl` (acción de usuario).\r\n * En `writeValue` del CVA debe ser `false`: el modelo ya viene del formulario.\r\n */\r\n private clearSelection(notifyModel = true): void {\r\n this.selectedHour = null;\r\n this.selectedMinute = null;\r\n this.selectedValue = null;\r\n this.previousSelectedValue = null;\r\n if (this.showPicker) {\r\n this.closePicker();\r\n }\r\n if (notifyModel) {\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private updateSelectedValue(): void {\r\n if (this.selectedHour == null || this.selectedMinute == null) {\r\n // Si falta algún valor, limpiar\r\n this.selectedValue = null;\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n const dt = DateTime.fromObject({\r\n hour: this.selectedHour,\r\n minute: this.selectedMinute,\r\n });\r\n\r\n if (dt.isValid) {\r\n this.selectedValue = dt.toFormat(this.format);\r\n this.onChange(this.selectedValue);\r\n this.selectionChange.emit(this.selectedValue);\r\n } else {\r\n // Si la hora no es válida, limpiar\r\n this.selectedValue = null;\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n }\r\n\r\n\r\n // ============================================================================\r\n // SELECTION METHODS (Métodos de selección)\r\n // ============================================================================\r\n onSelectHour(hour: number): void {\r\n this.selectedHour = hour;\r\n this.updateSelectedValue();\r\n }\r\n\r\n onSelectMinute(minute: number): void {\r\n this.selectedMinute = minute;\r\n this.updateSelectedValue();\r\n }\r\n\r\n // ============================================================================\r\n // SCROLL METHODS (Métodos de scroll)\r\n // ============================================================================\r\n scrollToCurrentHours(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${TimePickerComponent.modalRootSelector} .TimePicker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.Hours > div');\r\n const el =\r\n this.selectedHour != null\r\n ? (els[this.selectedHour] as HTMLElement)\r\n : null;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n scrollToCurrentMinutes(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${TimePickerComponent.modalRootSelector} .TimePicker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.Minutes > div');\r\n const el =\r\n this.selectedMinute != null\r\n ? (els[this.selectedMinute] as HTMLElement)\r\n : null;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n // ============================================================================\r\n // TOGGLE METHODS (Métodos de toggle)\r\n // ============================================================================\r\n toggleShowPicker(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n\r\n const isLabel = target.closest('.Label');\r\n const isDescription = target.closest('.Description');\r\n const isSelector = target.closest('.Entry');\r\n const isBackdrop = target.closest('.Backdrop');\r\n const isCloseBtn = target.classList.contains('Close');\r\n const isInsideBox = !!target.closest('.Picker');\r\n\r\n if (isLabel || isSelector || isDescription) {\r\n this.previousSelectedValue = this.selectedValue;\r\n this.showPicker = true;\r\n this.openModalPortal();\r\n this.scrollToCurrentHours();\r\n this.scrollToCurrentMinutes();\r\n } else if (isBackdrop) {\r\n if (!isInsideBox || isCloseBtn) {\r\n this.onCancel();\r\n }\r\n } else {\r\n this.onCancel();\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private applyCancelState(): void {\r\n if (this.previousSelectedValue) {\r\n this.setFromDate(this.previousSelectedValue);\r\n } else {\r\n this.clearSelection();\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.applyCancelState();\r\n this.closePicker();\r\n }\r\n\r\n onClear(): void {\r\n this.selectedValue = null;\r\n this.previousSelectedValue = null;\r\n this.selectedHour = null;\r\n this.selectedMinute = null;\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.closePicker();\r\n }\r\n\r\n onAccept(): void {\r\n this.previousSelectedValue = this.selectedValue;\r\n this.closePicker();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n selectedValue: this.selectedValue,\r\n selectedHour: this.selectedHour,\r\n selectedMinute: this.selectedMinute,\r\n selectedDateExtended: this.selectedDateExtended,\r\n HOURS: this.HOURS,\r\n MINUTES: this.MINUTES,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.showPicker) return;\r\n this.timePickerModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.timePickerModal.open({\r\n view: this.buildModalView(),\r\n handlers: this.buildHandlers(),\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.timePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.showPicker) return;\r\n this.onCancel();\r\n }\r\n\r\n private closePicker(): void {\r\n if (!this.showPicker) return;\r\n this.showPicker = false;\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildHandlers() {\r\n const sync = () => this.syncModalView();\r\n return {\r\n toggleShowPicker: (e: Event) => this.toggleShowPicker(e),\r\n onSelectHour: (h: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectHour(h);\r\n sync();\r\n },\r\n onSelectMinute: (m: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectMinute(m);\r\n sync();\r\n },\r\n onCancel: () => this.onCancel(),\r\n onClear: () => this.onClear(),\r\n onAccept: () => this.onAccept(),\r\n };\r\n }\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n if (this.isDisabled) return;\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n get selectedDateExtended(): string {\r\n if (this.selectedHour == null || this.selectedMinute == null) return '';\r\n return DateTime.fromObject({\r\n hour: this.selectedHour,\r\n minute: this.selectedMinute,\r\n })\r\n .setLocale('es')\r\n .toFormat('HH:mm');\r\n }\r\n\r\n // ============================================================================\r\n // CONSTANTS (Constantes del componente)\r\n // ============================================================================\r\n readonly HOURS = Array.from({ length: 24 }, (_, i) => i);\r\n readonly MINUTES = Array.from({ length: 60 }, (_, i) => i);\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div\n class=\"Entry\"\n (click)=\"toggleShowPicker($event)\"\n [class.focused]=\"isFocus\"\n [class.Disabled]=\"isDisabled\"\n tabindex=\"0\"\n (focus)=\"focus()\"\n (blur)=\"defocus()\"\n>\n <div class=\"Value\" *ngIf=\"selectedValue\">{{ selectedDateExtended }}</div>\n <div class=\"Placeholder\" *ngIf=\"!selectedValue\">{{ placeholder }}</div>\n <lucide-icon class=\"IconDate\" name=\"clock\"></lucide-icon>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface MonthPickerModalViewModel {\r\n selectedValue: string;\r\n years: number[];\r\n months: number[];\r\n showYears: boolean;\r\n selectedYear: number;\r\n selectedMonth: number | null;\r\n MONTH_NAMES: readonly string[];\r\n selectedDateExtended: string;\r\n formattedSelected: string;\r\n}\r\n\r\nexport interface MonthPickerModalHandlers {\r\n toggleShowPicker: (e: Event) => void;\r\n onSelectYear: (y: number, e: Event) => void;\r\n onDecrementYear: (e: Event) => void;\r\n onIncrementYear: (e: Event) => void;\r\n onSelectMonth: (m: number, e: Event) => void;\r\n openYears: (e: Event) => void;\r\n onDecrementMonth: (e: Event) => void;\r\n onIncrementMonth: (e: Event) => void;\r\n onCancel: () => void;\r\n onClear: () => void;\r\n onAccept: () => void;\r\n}\r\n\r\nexport interface MonthPickerModalSession {\r\n view: MonthPickerModalViewModel;\r\n handlers: MonthPickerModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MonthPickerModalService {\r\n private readonly state = new BehaviorSubject<MonthPickerModalSession | null>(\r\n null\r\n );\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: MonthPickerModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<MonthPickerModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n ElementRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { MonthPickerModalService } from './services/month-picker-modal/month-picker-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'month-picker',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n templateUrl: './month-picker.component.html',\r\n styleUrls: ['./month-picker.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MonthPickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MonthPickerComponent\r\n implements ControlValueAccessor, OnInit, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private monthPickerModal = inject(MonthPickerModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n private static readonly modalRootSelector = 'month-picker-modal-service';\r\n\r\n private get hostElement(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n \r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() format: string = 'yyyy-MM';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n if (value) {\r\n this.setFromDate(value);\r\n } else {\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = DateTime.now().year;\r\n this.selectedMonth = null;\r\n this.closePicker();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selectedValue: string = '';\r\n private previousSelectedValue: string = ''; // Valor antes de abrir el picker (para cancelar)\r\n selectedYear: number = DateTime.now().year;\r\n selectedMonth: number | null = null;\r\n currentYear = DateTime.now().year;\r\n // ============================================================================\r\n // CALENDAR STATE (Estado del calendario)\r\n // ============================================================================\r\n years: number[] = [];\r\n months: number[] = Array.from({ length: 12 }, (_, i) => i + 1);\r\n readonly MONTH_NAMES = [\r\n 'enero',\r\n 'febrero',\r\n 'marzo',\r\n 'abril',\r\n 'mayo',\r\n 'junio',\r\n 'julio',\r\n 'agosto',\r\n 'septiembre',\r\n 'octubre',\r\n 'noviembre',\r\n 'diciembre',\r\n ];\r\n\r\n // ============================================================================\r\n // UI STATE (Estado de la interfaz de usuario)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n showPicker = false;\r\n showMonths = false;\r\n showYears = false;\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n this.generateYears();\r\n }\r\n ngOnDestroy(): void {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.monthPickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n this.onChange = () => {};\r\n this.onTouched = () => {};\r\n this.selectionChange.complete();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n // ============================================================================\r\n // VALUE METHODS (Métodos de valor)\r\n // ============================================================================\r\n private setFromDate(dateStr: string): void {\r\n const dt = this.parseDate(dateStr);\r\n if (!dt.isValid) return;\r\n\r\n this.selectedYear = dt.year;\r\n this.selectedMonth = dt.month;\r\n this.updateSelectedValue();\r\n }\r\n\r\n private updateSelectedValue(): void {\r\n if (this.selectedYear == null || this.selectedMonth == null) {\r\n // Si falta algún valor, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n return;\r\n }\r\n\r\n const dt = DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n });\r\n\r\n if (dt.isValid) {\r\n this.selectedValue = dt.toFormat(this.format);\r\n this.onChange(this.selectedValue);\r\n this.selectionChange.emit(this.selectedValue);\r\n } else {\r\n // Si la fecha no es válida, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n }\r\n\r\n private parseDate(dateStr: string): DateTime {\r\n const isISO = this.format.includes('T') || this.format.includes(\"'T'\");\r\n let dt = isISO\r\n ? DateTime.fromISO(dateStr)\r\n : DateTime.fromFormat(dateStr, this.format);\r\n\r\n if (!dt.isValid) {\r\n dt = isISO\r\n ? DateTime.fromFormat(dateStr, this.format)\r\n : DateTime.fromISO(dateStr);\r\n }\r\n\r\n return dt;\r\n }\r\n\r\n // ============================================================================\r\n // NAVIGATION METHODS (Métodos de navegación)\r\n // ============================================================================\r\n onIncrementMonth(): void {\r\n if (this.selectedMonth === 12) {\r\n if (this.selectedYear && this.selectedYear < 2125) {\r\n this.selectedYear++;\r\n this.selectedMonth = 1;\r\n }\r\n } else {\r\n this.selectedMonth!++;\r\n }\r\n this.updateSelectedValue();\r\n }\r\n\r\n onDecrementMonth(): void {\r\n if (this.selectedMonth === 1) {\r\n if (this.selectedYear && this.selectedYear > 1) {\r\n this.selectedYear--;\r\n this.selectedMonth = 12;\r\n }\r\n } else {\r\n this.selectedMonth!--;\r\n }\r\n this.updateSelectedValue();\r\n }\r\n\r\n onIncrementYear(): void {\r\n if (this.selectedYear && this.selectedYear < 2125) {\r\n this.selectedYear++;\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n onDecrementYear(): void {\r\n if (this.selectedYear && this.selectedYear > 1) {\r\n this.selectedYear--;\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n onSelectMonth(month: number): void {\r\n this.selectedMonth = month;\r\n this.updateSelectedValue();\r\n this.showMonths = false;\r\n }\r\n\r\n onSelectYear(year: number): void {\r\n this.selectedYear = year;\r\n this.updateSelectedValue();\r\n this.showYears = false;\r\n }\r\n\r\n // ============================================================================\r\n // SCROLL METHODS (Métodos de scroll)\r\n // ============================================================================\r\n scrollToCurrentMonth(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${MonthPickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.months > div');\r\n const el = els[this.selectedMonth! - 1] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n scrollToCurrentYear(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${MonthPickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const index = this.years.indexOf(this.selectedYear!);\r\n const els = root.querySelectorAll('.years > div');\r\n const el = els[index] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n openMonths(): void {\r\n this.showMonths = !this.showMonths;\r\n if (this.showMonths) {\r\n this.showYears = false;\r\n this.scrollToCurrentMonth();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n openYears(): void {\r\n this.showYears = !this.showYears;\r\n if (this.showYears) this.scrollToCurrentYear();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // TOGGLE METHODS (Métodos de toggle)\r\n // ============================================================================\r\n toggleShowPicker(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n const isLabel = target.closest('.Label');\r\n const isDescription = target.closest('.Description');\r\n const isInput = target.closest('.Entry');\r\n const isBackdrop = target.closest('.Backdrop');\r\n const isCloseBtn = target.classList.contains('Close');\r\n const picker =\r\n this.hostElement.querySelector('.Picker') ||\r\n document.querySelector(\r\n `${MonthPickerComponent.modalRootSelector} .Picker`\r\n );\r\n const isInsideBox = picker?.contains(target) ?? false;\r\n\r\n if (isLabel || isInput || isDescription) {\r\n this.showYears = false;\r\n this.showMonths = false;\r\n this.previousSelectedValue = this.selectedValue;\r\n this.showPicker = true;\r\n this.openModalPortal();\r\n this.scrollToCurrentMonth();\r\n this.scrollToCurrentYear();\r\n } else if (isBackdrop) {\r\n if (!isInsideBox || isCloseBtn) this.onCancel();\r\n } else {\r\n this.onCancel();\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private applyCancelState(): void {\r\n if (this.previousSelectedValue) {\r\n this.setFromDate(this.previousSelectedValue);\r\n } else {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = null;\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.applyCancelState();\r\n this.closePicker();\r\n }\r\n\r\n onAccept(): void {\r\n this.previousSelectedValue = this.selectedValue;\r\n this.closePicker();\r\n }\r\n\r\n onClear(): void {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = null;\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.closePicker();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n selectedValue: this.selectedValue,\r\n years: this.years,\r\n months: this.months,\r\n showYears: this.showYears,\r\n selectedYear: this.selectedYear,\r\n selectedMonth: this.selectedMonth,\r\n MONTH_NAMES: this.MONTH_NAMES,\r\n selectedDateExtended: this.selectedDateExtended,\r\n formattedSelected: this.formattedSelected,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.showPicker) return;\r\n this.monthPickerModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.monthPickerModal.open({\r\n view: this.buildModalView(),\r\n handlers: this.buildHandlers(),\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.monthPickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.showPicker) return;\r\n this.onCancel();\r\n }\r\n\r\n private closePicker(): void {\r\n if (!this.showPicker) return;\r\n this.showPicker = false;\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildHandlers() {\r\n const sync = () => this.syncModalView();\r\n return {\r\n toggleShowPicker: (e: Event) => this.toggleShowPicker(e),\r\n onSelectYear: (y: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectYear(y);\r\n sync();\r\n },\r\n onDecrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementYear();\r\n sync();\r\n },\r\n onIncrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementYear();\r\n sync();\r\n },\r\n onSelectMonth: (m: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectMonth(m);\r\n sync();\r\n },\r\n openYears: (e: Event) => {\r\n e.stopPropagation();\r\n this.openYears();\r\n sync();\r\n },\r\n onDecrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementMonth();\r\n sync();\r\n },\r\n onIncrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementMonth();\r\n sync();\r\n },\r\n onCancel: () => this.onCancel(),\r\n onClear: () => this.onClear(),\r\n onAccept: () => this.onAccept(),\r\n };\r\n }\r\n\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n if (this.isDisabled) return;\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n get selectedDateExtended(): string {\r\n if (this.selectedYear == null || this.selectedMonth == null) return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n })\r\n .setLocale('es')\r\n .toFormat(\"LLLL 'de' yyyy\");\r\n }\r\n\r\n get formattedSelected(): string {\r\n if (this.selectedYear == null || this.selectedMonth == null) return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n }).toFormat(this.format);\r\n }\r\n\r\n private generateYears(): void {\r\n const start = this.currentYear - 100;\r\n const end = this.currentYear + 10;\r\n this.years = Array.from({ length: end - start + 1 }, (_, i) => start + i);\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div\r\n class=\"Entry\"\r\n (click)=\"toggleShowPicker($event)\"\r\n [class.focused]=\"isFocus\"\r\n [class.Disabled]=\"isDisabled\"\r\n tabindex=\"0\"\r\n (focus)=\"focus()\"\r\n (blur)=\"defocus()\"\r\n>\r\n <div class=\"Value\" *ngIf=\"selectedValue\">{{ formattedSelected }}</div>\r\n <div class=\"Placeholder\" *ngIf=\"!selectedValue\">{{ placeholder }}</div>\r\n <lucide-icon class=\"IconDate\" name=\"calendar\"></lucide-icon>\r\n</div>\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { CalendarDay } from '../../../date-picker/date-picker.types';\r\n\r\nexport interface DatetimePickerModalViewModel {\r\n selectedValue: string;\r\n years: number[];\r\n months: number[];\r\n calendarDays: CalendarDay[];\r\n showYears: boolean;\r\n showMonths: boolean;\r\n selectedYear: number;\r\n selectedMonth: number;\r\n selectedDay: number | null;\r\n selectedHour: number;\r\n selectedMinute: number;\r\n MONTH_NAMES: readonly string[];\r\n formattedMonthAndYear: string;\r\n selectedDateExtended: string;\r\n formattedSelected: string;\r\n HOURS: readonly number[];\r\n MINUTES: readonly number[];\r\n}\r\n\r\nexport interface DatetimePickerModalHandlers {\r\n toggleShowPicker: (e: Event) => void;\r\n onSelectYear: (y: number, e: Event) => void;\r\n onDecrementYear: (e: Event) => void;\r\n onIncrementYear: (e: Event) => void;\r\n onSelectMonth: (m: number, e: Event) => void;\r\n openYears: (e: Event) => void;\r\n openMonths: (e: Event) => void;\r\n onDecrementMonth: (e: Event) => void;\r\n onIncrementMonth: (e: Event) => void;\r\n onClickDay: (d: CalendarDay, e: Event) => void;\r\n onSelectHour: (h: number, e: Event) => void;\r\n onSelectMinute: (m: number, e: Event) => void;\r\n onCancel: () => void;\r\n onClear: () => void;\r\n onAccept: () => void;\r\n}\r\n\r\nexport interface DatetimePickerModalSession {\r\n view: DatetimePickerModalViewModel;\r\n handlers: DatetimePickerModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class DatetimePickerModalService {\r\n private readonly state = new BehaviorSubject<DatetimePickerModalSession | null>(\r\n null\r\n );\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: DatetimePickerModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<DatetimePickerModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n ElementRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { DateTime } from 'luxon';\r\nimport { DatetimePickerModalService } from './services/datetime-picker-modal/datetime-picker-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { CalendarDay } from '../date-picker/date-picker.types';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'datetime-picker',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n templateUrl: './datetime-picker.component.html',\r\n styleUrls: ['./datetime-picker.component.sass'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DatetimePickerComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class DatetimePickerComponent\r\n implements ControlValueAccessor, OnInit, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private datetimePickerModal = inject(DatetimePickerModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n private static readonly modalRootSelector =\r\n 'datetime-picker-modal-service';\r\n\r\n private get hostElement(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() format: string = \"yyyy-MM-dd'T'HH:mm\";\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<string | null>();\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n if (value) {\r\n this.setFromDate(value);\r\n } else {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.selectedHour = now.hour;\r\n this.selectedMinute = now.minute;\r\n this.updateCalendar();\r\n this.closePicker();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selectedValue = '';\r\n private previousSelectedValue = ''; // Valor antes de abrir el picker (para cancelar)\r\n selectedYear: number = DateTime.now().year;\r\n selectedMonth: number = DateTime.now().month;\r\n selectedDay: number | null = null;\r\n selectedHour: number = DateTime.now().hour;\r\n selectedMinute: number = DateTime.now().minute;\r\n\r\n currentYear = DateTime.now().year;\r\n years: number[] = [];\r\n months = Array.from({ length: 12 }, (_, i) => i + 1);\r\n calendarDays: CalendarDay[] = [];\r\n\r\n readonly MONTH_NAMES = [\r\n 'enero',\r\n 'febrero',\r\n 'marzo',\r\n 'abril',\r\n 'mayo',\r\n 'junio',\r\n 'julio',\r\n 'agosto',\r\n 'septiembre',\r\n 'octubre',\r\n 'noviembre',\r\n 'diciembre',\r\n ];\r\n\r\n readonly HOURS = Array.from({ length: 24 }, (_, i) => i);\r\n readonly MINUTES = Array.from({ length: 60 }, (_, i) => i);\r\n\r\n isFocus = false;\r\n isDisabled = false;\r\n showPicker = false;\r\n showMonths = false;\r\n showYears = false;\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n this.generateYears();\r\n }\r\n ngOnDestroy(): void {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.datetimePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n this.onChange = () => {};\r\n this.onTouched = () => {};\r\n this.selectionChange.complete();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n private setFromDate(dateStr: string): void {\r\n const dt = this.parseDate(dateStr);\r\n if (!dt.isValid) return;\r\n\r\n this.selectedYear = dt.year;\r\n this.selectedMonth = dt.month;\r\n this.selectedDay = dt.day;\r\n this.selectedHour = dt.hour;\r\n this.selectedMinute = dt.minute;\r\n\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n private parseDate(dateStr: string): DateTime {\r\n const isISO = this.format.includes('T') || this.format.includes(\"'T'\");\r\n let dt = isISO\r\n ? DateTime.fromISO(dateStr)\r\n : DateTime.fromFormat(dateStr, this.format);\r\n\r\n if (!dt.isValid) {\r\n dt = isISO\r\n ? DateTime.fromFormat(dateStr, this.format)\r\n : DateTime.fromISO(dateStr);\r\n }\r\n\r\n return dt;\r\n }\r\n\r\n private updateSelectedValue(): void {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n ) {\r\n // Si falta algún valor, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n return;\r\n }\r\n\r\n const dt = DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n hour: this.selectedHour,\r\n minute: this.selectedMinute,\r\n });\r\n\r\n if (dt.isValid) {\r\n this.selectedValue = dt.toFormat(this.format);\r\n this.onChange(this.selectedValue);\r\n this.selectionChange.emit(this.selectedValue);\r\n } else {\r\n // Si la fecha no es válida, limpiar\r\n this.selectedValue = '';\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n if (this.showPicker) this.syncModalView();\r\n }\r\n\r\n private updateCalendar(): void {\r\n this.generateCalendarDays();\r\n const maxDay =\r\n DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n }).daysInMonth ?? 31;\r\n\r\n if (this.selectedDay! > maxDay) {\r\n this.selectedDay = maxDay;\r\n }\r\n }\r\n\r\n private generateYears(): void {\r\n const start = this.currentYear - 100;\r\n const end = this.currentYear + 10;\r\n this.years = Array.from({ length: end - start + 1 }, (_, i) => start + i);\r\n }\r\n\r\n private generateCalendarDays(): void {\r\n const firstDay = DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: 1,\r\n });\r\n const startOffset = firstDay.weekday % 7;\r\n const start = firstDay.minus({ days: startOffset });\r\n const totalDays = 42;\r\n\r\n this.calendarDays = Array.from({ length: totalDays }, (_, i) => {\r\n const date = start.plus({ days: i });\r\n return {\r\n day: date.day,\r\n date,\r\n isCurrentMonth: date.month === this.selectedMonth,\r\n };\r\n });\r\n }\r\n\r\n // ============================================================================\r\n // SELECTION METHODS (Métodos de selección)\r\n // ============================================================================\r\n onClickDay(d: CalendarDay): void {\r\n if (!d.isCurrentMonth || this.isDisabled) return;\r\n this.selectedDay = d.day;\r\n this.updateSelectedValue();\r\n }\r\n\r\n onSelectMonth(month: number): void {\r\n this.selectedMonth = month;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n this.showMonths = false;\r\n }\r\n\r\n onSelectYear(year: number): void {\r\n this.selectedYear = year;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n this.showYears = false;\r\n }\r\n\r\n onSelectHour(hour: number): void {\r\n this.selectedHour = hour;\r\n this.updateSelectedValue();\r\n }\r\n\r\n onSelectMinute(minute: number): void {\r\n this.selectedMinute = minute;\r\n this.updateSelectedValue();\r\n }\r\n\r\n // ============================================================================\r\n // NAVIGATION METHODS (Métodos de navegación)\r\n // ============================================================================\r\n onIncrementMonth(): void {\r\n if (this.selectedMonth === 12) {\r\n if (this.selectedYear < 2125) {\r\n this.selectedYear++;\r\n this.selectedMonth = 1;\r\n }\r\n } else {\r\n this.selectedMonth++;\r\n }\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n onDecrementMonth(): void {\r\n if (this.selectedMonth === 1) {\r\n if (this.selectedYear > 1) {\r\n this.selectedYear--;\r\n this.selectedMonth = 12;\r\n }\r\n } else {\r\n this.selectedMonth--;\r\n }\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n\r\n onIncrementYear(): void {\r\n if (this.selectedYear < 2125) {\r\n this.selectedYear++;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n onDecrementYear(): void {\r\n if (this.selectedYear > 1) {\r\n this.selectedYear--;\r\n this.updateCalendar();\r\n this.updateSelectedValue();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // TOGGLE METHODS (Métodos de toggle)\r\n // ============================================================================\r\n toggleShowPicker(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n const isLabel = target.closest('.Label');\r\n const isDescription = target.closest('.Description');\r\n const isInput = target.closest('.Entry');\r\n const isBackdrop = target.closest('.Backdrop');\r\n const isCloseBtn = target.classList.contains('Close');\r\n const picker =\r\n this.hostElement.querySelector('.Picker') ||\r\n document.querySelector(\r\n `${DatetimePickerComponent.modalRootSelector} .Picker`\r\n );\r\n const isInsideBox = picker?.contains(target) ?? false;\r\n\r\n if (isLabel || isInput || isDescription) {\r\n this.showYears = false;\r\n this.showMonths = false;\r\n this.previousSelectedValue = this.selectedValue;\r\n this.showPicker = true;\r\n this.openModalPortal();\r\n this.scrollToCurrentMonth();\r\n this.scrollToCurrentYear();\r\n this.scrollToCurrentHours();\r\n this.scrollToCurrentMinutes();\r\n } else if (isBackdrop) {\r\n if (!isInsideBox || isCloseBtn) {\r\n this.onCancel();\r\n }\r\n } else {\r\n this.onCancel();\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private applyCancelState(): void {\r\n if (this.previousSelectedValue) {\r\n this.setFromDate(this.previousSelectedValue);\r\n } else {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.selectedHour = now.hour;\r\n this.selectedMinute = now.minute;\r\n this.updateCalendar();\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.applyCancelState();\r\n this.closePicker();\r\n }\r\n\r\n onAccept(): void {\r\n this.previousSelectedValue = this.selectedValue;\r\n this.closePicker();\r\n }\r\n\r\n onClear(): void {\r\n const now = DateTime.now();\r\n this.selectedValue = '';\r\n this.previousSelectedValue = '';\r\n this.selectedYear = now.year;\r\n this.selectedMonth = now.month;\r\n this.selectedDay = null;\r\n this.selectedHour = now.hour;\r\n this.selectedMinute = now.minute;\r\n this.updateCalendar();\r\n this.onChange(null);\r\n this.selectionChange.emit(null);\r\n this.closePicker();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n selectedValue: this.selectedValue,\r\n years: this.years,\r\n months: this.months,\r\n calendarDays: this.calendarDays,\r\n showYears: this.showYears,\r\n showMonths: this.showMonths,\r\n selectedYear: this.selectedYear,\r\n selectedMonth: this.selectedMonth,\r\n selectedDay: this.selectedDay,\r\n selectedHour: this.selectedHour,\r\n selectedMinute: this.selectedMinute,\r\n MONTH_NAMES: this.MONTH_NAMES,\r\n formattedMonthAndYear: this.formattedMonthAndYear,\r\n selectedDateExtended: this.selectedDateExtended,\r\n formattedSelected: this.formattedSelected,\r\n HOURS: this.HOURS,\r\n MINUTES: this.MINUTES,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.showPicker) return;\r\n this.datetimePickerModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.datetimePickerModal.open({\r\n view: this.buildModalView(),\r\n handlers: this.buildHandlers(),\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.datetimePickerModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.showPicker) return;\r\n this.onCancel();\r\n }\r\n\r\n private closePicker(): void {\r\n if (!this.showPicker) return;\r\n this.showPicker = false;\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildHandlers() {\r\n const sync = () => this.syncModalView();\r\n return {\r\n toggleShowPicker: (e: Event) => this.toggleShowPicker(e),\r\n onSelectYear: (y: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectYear(y);\r\n sync();\r\n },\r\n onDecrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementYear();\r\n sync();\r\n },\r\n onIncrementYear: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementYear();\r\n sync();\r\n },\r\n onSelectMonth: (m: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectMonth(m);\r\n sync();\r\n },\r\n openYears: (e: Event) => {\r\n e.stopPropagation();\r\n this.openYears();\r\n sync();\r\n },\r\n openMonths: (e: Event) => {\r\n e.stopPropagation();\r\n this.openMonths();\r\n sync();\r\n },\r\n onDecrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onDecrementMonth();\r\n sync();\r\n },\r\n onIncrementMonth: (e: Event) => {\r\n e.stopPropagation();\r\n this.onIncrementMonth();\r\n sync();\r\n },\r\n onClickDay: (d: CalendarDay, e: Event) => {\r\n e.stopPropagation();\r\n this.onClickDay(d);\r\n sync();\r\n },\r\n onSelectHour: (h: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectHour(h);\r\n sync();\r\n },\r\n onSelectMinute: (m: number, e: Event) => {\r\n e.stopPropagation();\r\n this.onSelectMinute(m);\r\n sync();\r\n },\r\n onCancel: () => this.onCancel(),\r\n onClear: () => this.onClear(),\r\n onAccept: () => this.onAccept(),\r\n };\r\n }\r\n\r\n scrollToCurrentHours(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatetimePickerComponent.modalRootSelector} .TimePicker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.Hours > div');\r\n const el = els[this.selectedHour] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n scrollToCurrentMinutes(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatetimePickerComponent.modalRootSelector} .TimePicker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.Minutes > div');\r\n const el = els[this.selectedMinute] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n openMonths(): void {\r\n this.showMonths = !this.showMonths;\r\n if (this.showMonths) {\r\n this.showYears = false;\r\n this.scrollToCurrentMonth();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n openYears(): void {\r\n this.showYears = !this.showYears;\r\n if (this.showYears) {\r\n this.scrollToCurrentYear();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n scrollToCurrentMonth(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatetimePickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const els = root.querySelectorAll('.months > div');\r\n const el = els[this.selectedMonth - 1] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n scrollToCurrentYear(): void {\r\n setTimeout(() => {\r\n const root = document.querySelector(\r\n `${DatetimePickerComponent.modalRootSelector} .Picker`\r\n );\r\n if (!root) return;\r\n const index = this.years.indexOf(this.selectedYear);\r\n const els = root.querySelectorAll('.years > div');\r\n const el = els[index] as HTMLElement;\r\n if (el) el.scrollIntoView({ block: 'center' });\r\n }, 10);\r\n }\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n if (this.isDisabled) return;\r\n }\r\n\r\n // ============================================================================\r\n // GETTERS (Getters del componente)\r\n // ============================================================================\r\n get selectedDateExtended(): string {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n )\r\n return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n hour: this.selectedHour,\r\n minute: this.selectedMinute,\r\n })\r\n .setLocale('es')\r\n .toFormat(\"cccc dd 'de' LLLL 'del' yyyy HH:mm\");\r\n }\r\n\r\n get formattedMonthAndYear(): string {\r\n if (!this.selectedMonth || !this.selectedYear) return '';\r\n const month = this.MONTH_NAMES[this.selectedMonth - 1];\r\n return `${month.charAt(0).toUpperCase() + month.slice(1)} de ${\r\n this.selectedYear\r\n }`;\r\n }\r\n\r\n get formattedSelected(): string {\r\n if (\r\n this.selectedYear == null ||\r\n this.selectedMonth == null ||\r\n this.selectedDay == null\r\n )\r\n return '';\r\n return DateTime.fromObject({\r\n year: this.selectedYear,\r\n month: this.selectedMonth,\r\n day: this.selectedDay,\r\n hour: this.selectedHour,\r\n minute: this.selectedMinute,\r\n }).toFormat(\"yyyy-MM-dd' 'HH:mm\");\r\n }\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); toggleShowPicker($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div\n class=\"Entry\"\n (click)=\"toggleShowPicker($event)\"\n [class.focused]=\"isFocus\"\n [class.Disabled]=\"isDisabled\"\n tabindex=\"0\"\n (focus)=\"focus()\"\n (blur)=\"defocus()\"\n>\n <div class=\"Value\" *ngIf=\"selectedValue\">{{ formattedSelected }}</div>\n <div class=\"Placeholder\" *ngIf=\"!selectedValue\">{{ placeholder }}</div>\n <lucide-icon class=\"IconDate\" name=\"calendar\"></lucide-icon>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SelectOption } from '../../only-select.types';\r\n\r\nexport interface OnlySelectModalViewModel {\r\n searchQuery: string;\r\n filteredOptions: SelectOption[];\r\n selectedOption: SelectOption | null;\r\n shouldShowSearch: boolean;\r\n isLoading: boolean;\r\n isSearching: boolean;\r\n noOptionsMessage: string;\r\n}\r\n\r\nexport interface OnlySelectModalHandlers {\r\n onSearchInput: (e: Event) => void;\r\n onBackdropClick: (e: Event) => void;\r\n onOptionSelect: (option: SelectOption) => void;\r\n}\r\n\r\nexport interface OnlySelectModalSession {\r\n view: OnlySelectModalViewModel;\r\n handlers: OnlySelectModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class OnlySelectModalService {\r\n private readonly state = new BehaviorSubject<OnlySelectModalSession | null>(null);\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: OnlySelectModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<OnlySelectModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { XOSUE_UTILS_INPUTS_CONFIG } from '../../config/inputs-config';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n Subject,\r\n switchMap,\r\n catchError,\r\n of,\r\n Subscription,\r\n} from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport {\r\n ControlValueAccessor,\r\n FormsModule,\r\n NG_VALUE_ACCESSOR,\r\n} from '@angular/forms';\r\nimport { OnlySelectModalService } from './services/only-select-modal/only-select-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { SelectOption } from './only-select.types';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\nimport { FieldHelpTooltipComponent } from '../../vendor/field-help-tooltip/field-help-tooltip.component';\r\n\r\nexport type { SelectOption } from './only-select.types';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'only-select',\r\n templateUrl: './only-select.component.html',\r\n styleUrls: ['./only-select.component.sass'],\r\n imports: [\r\n LucideIconComponent,\r\n CommonModule,\r\n FormsModule,\r\n FieldHelpTooltipComponent,\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush, // Optimización para detectar cambios solo cuando es necesario\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR, // Registro del value accessor para el componente\r\n useExisting: forwardRef(() => OnlySelectComponent), // Utilizamos forwardRef para evitar problemas con el ciclo de vida de Angular\r\n multi: true, // Necesario para que se pueda usar con múltiples componentes\r\n },\r\n ],\r\n})\r\nexport class OnlySelectComponent\r\n implements ControlValueAccessor, OnInit, OnChanges, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private http = inject(HttpClient);\r\n private readonly inputsConfig = inject(XOSUE_UTILS_INPUTS_CONFIG);\r\n private onlySelectModal = inject(OnlySelectModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() opcional: boolean = false;\r\n @Input() options: SelectOption[] = [];\r\n /** Texto de ayuda mostrado al pulsar el botón de información. */\r\n @Input() fieldHelp: string = '';\r\n @Input() api?: string;\r\n @Input() search: boolean = false;\r\n @Input() minSearch: number = 0;\r\n /** Mensaje cuando no quedan opciones (lista vacía o sin resultados de búsqueda). */\r\n @Input() noOptionsMessage: string = 'No hay opciones disponibles';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<SelectOption | null>();\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isOpenOptions = false;\r\n isFocus = false;\r\n isDisabled = false;\r\n filteredOptions: SelectOption[] = [];\r\n selectedOption: SelectOption | null = null;\r\n private internalOptions: SelectOption[] = [];\r\n private pendingValue: string | null = null;\r\n searchQuery: string = ''; // Estado del query de búsqueda\r\n isLoading = false; // Estado de carga inicial\r\n isSearching = false; // Estado de búsqueda en progreso\r\n\r\n // ============================================================================\r\n // OBSERVABLES AND RXJS (Observables y RxJS)\r\n // ============================================================================\r\n private searchSubject = new Subject<string>();\r\n private searchSubscription?: Subscription;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n const normalized =\r\n value === undefined || value === null || value === '' ? null : value;\r\n\r\n if (normalized === null) {\r\n if (this.isOpenOptions) {\r\n this.isOpenOptions = false;\r\n this.closeModalPortal();\r\n }\r\n this.pendingValue = null;\r\n this.selectedOption = null;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n this.syncModalView();\r\n return;\r\n }\r\n\r\n if (this.api || this.internalOptions.length === 0) {\r\n this.pendingValue = normalized;\r\n } else {\r\n this.selectedOption =\r\n this.internalOptions.find((opt) => opt.value === normalized) || null;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n private propagateChanges(): void {\r\n const value = this.selectedOption?.value ?? null;\r\n this.onChange(value);\r\n this.onTouched();\r\n this.selectionChange.emit(this.selectedOption);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Ciclo de vida del componente)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n // Configurar búsqueda con debounce para evitar sobrecarga\r\n if (this.search) {\r\n // Búsqueda con debounce (500ms) para API y local\r\n this.searchSubscription = this.searchSubject\r\n .pipe(\r\n debounceTime(500), // Aumentado a 500ms para dar tiempo de escribir\r\n distinctUntilChanged(),\r\n switchMap((query) => {\r\n this.isSearching = true;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n\r\n if (this.api) {\r\n // Búsqueda con API\r\n return this.http\r\n .get<SelectOption[]>(\r\n `${this.inputsConfig.apiUrl}${this.api}?search=${encodeURIComponent(query)}`,\r\n { headers: this.getAuthHeaders() }\r\n )\r\n .pipe(\r\n catchError((err) => {\r\n console.error('API search error:', err);\r\n this.isSearching = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n return of([]);\r\n })\r\n );\r\n } else {\r\n // Búsqueda local (simulamos delay mínimo para consistencia)\r\n return new Promise<SelectOption[]>((resolve) => {\r\n setTimeout(() => {\r\n resolve(this.filterLocalOptions(query));\r\n }, 100);\r\n }).then((results) => {\r\n this.isSearching = false;\r\n this.cdr.markForCheck();\r\n return results;\r\n });\r\n }\r\n })\r\n )\r\n .subscribe((results) => {\r\n this.filteredOptions = results;\r\n this.isSearching = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n // Cargar datos iniciales\r\n if (this.api) {\r\n this.fetchFromApi('');\r\n } else {\r\n this.loadLocalOptions();\r\n }\r\n }\r\n \r\n /**\r\n * Obtiene los headers de autenticación para las peticiones HTTP.\r\n */\r\n private getAuthHeaders(): HttpHeaders {\r\n const token = this.inputsConfig.getAuthToken();\r\n return new HttpHeaders({\r\n Authorization: `Bearer ${token}`,\r\n });\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['api'] && this.api) {\r\n this.fetchFromApi('');\r\n }\r\n if (changes['options'] && !this.api) {\r\n this.loadLocalOptions();\r\n }\r\n }\r\n ngOnDestroy(): void {\r\n this.searchSubscription?.unsubscribe();\r\n this.searchSubject.complete();\r\n if (this.isOpenOptions) {\r\n this.isOpenOptions = false;\r\n this.onlySelectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // SEARCH HANDLERS (Manejadores de búsqueda)\r\n // ============================================================================\r\n onSearchChange(e: Event): void {\r\n const query = (e.target as HTMLInputElement)?.value ?? '';\r\n this.searchQuery = query;\r\n\r\n if (!this.search) return;\r\n\r\n this.searchSubject.next(query);\r\n this.syncModalView();\r\n }\r\n \r\n /**\r\n * Filtra opciones locales (método auxiliar para búsqueda con debounce)\r\n */\r\n private filterLocalOptions(query: string): SelectOption[] {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n \r\n if (!normalizedQuery) {\r\n return [...this.internalOptions];\r\n }\r\n \r\n // Reordenar por relevancia\r\n return [...this.internalOptions]\r\n .map((option) => ({\r\n option,\r\n score: this.calculateRelevanceScore(option, normalizedQuery),\r\n }))\r\n .sort((a, b) => b.score - a.score)\r\n .map((item) => item.option);\r\n }\r\n \r\n /**\r\n * Calcula un score de relevancia para una opción basado en la búsqueda.\r\n * - Score más alto = mejor coincidencia\r\n * - Coincidencia exacta: 100\r\n * - Comienza con la búsqueda: 80\r\n * - Contiene la búsqueda: 60\r\n * - Coincidencia en descripción: 40\r\n * - Sin coincidencia: 0\r\n */\r\n private calculateRelevanceScore(option: SelectOption, query: string): number {\r\n const normalizedQuery = query.toLowerCase().trim();\r\n if (!normalizedQuery) return 50; // Sin búsqueda, score neutral\r\n \r\n const name = option.name.toLowerCase();\r\n const description = (option.description || '').toLowerCase();\r\n \r\n let score = 0;\r\n \r\n // Coincidencia exacta (mayor prioridad)\r\n if (name === normalizedQuery) {\r\n score = 100;\r\n }\r\n // Comienza con la búsqueda (alta prioridad)\r\n else if (name.startsWith(normalizedQuery)) {\r\n score = 80;\r\n }\r\n // Contiene la búsqueda en el nombre (media prioridad)\r\n else if (name.includes(normalizedQuery)) {\r\n score = 60;\r\n // Bonificación si está al principio de una palabra\r\n const words = name.split(/\\s+/);\r\n if (words.some(word => word.startsWith(normalizedQuery))) {\r\n score += 10;\r\n }\r\n }\r\n // Coincidencia en descripción (baja prioridad)\r\n else if (description.includes(normalizedQuery)) {\r\n score = 40;\r\n }\r\n // Sin coincidencia\r\n else {\r\n score = 0;\r\n }\r\n \r\n return score;\r\n }\r\n \r\n\r\n // ============================================================================\r\n // API HANDLERS (Manejadores de API)\r\n // ============================================================================\r\n private fetchFromApi(query: string): void {\r\n this.isLoading = true;\r\n this.cdr.markForCheck();\r\n this.syncModalView();\r\n\r\n const encodedQuery = encodeURIComponent(query || '');\r\n const url = query \r\n ? `${this.inputsConfig.apiUrl}${this.api}?search=${encodedQuery}`\r\n : `${this.inputsConfig.apiUrl}${this.api}`;\r\n \r\n this.http\r\n .get<SelectOption[]>(url, { headers: this.getAuthHeaders() })\r\n .pipe(\r\n catchError((err) => {\r\n console.error('API fetch error:', err);\r\n this.isLoading = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n return of([]);\r\n })\r\n )\r\n .subscribe((data) => {\r\n this.internalOptions = data;\r\n this.filteredOptions = data;\r\n \r\n // Si hay un valor pendiente, seleccionarlo ahora que tenemos las opciones\r\n if (this.pendingValue) {\r\n this.selectedOption = \r\n this.internalOptions.find((opt) => opt.value === this.pendingValue) || null;\r\n this.pendingValue = null;\r\n }\r\n \r\n this.isLoading = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n private loadLocalOptions(): void {\r\n this.internalOptions = this.options || [];\r\n // Siempre mostrar todas las opciones al cargar (sin búsqueda previa)\r\n this.filteredOptions = [...this.internalOptions];\r\n\r\n if (this.pendingValue) {\r\n this.selectedOption =\r\n this.internalOptions.find((opt) => opt.value === this.pendingValue) ||\r\n null;\r\n this.pendingValue = null;\r\n }\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n searchQuery: this.searchQuery,\r\n filteredOptions: this.filteredOptions,\r\n selectedOption: this.selectedOption,\r\n shouldShowSearch: this.shouldShowSearchInput(),\r\n isLoading: this.isLoading,\r\n isSearching: this.isSearching,\r\n noOptionsMessage: this.noOptionsMessage,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.isOpenOptions) return;\r\n this.onlySelectModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.onlySelectModal.open({\r\n view: this.buildModalView(),\r\n handlers: {\r\n onSearchInput: (e) => this.onSearchChange(e),\r\n onBackdropClick: (e) => this.toggleOpenOptions(e),\r\n onOptionSelect: (opt) => this.onOptionToggle(opt),\r\n },\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.onlySelectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.isOpenOptions) return;\r\n this.isOpenOptions = false;\r\n this.onlySelectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // COMPONENT METHODS (Métodos del componente)\r\n // ============================================================================\r\n onOptionToggle(option: SelectOption): void {\r\n this.selectedOption = option;\r\n this.propagateChanges();\r\n this.isOpenOptions = false;\r\n this.closeModalPortal();\r\n }\r\n removeSelected(): void {\r\n this.selectedOption = null;\r\n this.propagateChanges();\r\n }\r\n isSelected(option: SelectOption): boolean {\r\n return this.selectedOption?.value === option.value;\r\n }\r\n\r\n // ============================================================================\r\n // VISUAL INTERACTION (Interacción visual)\r\n // ============================================================================\r\n toggleOpenOptions(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n const inLabel = target.closest('.Label');\r\n const inDescription = target.closest('.Description');\r\n const inCombo =\r\n target.closest('.Entry') && !target.classList.contains('RemoveIcon');\r\n const container = target.closest('.Backdrop');\r\n const inBox = target.closest('.Picker');\r\n const isClose = target.classList.contains('Close');\r\n const wasOpen = this.isOpenOptions;\r\n\r\n if (inLabel || inCombo || inDescription) {\r\n this.isOpenOptions = true;\r\n } else {\r\n this.isOpenOptions =\r\n !container || !inBox || isClose ? false : this.isOpenOptions;\r\n }\r\n\r\n if (!wasOpen && this.isOpenOptions) {\r\n this.searchQuery = '';\r\n this.isSearching = false;\r\n if (this.api) {\r\n this.fetchFromApi('');\r\n } else {\r\n this.filteredOptions = [...this.internalOptions];\r\n }\r\n this.openModalPortal();\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n } else if (wasOpen && !this.isOpenOptions) {\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n shouldShowSearchInput(): boolean {\r\n return this.api\r\n ? this.search\r\n : this.search && this.minSearch <= this.internalOptions.length;\r\n }\r\n focus(): void {\r\n this.isFocus = true;\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n \r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n\r\n if (this.isDisabled) return;\r\n\r\n if (!this.isOpenOptions) {\r\n this.isOpenOptions = true;\r\n this.searchQuery = '';\r\n this.isSearching = false;\r\n if (this.api) {\r\n this.fetchFromApi('');\r\n } else {\r\n this.filteredOptions = [...this.internalOptions];\r\n }\r\n this.openModalPortal();\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n}\r\n\r\n//*! URGENTE: RECORDAR QUE AL CARGAR ACTUALIZACION CALIENTE DE CODIGO GENERA PROBLEMAS EN LA BUSQUEDA DEL SELECTOR, SI SE VA A TESTEAR UN SELECTOR EN DESARROLLO SE TIENE QUE RECARGAR MANUALMENTE LA PAGINA.\r\n","<div\n *ngIf=\"label\"\n class=\"LabelRow\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"toggleOpenOptions($event); $event.stopPropagation()\"\n>\n <p class=\"Label\">\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n </p>\n <field-help-tooltip\n *ngIf=\"fieldHelp\"\n [title]=\"label\"\n [text]=\"fieldHelp\"\n ></field-help-tooltip>\n</div>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"toggleOpenOptions($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div\n class=\"Entry\"\n (click)=\"toggleOpenOptions($event)\"\n [class.IsFocus]=\"isFocus\"\n [class.Disabled]=\"isDisabled\"\n (focus)=\"focus()\"\n (blur)=\"defocus()\"\n>\n <div class=\"SelectedOptions\" *ngIf=\"selectedOption\">\n <div class=\"SelectedOption\">\n <div\n class=\"Color\"\n *ngIf=\"selectedOption.color\"\n [style.backgroundColor]=\"selectedOption.color\"\n ></div>\n <span class=\"Text\">{{ selectedOption.name }}</span>\n <lucide-icon class=\"RemoveIcon\" name=\"x\" (click)=\"removeSelected()\"></lucide-icon>\n </div>\n </div>\n <div class=\"Placeholder\" *ngIf=\"!selectedOption\">\n {{ placeholder }}\n </div>\n\n <lucide-icon class=\"IconSort\" name=\"arrow-down-wide-narrow\"></lucide-icon>\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { SelectOption } from '../../../only-select/only-select.types';\r\n\r\nexport interface MultiselectComboboxModalViewModel {\r\n searchQuery: string;\r\n filteredOptions: SelectOption[];\r\n selectedOptions: SelectOption[];\r\n shouldShowSearch: boolean;\r\n isLoading: boolean;\r\n isSearching: boolean;\r\n noOptionsMessage: string;\r\n}\r\n\r\nexport interface MultiselectComboboxModalHandlers {\r\n onSearchInput: (e: Event) => void;\r\n onBackdropClick: (e: Event) => void;\r\n onOptionToggle: (option: SelectOption, event: Event) => void;\r\n onRemoveSelected: (option: SelectOption, event: Event) => void;\r\n}\r\n\r\nexport interface MultiselectComboboxModalSession {\r\n view: MultiselectComboboxModalViewModel;\r\n handlers: MultiselectComboboxModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MultiselectComboboxModalService {\r\n private readonly state = new BehaviorSubject<MultiselectComboboxModalSession | null>(null);\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: MultiselectComboboxModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<MultiselectComboboxModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import {\r\n Component,\r\n Input,\r\n Output,\r\n EventEmitter,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n OnChanges,\r\n SimpleChanges,\r\n OnInit,\r\n OnDestroy,\r\n forwardRef,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { XOSUE_UTILS_INPUTS_CONFIG } from '../../config/inputs-config';\r\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\r\nimport {\r\n debounceTime,\r\n distinctUntilChanged,\r\n Subject,\r\n switchMap,\r\n catchError,\r\n of,\r\n Subscription,\r\n} from 'rxjs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MultiselectComboboxModalService } from './services/multiselect-combobox-modal/multiselect-combobox-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { SelectOption } from '../only-select/only-select.types';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\nexport type { SelectOption } from '../only-select/only-select.types';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'multiselect-combobox',\r\n templateUrl: './multiselect-combobox.component.html',\r\n styleUrls: ['./multiselect-combobox.component.sass'],\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiselectComboboxComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultiselectComboboxComponent\r\n implements ControlValueAccessor, OnInit, OnChanges, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private http = inject(HttpClient);\r\n private readonly inputsConfig = inject(XOSUE_UTILS_INPUTS_CONFIG);\r\n private multiselectModal = inject(MultiselectComboboxModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() opcional: boolean = false;\r\n @Input() options: SelectOption[] = [];\r\n @Input() api?: string;\r\n @Input() search: boolean = false;\r\n @Input() minSearch: number = 0;\r\n /** Parámetros extra en la query del API (p. ej. exclude_id). */\r\n @Input() apiQueryParams: Record<string, string | number | boolean | null | undefined> = {};\r\n /** No cargar catálogo completo al iniciar (útil para listas grandes). */\r\n @Input() deferInitialLoad = false;\r\n /** Mensaje cuando no quedan opciones (lista vacía o sin resultados de búsqueda). */\r\n @Input() noOptionsMessage: string = 'No hay opciones disponibles';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // OUTPUT PROPERTIES (Props de salida)\r\n // ============================================================================\r\n @Output() selectionChange = new EventEmitter<SelectOption[] | null>();\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isOpenOptions = false;\r\n isFocus = false;\r\n isDisabled = false;\r\n filteredOptions: SelectOption[] = [];\r\n selectedOptions: SelectOption[] = [];\r\n private internalOptions: SelectOption[] = [];\r\n private pendingValues: string[] | null = null;\r\n private apiReady = false;\r\n searchQuery: string = ''; // Estado del query de búsqueda\r\n isLoading = false; // Estado de carga inicial\r\n isSearching = false; // Estado de búsqueda en progreso\r\n\r\n // ============================================================================\r\n // OBSERVABLES AND RXJS (Observables y RxJS)\r\n // ============================================================================\r\n private searchSubject = new Subject<string>();\r\n private fetchSubject = new Subject<{ query: string; extraParams?: Record<string, string> }>();\r\n private searchSubscription?: Subscription;\r\n private fetchSubscription?: Subscription;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string[]) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(values: string[] | null): void {\r\n const nextValues = values?.length ? [...values] : [];\r\n const currentValues = this.selectedOptions.map((opt) => opt.value);\r\n const sameSelection =\r\n nextValues.length === currentValues.length &&\r\n nextValues.every((value) => currentValues.includes(value));\r\n\r\n if (!values || values.length === 0) {\r\n if (this.isOpenOptions) {\r\n this.isOpenOptions = false;\r\n this.closeModalPortal();\r\n }\r\n this.selectedOptions = [];\r\n this.pendingValues = null;\r\n this.searchQuery = '';\r\n this.cdr.markForCheck();\r\n this.syncModalView();\r\n return;\r\n }\r\n\r\n if (sameSelection) {\r\n return;\r\n }\r\n\r\n if (this.api || this.internalOptions.length === 0) {\r\n this.pendingValues = values;\r\n if (this.apiReady && values.length > 0) {\r\n this.requestApi('', { ids: values.join(',') });\r\n } else if (!this.api) {\r\n this.resolvePendingSelection();\r\n }\r\n } else {\r\n this.selectedOptions = this.internalOptions.filter((opt) =>\r\n values.includes(opt.value)\r\n );\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: (value: string[]) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private propagateChanges(): void {\r\n const selectedValues = this.selectedOptions.map((opt) => opt.value);\r\n this.onChange(selectedValues);\r\n this.onTouched();\r\n this.selectionChange.emit(this.selectedOptions);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private resolvePendingSelection(): void {\r\n if (!this.pendingValues?.length) return;\r\n const source = this.api ? this.filteredOptions : this.internalOptions;\r\n if (!source.length) return;\r\n const matched = source.filter((opt) => this.pendingValues!.includes(opt.value));\r\n if (!matched.length) return;\r\n\r\n const byValue = new Map(this.selectedOptions.map((opt) => [opt.value, opt]));\r\n matched.forEach((opt) => byValue.set(opt.value, opt));\r\n this.selectedOptions = Array.from(byValue.values());\r\n\r\n const resolved = new Set(matched.map((opt) => opt.value));\r\n const remaining = this.pendingValues.filter((value) => !resolved.has(value));\r\n this.pendingValues = remaining.length ? remaining : null;\r\n if (matched.length > 0) {\r\n this.propagateChanges();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildApiUrl(query: string, extraParams?: Record<string, string>): string {\r\n const params = new URLSearchParams();\r\n const normalizedQuery = query.trim();\r\n if (normalizedQuery) {\r\n params.set('search', normalizedQuery);\r\n }\r\n for (const [key, value] of Object.entries(this.apiQueryParams)) {\r\n if (value !== null && value !== undefined && value !== '') {\r\n params.set(key, String(value));\r\n }\r\n }\r\n if (extraParams) {\r\n for (const [key, value] of Object.entries(extraParams)) {\r\n if (value) params.set(key, value);\r\n }\r\n }\r\n const qs = params.toString();\r\n return `${this.inputsConfig.apiUrl}${this.api}${qs ? `?${qs}` : ''}`;\r\n }\r\n\r\n private requestApi(query: string, extraParams?: Record<string, string>): void {\r\n if (!this.api) return;\r\n this.fetchSubject.next({ query, extraParams });\r\n }\r\n\r\n // ============================================================================\r\n // LIFE CYCLE HOOKS (Ciclo de vida del componente)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n if (this.api) {\r\n this.fetchSubscription = this.fetchSubject\r\n .pipe(\r\n switchMap(({ query, extraParams }) => {\r\n const normalizedQuery = query.trim();\r\n const isIdLookup = !!extraParams?.['ids'];\r\n const shouldSkipBrowseLoad =\r\n !isIdLookup &&\r\n !normalizedQuery &&\r\n this.deferInitialLoad &&\r\n this.minSearch > 0;\r\n\r\n this.isLoading = !shouldSkipBrowseLoad && !normalizedQuery && !isIdLookup;\r\n this.isSearching = !!normalizedQuery;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n\r\n if (shouldSkipBrowseLoad) {\r\n return of([]);\r\n }\r\n\r\n return this.http\r\n .get<SelectOption[]>(this.buildApiUrl(normalizedQuery, extraParams), {\r\n headers: this.getAuthHeaders(),\r\n })\r\n .pipe(\r\n catchError((err) => {\r\n console.error('API fetch error:', err);\r\n return of([]);\r\n })\r\n );\r\n })\r\n )\r\n .subscribe((data) => {\r\n this.filteredOptions = data;\r\n this.resolvePendingSelection();\r\n this.isLoading = false;\r\n this.isSearching = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n if (this.api && this.search) {\r\n this.searchSubscription = this.searchSubject\r\n .pipe(\r\n debounceTime(300),\r\n distinctUntilChanged(),\r\n switchMap((query) => {\r\n const normalizedQuery = query.trim();\r\n if (this.minSearch > 0 && normalizedQuery.length < this.minSearch) {\r\n this.isSearching = false;\r\n this.filteredOptions = [];\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n return of([]);\r\n }\r\n\r\n this.isSearching = true;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n\r\n return this.http\r\n .get<SelectOption[]>(this.buildApiUrl(normalizedQuery), {\r\n headers: this.getAuthHeaders(),\r\n })\r\n .pipe(\r\n catchError((err) => {\r\n console.error('API search error:', err);\r\n return of([]);\r\n })\r\n );\r\n })\r\n )\r\n .subscribe((results) => {\r\n this.filteredOptions = results;\r\n this.resolvePendingSelection();\r\n this.isSearching = false;\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n if (this.api) {\r\n this.apiReady = true;\r\n if (this.pendingValues?.length) {\r\n this.requestApi('', { ids: this.pendingValues.join(',') });\r\n } else if (!this.deferInitialLoad) {\r\n this.requestApi('');\r\n }\r\n } else {\r\n this.loadLocalOptions();\r\n }\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['api'] && this.api && !this.deferInitialLoad && !this.pendingValues?.length) {\r\n this.requestApi('');\r\n }\r\n if (changes['options'] && !this.api) {\r\n this.loadLocalOptions();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.searchSubscription?.unsubscribe();\r\n this.fetchSubscription?.unsubscribe();\r\n this.searchSubject.complete();\r\n this.fetchSubject.complete();\r\n if (this.isOpenOptions) {\r\n this.isOpenOptions = false;\r\n this.multiselectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // SEARCH HANDLERS (Manejadores de búsqueda)\r\n // ============================================================================\r\n onSearchChange(e: Event): void {\r\n const query = (e.target as HTMLInputElement)?.value ?? '';\r\n this.searchQuery = query;\r\n\r\n if (!this.search) return;\r\n\r\n this.searchSubject.next(query);\r\n this.syncModalView();\r\n }\r\n \r\n /**\r\n * Filtra opciones locales (método auxiliar para búsqueda con debounce)\r\n */\r\n private filterLocalOptions(query: string): SelectOption[] {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n \r\n if (!normalizedQuery) {\r\n return [...this.internalOptions];\r\n }\r\n \r\n // Reordenar por relevancia\r\n return [...this.internalOptions]\r\n .map((option) => ({\r\n option,\r\n score: this.calculateRelevanceScore(option, normalizedQuery),\r\n }))\r\n .sort((a, b) => b.score - a.score)\r\n .map((item) => item.option);\r\n }\r\n\r\n /**\r\n * Calcula un score de relevancia para una opción basado en la búsqueda.\r\n * - Score más alto = mejor coincidencia\r\n * - Coincidencia exacta: 100\r\n * - Comienza con la búsqueda: 80\r\n * - Contiene la búsqueda: 60\r\n * - Coincidencia en descripción: 40\r\n * - Sin coincidencia: 0\r\n */\r\n private calculateRelevanceScore(option: SelectOption, query: string): number {\r\n const normalizedQuery = query.toLowerCase().trim();\r\n if (!normalizedQuery) return 50; // Sin búsqueda, score neutral\r\n\r\n const name = option.name.toLowerCase();\r\n const description = (option.description || '').toLowerCase();\r\n\r\n let score = 0;\r\n\r\n // Coincidencia exacta (mayor prioridad)\r\n if (name === normalizedQuery) {\r\n score = 100;\r\n }\r\n // Comienza con la búsqueda (alta prioridad)\r\n else if (name.startsWith(normalizedQuery)) {\r\n score = 80;\r\n }\r\n // Contiene la búsqueda en el nombre (media prioridad)\r\n else if (name.includes(normalizedQuery)) {\r\n score = 60;\r\n // Bonificación si está al principio de una palabra\r\n const words = name.split(/\\s+/);\r\n if (words.some((word) => word.startsWith(normalizedQuery))) {\r\n score += 10;\r\n }\r\n }\r\n // Coincidencia en descripción (baja prioridad)\r\n else if (description.includes(normalizedQuery)) {\r\n score = 40;\r\n }\r\n // Sin coincidencia\r\n else {\r\n score = 0;\r\n }\r\n\r\n return score;\r\n }\r\n\r\n\r\n // ============================================================================\r\n // API HANDLERS (Manejadores de API)\r\n // ============================================================================\r\n /**\r\n * Obtiene los headers de autenticación para las peticiones HTTP.\r\n */\r\n private getAuthHeaders(): HttpHeaders {\r\n const token = this.inputsConfig.getAuthToken();\r\n return new HttpHeaders({\r\n Authorization: `Bearer ${token}`,\r\n });\r\n }\r\n\r\n private fetchFromApi(query: string, extraParams?: Record<string, string>): void {\r\n this.requestApi(query, extraParams);\r\n }\r\n\r\n private loadLocalOptions(): void {\r\n this.internalOptions = this.options || [];\r\n // Siempre mostrar todas las opciones al cargar (sin búsqueda previa)\r\n this.filteredOptions = [...this.internalOptions];\r\n\r\n if (this.pendingValues) {\r\n this.resolvePendingSelection();\r\n }\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n searchQuery: this.searchQuery,\r\n filteredOptions: this.filteredOptions,\r\n selectedOptions: this.selectedOptions,\r\n shouldShowSearch: this.shouldShowSearchInput(),\r\n isLoading: this.isLoading,\r\n isSearching: this.isSearching,\r\n noOptionsMessage: this.noOptionsMessage,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.isOpenOptions) return;\r\n this.multiselectModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.multiselectModal.open({\r\n view: this.buildModalView(),\r\n handlers: {\r\n onSearchInput: (e) => this.onSearchChange(e),\r\n onBackdropClick: (e) => this.toggleOpenOptions(e),\r\n onOptionToggle: (option, event) => this.onOptionToggle(option, event),\r\n onRemoveSelected: (option, event) => this.removeSelectedFromModal(option, event),\r\n },\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.multiselectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.isOpenOptions) return;\r\n this.isOpenOptions = false;\r\n this.multiselectModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Quitar chip desde el modal sin propagar el click al backdrop. */\r\n private removeSelectedFromModal(option: SelectOption, event: Event): void {\r\n event.stopPropagation();\r\n this.removeSelected(option);\r\n this.syncModalView();\r\n }\r\n\r\n // ============================================================================\r\n // COMPONENT METHODS (Métodos del componente)\r\n // ============================================================================\r\n onOptionToggle(option: SelectOption, event: Event): void {\r\n const checked = (event.target as HTMLInputElement).checked;\r\n this.selectedOptions = checked\r\n ? [...this.selectedOptions, option]\r\n : this.selectedOptions.filter((opt) => opt.value !== option.value);\r\n\r\n this.propagateChanges();\r\n this.syncModalView();\r\n }\r\n\r\n removeSelected(option: SelectOption): void {\r\n this.selectedOptions = this.selectedOptions.filter(\r\n (opt) => opt.value !== option.value\r\n );\r\n this.propagateChanges();\r\n this.syncModalView();\r\n }\r\n\r\n isSelected(option: SelectOption): boolean {\r\n return this.selectedOptions.some((opt) => opt.value === option.value);\r\n }\r\n\r\n // ============================================================================\r\n // VISUAL INTERACTION (Interacción visual)\r\n // ============================================================================\r\n toggleOpenOptions(e: Event): void {\r\n const target = e.target as HTMLElement;\r\n const inLabel = target.closest('.Label');\r\n const inDescription = target.closest('.Description');\r\n const inCombo =\r\n target.closest('.Entry') && !target.classList.contains('RemoveIcon');\r\n const container = target.closest('.Backdrop');\r\n const inBox = target.closest('.Picker');\r\n const isClose = target.classList.contains('Close');\r\n const wasOpen = this.isOpenOptions;\r\n\r\n if (inLabel || inCombo || inDescription) {\r\n this.isOpenOptions = true;\r\n } else {\r\n this.isOpenOptions =\r\n !container || !inBox || isClose ? false : this.isOpenOptions;\r\n }\r\n\r\n if (!wasOpen && this.isOpenOptions) {\r\n this.searchQuery = '';\r\n this.isSearching = false;\r\n if (this.api) {\r\n if (this.deferInitialLoad && this.minSearch > 0) {\r\n this.filteredOptions = [];\r\n } else if (this.filteredOptions.length === 0) {\r\n this.fetchFromApi('');\r\n }\r\n } else {\r\n this.filteredOptions = [...this.internalOptions];\r\n }\r\n this.openModalPortal();\r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n } else if (wasOpen && !this.isOpenOptions) {\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n shouldShowSearchInput(): boolean {\r\n return this.api\r\n ? this.search\r\n : this.search && this.minSearch <= this.internalOptions.length;\r\n }\r\n\r\n focus(): void {\r\n this.isFocus = true;\r\n }\r\n\r\n defocus(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n }\r\n\r\n /**\r\n * Simula un click en el input interno (si existe) para enfocarlo.\r\n * @param event Evento del mouse (opcional).\r\n */\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n if (this.isDisabled) return;\r\n\r\n // Si el dropdown está cerrado, abrirlo\r\n if (!this.isOpenOptions) {\r\n this.isOpenOptions = true;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"toggleOpenOptions($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"toggleOpenOptions($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div\n class=\"Entry\"\n (click)=\"toggleOpenOptions($event)\"\n [class.focused]=\"isFocus\"\n [class.disabled]=\"isDisabled\"\n tabindex=\"0\"\n (focus)=\"focus()\"\n (blur)=\"defocus()\"\n>\n <div class=\"SelectedOptions\" *ngIf=\"selectedOptions.length > 0\">\n <ng-container *ngIf=\"selectedOptions.length > 1\">\n <span class=\"SelectedCount\">\n +{{ selectedOptions.length - 1 }} items\n </span>\n\n <span class=\"SelectedOption\">\n <span class=\"Text\">{{ selectedOptions[selectedOptions.length - 1].name }}</span>\n <lucide-icon class=\"RemoveIcon\" name=\"x\" (click)=\"removeSelected(selectedOptions[selectedOptions.length - 1])\"></lucide-icon>\n </span>\n </ng-container>\n\n <ng-container *ngIf=\"selectedOptions.length === 1\">\n <span class=\"SelectedOption\">\n <p class=\"Text\">{{ selectedOptions[0].name }}</p>\n\n <lucide-icon\n class=\"RemoveIcon\"\n name=\"x\"\n (click)=\"removeSelected(selectedOptions[0])\"\n ></lucide-icon>\n </span>\n </ng-container>\n </div>\n\n <div\n class=\"Placeholder\"\n *ngIf=\"!selectedOptions || selectedOptions.length === 0\"\n >\n {{ placeholder }}\n </div>\n <lucide-icon class=\"IconSort\" name=\"arrow-down-wide-narrow\"></lucide-icon>\n</div>\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n ChangeDetectorRef,\r\n forwardRef,\r\n ElementRef,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'boolean-entry',\r\n standalone: true,\r\n templateUrl: './boolean-entry.component.html',\r\n styleUrl: './boolean-entry.component.sass',\r\n imports: [CommonModule, LucideIconComponent],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => BooleanEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class BooleanEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() text: string = 'Boleano';\r\n\r\n /**\r\n * Textos según el valor del control:\r\n * - 1 elemento: mismo texto para true, false y null (default).\r\n * - 2 elementos: [0] = true, [1] = false; null usa {@link description} (si vacío, {@link text}).\r\n * - 3+ elementos: [0] = true, [1] = false, [2] = null/default.\r\n */\r\n @Input() valuesOnValue: string[] | null | undefined;\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n value: boolean | null = null;\r\n isDisabled = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (val: boolean) => {};\r\n private onTouched = () => {};\r\n writeValue(value: boolean | null): void {\r\n this.value = value ?? null;\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n toggle(): void {\r\n if (this.isDisabled) return;\r\n this.value = this.value === null ? true : !this.value;\r\n this.onChange(this.value);\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // COMPUTED PROPERTIES (Propiedades calculadas)\r\n // ============================================================================\r\n get iconName(): 'check' | 'x' | 'minus' {\r\n if (this.value === true) return 'check';\r\n if (this.value === false) return 'x';\r\n return 'minus';\r\n }\r\n\r\n /** Texto junto al icono: {@link valuesOnValue} si aplica; si no, {@link text}. */\r\n get displayValueText(): string {\r\n const arr = this.valuesOnValue;\r\n if (!arr?.length) {\r\n return this.text;\r\n }\r\n if (arr.length === 1) {\r\n return arr[0] ?? this.text;\r\n }\r\n const defFromDescription = this.description?.trim() ? this.description : this.text;\r\n if (arr.length === 2) {\r\n if (this.value === true) {\r\n return arr[0] ?? '';\r\n }\r\n if (this.value === false) {\r\n return arr[1] ?? '';\r\n }\r\n return defFromDescription;\r\n }\r\n if (this.value === true) {\r\n return arr[0] ?? '';\r\n }\r\n if (this.value === false) {\r\n return arr[1] ?? '';\r\n }\r\n return arr[2] ?? defFromDescription;\r\n }\r\n\r\n // ============================================================================\r\n // HOST LISTENERS (Eventos del host)\r\n // ============================================================================\r\n @HostListener('click')\r\n onClick(): void {\r\n this.toggle();\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n if (!this.isDisabled) {\r\n this.toggle();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry NotHover\" [class.Disabled]=\"isDisabled\">\r\n <lucide-icon\r\n class=\"Icon\"\r\n [name]=\"iconName\"\r\n [class.Icon--true]=\"value === true\"\r\n [class.Icon--false]=\"value === false\"\r\n [class.Icon--null]=\"value === null\"\r\n ></lucide-icon>\r\n <span class=\"Text\" *ngIf=\"displayValueText\">{{ displayValueText }}</span>\r\n</div>\r\n\r\n<input type=\"checkbox\" [checked]=\"value\" hidden />\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'multichoice-entry',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './multichoice-entry.component.html',\r\n styleUrl: './multichoice-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultichoiceEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MultichoiceEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() options: { value: string; text?: string }[] = [];\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selected: string[] | null = null;\r\n isDisabled = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string[] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string[] | null): void {\r\n if (value == null || value.length === 0) {\r\n this.selected = null;\r\n } else {\r\n this.selected = [...value];\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string[] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n toggle(optionValue: string): void {\r\n if (this.isDisabled) return;\r\n\r\n if (!this.selected) {\r\n this.selected = [optionValue];\r\n } else {\r\n const index = this.selected.indexOf(optionValue);\r\n if (index >= 0) {\r\n this.selected.splice(index, 1);\r\n if (this.selected.length === 0) this.selected = null;\r\n } else {\r\n this.selected.push(optionValue);\r\n }\r\n }\r\n\r\n this.onChange(this.selected ? [...this.selected] : null);\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n isChecked(optionValue: string): boolean {\r\n return this.selected?.includes(optionValue) ?? false;\r\n }\r\n\r\n iconClass(optionValue: string): string {\r\n return this.isChecked(optionValue) ? 'check' : 'x';\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Options\">\r\n <div\r\n class=\"BooleanEntry\"\r\n *ngFor=\"let opt of options\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"toggle(opt.value)\"\r\n >\r\n <i class=\"Icon fa-solid\" [ngClass]=\"iconClass(opt.value)\"></i>\r\n <span class=\"Text\" *ngIf=\"opt.text\">{{ opt.text }}</span>\r\n <input type=\"checkbox\" [checked]=\"isChecked(opt.value)\" hidden />\r\n </div>\r\n</div>\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n ElementRef,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule\r\n} from '@angular/forms';\r\n\r\n@Component({\r\n selector: 'onlychoice-entry',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './onlychoice-entry.component.html',\r\n styleUrl: './onlychoice-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => OnlychoiceEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class OnlychoiceEntryComponent implements ControlValueAccessor {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() description: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() options: { value: string; text?: string }[] = [];\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n selected: string | null = null;\r\n isDisabled = false;\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: string | null): void {\r\n this.selected = value ?? null;\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // METHODS (Métodos del componente)\r\n // ============================================================================\r\n toggle(optionValue: string): void {\r\n if (this.isDisabled) return;\r\n\r\n if (this.selected === optionValue) {\r\n this.selected = this.opcional ? null : optionValue; // solo permite desmarcar si es opcional\r\n } else {\r\n this.selected = optionValue;\r\n }\r\n\r\n this.onChange(this.selected);\r\n this.onTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n isChecked(optionValue: string): boolean {\r\n return this.selected === optionValue;\r\n }\r\n\r\n iconClass(optionValue: string): string {\r\n return this.isChecked(optionValue) ? 'check' : 'minus';\r\n }\r\n}\r\n\r\n\r\n\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Options\" [class.Disabled]=\"isDisabled\">\r\n <div\r\n class=\"BooleanEntry\"\r\n *ngFor=\"let opt of options\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"toggle(opt.value)\"\r\n >\r\n <i class=\"Icon fa-solid\" [ngClass]=\"iconClass(opt.value)\"></i>\r\n <span class=\"Text\" *ngIf=\"opt.text\">{{ opt.text }}</span>\r\n <input\r\n type=\"radio\"\r\n [checked]=\"isChecked(opt.value)\"\r\n [value]=\"opt.value\"\r\n hidden\r\n />\r\n </div>\r\n</div>\r\n\r\n<!-- SI es opcional te permite deselccionar todos pero si no es opcional no te -->\r\n<!-- permite deselccionar todos una vez que ya hay un valor -->\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n PLATFORM_ID,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\nimport { isPlatformBrowser } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n\r\ntype SwitchLabels = [string, string];\r\ntype SwitchEntryModelValue = boolean | string | null;\r\n\r\n@Component({\r\n selector: 'switch-entry',\r\n standalone: true,\r\n imports: [CommonModule],\r\n templateUrl: './switch-entry.component.html',\r\n styleUrl: './switch-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: SwitchEntryComponent,\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SwitchEntryComponent implements ControlValueAccessor, OnChanges, OnDestroy {\r\n private cdr = inject(ChangeDetectorRef);\r\n private hostRef = inject(ElementRef<HTMLElement>);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n @Input() label = '';\r\n @Input() description = '';\r\n @Input() opcional = false;\r\n\r\n /**\r\n * Si se brinda:\r\n * - `values[0]` = equivalente a false/off (izquierda)\r\n * - `values[1]` = equivalente a true/on (derecha)\r\n *\r\n * En ese caso el valor que emite el control es string (uno de esos 2).\r\n * Si NO se brinda, el control funciona como boolean (true/false).\r\n */\r\n @Input() values: SwitchLabels | null | undefined;\r\n\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(v: boolean) {\r\n this.isDisabled = v;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Estado interno (solo para UI). */\r\n private boolValue: boolean | null = null;\r\n /** Último valor del modelo (boolean o string según modo). */\r\n private modelValue: SwitchEntryModelValue = null;\r\n isDisabled = false;\r\n\r\n // Drag state\r\n private dragging = false;\r\n private pointerId: number | null = null;\r\n private startX = 0;\r\n private startLeft = 0; // px\r\n private currentLeft = 0; // px\r\n private moved = false;\r\n\r\n private onChange: (v: SwitchEntryModelValue) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(v: SwitchEntryModelValue): void {\r\n this.modelValue = v;\r\n this.boolValue = this.modelToBool(v);\r\n this.resetThumbToValue();\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (v: SwitchEntryModelValue) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get ariaChecked(): 'true' | 'false' {\r\n return this.boolValue === true ? 'true' : 'false';\r\n }\r\n\r\n get isOn(): boolean {\r\n return this.boolValue === true;\r\n }\r\n\r\n get isDragging(): boolean {\r\n return this.dragging;\r\n }\r\n\r\n get displayText(): string {\r\n const vals = this.values;\r\n if (Array.isArray(vals) && vals.length === 2) {\r\n // Texto del estado actual. Derecha = ON.\r\n return this.boolValue === true ? vals[1] : vals[0];\r\n }\r\n // Fallback si no se pasa values: mostrar nada (o usar description si hay)\r\n return '';\r\n }\r\n\r\n onTrackClick(e: MouseEvent): void {\r\n // Si el gesto fue arrastre, no tratarlo como click.\r\n if (this.moved) {\r\n this.moved = false;\r\n return;\r\n }\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.toggleByClick();\r\n }\r\n\r\n onPointerDown(e: PointerEvent): void {\r\n if (this.isDisabled) return;\r\n // Solo botón primario para mouse; touch/pen siempre ok.\r\n if (e.pointerType === 'mouse' && e.button !== 0) return;\r\n\r\n const track = this.getTrackEl();\r\n if (!track) return;\r\n\r\n this.dragging = true;\r\n this.pointerId = e.pointerId;\r\n this.moved = false;\r\n\r\n const maxLeft = this.getMaxLeft(track);\r\n this.startX = e.clientX;\r\n this.startLeft = this.getThumbLeftForValue(track, maxLeft);\r\n this.currentLeft = this.startLeft;\r\n\r\n try {\r\n (e.currentTarget as HTMLElement | null)?.setPointerCapture?.(e.pointerId);\r\n } catch {}\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onPointerMove(e: PointerEvent): void {\r\n if (!this.dragging || this.pointerId !== e.pointerId) return;\r\n const track = this.getTrackEl();\r\n if (!track) return;\r\n const maxLeft = this.getMaxLeft(track);\r\n\r\n const dx = e.clientX - this.startX;\r\n const next = Math.max(0, Math.min(maxLeft, this.startLeft + dx));\r\n this.currentLeft = next;\r\n if (Math.abs(dx) >= 3) this.moved = true;\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onPointerUp(e: PointerEvent): void {\r\n if (!this.dragging || this.pointerId !== e.pointerId) return;\r\n const track = this.getTrackEl();\r\n this.dragging = false;\r\n this.pointerId = null;\r\n\r\n if (!track) return;\r\n const maxLeft = this.getMaxLeft(track);\r\n const ratio = maxLeft > 0 ? this.currentLeft / maxLeft : 0;\r\n\r\n // Umbral de cambio: 0.5 con un margen (si no pasa, vuelve al estado previo)\r\n const shouldBeOn = ratio >= 0.5;\r\n const prev = this.boolValue === true;\r\n if (shouldBeOn !== prev) {\r\n this.setValue(shouldBeOn);\r\n } else {\r\n // Revertir visual\r\n this.resetThumbToValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n onPointerCancel(e: PointerEvent): void {\r\n if (!this.dragging || this.pointerId !== e.pointerId) return;\r\n this.dragging = false;\r\n this.pointerId = null;\r\n this.resetThumbToValue();\r\n this.cdr.markForCheck();\r\n e.preventDefault();\r\n e.stopPropagation();\r\n }\r\n\r\n private toggleByClick(): void {\r\n if (this.isDisabled) return;\r\n const next = this.boolValue === null ? true : !this.boolValue;\r\n this.setValue(next);\r\n }\r\n\r\n private setValue(v: boolean | null): void {\r\n if (v === null && !this.opcional) {\r\n // No permitir null si no es opcional\r\n v = false;\r\n }\r\n this.boolValue = v;\r\n this.modelValue = this.boolToModel(this.boolValue);\r\n this.onChange(this.modelValue);\r\n this.onTouched();\r\n this.resetThumbToValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private getTrackEl(): HTMLElement | null {\r\n if (!isPlatformBrowser(this.platformId)) return null;\r\n const el = this.hostRef.nativeElement.querySelector('.SwitchTrack');\r\n return el instanceof HTMLElement ? el : null;\r\n }\r\n\r\n private getMaxLeft(track: HTMLElement): number {\r\n // Máxima traslación X del thumb respetando su margen.\r\n // Nota: usamos clientWidth/offsetWidth (no incluyen márgenes).\r\n const thumb = track.querySelector('.SwitchThumb') as HTMLElement | null;\r\n if (!thumb) return 0;\r\n try {\r\n const trackW = (track as any)?.clientWidth;\r\n const thumbW = (thumb as any)?.offsetWidth;\r\n if (!Number.isFinite(trackW) || !Number.isFinite(thumbW)) return 0;\r\n const cs = getComputedStyle(thumb);\r\n const ml = parseFloat(cs.marginLeft || '0') || 0;\r\n const mr = parseFloat(cs.marginRight || '0') || 0;\r\n return Math.max(0, trackW - thumbW - ml - mr);\r\n } catch {\r\n return 0;\r\n }\r\n }\r\n\r\n private getThumbLeftForValue(track: HTMLElement, maxLeft: number): number {\r\n return this.boolValue === true ? maxLeft : 0;\r\n }\r\n\r\n get thumbLeftPx(): number {\r\n if (this.dragging) return this.currentLeft;\r\n const track = this.getTrackEl();\r\n if (!track) return this.boolValue === true ? 9999 : 0;\r\n const maxLeft = this.getMaxLeft(track);\r\n return this.getThumbLeftForValue(track, maxLeft);\r\n }\r\n\r\n /** Porcentaje (0–100%) usado para el relleno/gradiente del track. */\r\n get trackFillWidth(): string {\r\n const track = this.getTrackEl();\r\n if (!track) return this.isOn ? '100%' : '0%';\r\n const maxLeft = this.getMaxLeft(track);\r\n const left = this.dragging ? this.currentLeft : this.getThumbLeftForValue(track, maxLeft);\r\n const ratio = maxLeft > 0 ? Math.max(0, Math.min(1, left / maxLeft)) : (this.isOn ? 1 : 0);\r\n return `${Math.round(ratio * 1000) / 10}%`;\r\n }\r\n\r\n private resetThumbToValue(): void {\r\n const track = this.getTrackEl();\r\n if (!track) return;\r\n const maxLeft = this.getMaxLeft(track);\r\n this.currentLeft = this.getThumbLeftForValue(track, maxLeft);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // nada por ahora\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['values']) {\r\n // Si cambia el modo (boolean ⇄ string), recalcular el estado UI desde el último valor del modelo.\r\n this.boolValue = this.modelToBool(this.modelValue);\r\n this.resetThumbToValue();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n private boolToModel(v: boolean | null): SwitchEntryModelValue {\r\n const vals = this.values;\r\n if (Array.isArray(vals) && vals.length === 2) {\r\n if (v === null) return null;\r\n return v ? vals[1] : vals[0];\r\n }\r\n return v;\r\n }\r\n\r\n private modelToBool(v: SwitchEntryModelValue): boolean | null {\r\n const vals = this.values;\r\n if (Array.isArray(vals) && vals.length === 2) {\r\n if (v === null || v === undefined) return null;\r\n if (typeof v === 'boolean') return v;\r\n if (typeof v === 'string') {\r\n if (v === vals[1]) return true;\r\n if (v === vals[0]) return false;\r\n }\r\n return null;\r\n }\r\n if (v === null || v === undefined) return null;\r\n if (typeof v === 'boolean') return v;\r\n return null;\r\n }\r\n}\r\n\r\n","<p *ngIf=\"label\" class=\"Label\" [class.Disabled]=\"isDisabled\">\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p *ngIf=\"description\" class=\"Description\" [class.Disabled]=\"isDisabled\">\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"Entry NotHover\" [class.Disabled]=\"isDisabled\">\r\n <div\r\n class=\"Switch\"\r\n role=\"switch\"\r\n [class.Switch--on]=\"isOn\"\r\n [class.Switch--dragging]=\"isDragging\"\r\n [attr.aria-checked]=\"ariaChecked\"\r\n [attr.aria-disabled]=\"isDisabled ? 'true' : 'false'\"\r\n (click)=\"onTrackClick($event)\"\r\n >\r\n <div\r\n class=\"SwitchTrack\"\r\n tabindex=\"0\"\r\n (pointerdown)=\"onPointerDown($event)\"\r\n (pointermove)=\"onPointerMove($event)\"\r\n (pointerup)=\"onPointerUp($event)\"\r\n (pointercancel)=\"onPointerCancel($event)\"\r\n >\r\n <div class=\"SwitchTrackFill\" [style.width]=\"trackFillWidth\"></div>\r\n <div class=\"SwitchThumb\" [style.transform]=\"'translateX(' + thumbLeftPx + 'px)'\"></div>\r\n </div>\r\n <span class=\"SwitchText\" *ngIf=\"displayText\">{{ displayText }}</span>\r\n </div>\r\n</div>\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\nimport { PhoneCountry } from '../../phone-entry.types';\r\n\r\nexport interface PhoneEntryModalViewModel {\r\n searchQuery: string;\r\n filteredCountries: PhoneCountry[];\r\n}\r\n\r\nexport interface PhoneEntryModalHandlers {\r\n onSearchInput: (e: Event) => void;\r\n onBackdropClick: (e: Event) => void;\r\n onSelectCountry: (country: PhoneCountry, e: Event) => void;\r\n}\r\n\r\nexport interface PhoneEntryModalSession {\r\n view: PhoneEntryModalViewModel;\r\n handlers: PhoneEntryModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class PhoneEntryModalService {\r\n private readonly state = new BehaviorSubject<PhoneEntryModalSession | null>(null);\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: PhoneEntryModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<PhoneEntryModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import { PhoneCountry } from './phone-entry.types';\r\n\r\n/** Normaliza prefijo a formato +NNN */\r\nexport function normalizePhonePrefix(prefix: string | null | undefined): string {\r\n const raw = (prefix ?? '').trim();\r\n if (!raw) return '';\r\n const cleaned = raw.replace(/[^\\d+]/g, '');\r\n if (!cleaned) return '';\r\n const digits = cleaned.replace(/^\\+/, '');\r\n return digits ? `+${digits}` : '';\r\n}\r\n\r\n/**\r\n * Quita el código de país del número si ya está incluido (solo para mostrar o editar en el input).\r\n * Ej: prefix +51, number +51932454853 → 932454853\r\n */\r\nexport function stripCountryCodeFromNumber(\r\n number: string | null | undefined,\r\n prefix: string | null | undefined\r\n): string {\r\n const numRaw = (number ?? '').trim();\r\n if (!numRaw) return '';\r\n\r\n const prefixDigits = normalizePhonePrefix(prefix).replace(/\\D/g, '');\r\n let numDigits = numRaw.replace(/[^\\d+]/g, '');\r\n if (numDigits.startsWith('+')) {\r\n numDigits = numDigits.slice(1);\r\n }\r\n if (!numDigits) return '';\r\n\r\n if (prefixDigits && numDigits.startsWith(prefixDigits)) {\r\n return numDigits.slice(prefixDigits.length);\r\n }\r\n\r\n return numDigits;\r\n}\r\n\r\n/** Formato legible: \"+51 932454853\" sin duplicar el prefijo */\r\nexport function formatPhoneForDisplay(\r\n prefix: string | null | undefined,\r\n number: string | null | undefined,\r\n fallback = 'N/A'\r\n): string {\r\n const prefixNorm = normalizePhonePrefix(prefix);\r\n const local = stripCountryCodeFromNumber(number, prefixNorm);\r\n if (!prefixNorm && !local) return fallback;\r\n if (prefixNorm && local) return `${prefixNorm} ${local}`;\r\n return local || prefixNorm || fallback;\r\n}\r\n\r\n/**\r\n * Detecta código de país en un número pegado o completo.\r\n * Usa la lista de países (prefijo más largo primero).\r\n */\r\nexport function parseEmbeddedCountryCode(\r\n raw: string,\r\n countries: readonly PhoneCountry[]\r\n): { prefix: string; localNumber: string; country: PhoneCountry | null } {\r\n const cleaned = raw.replace(/[\\s\\-().]/g, '');\r\n let digits = cleaned.startsWith('+') ? cleaned.slice(1) : cleaned;\r\n digits = digits.replace(/\\D/g, '');\r\n\r\n if (!digits) {\r\n return { prefix: '', localNumber: '', country: null };\r\n }\r\n\r\n const sorted = [...countries].sort((a, b) => {\r\n const lenA = a.prefix.replace(/\\D/g, '').length;\r\n const lenB = b.prefix.replace(/\\D/g, '').length;\r\n return lenB - lenA;\r\n });\r\n\r\n for (const country of sorted) {\r\n const codeDigits = country.prefix.replace(/\\D/g, '');\r\n if (codeDigits && digits.startsWith(codeDigits)) {\r\n return {\r\n prefix: country.prefix,\r\n localNumber: digits.slice(codeDigits.length),\r\n country,\r\n };\r\n }\r\n }\r\n\r\n return { prefix: '', localNumber: digits, country: null };\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ElementRef,\r\n HostListener,\r\n OnInit,\r\n OnDestroy,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { PhoneEntryModalService } from './services/phone-entry-modal/phone-entry-modal.service';\r\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\r\nimport { PhoneCountry } from './phone-entry.types';\r\nimport {\r\n parseEmbeddedCountryCode,\r\n stripCountryCodeFromNumber,\r\n} from './phone-display.util';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\nexport type { PhoneCountry } from './phone-entry.types';\r\nexport {\r\n formatPhoneForDisplay,\r\n stripCountryCodeFromNumber,\r\n} from './phone-display.util';\r\n\r\n@Component({\r\n selector: 'phone-entry',\r\n standalone: true,\r\n templateUrl: './phone-entry.component.html',\r\n styleUrl: './phone-entry.component.sass',\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PhoneEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class PhoneEntryComponent implements ControlValueAccessor, OnInit, OnDestroy {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private phoneEntryModal = inject(PhoneEntryModalService);\r\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\r\n\r\n private readonly overlayToken: { close: () => void } = {\r\n close: () => this.onOverlayDismissedByCoordinator(),\r\n };\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Teléfono';\r\n @Input() defaultCountry: string = 'PE';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n isFocus = false;\r\n textValue: string = '';\r\n error: boolean = false;\r\n\r\n // ============================================================================\r\n // COUNTRIES (Países)\r\n // ============================================================================\r\n countries: PhoneCountry[] = [\r\n {\r\n img: 'country-icons/us.png',\r\n code: 'US',\r\n prefix: '+1',\r\n name: 'Estados Unidos',\r\n },\r\n {\r\n img: 'country-icons/cn.png',\r\n code: 'CN',\r\n prefix: '+86',\r\n name: 'China',\r\n },\r\n {\r\n img: 'country-icons/in.png',\r\n code: 'IN',\r\n prefix: '+91',\r\n name: 'India',\r\n },\r\n {\r\n img: 'country-icons/br.png',\r\n code: 'BR',\r\n prefix: '+55',\r\n name: 'Brasil',\r\n },\r\n {\r\n img: 'country-icons/ru.png',\r\n code: 'RU',\r\n prefix: '+7',\r\n name: 'Rusia',\r\n },\r\n {\r\n img: 'country-icons/id.png',\r\n code: 'ID',\r\n prefix: '+62',\r\n name: 'Indonesia',\r\n },\r\n {\r\n img: 'country-icons/pk.png',\r\n code: 'PK',\r\n prefix: '+92',\r\n name: 'Pakistán',\r\n },\r\n {\r\n img: 'country-icons/ng.png',\r\n code: 'NG',\r\n prefix: '+234',\r\n name: 'Nigeria',\r\n },\r\n {\r\n img: 'country-icons/bd.png',\r\n code: 'BD',\r\n prefix: '+880',\r\n name: 'Bangladés',\r\n },\r\n {\r\n img: 'country-icons/jp.png',\r\n code: 'JP',\r\n prefix: '+81',\r\n name: 'Japón',\r\n },\r\n {\r\n img: 'country-icons/mx.png',\r\n code: 'MX',\r\n prefix: '+52',\r\n name: 'México',\r\n },\r\n {\r\n img: 'country-icons/ph.png',\r\n code: 'PH',\r\n prefix: '+63',\r\n name: 'Filipinas',\r\n },\r\n {\r\n img: 'country-icons/et.png',\r\n code: 'ET',\r\n prefix: '+251',\r\n name: 'Etiopía',\r\n },\r\n {\r\n img: 'country-icons/eg.png',\r\n code: 'EG',\r\n prefix: '+20',\r\n name: 'Egipto',\r\n },\r\n {\r\n img: 'country-icons/vn.png',\r\n code: 'VN',\r\n prefix: '+84',\r\n name: 'Vietnam',\r\n },\r\n {\r\n img: 'country-icons/cd.png',\r\n code: 'CD',\r\n prefix: '+243',\r\n name: 'Rep. Dem. del Congo',\r\n },\r\n {\r\n img: 'country-icons/tr.png',\r\n code: 'TR',\r\n prefix: '+90',\r\n name: 'Turquía',\r\n },\r\n {\r\n img: 'country-icons/ir.png',\r\n code: 'IR',\r\n prefix: '+98',\r\n name: 'Irán',\r\n },\r\n {\r\n img: 'country-icons/de.png',\r\n code: 'DE',\r\n prefix: '+49',\r\n name: 'Alemania',\r\n },\r\n {\r\n img: 'country-icons/fr.png',\r\n code: 'FR',\r\n prefix: '+33',\r\n name: 'Francia',\r\n },\r\n {\r\n img: 'country-icons/gb.png',\r\n code: 'GB',\r\n prefix: '+44',\r\n name: 'Reino Unido',\r\n },\r\n {\r\n img: 'country-icons/it.png',\r\n code: 'IT',\r\n prefix: '+39',\r\n name: 'Italia',\r\n },\r\n {\r\n img: 'country-icons/th.png',\r\n code: 'TH',\r\n prefix: '+66',\r\n name: 'Tailandia',\r\n },\r\n {\r\n img: 'country-icons/za.png',\r\n code: 'ZA',\r\n prefix: '+27',\r\n name: 'Sudáfrica',\r\n },\r\n {\r\n img: 'country-icons/kr.png',\r\n code: 'KR',\r\n prefix: '+82',\r\n name: 'Corea del Sur',\r\n },\r\n {\r\n img: 'country-icons/co.png',\r\n code: 'CO',\r\n prefix: '+57',\r\n name: 'Colombia',\r\n },\r\n {\r\n img: 'country-icons/es.png',\r\n code: 'ES',\r\n prefix: '+34',\r\n name: 'España',\r\n },\r\n {\r\n img: 'country-icons/ar.png',\r\n code: 'AR',\r\n prefix: '+54',\r\n name: 'Argentina',\r\n },\r\n {\r\n img: 'country-icons/sa.png',\r\n code: 'SA',\r\n prefix: '+966',\r\n name: 'Arabia Saudita',\r\n },\r\n {\r\n img: 'country-icons/pe.png',\r\n code: 'PE',\r\n prefix: '+51',\r\n name: 'Perú',\r\n },\r\n ];\r\n\r\n selectedCountry: PhoneCountry = this.countries[0];\r\n showPicker = false;\r\n searchQuery: string = ''; // Query de búsqueda\r\n filteredCountries: PhoneCountry[] = []; // Países filtrados/ordenados\r\n customPrefix: string = ''; // Prefijo personalizado cuando no está en la lista\r\n isEditingPrefix: boolean = false; // Si está editando el prefijo manualmente\r\n\r\n constructor() {\r\n // Ordenar inicialmente por número de prefijo (menor a mayor)\r\n this.countries.sort((a, b) => {\r\n const numA = parseInt(a.prefix.replace('+', ''), 10);\r\n const numB = parseInt(b.prefix.replace('+', ''), 10);\r\n return numA - numB;\r\n });\r\n this.filteredCountries = [...this.countries];\r\n }\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngOnInit(): void {\r\n const match = this.countries.find(\r\n (c) => c.code === this.defaultCountry.toUpperCase()\r\n );\r\n this.selectedCountry = match ?? this.countries[0];\r\n this.customPrefix = this.selectedCountry.prefix;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.phoneEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n // Cambiar para que siempre devuelva [prefix: string, number: string] | null\r\n private onChange: (value: [string, string] | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n writeValue(value: [string, string] | string | null): void {\r\n if (!value) {\r\n if (this.showPicker) {\r\n this.showPicker = false;\r\n this.closeModalPortal();\r\n }\r\n this.textValue = '';\r\n const match = this.countries.find(\r\n (c) => c.code === this.defaultCountry.toUpperCase()\r\n );\r\n this.selectedCountry = match ?? this.countries[0];\r\n this.customPrefix = this.selectedCountry.prefix;\r\n this.isEditingPrefix = false;\r\n this.error = false;\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n let prefix = this.selectedCountry.prefix;\r\n let number = '';\r\n\r\n // Si viene como array [prefix, number]\r\n if (Array.isArray(value) && value.length >= 2) {\r\n prefix = value[0] || this.selectedCountry.prefix;\r\n number = value[1] || '';\r\n } \r\n // Si viene como string, parsear\r\n else if (typeof value === 'string') {\r\n const cleanValue = value.trim().replace(/\\s+/g, ' ');\r\n const parts = cleanValue.split(' ');\r\n\r\n if (parts.length > 1 && parts[0].startsWith('+')) {\r\n prefix = parts[0];\r\n number = parts.slice(1).join('');\r\n } else {\r\n number = cleanValue.replace(/\\s+/g, '');\r\n }\r\n }\r\n\r\n number = this.resolveLocalNumber(value, prefix, number);\r\n this.applyPrefixSelection(prefix);\r\n this.textValue = number;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Separa prefijo y número local si el valor guardado incluye el código duplicado */\r\n private resolveLocalNumber(\r\n value: [string, string] | string | null,\r\n prefix: string,\r\n number: string\r\n ): string {\r\n const rawNumber = Array.isArray(value)\r\n ? (value[1] ?? '')\r\n : typeof value === 'string'\r\n ? value\r\n : number;\r\n const digitLen = String(rawNumber).replace(/\\D/g, '').length;\r\n\r\n if (digitLen > 9) {\r\n const parsed = parseEmbeddedCountryCode(String(rawNumber), this.countries);\r\n if (parsed.localNumber) {\r\n if (parsed.country) {\r\n this.applyPrefixSelection(parsed.prefix);\r\n } else if (parsed.prefix) {\r\n this.applyPrefixSelection(parsed.prefix);\r\n }\r\n return parsed.localNumber;\r\n }\r\n }\r\n\r\n return stripCountryCodeFromNumber(number || String(rawNumber), prefix);\r\n }\r\n\r\n private applyPrefixSelection(prefix: string): void {\r\n const match = this.countries.find((c) => c.prefix === prefix);\r\n if (match) {\r\n this.selectedCountry = match;\r\n this.defaultCountry = match.code;\r\n this.customPrefix = match.prefix;\r\n this.isEditingPrefix = false;\r\n return;\r\n }\r\n this.customPrefix = prefix;\r\n this.selectedCountry = {\r\n code: 'CUSTOM',\r\n prefix,\r\n name: `Código ${prefix}`,\r\n };\r\n this.isEditingPrefix = false;\r\n }\r\n registerOnChange(fn: (value: [string, string] | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onFocus(): void {\r\n this.isFocus = true;\r\n }\r\n onBlur(): void {\r\n this.isFocus = false;\r\n this.onTouched();\r\n\r\n this.error = !!this.textValue && !this.isValidPhone(this.textValue);\r\n this.cdr.markForCheck();\r\n }\r\n onInput(event: Event): void {\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value;\r\n // ❌ Si contiene letras o símbolos no permitidos\r\n if (/[^\\d]/.test(raw)) {\r\n this.error = true;\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n this.textValue = raw;\r\n if (!raw) {\r\n this.error = false;\r\n this.onChange(null);\r\n return;\r\n }\r\n const isValid = this.isValidPhone(raw);\r\n this.error = !isValid;\r\n // ✅ Retornar siempre como array [prefix, number]\r\n // Usar customPrefix si está definido y es válido, sino usar selectedCountry\r\n const prefix = (this.customPrefix && this.customPrefix !== '+') \r\n ? this.customPrefix \r\n : this.selectedCountry.prefix;\r\n this.onChange(isValid ? [prefix, raw] : null);\r\n this.cdr.markForCheck();\r\n }\r\n onKeyDown(event: KeyboardEvent): void {\r\n if (\r\n !/^\\d$/.test(event.key) &&\r\n !['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab'].includes(\r\n event.key\r\n )\r\n ) {\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n onPaste(event: ClipboardEvent): void {\r\n if (this.isDisabled) return;\r\n const pasted = event.clipboardData?.getData('text') ?? '';\r\n if (!pasted.trim()) return;\r\n\r\n event.preventDefault();\r\n const parsed = parseEmbeddedCountryCode(pasted, this.countries);\r\n\r\n if (parsed.country) {\r\n this.applyPrefixSelection(parsed.country.prefix);\r\n } else if (parsed.prefix) {\r\n this.applyPrefixSelection(parsed.prefix);\r\n } else {\r\n const currentPrefix =\r\n this.customPrefix && this.customPrefix !== '+'\r\n ? this.customPrefix\r\n : this.selectedCountry.prefix;\r\n parsed.localNumber = stripCountryCodeFromNumber(\r\n pasted.replace(/\\D/g, ''),\r\n currentPrefix\r\n );\r\n }\r\n\r\n this.textValue = parsed.localNumber.replace(/\\D/g, '');\r\n const input = event.target as HTMLInputElement;\r\n if (input) {\r\n input.value = this.textValue;\r\n }\r\n\r\n if (!this.textValue) {\r\n this.error = false;\r\n this.onChange(null);\r\n } else {\r\n const isValid = this.isValidPhone(this.textValue);\r\n this.error = !isValid;\r\n const prefix =\r\n this.customPrefix && this.customPrefix !== '+'\r\n ? this.customPrefix\r\n : this.selectedCountry.prefix;\r\n this.onChange(isValid ? [prefix, this.textValue] : null);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // COMPONENT METHODS (Métodos del componente)\r\n // ============================================================================\r\n isValidPhone(value: string): boolean {\r\n return /^\\d{6,12}$/.test(value); // acepta solo de 6 a 12 dígitos\r\n }\r\n\r\n togglePicker(): void {\r\n if (this.isDisabled) return;\r\n const willOpen = !this.showPicker;\r\n this.showPicker = willOpen;\r\n if (willOpen) {\r\n this.searchQuery = '';\r\n this.applySearch('');\r\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\r\n this.openModalPortal();\r\n } else {\r\n this.searchQuery = '';\r\n this.filteredCountries = [...this.countries];\r\n this.closeModalPortal();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private buildModalView() {\r\n return {\r\n searchQuery: this.searchQuery,\r\n filteredCountries: this.filteredCountries,\r\n };\r\n }\r\n\r\n private syncModalView(): void {\r\n if (!this.showPicker) return;\r\n this.phoneEntryModal.patchView(this.buildModalView());\r\n }\r\n\r\n private openModalPortal(): void {\r\n this.phoneEntryModal.open({\r\n view: this.buildModalView(),\r\n handlers: {\r\n onSearchInput: (e) => this.onSearchChange(e),\r\n onBackdropClick: (e) => {\r\n const t = e.target as HTMLElement;\r\n if (t.closest('.Picker')) return;\r\n this.showPicker = false;\r\n this.searchQuery = '';\r\n this.filteredCountries = [...this.countries];\r\n this.closeModalPortal();\r\n this.cdr.markForCheck();\r\n },\r\n onSelectCountry: (country, ev) => {\r\n ev.stopPropagation();\r\n this.selectCountry(country);\r\n },\r\n },\r\n });\r\n }\r\n\r\n private closeModalPortal(): void {\r\n this.phoneEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n }\r\n\r\n private onOverlayDismissedByCoordinator(): void {\r\n if (!this.showPicker) return;\r\n this.showPicker = false;\r\n this.searchQuery = '';\r\n this.filteredCountries = [...this.countries];\r\n this.phoneEntryModal.close();\r\n this.inputOverlayCoordinator.release(this.overlayToken);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n selectCountry(country: PhoneCountry): void {\r\n this.selectedCountry = country;\r\n this.customPrefix = country.prefix;\r\n this.isEditingPrefix = false;\r\n this.showPicker = false;\r\n this.searchQuery = ''; // Limpiar búsqueda al seleccionar\r\n this.filteredCountries = [...this.countries];\r\n this.closeModalPortal();\r\n this.onInput({ target: { value: this.textValue } } as any); // for recompute\r\n }\r\n\r\n // ============================================================================\r\n // SEARCH METHODS (Métodos de búsqueda)\r\n // ============================================================================\r\n onSearchChange(e: Event): void {\r\n const query = (e.target as HTMLInputElement)?.value ?? '';\r\n this.searchQuery = query;\r\n this.applySearch(query);\r\n }\r\n\r\n /**\r\n * Aplica la búsqueda y reordena los países por relevancia.\r\n * @param query Texto de búsqueda.\r\n */\r\n private applySearch(query: string): void {\r\n const normalizedQuery = query.trim().toLowerCase();\r\n \r\n if (!normalizedQuery) {\r\n // Sin búsqueda: mostrar todos ordenados por número (menor a mayor)\r\n this.filteredCountries = [...this.countries].sort((a, b) => {\r\n const numA = parseInt(a.prefix.replace('+', ''), 10);\r\n const numB = parseInt(b.prefix.replace('+', ''), 10);\r\n return numA - numB;\r\n });\r\n this.syncModalView();\r\n return;\r\n }\r\n\r\n // Con búsqueda: reordenar por relevancia\r\n this.filteredCountries = [...this.countries]\r\n .map((country) => ({\r\n country,\r\n score: this.calculateRelevanceScore(country, normalizedQuery),\r\n }))\r\n .sort((a, b) => b.score - a.score)\r\n .map((item) => item.country);\r\n \r\n this.syncModalView();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Calcula el score de relevancia de un país basado en la búsqueda.\r\n * @param country País a evaluar.\r\n * @param query Query de búsqueda normalizado.\r\n * @returns Score de relevancia (mayor = más relevante).\r\n */\r\n private calculateRelevanceScore(country: PhoneCountry, query: string): number {\r\n let score = 0;\r\n const lowerCaseName = country.name.toLowerCase();\r\n const prefixNumber = country.prefix.replace('+', '');\r\n const lowerCasePrefix = country.prefix.toLowerCase();\r\n\r\n // Coincidencia exacta en nombre\r\n if (lowerCaseName === query) {\r\n score += 100;\r\n }\r\n // Nombre empieza con query\r\n else if (lowerCaseName.startsWith(query)) {\r\n score += 80;\r\n }\r\n // Nombre contiene query\r\n else if (lowerCaseName.includes(query)) {\r\n score += 60;\r\n }\r\n\r\n // Coincidencia exacta en prefijo numérico\r\n if (prefixNumber === query) {\r\n score += 90;\r\n }\r\n // Prefijo numérico empieza con query\r\n else if (prefixNumber.startsWith(query)) {\r\n score += 70;\r\n }\r\n // Prefijo numérico contiene query\r\n else if (prefixNumber.includes(query)) {\r\n score += 50;\r\n }\r\n\r\n // Coincidencia en prefijo con +\r\n if (lowerCasePrefix === query) {\r\n score += 85;\r\n }\r\n else if (lowerCasePrefix.startsWith(query)) {\r\n score += 65;\r\n }\r\n else if (lowerCasePrefix.includes(query)) {\r\n score += 45;\r\n }\r\n\r\n return score;\r\n }\r\n\r\n // ============================================================================\r\n // CUSTOM PREFIX METHODS (Métodos para prefijo personalizado)\r\n // ============================================================================\r\n onPrefixFocus(): void {\r\n this.isEditingPrefix = true;\r\n }\r\n\r\n onPrefixBlur(): void {\r\n // Pequeño delay para permitir que se procese el click en un país\r\n setTimeout(() => {\r\n this.isEditingPrefix = false;\r\n this.validateAndSetCustomPrefix();\r\n this.cdr.markForCheck();\r\n }, 200);\r\n }\r\n\r\n onPrefixInput(e: Event): void {\r\n const input = e.target as HTMLInputElement;\r\n let value = input.value.trim();\r\n \r\n // Asegurar que empiece con +\r\n if (value && !value.startsWith('+')) {\r\n value = '+' + value.replace(/\\+/g, '');\r\n }\r\n \r\n // Solo permitir números y +\r\n value = value.replace(/[^\\d+]/g, '');\r\n \r\n // Limitar a un solo +\r\n if ((value.match(/\\+/g) || []).length > 1) {\r\n value = '+' + value.replace(/\\+/g, '');\r\n }\r\n \r\n this.customPrefix = value;\r\n input.value = value;\r\n }\r\n\r\n onPrefixKeyDown(e: KeyboardEvent): void {\r\n // Permitir números, +, Backspace, Delete, Arrow keys, Tab\r\n if (\r\n !/^[\\d+]$/.test(e.key) &&\r\n !['Backspace', 'Delete', 'ArrowLeft', 'ArrowRight', 'Tab', 'Enter'].includes(e.key)\r\n ) {\r\n e.preventDefault();\r\n }\r\n \r\n // Si presiona Enter, validar y cerrar\r\n if (e.key === 'Enter') {\r\n e.preventDefault();\r\n this.validateAndSetCustomPrefix();\r\n this.isEditingPrefix = false;\r\n this.showPicker = false;\r\n this.searchQuery = '';\r\n this.filteredCountries = [...this.countries];\r\n this.closeModalPortal();\r\n }\r\n }\r\n\r\n /**\r\n * Valida y establece el prefijo personalizado.\r\n */\r\n private validateAndSetCustomPrefix(): void {\r\n if (!this.customPrefix || this.customPrefix === '+') {\r\n // Si está vacío o solo tiene +, usar el país seleccionado\r\n this.customPrefix = this.selectedCountry.prefix;\r\n return;\r\n }\r\n\r\n // Buscar si el prefijo existe en la lista\r\n const match = this.countries.find((c) => c.prefix === this.customPrefix);\r\n \r\n if (match) {\r\n // Si existe, usar ese país\r\n this.selectedCountry = match;\r\n } else {\r\n // Si no existe, crear un país temporal con el prefijo personalizado\r\n this.selectedCountry = {\r\n code: 'CUSTOM',\r\n prefix: this.customPrefix,\r\n name: `Código ${this.customPrefix}`,\r\n };\r\n }\r\n \r\n // Actualizar el valor del input\r\n this.onInput({ target: { value: this.textValue } } as any);\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\" [class.Error]=\"error\">\n <div class=\"CodePicker\" (click)=\"!isEditingPrefix && togglePicker()\">\n <img \n *ngIf=\"selectedCountry.img && selectedCountry.code !== 'CUSTOM'\" \n class=\"Icon\" \n [src]=\"selectedCountry.img\" \n draggable=\"false\" \n />\n <lucide-icon class=\"Icon\" name=\"globe\" *ngIf=\"!selectedCountry.img || selectedCountry.code === 'CUSTOM'\"></lucide-icon>\n <input\n *ngIf=\"isEditingPrefix\"\n type=\"text\"\n class=\"PrefixInput\"\n [value]=\"customPrefix\"\n (input)=\"onPrefixInput($event)\"\n (focus)=\"onPrefixFocus()\"\n (blur)=\"onPrefixBlur()\"\n (keydown)=\"onPrefixKeyDown($event)\"\n (click)=\"$event.stopPropagation()\"\n placeholder=\"+XX\"\n maxlength=\"5\"\n />\n <span *ngIf=\"!isEditingPrefix\" class=\"PrefixText\" (dblclick)=\"onPrefixFocus(); $event.stopPropagation()\">\n {{ customPrefix || selectedCountry.prefix }}\n </span>\n </div>\n\n <input\n type=\"text\"\n class=\"Input\"\n [class.Disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n [value]=\"textValue\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeyDown($event)\"\n (paste)=\"onPaste($event)\"\n inputmode=\"tel\"\n pattern=\"[0-9]*\"\n />\n</div>\n","import { Injectable } from '@angular/core';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\nexport interface ColorPickerModalViewModel {\r\n mode: 'hex' | 'rgb';\r\n textValue: string;\r\n}\r\n\r\nexport interface ColorPickerModalHandlers {\r\n onTextValueChange: (v: string) => void;\r\n onCancel: () => void;\r\n onAccept: () => void;\r\n}\r\n\r\nexport interface ColorPickerModalSession {\r\n view: ColorPickerModalViewModel;\r\n handlers: ColorPickerModalHandlers;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ColorPickerModalService {\r\n private readonly state = new BehaviorSubject<ColorPickerModalSession | null>(\r\n null\r\n );\r\n readonly state$ = this.state.asObservable();\r\n\r\n open(session: ColorPickerModalSession): void {\r\n this.state.next(session);\r\n }\r\n\r\n patchView(patch: Partial<ColorPickerModalViewModel>): void {\r\n const current = this.state.value;\r\n if (!current) return;\r\n this.state.next({\r\n ...current,\r\n view: { ...current.view, ...patch },\r\n });\r\n }\r\n\r\n close(): void {\r\n this.state.next(null);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\nimport {\n Component,\n Input,\n forwardRef,\n ChangeDetectorRef,\n ElementRef,\n OnInit,\n OnDestroy,\n HostBinding,\n inject,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { ColorPickerModalService } from './services/color-picker-modal/color-picker-modal.service';\nimport { InputOverlayCoordinatorService } from '../input-overlay-coordinator.service';\n\n@Component({\n selector: 'color-picker',\n standalone: true,\n templateUrl: './color-picker.component.html',\n styleUrl: './color-picker.component.sass',\n imports: [CommonModule],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ColorPickerComponent),\n multi: true,\n },\n ],\n})\nexport class ColorPickerComponent implements ControlValueAccessor, OnInit, OnDestroy {\n private cdr = inject(ChangeDetectorRef);\n private elementRef = inject(ElementRef);\n private colorPickerModal = inject(ColorPickerModalService);\n private inputOverlayCoordinator = inject(InputOverlayCoordinatorService);\n\n private readonly overlayToken: { close: () => void } = {\n close: () => this.onOverlayDismissedByCoordinator(),\n };\n\n @Input() label: string = '';\n @Input() description: string = '';\n @Input() opcional: boolean = false;\n @Input() placeholder: string = 'Código de color';\n @Input() mode: 'hex' | 'rgb' = 'hex';\n\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\n return this.isDisabled;\n }\n @Input() set disabled(value: boolean) {\n this.isDisabled = value;\n this.cdr.markForCheck();\n }\n\n isDisabled: boolean = false;\n isFocus: boolean = false;\n textValue: string = '';\n error: boolean = false;\n showPicker = false;\n /** Borrador dentro del modal; se confirma solo con Aceptar. */\n private modalDraftValue = '';\n\n private onChange: (value: string | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {\n if (this.showPicker) {\n this.showPicker = false;\n this.colorPickerModal.close();\n this.inputOverlayCoordinator.release(this.overlayToken);\n }\n }\n\n writeValue(value: string | null): void {\n const empty = value === null || value === undefined || value === '';\n if (empty) {\n if (this.showPicker) {\n this.showPicker = false;\n this.closeModalPortal();\n }\n this.textValue = '';\n this.error = false;\n this.cdr.markForCheck();\n return;\n }\n this.textValue = value;\n this.error = !this.isValidColor(value);\n if (this.showPicker) this.syncModalView();\n this.cdr.markForCheck();\n }\n registerOnChange(fn: (value: string | null) => void): void {\n this.onChange = fn;\n }\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n onFocus(): void {\n this.isFocus = true;\n }\n onBlur(): void {\n this.isFocus = false;\n this.onTouched();\n this.error = !!this.textValue && !this.isValidColor(this.textValue);\n this.cdr.markForCheck();\n }\n onInput(event: Event): void {\n const input = (event.target as HTMLInputElement).value.trim();\n this.textValue = input;\n\n if (!input) {\n this.error = false;\n this.onChange(null);\n if (this.showPicker) this.syncModalView();\n return;\n }\n\n const isValid = this.isValidColor(input);\n this.error = !isValid;\n this.onChange(isValid ? input : null);\n if (this.showPicker) this.syncModalView();\n this.cdr.markForCheck();\n }\n onKeyDown(event: KeyboardEvent): void {\n const allowedKeys = [\n 'Backspace',\n 'Delete',\n 'ArrowLeft',\n 'ArrowRight',\n 'Tab',\n ];\n\n if (this.mode === 'hex') {\n if (!/[#a-fA-F0-9]/.test(event.key) && !allowedKeys.includes(event.key)) {\n event.preventDefault();\n }\n } else if (this.mode === 'rgb') {\n if (\n !/[rgb\\d(),\\s]/i.test(event.key) &&\n !allowedKeys.includes(event.key)\n ) {\n event.preventDefault();\n }\n }\n }\n\n isValidColor(value: string): boolean {\n if (this.mode === 'hex') {\n return /^#[0-9A-Fa-f]{6}$/.test(value);\n }\n if (this.mode === 'rgb') {\n return /^rgb\\(\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*,\\s*\\d{1,3}\\s*\\)$/.test(value);\n }\n return false;\n }\n\n togglePicker(): void {\n if (this.isDisabled) return;\n this.showPicker = !this.showPicker;\n if (this.showPicker) {\n this.openModalPortal();\n } else {\n this.closeModalPortal();\n }\n this.cdr.markForCheck();\n }\n\n private buildModalView() {\n return {\n mode: this.mode,\n textValue: this.modalDraftValue,\n };\n }\n\n private syncModalView(): void {\n if (!this.showPicker) return;\n this.colorPickerModal.patchView(this.buildModalView());\n }\n\n private openModalPortal(): void {\n this.modalDraftValue = this.textValue;\n this.inputOverlayCoordinator.openExclusive(this.overlayToken);\n this.colorPickerModal.open({\n view: this.buildModalView(),\n handlers: {\n onTextValueChange: (v: string) => this.onModalTextValueChange(v),\n onCancel: () => this.onModalCancel(),\n onAccept: () => this.onModalAccept(),\n },\n });\n }\n\n private closeModalPortal(): void {\n this.colorPickerModal.close();\n this.inputOverlayCoordinator.release(this.overlayToken);\n }\n\n private onOverlayDismissedByCoordinator(): void {\n this.onModalCancel();\n }\n\n private onModalTextValueChange(v: string): void {\n this.modalDraftValue = v;\n this.colorPickerModal.patchView({ textValue: v });\n this.cdr.markForCheck();\n }\n\n private onModalCancel(): void {\n if (!this.showPicker) return;\n this.showPicker = false;\n this.closeModalPortal();\n this.cdr.markForCheck();\n }\n\n private onModalAccept(): void {\n const v = this.modalDraftValue.trim();\n if (!v) {\n this.textValue = '';\n this.error = false;\n this.onChange(null);\n } else if (this.isValidColor(v)) {\n this.textValue = v;\n this.error = false;\n this.onChange(v);\n } else {\n this.error = true;\n return;\n }\n this.onTouched();\n this.showPicker = false;\n this.closeModalPortal();\n this.cdr.markForCheck();\n }\n\n manualClick(event?: MouseEvent): void {\n event?.stopPropagation();\n const input: HTMLInputElement | null =\n this.elementRef.nativeElement.querySelector('input');\n if (input && !this.isDisabled) {\n input.focus();\n }\n }\n}\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div class=\"Entry\" [class.IsFocus]=\"isFocus\" [class.Error]=\"error\">\n <div\n class=\"Preview\"\n [style.background-color]=\"textValue || null\"\n (click)=\"togglePicker()\"\n role=\"button\"\n tabindex=\"-1\"\n aria-label=\"Abrir selector de color\"\n ></div>\n\n <input\n type=\"text\"\n class=\"Input\"\n [class.Disabled]=\"isDisabled\"\n [placeholder]=\"placeholder\"\n [value]=\"textValue\"\n (input)=\"onInput($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keydown)=\"onKeyDown($event)\"\n />\n</div>\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ElementRef,\r\n ViewChildren,\r\n QueryList,\r\n ChangeDetectorRef,\r\n AfterViewInit,\r\n HostListener,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n ControlValueAccessor,\r\n NG_VALUE_ACCESSOR,\r\n FormsModule,\r\n} from '@angular/forms';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@Component({\r\n selector: 'otp-entry',\r\n standalone: true,\r\n imports: [CommonModule, FormsModule],\r\n templateUrl: './otp-entry.component.html',\r\n styleUrl: './otp-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => OtpEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class OtpEntryComponent implements ControlValueAccessor, AfterViewInit {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() length: number = 6;\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = '';\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (View Children)\r\n // ============================================================================\r\n @ViewChildren('inputRef') inputs!: QueryList<ElementRef<HTMLInputElement>>;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n values: string[] = [];\r\n\r\n // ============================================================================\r\n // LIFECYCLE HOOKS (Hooks de ciclo de vida)\r\n // ============================================================================\r\n ngAfterViewInit(): void {\r\n this.resetValues();\r\n }\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Implementación de ControlValueAccessor)\r\n // ============================================================================\r\n private onChange = (value: string | null) => {};\r\n private onTouched = () => {};\r\n writeValue(value: string | null): void {\r\n this.resetValues();\r\n if (value) {\r\n const digits = value.replace(/\\D/g, '').slice(0, this.length);\r\n digits.split('').forEach((digit, i) => (this.values[i] = digit));\r\n }\r\n this.updateInputs();\r\n this.cdr.markForCheck();\r\n }\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INPUT EVENT HANDLERS (Manejadores de eventos del input)\r\n // ============================================================================\r\n onInput(event: Event, index: number): void {\r\n const input = event.target as HTMLInputElement;\r\n const digit = input.value.replace(/\\D/g, '').charAt(0) || '';\r\n this.values[index] = digit;\r\n input.value = digit;\r\n if (digit && index < this.length - 1) {\r\n this.focus(index + 1);\r\n }\r\n this.emit();\r\n }\r\n\r\n onKeyDown(event: KeyboardEvent, index: number): void {\r\n const key = event.key;\r\n\r\n if (\r\n !/^\\d$/.test(key) &&\r\n !['Backspace', 'ArrowLeft', 'ArrowRight', 'Tab'].includes(key)\r\n ) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (key === 'Backspace') {\r\n event.preventDefault();\r\n\r\n if (this.values[index]) {\r\n this.values[index] = '';\r\n this.updateInput(index, '');\r\n } else if (index > 0) {\r\n this.focus(index - 1);\r\n this.values[index - 1] = '';\r\n this.updateInput(index - 1, '');\r\n }\r\n\r\n this.emit();\r\n }\r\n\r\n if (key === 'ArrowLeft' && index > 0) this.focus(index - 1);\r\n if (key === 'ArrowRight' && index < this.length - 1) this.focus(index + 1);\r\n }\r\n\r\n @HostListener('paste', ['$event'])\r\n handlePaste(event: ClipboardEvent): void {\r\n event.preventDefault();\r\n\r\n const pasted = event.clipboardData?.getData('text') || '';\r\n const digits = pasted.replace(/\\D/g, '').slice(0, this.length).split('');\r\n\r\n // Reset y asignación\r\n this.values = Array(this.length).fill('');\r\n digits.forEach((digit, i) => {\r\n this.values[i] = digit;\r\n this.updateInput(i, digit);\r\n });\r\n\r\n // Enfocar el siguiente input disponible (si hay)\r\n const nextIndex =\r\n digits.length < this.length ? digits.length : this.length - 1;\r\n this.focus(nextIndex);\r\n\r\n this.emit();\r\n }\r\n\r\n private resetValues(): void {\r\n this.values = Array(this.length).fill('');\r\n }\r\n\r\n private updateInputs(): void {\r\n this.inputs.forEach((ref, i) => {\r\n ref.nativeElement.value = this.values[i] || '';\r\n });\r\n }\r\n\r\n private updateInput(index: number, value: string): void {\r\n const input = this.inputs.get(index)?.nativeElement;\r\n if (input) input.value = value;\r\n }\r\n\r\n private focus(index: number): void {\r\n const input = this.inputs.get(index)?.nativeElement;\r\n if (input) {\r\n setTimeout(() => {\r\n input.focus();\r\n input.setSelectionRange(0, 1);\r\n });\r\n }\r\n }\r\n\r\n private emit(): void {\r\n const joined = this.values.join('');\r\n this.onChange(joined.length === this.length ? joined : null);\r\n }\r\n\r\n // ============================================================================\r\n // UTILITY METHODS (Métodos de utilidad)\r\n // ============================================================================\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation(); // evita interferir con otros componentes\r\n\r\n const textarea: HTMLTextAreaElement | null =\r\n this.elementRef.nativeElement.querySelector('input');\r\n\r\n if (textarea && !this.isDisabled) {\r\n textarea.focus();\r\n }\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n (click)=\"manualClick($event); $event.stopPropagation()\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n\r\n<div class=\"OtpWrapper\" [class.Disabled]=\"isDisabled\">\r\n <input\r\n *ngFor=\"let i of [].constructor(length); let index = index\"\r\n #inputRef\r\n class=\"OtpInput\"\r\n type=\"text\"\r\n maxlength=\"1\"\r\n [disabled]=\"isDisabled\"\r\n placeholder=\"0\"\r\n (input)=\"onInput($event, index)\"\r\n (keydown)=\"onKeyDown($event, index)\"\r\n (paste)=\"$event.preventDefault(); handlePaste($event)\"\r\n />\r\n</div>\r\n","import { AfterViewInit, Directive, ElementRef, Input } from '@angular/core';\r\n\r\n@Directive({\r\n selector: '[dragScroll]',\r\n standalone: true,\r\n})\r\nexport class DragScrollDirective implements AfterViewInit {\r\n @Input('dragScroll') direction?: 'horizontal' | 'vertical';\r\n\r\n constructor(private el: ElementRef<HTMLElement>) {}\r\n\r\n ngAfterViewInit() {\r\n const element = this.el.nativeElement;\r\n\r\n // 🔥 autodetección\r\n const isHorizontal = this.direction\r\n ? this.direction === 'horizontal'\r\n : element.scrollWidth > element.clientWidth;\r\n\r\n let isDown = false;\r\n let isDragging = false;\r\n let lastDragEndAt = 0;\r\n let activePointerId: number | null = null;\r\n\r\n let start = 0;\r\n let scrollStart = 0;\r\n\r\n const DRAG_THRESHOLD = 5;\r\n const CLICK_SUPPRESS_MS = 350;\r\n\r\n const lockTextSelection = () => {\r\n document.body.style.userSelect = 'none';\r\n document.body.style.webkitUserSelect = 'none';\r\n };\r\n\r\n const unlockTextSelection = () => {\r\n document.body.style.userSelect = '';\r\n document.body.style.webkitUserSelect = '';\r\n };\r\n\r\n if (isHorizontal) {\r\n element.style.touchAction = 'pan-x';\r\n } else {\r\n element.style.touchAction = 'pan-y';\r\n }\r\n\r\n // Nota: `pointer*` permite iniciar el drag desde cualquier hijo/nieto\r\n // (evento burbujea) y soporta mouse/touch/pen.\r\n element.addEventListener(\r\n 'pointerdown',\r\n (e: PointerEvent) => {\r\n // Solo drag con botón principal (mouse) o toque/pen.\r\n if (e.pointerType === 'mouse' && e.button !== 0) return;\r\n\r\n lockTextSelection();\r\n isDown = true;\r\n isDragging = false;\r\n lastDragEndAt = 0;\r\n activePointerId = e.pointerId;\r\n\r\n start = isHorizontal ? e.pageX : e.pageY;\r\n scrollStart = isHorizontal ? element.scrollLeft : element.scrollTop;\r\n },\r\n { passive: true },\r\n );\r\n\r\n element.addEventListener(\r\n 'pointerleave',\r\n () => {\r\n isDown = false;\r\n unlockTextSelection();\r\n },\r\n { passive: true },\r\n );\r\n\r\n element.addEventListener(\r\n 'pointerup',\r\n (e: PointerEvent) => {\r\n isDown = false;\r\n unlockTextSelection();\r\n element.classList.remove('dragging');\r\n if (isDragging) {\r\n // Marca el fin del drag para bloquear SOLO el click inmediato que suele dispararse al soltar.\r\n lastDragEndAt = Date.now();\r\n }\r\n isDragging = false;\r\n activePointerId = null;\r\n element.releasePointerCapture?.(e.pointerId);\r\n },\r\n { passive: true },\r\n );\r\n\r\n element.addEventListener(\r\n 'pointercancel',\r\n (e: PointerEvent) => {\r\n isDown = false;\r\n isDragging = false;\r\n lastDragEndAt = 0;\r\n activePointerId = null;\r\n unlockTextSelection();\r\n element.classList.remove('dragging');\r\n element.releasePointerCapture?.(e.pointerId);\r\n },\r\n { passive: true },\r\n );\r\n\r\n element.addEventListener(\r\n 'pointermove',\r\n (e: PointerEvent) => {\r\n if (!isDown) return;\r\n\r\n const current = isHorizontal ? e.pageX : e.pageY;\r\n const delta = current - start;\r\n\r\n if (!isDragging && Math.abs(delta) > DRAG_THRESHOLD) {\r\n isDragging = true;\r\n element.classList.add('dragging');\r\n window.getSelection()?.removeAllRanges();\r\n\r\n // Solo capturamos el puntero cuando realmente estamos arrastrando.\r\n if (activePointerId != null) {\r\n element.setPointerCapture?.(activePointerId);\r\n }\r\n\r\n // Bloquea UN solo click inmediato tras el drag (sin afectar clicks normales).\r\n const suppressUntil = Date.now() + CLICK_SUPPRESS_MS;\r\n const onClickCapture = (evt: MouseEvent) => {\r\n document.removeEventListener('click', onClickCapture, true);\r\n if (Date.now() <= suppressUntil) {\r\n evt.preventDefault();\r\n evt.stopPropagation();\r\n // Asegura que no ejecute handlers del target.\r\n (evt as unknown as { stopImmediatePropagation?: () => void }).stopImmediatePropagation?.();\r\n }\r\n };\r\n document.addEventListener('click', onClickCapture, true);\r\n }\r\n\r\n if (!isDragging) return;\r\n\r\n // Necesario para evitar selección de texto / drag nativo mientras scrolleamos.\r\n e.preventDefault();\r\n\r\n const walk = delta * 1.2;\r\n if (isHorizontal) {\r\n element.scrollLeft = scrollStart - walk;\r\n } else {\r\n element.scrollTop = scrollStart - walk;\r\n }\r\n },\r\n { passive: false },\r\n );\r\n }\r\n}\r\n","import type {\r\n DOMConversionMap,\r\n DOMConversionOutput,\r\n DOMExportOutput,\r\n LexicalNode,\r\n NodeKey,\r\n SerializedLexicalNode,\r\n} from 'lexical';\r\nimport { DecoratorNode } from 'lexical';\r\n\r\nexport type CaludyImagePayload = Readonly<{\r\n src: string;\r\n altText?: string;\r\n width?: number;\r\n height?: number;\r\n}>;\r\n\r\nexport type SerializedCaludyImageNode = SerializedLexicalNode & {\r\n type: 'caludy-image';\r\n version: 1;\r\n src: string;\r\n altText: string;\r\n width?: number;\r\n height?: number;\r\n};\r\n\r\nfunction convertImageElement(domNode: Node): DOMConversionOutput | null {\r\n const img = domNode as HTMLImageElement;\r\n const src = img.getAttribute('src') || '';\r\n if (!src) return null;\r\n const alt = img.getAttribute('alt') || undefined;\r\n const widthAttr = img.getAttribute('width');\r\n const heightAttr = img.getAttribute('height');\r\n const width = widthAttr ? Number(widthAttr) : img.width || undefined;\r\n const height = heightAttr ? Number(heightAttr) : img.height || undefined;\r\n return { node: $createCaludyImageNode({ src, altText: alt, width, height }) as unknown as LexicalNode };\r\n}\r\n\r\nexport class CaludyImageNode extends DecoratorNode<null> {\r\n __src: string;\r\n __altText: string;\r\n __width?: number;\r\n __height?: number;\r\n\r\n static override getType(): string {\r\n return 'caludy-image';\r\n }\r\n\r\n static override clone(node: CaludyImageNode): CaludyImageNode {\r\n return new CaludyImageNode(\r\n { src: node.__src, altText: node.__altText, width: node.__width, height: node.__height },\r\n node.__key,\r\n );\r\n }\r\n\r\n constructor(payload: CaludyImagePayload, key?: NodeKey) {\r\n super(key);\r\n this.__src = payload.src;\r\n this.__altText = payload.altText ?? '';\r\n this.__width = payload.width;\r\n this.__height = payload.height;\r\n }\r\n\r\n override createDOM(): HTMLElement {\r\n const wrapper = document.createElement('span');\r\n wrapper.className = 'editor-image';\r\n wrapper.dataset['lexicalImageKey'] = this.getKey();\r\n\r\n const img = document.createElement('img');\r\n img.src = this.__src;\r\n img.alt = this.__altText;\r\n img.loading = 'lazy';\r\n img.decoding = 'async';\r\n img.draggable = false;\r\n\r\n // Ancho/alto controlables por el usuario; si no hay, se adapta.\r\n if (this.__width != null) img.style.width = `${this.__width}px`;\r\n if (this.__height != null) img.style.height = `${this.__height}px`;\r\n\r\n wrapper.appendChild(img);\r\n\r\n return wrapper;\r\n }\r\n\r\n override updateDOM(prevNode: CaludyImageNode, dom: HTMLElement): boolean {\r\n const wrapper = dom as HTMLElement;\r\n const img = wrapper.querySelector('img') as HTMLImageElement | null;\r\n if (!img) return false;\r\n if (prevNode.__src !== this.__src) img.src = this.__src;\r\n if (prevNode.__altText !== this.__altText) img.alt = this.__altText;\r\n if (prevNode.__width !== this.__width) img.style.width = this.__width != null ? `${this.__width}px` : '';\r\n if (prevNode.__height !== this.__height) img.style.height = this.__height != null ? `${this.__height}px` : '';\r\n return false;\r\n }\r\n\r\n override exportDOM(): DOMExportOutput {\r\n const img = document.createElement('img');\r\n img.setAttribute('src', this.__src);\r\n if (this.__altText) img.setAttribute('alt', this.__altText);\r\n if (this.__width != null) img.setAttribute('width', String(this.__width));\r\n if (this.__height != null) img.setAttribute('height', String(this.__height));\r\n return { element: img };\r\n }\r\n\r\n static override importDOM(): DOMConversionMap | null {\r\n return {\r\n img: () => ({\r\n conversion: convertImageElement,\r\n priority: 1,\r\n }),\r\n };\r\n }\r\n\r\n override exportJSON(): SerializedCaludyImageNode {\r\n return {\r\n type: 'caludy-image',\r\n version: 1,\r\n src: this.__src,\r\n altText: this.__altText,\r\n width: this.__width,\r\n height: this.__height,\r\n };\r\n }\r\n\r\n static override importJSON(serialized: SerializedCaludyImageNode): CaludyImageNode {\r\n return new CaludyImageNode({\r\n src: serialized.src,\r\n altText: serialized.altText,\r\n width: serialized.width,\r\n height: serialized.height,\r\n });\r\n }\r\n\r\n override isInline(): boolean {\r\n return false;\r\n }\r\n\r\n override decorate(): null {\r\n // En integraciones sin React (Angular), no usamos el pipeline de decoración.\r\n return null;\r\n }\r\n\r\n setDimensions(width?: number, height?: number): void {\r\n const writable = this.getWritable() as unknown as CaludyImageNode;\r\n writable.__width = width;\r\n writable.__height = height;\r\n }\r\n}\r\n\r\nexport function $createCaludyImageNode(payload: CaludyImagePayload): CaludyImageNode {\r\n return new CaludyImageNode(payload);\r\n}\r\n\r\nexport function $isCaludyImageNode(node: LexicalNode | null | undefined): boolean {\r\n return node instanceof CaludyImageNode;\r\n}\r\n\r\n","import type { EditorThemeClasses } from 'lexical';\r\n\r\n/** Theme compartido: clases estables para estilar nodos generados por Lexical. */\r\nexport const RICH_TEXT_LEXICAL_THEME: EditorThemeClasses = {\r\n code: 'editor-code',\r\n heading: {\r\n h1: 'editor-heading-h1',\r\n h2: 'editor-heading-h2',\r\n h3: 'editor-heading-h3',\r\n h4: 'editor-heading-h4',\r\n h5: 'editor-heading-h5',\r\n h6: 'editor-heading-h6',\r\n },\r\n image: 'editor-image',\r\n link: 'editor-link',\r\n list: {\r\n listitem: 'editor-listitem',\r\n nested: {\r\n listitem: 'editor-nested-listitem',\r\n },\r\n ol: 'editor-list-ol',\r\n ul: 'editor-list-ul',\r\n },\r\n paragraph: 'editor-paragraph',\r\n quote: 'editor-quote',\r\n table: 'editor-table',\r\n tableRow: 'editor-table-row',\r\n tableCell: 'editor-table-cell',\r\n tableCellHeader: 'editor-table-cell-header',\r\n text: {\r\n bold: 'editor-text-bold',\r\n italic: 'editor-text-italic',\r\n strikethrough: 'editor-text-strikethrough',\r\n underline: 'editor-text-underline',\r\n underlineStrikethrough: 'editor-text-underlineStrikethrough',\r\n code: 'editor-text-code',\r\n hashtag: 'editor-text-hashtag',\r\n overflowed: 'editor-text-overflowed',\r\n },\r\n};\r\n","import {\r\n Component,\r\n Input,\r\n forwardRef,\r\n OnInit,\r\n OnDestroy,\r\n ChangeDetectorRef,\r\n HostBinding,\r\n inject,\r\n ElementRef,\r\n PLATFORM_ID,\r\n AfterViewInit,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport {\r\n createEditor,\r\n type LexicalEditor,\r\n $getRoot,\r\n $createParagraphNode,\r\n $createTextNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $getNodeByKey,\r\n FORMAT_TEXT_COMMAND,\r\n FORMAT_ELEMENT_COMMAND,\r\n SELECTION_CHANGE_COMMAND,\r\n COMMAND_PRIORITY_LOW,\r\n CAN_UNDO_COMMAND,\r\n CAN_REDO_COMMAND,\r\n UNDO_COMMAND,\r\n REDO_COMMAND,\r\n} from 'lexical';\r\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\r\nimport { registerRichText, HeadingNode, QuoteNode, $createHeadingNode, $isHeadingNode } from '@lexical/rich-text';\r\nimport { registerHistory, createEmptyHistoryState } from '@lexical/history';\r\nimport { ListNode, ListItemNode, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, registerList } from '@lexical/list';\r\nimport { $isLinkNode, LinkNode, TOGGLE_LINK_COMMAND } from '@lexical/link';\r\nimport {\r\n $insertTableColumnAtSelection,\r\n $insertTableRowAtSelection,\r\n $deleteTableColumnAtSelection,\r\n $deleteTableRowAtSelection,\r\n $getTableNodeFromLexicalNodeOrThrow,\r\n INSERT_TABLE_COMMAND,\r\n registerTablePlugin,\r\n TableCellNode,\r\n TableNode,\r\n TableRowNode,\r\n} from '@lexical/table';\r\nimport { mergeRegister } from '@lexical/utils';\r\nimport { $setBlocksType } from '@lexical/selection';\r\nimport { DragScrollDirective } from '../../vendor/drag-scroll.directive';\r\nimport { $createCaludyImageNode, CaludyImageNode } from './caludy-image.node';\r\nimport { RICH_TEXT_LEXICAL_THEME } from './lexical-editor-theme';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'rich-text-entry',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule, DragScrollDirective],\r\n templateUrl: './rich-text-entry.component.html',\r\n styleUrls: ['./rich-text-entry.component.sass'],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => RichTextEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class RichTextEntryComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnDestroy {\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n @Input() label = '';\r\n @Input() opcional = false;\r\n @Input() description = '';\r\n @Input() placeholder = 'Escribe aquí...';\r\n\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.applyEditorInteractionStyles();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Solo true en el navegador; en SSR no se instancia el editor. */\r\n readonly isBrowser = isPlatformBrowser(this.platformId);\r\n\r\n @ViewChild('contentEditable', { static: false }) contentEditable?: ElementRef<HTMLElement>;\r\n @ViewChild('imageInput', { static: false }) imageInput?: ElementRef<HTMLInputElement>;\r\n @ViewChild('imageOverlay', { static: false }) imageOverlay?: ElementRef<HTMLElement>;\r\n @ViewChild('tableOverlay', { static: false }) tableOverlay?: ElementRef<HTMLElement>;\r\n\r\n private editor: LexicalEditor | null = null;\r\n private lastEmittedHtml: string | null = null;\r\n private pendingHtmlWrite: string | null = null;\r\n private lastIncomingWriteHtml: string | null = null;\r\n\r\n showPlaceholder = true;\r\n isDisabled = false;\r\n\r\n canUndo = false;\r\n canRedo = false;\r\n isBold = false;\r\n isItalic = false;\r\n isUnderline = false;\r\n isStrikethrough = false;\r\n\r\n isAlignLeft = false;\r\n isAlignCenter = false;\r\n isAlignRight = false;\r\n isAlignJustify = false;\r\n\r\n isH1 = false;\r\n isLink = false;\r\n isOnImage = false;\r\n isInTable = false;\r\n\r\n // Overlays (NO forman parte del HTML guardado)\r\n imageOverlayVisible = false;\r\n imageOverlayTop = 0;\r\n imageOverlayLeft = 0;\r\n imageOverlayKey: string | null = null;\r\n private imageResizeActive = false;\r\n private imageResizeStartX = 0;\r\n private imageResizeStartW = 0;\r\n private imageResizeStartH = 0;\r\n private imageResizeAspect = 1;\r\n\r\n tableOverlayVisible = false;\r\n tableOverlayTop = 0;\r\n tableOverlayLeft = 0;\r\n tableOverlayMaxHeight = 0;\r\n private tableOverlayAnchorX = 0;\r\n private tableOverlayAnchorY = 0;\r\n private lastTableRect: DOMRect | null = null;\r\n\r\n private onChange: (value: string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n private imageResizeCleanup: (() => void) | null = null;\r\n private overlayCleanup: (() => void) | null = null;\r\n\r\n ngOnInit(): void {\r\n // La instancia real se crea en ngAfterViewInit cuando existe el contenteditable.\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.isBrowser) return;\r\n if (!this.contentEditable?.nativeElement) return;\r\n\r\n this.editor = createEditor({\r\n namespace: 'caludy-rich-text-entry',\r\n nodes: [\r\n HeadingNode,\r\n QuoteNode,\r\n ListNode,\r\n ListItemNode,\r\n LinkNode,\r\n TableNode,\r\n TableRowNode,\r\n TableCellNode,\r\n CaludyImageNode as unknown as any,\r\n ],\r\n editable: !this.isDisabled,\r\n theme: RICH_TEXT_LEXICAL_THEME,\r\n onError(error) {\r\n // Evita romper la app por errores del editor; se reportan en consola.\r\n // eslint-disable-next-line no-console\r\n console.error(error);\r\n },\r\n });\r\n\r\n this.editor.setRootElement(this.contentEditable.nativeElement);\r\n this.setupOverlays();\r\n\r\n // Plugins esenciales (sin React): rich-text + listas + history.\r\n const unregRich = registerRichText(this.editor);\r\n const unregList = registerList(this.editor);\r\n const unregTable = registerTablePlugin(this.editor);\r\n const historyState = createEmptyHistoryState();\r\n const unregHist = registerHistory(this.editor, historyState, 300);\r\n\r\n const unregisterToolbarAndEmit = mergeRegister(\r\n // Emitir HTML + refrescar toolbar cuando cambie el estado del editor.\r\n this.editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => {\r\n this.updateToolbarState();\r\n this.updatePlaceholderFlag();\r\n });\r\n this.emitChangeFromEditor();\r\n }),\r\n this.editor.registerCommand(\r\n SELECTION_CHANGE_COMMAND,\r\n () => {\r\n this.editor?.getEditorState().read(() => this.updateToolbarState());\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n this.editor.registerCommand(\r\n CAN_UNDO_COMMAND,\r\n (payload) => {\r\n this.canUndo = payload;\r\n this.cdr.markForCheck();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n this.editor.registerCommand(\r\n CAN_REDO_COMMAND,\r\n (payload) => {\r\n this.canRedo = payload;\r\n this.cdr.markForCheck();\r\n return false;\r\n },\r\n COMMAND_PRIORITY_LOW,\r\n ),\r\n );\r\n\r\n // Si hubo writeValue antes de tener editor, lo aplicamos ahora.\r\n if (this.pendingHtmlWrite != null) {\r\n this.setEditorHtml(this.pendingHtmlWrite);\r\n this.pendingHtmlWrite = null;\r\n } else {\r\n this.updatePlaceholderFlag();\r\n }\r\n\r\n // Guardamos unregisters en el propio editor via destroy hook.\r\n // Lexical no expone un \"plugin host\", así que hacemos teardown manual.\r\n (this.editor as unknown as { __caludyTeardown?: () => void }).__caludyTeardown = () => {\r\n unregisterToolbarAndEmit();\r\n unregHist();\r\n unregTable();\r\n unregList();\r\n unregRich();\r\n };\r\n\r\n this.applyEditorInteractionStyles();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.imageResizeCleanup?.();\r\n this.overlayCleanup?.();\r\n const ed = this.editor as (LexicalEditor & { __caludyTeardown?: () => void }) | null;\r\n if (!ed) return;\r\n ed.__caludyTeardown?.();\r\n ed.setRootElement(null);\r\n this.editor = null;\r\n }\r\n\r\n onEditorBlur(event: FocusEvent): void {\r\n const next = event.relatedTarget as Node | null;\r\n // Si el foco pasa a la toolbar u otro control dentro del host, no tratamos esto como \"touched\"\r\n // ni dejamos que Lexical pierda la selección por un blur intermedio.\r\n if (next && this.elementRef.nativeElement.contains(next)) {\r\n return;\r\n }\r\n\r\n // En algunos navegadores `relatedTarget` puede ser null al pasar foco a <button>.\r\n // Diferimos 1 tick y comprobamos `document.activeElement` para no marcar touched por error.\r\n if (!next) {\r\n queueMicrotask(() => {\r\n const active = document.activeElement as Node | null;\r\n if (active && this.elementRef.nativeElement.contains(active)) {\r\n return;\r\n }\r\n this.onTouched();\r\n this.emitChangeFromEditor();\r\n });\r\n return;\r\n }\r\n\r\n this.onTouched();\r\n this.emitChangeFromEditor();\r\n }\r\n\r\n onToolbarMouseDown(event: MouseEvent): void {\r\n // Evita que el editor pierda el foco/selección al pulsar botones de la toolbar.\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n onInput(): void {\r\n // El update listener se encarga de emitir; esto solo ayuda a refrescar placeholder rápido.\r\n this.updatePlaceholderFlag();\r\n }\r\n\r\n manualClick(event?: MouseEvent): void {\r\n event?.stopPropagation();\r\n this.applyEditorInteractionStyles();\r\n const el = this.contentEditable?.nativeElement;\r\n if (el && !this.isDisabled) {\r\n el.focus();\r\n }\r\n }\r\n\r\n private applyEditorInteractionStyles(): void {\r\n if (!this.isBrowser) return;\r\n const root = this.elementRef.nativeElement.querySelector('.LexicalRoot') as HTMLElement;\r\n const content = this.elementRef.nativeElement.querySelector('.LexicalContent') as HTMLElement;\r\n const style = this.isDisabled ? 'none' : 'text';\r\n const pointer = this.isDisabled ? 'none' : 'auto';\r\n if (root) {\r\n root.style.setProperty('user-select', style, 'important');\r\n root.style.setProperty('-webkit-user-select', style, 'important');\r\n root.style.pointerEvents = pointer;\r\n }\r\n if (content) {\r\n content.style.setProperty('user-select', style, 'important');\r\n content.style.setProperty('-webkit-user-select', style, 'important');\r\n content.style.pointerEvents = pointer;\r\n }\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n const html = value ?? '';\r\n if (!this.isBrowser) {\r\n this.pendingHtmlWrite = html;\r\n return;\r\n }\r\n if (!this.editor) {\r\n this.pendingHtmlWrite = html;\r\n return;\r\n }\r\n\r\n // Evita el loop típico CVA: emitimos HTML -> el FormControl re-emit writeValue con el mismo string\r\n // -> re-importar DOM destruye selección y rompe comandos (toolbar parece “muerta”).\r\n const incoming = html.trim() ? html.trim() : null;\r\n if (incoming === this.lastEmittedHtml) {\r\n this.lastIncomingWriteHtml = incoming;\r\n return;\r\n }\r\n // También ignora re-writes idénticos consecutivos desde el exterior.\r\n if (incoming === this.lastIncomingWriteHtml) {\r\n return;\r\n }\r\n this.lastIncomingWriteHtml = incoming;\r\n\r\n this.setEditorHtml(html);\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(disabled: boolean): void {\r\n this.isDisabled = disabled;\r\n this.editor?.setEditable(!disabled);\r\n this.applyEditorInteractionStyles();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n exec(\r\n action:\r\n | 'undo'\r\n | 'redo'\r\n | 'bold'\r\n | 'italic'\r\n | 'underline'\r\n | 'strikethrough'\r\n | 'h1'\r\n | 'link'\r\n | 'image'\r\n | 'table'\r\n | 'image-move-up'\r\n | 'image-move-down'\r\n | 'table-row-after'\r\n | 'table-row-before'\r\n | 'table-col-after'\r\n | 'table-col-before'\r\n | 'table-row-delete'\r\n | 'table-col-delete'\r\n | 'table-delete'\r\n | 'ol'\r\n | 'ul'\r\n | 'align-left'\r\n | 'align-center'\r\n | 'align-right'\r\n | 'align-justify',\r\n ): void {\r\n const ed = this.editor;\r\n if (!ed || this.isDisabled) return;\r\n\r\n // Refuerzo: asegura foco en el root antes de despachar comandos.\r\n this.contentEditable?.nativeElement?.focus();\r\n\r\n switch (action) {\r\n case 'undo':\r\n ed.dispatchCommand(UNDO_COMMAND, undefined);\r\n break;\r\n case 'redo':\r\n ed.dispatchCommand(REDO_COMMAND, undefined);\r\n break;\r\n case 'bold':\r\n ed.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold');\r\n break;\r\n case 'italic':\r\n ed.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic');\r\n break;\r\n case 'underline':\r\n ed.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline');\r\n break;\r\n case 'strikethrough':\r\n ed.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough');\r\n break;\r\n case 'h1':\r\n this.toggleH1();\r\n break;\r\n case 'link':\r\n this.toggleLink();\r\n break;\r\n case 'image':\r\n this.pickImage();\r\n break;\r\n case 'table':\r\n ed.dispatchCommand(INSERT_TABLE_COMMAND, { rows: '3', columns: '3', includeHeaders: true });\r\n break;\r\n case 'table-row-after':\r\n ed.update(() => {\r\n $insertTableRowAtSelection(true);\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-row-before':\r\n ed.update(() => {\r\n $insertTableRowAtSelection(false);\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-col-after':\r\n ed.update(() => {\r\n $insertTableColumnAtSelection(true);\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-col-before':\r\n ed.update(() => {\r\n $insertTableColumnAtSelection(false);\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-row-delete':\r\n ed.update(() => {\r\n $deleteTableRowAtSelection();\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-col-delete':\r\n ed.update(() => {\r\n $deleteTableColumnAtSelection();\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'table-delete':\r\n ed.update(() => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n const anchor = selection.anchor.getNode();\r\n const table = $getTableNodeFromLexicalNodeOrThrow(anchor);\r\n table.remove();\r\n });\r\n this.hideTableOverlay();\r\n break;\r\n case 'image-move-up':\r\n this.moveSelectedImage(-1);\r\n break;\r\n case 'image-move-down':\r\n this.moveSelectedImage(1);\r\n break;\r\n case 'ol':\r\n ed.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'ul':\r\n ed.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined);\r\n break;\r\n case 'align-left':\r\n ed.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'left');\r\n break;\r\n case 'align-center':\r\n ed.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'center');\r\n break;\r\n case 'align-right':\r\n ed.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'right');\r\n break;\r\n case 'align-justify':\r\n ed.dispatchCommand(FORMAT_ELEMENT_COMMAND, 'justify');\r\n break;\r\n }\r\n this.emitChangeFromEditor();\r\n }\r\n\r\n private moveSelectedImage(direction: -1 | 1): void {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n ed.update(() => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n const anchor = selection.anchor.getNode();\r\n const top = anchor.getTopLevelElementOrThrow();\r\n\r\n // Si el anchor está dentro del wrapper, buscamos el nodo decorador más cercano por key no es trivial;\r\n // en la práctica el CaludyImageNode será top-level cuando se inserta.\r\n const maybe = top as any;\r\n if (!(maybe instanceof CaludyImageNode)) return;\r\n\r\n const parent = maybe.getParent();\r\n if (!parent) return;\r\n\r\n if (direction === -1) {\r\n const prev = maybe.getPreviousSibling();\r\n if (prev) prev.insertAfter(maybe);\r\n } else {\r\n const next = maybe.getNextSibling();\r\n if (next) next.insertBefore(maybe);\r\n }\r\n });\r\n this.emitChangeFromEditor();\r\n }\r\n\r\n private setupImageResizeHandles(): void {\r\n // Deprecated: los handles ya no viven dentro del nodo.\r\n }\r\n\r\n private setupOverlays(): void {\r\n const content = this.contentEditable?.nativeElement;\r\n if (!content) return;\r\n\r\n const root = this.elementRef.nativeElement.querySelector('.LexicalRoot') as HTMLElement | null;\r\n if (!root) return;\r\n\r\n const toRootCoords = (rect: DOMRect) => {\r\n const rootRect = root.getBoundingClientRect();\r\n return {\r\n left: rect.left - rootRect.left + root.scrollLeft,\r\n top: rect.top - rootRect.top + root.scrollTop,\r\n };\r\n };\r\n\r\n const clampOverlay = (kind: 'image' | 'table') => {\r\n // Espera a que Angular pinte el overlay para poder medirlo.\r\n requestAnimationFrame(() => {\r\n const el = (kind === 'image' ? this.imageOverlay?.nativeElement : this.tableOverlay?.nativeElement) ?? null;\r\n if (!el) return;\r\n const margin = 8;\r\n\r\n // IMPORTANTE:\r\n // - con overflow hidden, getBoundingClientRect puede devolver el tamaño RECORTADO.\r\n // - offsetHeight puede estar afectado por un max-height previo.\r\n // Para el \"fit\" usamos el alto NATURAL del contenido (scrollHeight).\r\n const overlayW = el.offsetWidth || 0;\r\n const naturalH = el.scrollHeight || 0;\r\n if (!overlayW || !naturalH) return;\r\n\r\n const viewportLeft = root.scrollLeft + margin;\r\n const viewportRight = root.scrollLeft + root.clientWidth - margin;\r\n const viewportTop = root.scrollTop + margin;\r\n const viewportBottom = root.scrollTop + root.clientHeight - margin;\r\n\r\n const viewportH = Math.max(0, viewportBottom - viewportTop);\r\n const maxOverlayHeight = Math.max(120, viewportH);\r\n\r\n const minLeft = viewportLeft;\r\n const maxLeft = viewportRight - overlayW;\r\n const minTop = viewportTop;\r\n const maxTop = viewportBottom - Math.min(naturalH, viewportH);\r\n\r\n if (kind === 'image') {\r\n this.imageOverlayLeft = Math.min(Math.max(this.imageOverlayLeft, minLeft), Math.max(minLeft, maxLeft));\r\n this.imageOverlayTop = Math.min(Math.max(this.imageOverlayTop, minTop), Math.max(minTop, maxTop));\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n // TABLA: \"flip\" inteligente según espacio disponible.\r\n const anchorX = this.tableOverlayAnchorX;\r\n const anchorY = this.tableOverlayAnchorY;\r\n\r\n const spaceLeft = anchorX - viewportLeft;\r\n const spaceRight = viewportRight - anchorX;\r\n const spaceAbove = anchorY - viewportTop;\r\n const spaceBelow = viewportBottom - anchorY;\r\n\r\n // Horizontal: preferir derecha si cabe, si no izquierda, si no clamp centrado.\r\n let desiredLeft: number;\r\n if (spaceRight >= overlayW) {\r\n desiredLeft = anchorX;\r\n } else if (spaceLeft >= overlayW) {\r\n desiredLeft = anchorX - overlayW;\r\n } else {\r\n desiredLeft = anchorX - overlayW / 2;\r\n }\r\n\r\n // Vertical: preferir arriba/abajo si cabe, si no forzar dentro del viewport completo.\r\n let desiredTop: number;\r\n if (spaceAbove >= naturalH + 10) {\r\n desiredTop = anchorY - naturalH - 10;\r\n } else if (spaceBelow >= naturalH + 10) {\r\n desiredTop = anchorY + 10;\r\n } else {\r\n // No cabe completo ni arriba ni abajo: colócalo dentro del viewport (sin recortes).\r\n desiredTop = viewportTop;\r\n }\r\n\r\n this.tableOverlayLeft = Math.min(Math.max(desiredLeft, minLeft), Math.max(minLeft, maxLeft));\r\n const finalTop = Math.min(Math.max(desiredTop, minTop), Math.max(minTop, maxTop));\r\n this.tableOverlayTop = finalTop;\r\n // El overlay nunca debe quedar recortado: maxHeight exacto desde su top hasta el bottom del viewport.\r\n this.tableOverlayMaxHeight = Math.max(120, viewportBottom - finalTop);\r\n this.cdr.markForCheck();\r\n });\r\n };\r\n\r\n const updateImageOverlayFromTarget = (target: HTMLElement | null) => {\r\n if (!target) {\r\n this.hideImageOverlay();\r\n return;\r\n }\r\n\r\n const wrapper = target.closest('.editor-image') as HTMLElement | null;\r\n if (!wrapper) {\r\n if (!this.imageResizeActive) this.hideImageOverlay();\r\n return;\r\n }\r\n\r\n const key = wrapper.dataset['lexicalImageKey'] ?? null;\r\n if (!key) {\r\n if (!this.imageResizeActive) this.hideImageOverlay();\r\n return;\r\n }\r\n\r\n const rect = wrapper.getBoundingClientRect();\r\n const pos = toRootCoords(rect);\r\n this.imageOverlayVisible = true;\r\n this.imageOverlayKey = key;\r\n // Intenta arriba-izquierda del bloque imagen\r\n this.imageOverlayLeft = Math.max(0, pos.left);\r\n this.imageOverlayTop = Math.max(0, pos.top - 36);\r\n this.isOnImage = true;\r\n this.cdr.markForCheck();\r\n clampOverlay('image');\r\n };\r\n\r\n const updateTableOverlayFromTarget = (target: HTMLElement | null, forceOpen = false, clickX?: number, clickY?: number) => {\r\n if (!target) {\r\n if (!forceOpen) this.hideTableOverlay();\r\n return;\r\n }\r\n const table = target.closest('table') as HTMLTableElement | null;\r\n if (!table) {\r\n if (!forceOpen) this.hideTableOverlay();\r\n return;\r\n }\r\n\r\n const rect = table.getBoundingClientRect();\r\n this.lastTableRect = rect;\r\n\r\n const rootRect = root.getBoundingClientRect();\r\n const anchorX =\r\n clickX != null\r\n ? clickX - rootRect.left + root.scrollLeft\r\n : rect.left - rootRect.left + root.scrollLeft + rect.width / 2;\r\n const anchorY = clickY != null ? clickY - rootRect.top + root.scrollTop : rect.top - rootRect.top + root.scrollTop;\r\n\r\n this.tableOverlayVisible = true;\r\n // Se calcula realmente al medir el overlay (clampOverlay), pero dejamos valores base.\r\n this.tableOverlayAnchorX = anchorX;\r\n this.tableOverlayAnchorY = anchorY;\r\n this.tableOverlayLeft = Math.max(0, anchorX);\r\n this.tableOverlayTop = Math.max(0, anchorY);\r\n this.isInTable = true;\r\n this.cdr.markForCheck();\r\n clampOverlay('table');\r\n };\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (this.isDisabled) return;\r\n updateImageOverlayFromTarget(e.target as HTMLElement | null);\r\n };\r\n\r\n const onMouseLeave = () => {\r\n if (this.imageResizeActive) return;\r\n this.hideImageOverlay();\r\n };\r\n\r\n const onContextMenu = (e: MouseEvent) => {\r\n if (this.isDisabled) return;\r\n const t = e.target as HTMLElement | null;\r\n const table = t?.closest('table');\r\n if (!table) return;\r\n e.preventDefault();\r\n e.stopPropagation();\r\n updateTableOverlayFromTarget(t, true, e.clientX, e.clientY);\r\n };\r\n\r\n const onDocPointerDown = (e: PointerEvent) => {\r\n const t = e.target as HTMLElement | null;\r\n // Si clic fuera del root o de overlays, cerrar menús.\r\n if (!t || !root.contains(t)) {\r\n this.hideImageOverlay();\r\n this.hideTableOverlay();\r\n return;\r\n }\r\n // Si el click fue dentro del overlay, no cierres.\r\n if (t.closest('.FloatingOverlay')) return;\r\n\r\n // Dentro del editor: cualquier click fuera del menú debe cerrarlo,\r\n // incluso si fue dentro de la misma tabla (fuera del menú).\r\n if (this.tableOverlayVisible) this.hideTableOverlay();\r\n\r\n // El overlay de imagen se cierra al clicar fuera del bloque imagen.\r\n if (!t.closest('.editor-image')) this.hideImageOverlay();\r\n };\r\n\r\n content.addEventListener('mousemove', onMouseMove, true);\r\n content.addEventListener('mouseleave', onMouseLeave, true);\r\n content.addEventListener('contextmenu', onContextMenu, true);\r\n document.addEventListener('pointerdown', onDocPointerDown, true);\r\n\r\n const onAnyScroll = () => {\r\n // Sin backdrop: al scrollear el layout cambia, cerramos overlays.\r\n if (!this.imageResizeActive) this.hideImageOverlay();\r\n this.hideTableOverlay();\r\n };\r\n // Scroll del contenedor del editor (toolbar horizontal, root, o window).\r\n root.addEventListener('scroll', onAnyScroll, { passive: true });\r\n content.addEventListener('scroll', onAnyScroll, { passive: true });\r\n window.addEventListener('scroll', onAnyScroll, { passive: true });\r\n\r\n const onDocWheel = (e: WheelEvent) => {\r\n const t = e.target as HTMLElement | null;\r\n // Si el wheel ocurre dentro del menú, NO lo cierres (scroll interno permitido).\r\n if (t && t.closest('.FloatingOverlay')) return;\r\n // Wheel fuera del menú: cierra overlays (comportamiento esperado).\r\n if (!this.imageResizeActive) this.hideImageOverlay();\r\n this.hideTableOverlay();\r\n };\r\n // Wheel se dispara aunque no haya scroll real (trackpad/rueda): usamos esto\r\n // para cerrar el menú al \"intento\" de scroll fuera del menú.\r\n document.addEventListener('wheel', onDocWheel, { passive: true, capture: true } as any);\r\n\r\n this.overlayCleanup = () => {\r\n content.removeEventListener('mousemove', onMouseMove, true);\r\n content.removeEventListener('mouseleave', onMouseLeave, true);\r\n content.removeEventListener('contextmenu', onContextMenu, true);\r\n document.removeEventListener('pointerdown', onDocPointerDown, true);\r\n root.removeEventListener('scroll', onAnyScroll as any);\r\n content.removeEventListener('scroll', onAnyScroll as any);\r\n window.removeEventListener('scroll', onAnyScroll as any);\r\n document.removeEventListener('wheel', onDocWheel as any, true);\r\n };\r\n\r\n // Resize global listeners (para el handle flotante)\r\n const onWinPointerMove = (e: PointerEvent) => {\r\n if (!this.imageResizeActive || !this.imageOverlayKey) return;\r\n const dx = e.clientX - this.imageResizeStartX;\r\n const nextW = Math.max(80, Math.min(800, Math.round(this.imageResizeStartW + dx)));\r\n const nextH = Math.max(40, Math.round(nextW * this.imageResizeAspect));\r\n this.editor?.update(() => {\r\n const node = $getNodeByKey(this.imageOverlayKey!) as any;\r\n if (node instanceof CaludyImageNode) {\r\n node.setDimensions(nextW, nextH);\r\n }\r\n });\r\n };\r\n\r\n const onWinPointerUp = () => {\r\n if (!this.imageResizeActive) return;\r\n this.imageResizeActive = false;\r\n this.emitChangeFromEditor();\r\n };\r\n\r\n window.addEventListener('pointermove', onWinPointerMove, { passive: true });\r\n window.addEventListener('pointerup', onWinPointerUp, { passive: true });\r\n\r\n const prevCleanup = this.overlayCleanup;\r\n this.overlayCleanup = () => {\r\n prevCleanup?.();\r\n window.removeEventListener('pointermove', onWinPointerMove as any);\r\n window.removeEventListener('pointerup', onWinPointerUp as any);\r\n };\r\n }\r\n\r\n onImageResizeStart(event: PointerEvent): void {\r\n if (this.isDisabled) return;\r\n if (!this.imageOverlayKey) return;\r\n const wrapper = this.contentEditable?.nativeElement?.querySelector(\r\n `.editor-image[data-lexical-image-key=\"${this.imageOverlayKey}\"]`,\r\n ) as HTMLElement | null;\r\n const img = wrapper?.querySelector('img') as HTMLImageElement | null;\r\n if (!img) return;\r\n\r\n const rect = img.getBoundingClientRect();\r\n this.imageResizeActive = true;\r\n this.imageResizeStartX = event.clientX;\r\n this.imageResizeStartW = rect.width;\r\n this.imageResizeStartH = rect.height;\r\n this.imageResizeAspect = rect.width > 0 ? rect.height / rect.width : 1;\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n\r\n private hideImageOverlay(): void {\r\n this.imageOverlayVisible = false;\r\n this.imageOverlayKey = null;\r\n this.isOnImage = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private hideTableOverlay(): void {\r\n this.tableOverlayVisible = false;\r\n this.lastTableRect = null;\r\n this.isInTable = false;\r\n this.tableOverlayMaxHeight = 0;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private toggleLink(): void {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n\r\n // Si ya está en link, lo quita. Si no, pide URL y lo aplica.\r\n const currentIsLink = this.isLink;\r\n if (currentIsLink) {\r\n ed.dispatchCommand(TOGGLE_LINK_COMMAND, null);\r\n return;\r\n }\r\n\r\n const url = window.prompt('Pega la URL del link (vacío para cancelar):', 'https://');\r\n if (!url) return;\r\n const trimmed = url.trim();\r\n if (!trimmed) return;\r\n ed.dispatchCommand(TOGGLE_LINK_COMMAND, trimmed);\r\n }\r\n\r\n private pickImage(): void {\r\n if (this.isDisabled) return;\r\n const input = this.imageInput?.nativeElement;\r\n if (!input) return;\r\n input.value = '';\r\n input.click();\r\n }\r\n\r\n async onImageSelected(event: Event): Promise<void> {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n const input = event.target as HTMLInputElement | null;\r\n const file = input?.files?.[0];\r\n if (!file) return;\r\n\r\n if (!file.type.startsWith('image/')) return;\r\n // Límite de entrada: evita congelar el browser con imágenes gigantes.\r\n const MAX_INPUT_BYTES = 10 * 1024 * 1024; // 10MB\r\n if (file.size > MAX_INPUT_BYTES) {\r\n window.alert('La imagen es muy pesada. Máximo 10MB.');\r\n return;\r\n }\r\n\r\n const processed = await this.compressAndResizeImageToDataUrl(file, 800, 1_200_000);\r\n if (!processed) {\r\n window.alert('No se pudo procesar la imagen.');\r\n return;\r\n }\r\n\r\n const { dataUrl, width, height } = processed;\r\n\r\n ed.update(() => {\r\n const selection = $getSelection();\r\n const node = $createCaludyImageNode({ src: dataUrl, altText: file.name, width, height }) as unknown as any;\r\n if ($isRangeSelection(selection)) {\r\n selection.insertNodes([node]);\r\n } else {\r\n $getRoot().append(node);\r\n }\r\n });\r\n\r\n this.emitChangeFromEditor();\r\n }\r\n\r\n private async compressAndResizeImageToDataUrl(\r\n file: File,\r\n maxSide: number,\r\n maxOutputBytes: number,\r\n ): Promise<{ dataUrl: string; width: number; height: number } | null> {\r\n const bitmap = await this.readImageBitmap(file);\r\n if (!bitmap) return null;\r\n\r\n const srcW = bitmap.width;\r\n const srcH = bitmap.height;\r\n const scale = Math.min(1, maxSide / Math.max(srcW, srcH));\r\n const targetW = Math.max(1, Math.round(srcW * scale));\r\n const targetH = Math.max(1, Math.round(srcH * scale));\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = targetW;\r\n canvas.height = targetH;\r\n const ctx = canvas.getContext('2d', { alpha: false });\r\n if (!ctx) return null;\r\n\r\n ctx.drawImage(bitmap as any, 0, 0, targetW, targetH);\r\n\r\n // JPEG suele ser el mejor balance para base64. Ajustamos calidad para entrar en el límite.\r\n const mime = 'image/jpeg';\r\n let quality = 0.82;\r\n\r\n for (let i = 0; i < 8; i++) {\r\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, mime, quality));\r\n if (!blob) return null;\r\n if (blob.size <= maxOutputBytes) {\r\n const dataUrl = await this.blobToDataUrl(blob);\r\n return { dataUrl, width: targetW, height: targetH };\r\n }\r\n quality = Math.max(0.5, quality - 0.06);\r\n }\r\n\r\n // Último intento con calidad baja.\r\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, mime, 0.5));\r\n if (!blob) return null;\r\n if (blob.size > maxOutputBytes) return null;\r\n const dataUrl = await this.blobToDataUrl(blob);\r\n return { dataUrl, width: targetW, height: targetH };\r\n }\r\n\r\n private async readImageBitmap(file: File): Promise<ImageBitmap | HTMLImageElement | null> {\r\n // createImageBitmap es más rápido y evita layout; fallback a <img>.\r\n if ('createImageBitmap' in window) {\r\n try {\r\n return await (window as any).createImageBitmap(file);\r\n } catch {\r\n // fallback abajo\r\n }\r\n }\r\n\r\n return await new Promise<HTMLImageElement | null>((resolve) => {\r\n const img = new Image();\r\n img.onload = () => resolve(img);\r\n img.onerror = () => resolve(null);\r\n img.src = URL.createObjectURL(file);\r\n });\r\n }\r\n\r\n private async blobToDataUrl(blob: Blob): Promise<string> {\r\n return await new Promise<string>((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onload = () => resolve(String(reader.result));\r\n reader.onerror = () => reject(new Error('FileReader error'));\r\n reader.readAsDataURL(blob);\r\n });\r\n }\r\n\r\n private toggleH1(): void {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n ed.update(() => {\r\n const selection = $getSelection();\r\n if (!$isRangeSelection(selection)) return;\r\n const anchor = selection.anchor.getNode();\r\n const top = anchor.getTopLevelElementOrThrow();\r\n\r\n const alreadyH1 = $isHeadingNode(top) && top.getTag() === 'h1';\r\n if (alreadyH1) {\r\n $setBlocksType(selection, () => $createParagraphNode());\r\n } else {\r\n $setBlocksType(selection, () => $createHeadingNode('h1'));\r\n }\r\n });\r\n }\r\n\r\n private setEditorHtml(html: string): void {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n const normalized = html.trim();\r\n\r\n ed.update(() => {\r\n const root = $getRoot();\r\n root.clear();\r\n\r\n if (!normalized) {\r\n root.append($createParagraphNode());\r\n return;\r\n }\r\n\r\n // Si no parece HTML, evita parsear \"texto suelto\" como documento (suele degradar a nodos raros).\r\n const looksLikeHtml = /<\\/?[a-z][\\s\\S]*>/i.test(normalized);\r\n if (!looksLikeHtml) {\r\n const p = $createParagraphNode();\r\n p.append($createTextNode(normalized));\r\n root.append(p);\r\n return;\r\n }\r\n\r\n const parser = new DOMParser();\r\n const dom = parser.parseFromString(normalized, 'text/html');\r\n const nodes = $generateNodesFromDOM(ed, dom);\r\n root.append(...nodes);\r\n });\r\n\r\n this.updatePlaceholderFlag();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private emitChangeFromEditor(): void {\r\n const ed = this.editor;\r\n if (!ed) return;\r\n\r\n let html: string | null = null;\r\n ed.getEditorState().read(() => {\r\n const generated = $generateHtmlFromNodes(ed, null).trim();\r\n html = generated ? generated : null;\r\n });\r\n\r\n if (html === this.lastEmittedHtml) return;\r\n this.lastEmittedHtml = html;\r\n this.onChange(html);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private updatePlaceholderFlag(): void {\r\n const ed = this.editor;\r\n if (!ed) {\r\n this.showPlaceholder = true;\r\n return;\r\n }\r\n ed.getEditorState().read(() => {\r\n const root = $getRoot();\r\n const text = root.getTextContent().trim();\r\n this.showPlaceholder = text.length === 0;\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private updateToolbarState(): void {\r\n const selection = $getSelection();\r\n if ($isRangeSelection(selection)) {\r\n this.isBold = selection.hasFormat('bold');\r\n this.isItalic = selection.hasFormat('italic');\r\n this.isUnderline = selection.hasFormat('underline');\r\n this.isStrikethrough = selection.hasFormat('strikethrough');\r\n\r\n const anchor = selection.anchor.getNode();\r\n const top = anchor.getTopLevelElementOrThrow();\r\n\r\n this.isH1 = $isHeadingNode(top) && top.getTag() === 'h1';\r\n const maybeLinkParent = anchor.getParent();\r\n this.isLink = $isLinkNode(anchor) || $isLinkNode(maybeLinkParent) || $isLinkNode(top);\r\n // Nota: overlays (imagen/tabla) se controlan por hover/anticlick, no por “ensuciar” el DOM del nodo.\r\n // Estos flags solo ayudan a habilitar/deshabilitar botones cuando ya está abierto un overlay.\r\n this.isInTable = this.tableOverlayVisible || this.isInTable;\r\n this.isOnImage = this.imageOverlayVisible || this.isOnImage;\r\n\r\n const fmt = top.getFormatType?.() ?? 'left';\r\n this.isAlignLeft = fmt === 'left';\r\n this.isAlignCenter = fmt === 'center';\r\n this.isAlignRight = fmt === 'right';\r\n this.isAlignJustify = fmt === 'justify';\r\n } else {\r\n this.isBold = false;\r\n this.isItalic = false;\r\n this.isUnderline = false;\r\n this.isStrikethrough = false;\r\n this.isH1 = false;\r\n this.isLink = false;\r\n if (!this.imageResizeActive) this.isOnImage = false;\r\n this.isInTable = false;\r\n this.isAlignLeft = true;\r\n this.isAlignCenter = false;\r\n this.isAlignRight = false;\r\n this.isAlignJustify = false;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event); $event.stopPropagation()\"\n>\n {{ description }}\n</p>\n\n<div class=\"EditorWrapper\" [class.Disabled]=\"isDisabled\">\n <!-- Solo en el navegador: Lexical (en SSR no se crea editor para evitar \"document is not defined\") -->\n <ng-container *ngIf=\"isBrowser\">\n <div class=\"Toolbar\" [class.Disabled]=\"isDisabled\" (click)=\"$event.stopPropagation()\" dragScroll=\"horizontal\">\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--undo\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('undo'); $event.preventDefault()\"\n [disabled]=\"isDisabled || !canUndo\"\n aria-label=\"Deshacer\"\n >\n <lucide-icon name=\"rotate-ccw\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--redo\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('redo'); $event.preventDefault()\"\n [disabled]=\"isDisabled || !canRedo\"\n aria-label=\"Rehacer\"\n >\n <lucide-icon name=\"rotate-cw\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <span class=\"ToolSep\"></span>\n\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--bold\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isBold\"\n (click)=\"exec('bold'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Negrita\"\n >\n <lucide-icon name=\"bold\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--italic\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isItalic\"\n (click)=\"exec('italic'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Cursiva\"\n >\n <lucide-icon name=\"italic\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--underline\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isUnderline\"\n (click)=\"exec('underline'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Subrayado\"\n >\n <lucide-icon name=\"underline\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--strike\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isStrikethrough\"\n (click)=\"exec('strikethrough'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Tachado\"\n >\n <lucide-icon name=\"strikethrough\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <span class=\"ToolSep\"></span>\n\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--h1\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isH1\"\n (click)=\"exec('h1'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Título H1\"\n >\n H1\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--link\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isLink\"\n (click)=\"exec('link'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Insertar o quitar link\"\n >\n <lucide-icon name=\"link\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--image\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('image'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Insertar imagen\"\n >\n <lucide-icon name=\"image\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--table\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Insertar tabla\"\n >\n <lucide-icon name=\"table\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <span class=\"ToolSep\"></span>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--ol\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('ol'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Lista numerada\"\n >\n <lucide-icon name=\"list-ordered\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--ul\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('ul'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Lista con viñetas\"\n >\n <lucide-icon name=\"list\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <span class=\"ToolSep\"></span>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--align\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isAlignLeft\"\n (click)=\"exec('align-left'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Alinear a la izquierda\"\n >\n <lucide-icon name=\"text-align-start\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--align\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isAlignCenter\"\n (click)=\"exec('align-center'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Centrar\"\n >\n <lucide-icon name=\"text-align-center\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--align\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isAlignRight\"\n (click)=\"exec('align-right'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Alinear a la derecha\"\n >\n <lucide-icon name=\"text-align-end\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"ToolBtn ToolBtn--align\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n [class.Active]=\"isAlignJustify\"\n (click)=\"exec('align-justify'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Justificar\"\n >\n <lucide-icon name=\"text-align-justify\" aria-hidden=\"true\"></lucide-icon>\n </button>\n </div>\n <input #imageInput type=\"file\" accept=\"image/*\" hidden (change)=\"onImageSelected($event)\" />\n\n <div\n class=\"LexicalRoot\"\n [class.Disabled]=\"isDisabled\"\n (click)=\"manualClick($event)\"\n >\n <!-- Overlays flotantes (NO se guardan en el HTML del editor) -->\n <div\n *ngIf=\"imageOverlayVisible\"\n #imageOverlay\n class=\"FloatingOverlay FloatingOverlay--image\"\n [style.top.px]=\"imageOverlayTop\"\n [style.left.px]=\"imageOverlayLeft\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n >\n <button\n type=\"button\"\n class=\"FloatingBtn\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('image-move-up'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Mover imagen arriba\"\n >\n <lucide-icon name=\"arrow-up\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <button\n type=\"button\"\n class=\"FloatingBtn\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('image-move-down'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n aria-label=\"Mover imagen abajo\"\n >\n <lucide-icon name=\"arrow-down\" aria-hidden=\"true\"></lucide-icon>\n </button>\n <span class=\"FloatingHandle\" (pointerdown)=\"onImageResizeStart($event)\" aria-label=\"Resize imagen\"></span>\n </div>\n\n <div\n *ngIf=\"tableOverlayVisible\"\n #tableOverlay\n class=\"FloatingOverlay FloatingOverlay--table\"\n [style.top.px]=\"tableOverlayTop\"\n [style.left.px]=\"tableOverlayLeft\"\n [style.maxHeight.px]=\"tableOverlayMaxHeight\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"ContextMenu\">\n <div class=\"ContextMenuTitle\">Tabla</div>\n\n <div class=\"ContextMenuSection\">\n <div class=\"ContextMenuLabel\">Insertar</div>\n <button\n type=\"button\"\n class=\"ContextMenuItem\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-row-before'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"arrow-up\" aria-hidden=\"true\"></lucide-icon>\n <span>Fila arriba</span>\n </button>\n <button\n type=\"button\"\n class=\"ContextMenuItem\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-row-after'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"arrow-down\" aria-hidden=\"true\"></lucide-icon>\n <span>Fila abajo</span>\n </button>\n <button\n type=\"button\"\n class=\"ContextMenuItem\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-col-before'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"arrow-left\" aria-hidden=\"true\"></lucide-icon>\n <span>Columna izquierda</span>\n </button>\n <button\n type=\"button\"\n class=\"ContextMenuItem\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-col-after'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"arrow-right\" aria-hidden=\"true\"></lucide-icon>\n <span>Columna derecha</span>\n </button>\n </div>\n\n <div class=\"ContextMenuDivider\"></div>\n\n <div class=\"ContextMenuSection\">\n <div class=\"ContextMenuLabel\">Eliminar</div>\n <button\n type=\"button\"\n class=\"ContextMenuItem ContextMenuItem--danger\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-row-delete'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"minus\" aria-hidden=\"true\"></lucide-icon>\n <span>Eliminar fila</span>\n </button>\n <button\n type=\"button\"\n class=\"ContextMenuItem ContextMenuItem--danger\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-col-delete'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon name=\"minus\" aria-hidden=\"true\"></lucide-icon>\n <span>Eliminar columna</span>\n </button>\n <button\n type=\"button\"\n class=\"ContextMenuItem ContextMenuItem--danger\"\n (mousedown)=\"onToolbarMouseDown($event)\"\n (click)=\"exec('table-delete'); $event.preventDefault()\"\n [disabled]=\"isDisabled\"\n >\n <lucide-icon class=\"Icon--trash\" name=\"trash\" aria-hidden=\"true\"></lucide-icon>\n <span>Eliminar tabla</span>\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"LexicalPlaceholder\" *ngIf=\"showPlaceholder\">{{ placeholder }}</div>\n <div\n #contentEditable\n class=\"LexicalContent\"\n contenteditable=\"true\"\n spellcheck=\"true\"\n (blur)=\"onEditorBlur($event)\"\n (input)=\"onInput()\"\n ></div>\n </div>\n </ng-container>\n\n <!-- En SSR: placeholder para mantener el layout (el campo no afecta SEO) -->\n <div *ngIf=\"!isBrowser\" class=\"EditorPlaceholder\" [class.Disabled]=\"isDisabled\">\n <span class=\"EditorPlaceholderText\">Editor de texto enriquecido (carga en el navegador)</span>\n </div>\n</div>\n","import {\r\n Component,\r\n forwardRef,\r\n ViewChild,\r\n ElementRef,\r\n AfterViewInit,\r\n OnDestroy,\r\n Input,\r\n HostBinding,\r\n ChangeDetectorRef,\r\n inject,\r\n PLATFORM_ID,\r\n} from '@angular/core';\r\nimport { CommonModule, isPlatformBrowser } from '@angular/common';\r\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\n@Component({\r\n selector: 'signature-entry',\r\n standalone: true,\r\n imports: [\r\n LucideIconComponent,CommonModule],\r\n templateUrl: './signature-entry.component.html',\r\n styleUrl: './signature-entry.component.sass',\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SignatureEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class SignatureEntryComponent\r\n implements ControlValueAccessor, AfterViewInit, OnDestroy\r\n{\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private platformId = inject(PLATFORM_ID);\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() clearText: string = 'Limpiar';\r\n @Input() quality: number = 0.7; // Calidad de compresión JPEG (0.0 - 1.0) - Solo afecta el export, no el canvas\r\n @Input() exportWidth: number = 150; // Ancho de la imagen exportada (mantiene relación de aspecto)\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n if (this.cdr) this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n isDisabled = false;\r\n\r\n @ViewChild('canvas') canvasRef!: ElementRef<HTMLCanvasElement>;\r\n\r\n private ctx!: CanvasRenderingContext2D;\r\n private drawing = false;\r\n private dpr = 1;\r\n private lastPos: { x: number; y: number } | null = null;\r\n private lastTimestamp: number | null = null;\r\n\r\n private onChange = (value: string | null) => {};\r\n private onTouched = () => {};\r\n\r\n\r\n private listeners: {\r\n type: string;\r\n fn: EventListenerOrEventListenerObject;\r\n options?: any;\r\n }[] = [];\r\n\r\n ngAfterViewInit(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n if (!this.canvasRef?.nativeElement) return;\r\n this.initCanvas();\r\n this.registerEvents(this.canvasRef.nativeElement);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (!isPlatformBrowser(this.platformId)) return;\r\n const canvas = this.canvasRef?.nativeElement;\r\n if (canvas) {\r\n for (const { type, fn, options } of this.listeners) {\r\n canvas.removeEventListener(type, fn, options);\r\n }\r\n }\r\n this.listeners = [];\r\n }\r\n\r\n private initCanvas(): void {\r\n const canvas = this.canvasRef?.nativeElement;\r\n if (!canvas || typeof canvas.getBoundingClientRect !== 'function') return;\r\n const rect = canvas.getBoundingClientRect();\r\n const scaleResolution = 2; // Escalar resolucion X2\r\n\r\n this.dpr = window.devicePixelRatio * scaleResolution;\r\n canvas.width = rect.width * this.dpr;\r\n canvas.height = ((rect.width * 9) / 16) * this.dpr;\r\n canvas.style.width = `${rect.width}px`;\r\n canvas.style.height = `${(rect.width * 9) / 16}px`;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) {\r\n console.error('No se pudo obtener el contexto del canvas');\r\n return;\r\n }\r\n\r\n ctx.scale(this.dpr, this.dpr);\r\n this.ctx = ctx;\r\n\r\n this.ctx.imageSmoothingEnabled = true;\r\n this.ctx.imageSmoothingQuality = 'high';\r\n this.ctx.lineWidth = 1.4;\r\n this.ctx.lineJoin = 'round';\r\n this.ctx.lineCap = 'round';\r\n this.ctx.strokeStyle = '#002c5c';\r\n\r\n this.clearCanvas();\r\n }\r\n\r\n writeValue(value: string | null): void {\r\n if (!this.ctx) return;\r\n if (!value) {\r\n this.paintBlankCanvas();\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n const img = new Image();\r\n img.onload = () => {\r\n this.ctx.clearRect(\r\n 0,\r\n 0,\r\n this.canvasRef.nativeElement.width / this.dpr,\r\n this.canvasRef.nativeElement.height / this.dpr\r\n );\r\n this.ctx.drawImage(\r\n img,\r\n 0,\r\n 0,\r\n this.canvasRef.nativeElement.width / this.dpr,\r\n this.canvasRef.nativeElement.height / this.dpr\r\n );\r\n };\r\n img.src = value;\r\n }\r\n\r\n registerOnChange(fn: (value: string | null) => void): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private emitValue(): void {\r\n this.compressAndEmit();\r\n }\r\n\r\n /**\r\n * Comprime y redimensiona la imagen del canvas y emite el valor base64.\r\n * El canvas se mantiene en alta calidad para dibujar.\r\n * Al exportar: redimensiona a exportWidth de ancho (manteniendo relación de aspecto) y aplica compresión JPEG.\r\n * Captura TODO el contenido del canvas original sin recortar.\r\n */\r\n private compressAndEmit(): void {\r\n const canvas = this.canvasRef.nativeElement;\r\n \r\n // Usar las dimensiones físicas completas del canvas (no dividir por dpr)\r\n // Esto captura todo el contenido dibujado sin recortar\r\n const originalWidth = canvas.width;\r\n const originalHeight = canvas.height;\r\n\r\n // Calcular el alto manteniendo la relación de aspecto\r\n const aspectRatio = originalHeight / originalWidth;\r\n const exportHeight = Math.floor(this.exportWidth * aspectRatio);\r\n\r\n // Crear un canvas temporal para la compresión y redimensionamiento\r\n const tempCanvas = document.createElement('canvas');\r\n tempCanvas.width = this.exportWidth;\r\n tempCanvas.height = exportHeight;\r\n const tempCtx = tempCanvas.getContext('2d');\r\n\r\n if (!tempCtx) {\r\n console.error('No se pudo obtener el contexto del canvas temporal');\r\n return;\r\n }\r\n\r\n // Dibujar la imagen completa del canvas original redimensionada en el canvas temporal\r\n // Usar las dimensiones físicas completas del canvas para capturar todo sin recortar\r\n tempCtx.drawImage(\r\n canvas,\r\n 0, 0, // Origen en el canvas original (esquina superior izquierda)\r\n originalWidth, originalHeight, // Dimensiones completas del canvas original\r\n 0, 0, // Destino en el canvas temporal (esquina superior izquierda)\r\n this.exportWidth, exportHeight // Dimensiones redimensionadas\r\n );\r\n\r\n // Convertir a base64 con compresión JPEG de baja calidad\r\n const base64 = tempCanvas.toDataURL('image/jpeg', this.quality);\r\n \r\n this.onChange(base64);\r\n }\r\n\r\n /** Solo vista: usado por `writeValue(null)` sin notificar al modelo (el `FormControl` ya está vacío). */\r\n private paintBlankCanvas(): void {\r\n const canvas = this.canvasRef.nativeElement;\r\n const width = canvas.width / this.dpr;\r\n const height = canvas.height / this.dpr;\r\n\r\n this.ctx.fillStyle = '#fff';\r\n this.ctx.fillRect(0, 0, width, height);\r\n this.ctx.beginPath();\r\n }\r\n\r\n clearCanvas(): void {\r\n this.paintBlankCanvas();\r\n this.onChange(null);\r\n }\r\n\r\n private registerEvents(canvas: HTMLCanvasElement): void {\r\n const getPosition = (\r\n e: MouseEvent | TouchEvent\r\n ): { x: number; y: number } => {\r\n const rect = canvas.getBoundingClientRect();\r\n const isTouch = e instanceof TouchEvent;\r\n const clientX = isTouch\r\n ? e.touches[0].clientX\r\n : (e as MouseEvent).clientX;\r\n const clientY = isTouch\r\n ? e.touches[0].clientY\r\n : (e as MouseEvent).clientY;\r\n return {\r\n x: Math.floor(clientX - rect.left) + 0.5,\r\n y: Math.floor(clientY - rect.top) + 0.5,\r\n };\r\n };\r\n\r\n const start = (e: MouseEvent | TouchEvent) => {\r\n e.preventDefault();\r\n this.drawing = true;\r\n this.lastPos = getPosition(e);\r\n this.ctx.beginPath();\r\n this.ctx.moveTo(this.lastPos.x, this.lastPos.y);\r\n this.lastTimestamp = performance.now();\r\n };\r\n\r\n const move = (e: MouseEvent | TouchEvent) => {\r\n if (!this.drawing || !this.lastPos) return;\r\n\r\n const pos = getPosition(e);\r\n const mid = {\r\n x: (this.lastPos.x + pos.x) / 2,\r\n y: (this.lastPos.y + pos.y) / 2,\r\n };\r\n\r\n // Calcular velocidad\r\n const now = performance.now();\r\n const dt = this.lastTimestamp ? now - this.lastTimestamp : 0;\r\n const dx = pos.x - this.lastPos.x;\r\n const dy = pos.y - this.lastPos.y;\r\n const dist = Math.sqrt(dx * dx + dy * dy);\r\n const speed = dt > 0 ? dist / dt : 0;\r\n\r\n // Emular presión inversa: velocidad baja = trazo grueso\r\n const minLine = 0.2;\r\n const maxLine = 1;\r\n const pressure = Math.max(0, Math.min(1, 1 - speed * 0.7));\r\n const width = minLine + (maxLine - minLine) * pressure;\r\n\r\n this.ctx.lineWidth = width;\r\n this.ctx.quadraticCurveTo(this.lastPos.x, this.lastPos.y, mid.x, mid.y);\r\n this.ctx.stroke();\r\n\r\n this.lastPos = pos;\r\n this.lastTimestamp = now;\r\n };\r\n\r\n const end = () => {\r\n if (!this.drawing) return;\r\n this.drawing = false;\r\n this.lastPos = null;\r\n this.lastPos = null;\r\n this.lastTimestamp = null;\r\n\r\n this.emitValue();\r\n };\r\n\r\n const addListener = (\r\n type: string,\r\n fn: EventListenerOrEventListenerObject,\r\n options?: any\r\n ) => {\r\n canvas.addEventListener(type, fn, options);\r\n this.listeners.push({ type, fn, options });\r\n };\r\n\r\n addListener('mousedown', (e) => start(e as MouseEvent));\r\n addListener('mousemove', (e) => move(e as MouseEvent));\r\n addListener('mouseup', () => end());\r\n addListener('mouseleave', () => end());\r\n\r\n addListener('touchstart', (e) => start(e as TouchEvent), {\r\n passive: false,\r\n });\r\n addListener('touchmove', (e) => move(e as TouchEvent), {\r\n passive: false,\r\n });\r\n addListener('touchend', () => end());\r\n }\r\n}\r\n","<p\r\n *ngIf=\"label\"\r\n class=\"Label\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\r\n</p>\r\n\r\n<p\r\n *ngIf=\"description\"\r\n class=\"Description\"\r\n [class.Disabled]=\"isDisabled\"\r\n>\r\n {{ description }}\r\n</p>\r\n\r\n<div class=\"SignatureBox\">\r\n <canvas #canvas width=\"400\" height=\"150\" class=\"SignatureCanvas\"></canvas>\r\n <button class=\"Clear\" type=\"button\" (click)=\"clearCanvas()\"><lucide-icon name=\"brush-cleaning\"></lucide-icon> limpiar firma</button>\r\n</div>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\n\r\n@Pipe({\r\n name: 'fileSize',\r\n standalone: true,\r\n})\r\nexport class FileSizePipe implements PipeTransform {\r\n transform(bytes: number | null | undefined, decimals: number = 2): string {\r\n if (bytes == null || bytes === 0) return '0 Bytes';\r\n\r\n const k = 1024;\r\n const dm = decimals < 0 ? 0 : decimals;\r\n const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\r\n\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n }\r\n}\r\n\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n Component,\r\n Input,\r\n forwardRef,\r\n ChangeDetectorRef,\r\n ViewChild,\r\n ElementRef,\r\n AfterViewInit,\r\n HostBinding,\r\n inject,\r\n} from '@angular/core';\r\nimport { XOSUE_UTILS_INPUTS_CONFIG } from '../../config/inputs-config';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport * as Sortable from 'sortablejs';\r\n\r\nimport { FileSizePipe } from '../../vendor/file-size.pipe';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport { XOSUE_UTILS_MEDIA_PREVIEW, createBackendMediaImageUrlState } from '../../config/media-adapters';\r\nimport { XOSUE_UTILS_MEDIA_VIEWER, type GeneralViewerMode } from '../../config/media-adapters';\r\nimport { LucideIconComponent } from '../../vendor/lucide-icon/lucide-icon.component';\r\n\r\nconst IMAGE_MAGIC_HEADERS = [\r\n 'ffd8ffe0',\r\n 'ffd8ffe1',\r\n 'ffd8ffe2',\r\n 'ffd8ffe3',\r\n 'ffd8ffe8',\r\n '89504e47',\r\n '47494638',\r\n '424d',\r\n '49492a00',\r\n '4d4d002a',\r\n '00000100',\r\n];\r\n\r\ninterface FileInfo {\r\n name: string;\r\n size: number;\r\n progress: number;\r\n status: 'loading' | 'success' | 'error';\r\n type?: string;\r\n url?: string; // Hash encriptado o URL completa\r\n error?: string;\r\n /** 'uploading' = subiendo chunks; 'processing' = servidor procesando (resoluciones, etc.) */\r\n phase?: 'uploading' | 'processing';\r\n // Para chunks\r\n file?: File;\r\n urlEncrypted?: string; // URL encriptada (hash) - única URL necesaria\r\n chunkNumber?: number;\r\n uploadedBytes?: number;\r\n}\r\n\r\ntype MediaMode = 'file' | 'image' | 'card';\r\n\r\n@Component({\r\n selector: 'media-entry',\r\n standalone: true,\r\n templateUrl: './media-entry.component.html',\r\n styleUrls: ['./media-entry.component.sass'],\r\n host: {\r\n ngSkipHydration: '',\r\n },\r\n imports: [\r\n LucideIconComponent,CommonModule, FileSizePipe],\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MediaEntryComponent),\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class MediaEntryComponent implements ControlValueAccessor, AfterViewInit {\r\n // ============================================================================\r\n // DEPENDENCIES (Injected Services)\r\n // ============================================================================\r\n private cdr = inject(ChangeDetectorRef);\r\n private elementRef = inject(ElementRef);\r\n private sanitizer = inject(DomSanitizer);\r\n private readonly inputsConfig = inject(XOSUE_UTILS_INPUTS_CONFIG);\r\n private mediaPreview = inject(XOSUE_UTILS_MEDIA_PREVIEW);\r\n /** Visor de previsualización global (consumido desde la plantilla vía `openGeneralMediaPreview`). */\r\n readonly generalMediaViewer = inject(XOSUE_UTILS_MEDIA_VIEWER);\r\n\r\n /** Preview de imágenes: hash / uploads / URL absoluta (mismo estado que el resto del front). */\r\n private readonly backendPreviewImgState = createBackendMediaImageUrlState();\r\n\r\n // ============================================================================\r\n // INPUT PROPERTIES (Props del componente)\r\n // ============================================================================\r\n @Input() label: string = '';\r\n @Input() opcional: boolean = false;\r\n @Input() description: string = '';\r\n @Input() placeholder: string = 'Seleccionar';\r\n @Input() mode: MediaMode = 'file';\r\n @Input() display: 'items' | 'cards' = 'items';\r\n @Input() multiple = true;\r\n @Input() maxItems = 6;\r\n @Input() maxSize: number | null = null; // en MB\r\n @Input() types: string[] = [];\r\n @Input() extensions: string[] = [];\r\n @Input() endpointUpload?: string;\r\n /** Tamaño de cada chunk en MB. Por defecto 1.5 MB para no superar upload_max_filesize=2M en muchos servidores. */\r\n @Input() chunkSizeMB: number = 1.5;\r\n @Input() sortable = true;\r\n @Input() primaryTag = true;\r\n @Input() previewEndpoint?: string; // Endpoint personalizado para preview (ej: materials/image)\r\n /** Ancho máximo en px para imágenes (opcional). Si no se envía, se conserva el tamaño original. */\r\n @Input() imageMaxWidth?: number;\r\n /** Altura máxima en px para imágenes (opcional). Si no se envía, no se limita. */\r\n @Input() imageMaxHeight?: number;\r\n\r\n // ============================================================================\r\n // DISABLED STATE (Estado deshabilitado)\r\n // ============================================================================\r\n @HostBinding('class.IsDisable') get hostDisabledClass(): boolean {\r\n return this.isDisabled;\r\n }\r\n @Input() set disabled(value: boolean) {\r\n this.isDisabled = value;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // VIEW CHILDREN (View Children)\r\n // ============================================================================\r\n @ViewChild('uploadForm', { static: false })\r\n uploadFormRef?: ElementRef<HTMLFormElement>;\r\n @ViewChild('sortableContainer', { static: false })\r\n sortableContainer?: ElementRef;\r\n\r\n // ============================================================================\r\n // INTERNAL STATE (Estado interno del componente)\r\n // ============================================================================\r\n private sortableInstance?: Sortable;\r\n private sortableInitialized = false;\r\n\r\n pending: FileInfo[] = [];\r\n uploaded: FileInfo[] = [];\r\n failed: FileInfo[] = [];\r\n loading = false;\r\n isDisabled = false;\r\n\r\n // Drag and drop\r\n private dragCounter = 0;\r\n isDragging = false;\r\n\r\n // ============================================================================\r\n // COMPUTED PROPERTIES (Propiedades computadas)\r\n // ============================================================================\r\n get isImageMode(): boolean {\r\n return this.mode === 'image' || this.mode === 'card';\r\n }\r\n\r\n get isFileMode(): boolean {\r\n return this.mode === 'file';\r\n }\r\n\r\n get isCardMode(): boolean {\r\n return this.mode === 'card';\r\n }\r\n\r\n get isCardsDisplay(): boolean {\r\n return this.display === 'cards';\r\n }\r\n\r\n get isItemsDisplay(): boolean {\r\n return this.display === 'items';\r\n }\r\n\r\n get defaultTypes(): string[] {\r\n if (this.isImageMode) {\r\n // Solo tipos de imagen para modo imagen\r\n return [\r\n 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp', 'image/gif',\r\n 'image/bmp', 'image/x-ms-bmp', 'image/svg+xml', 'image/tiff', 'image/x-tiff',\r\n 'image/x-icon', 'image/vnd.microsoft.icon', 'image/heic', 'image/heif',\r\n 'image/avif', 'image/x-portable-pixmap', 'image/x-portable-graymap', 'image/x-portable-bitmap',\r\n ];\r\n }\r\n // Para file mode: todos los tipos de archivo no peligrosos\r\n return [\r\n // Imágenes\r\n 'image/jpeg', 'image/pjpeg', 'image/png', 'image/webp', 'image/gif',\r\n 'image/bmp', 'image/x-ms-bmp', 'image/svg+xml', 'image/tiff', 'image/x-tiff',\r\n 'image/x-icon', 'image/vnd.microsoft.icon', 'image/heic', 'image/heif',\r\n 'image/x-portable-pixmap', 'image/x-portable-graymap', 'image/x-portable-bitmap',\r\n // Videos\r\n 'video/mp4', 'video/x-m4v', 'video/webm', 'video/ogg', 'video/quicktime',\r\n 'video/x-msvideo', 'video/x-ms-wmv', 'video/x-matroska', 'video/x-flv',\r\n 'video/3gpp', 'video/3gpp2', 'video/x-ms-asf',\r\n // Audio\r\n 'audio/mpeg', 'audio/mp3', 'audio/x-mpeg', 'audio/x-mp3', 'audio/wav', 'audio/x-wav',\r\n 'audio/ogg', 'audio/aac', 'audio/flac', 'audio/x-flac', 'audio/x-ms-wma',\r\n 'audio/webm', 'audio/opus', 'audio/mp4', 'audio/x-m4a',\r\n // Documentos PDF y Office\r\n 'application/pdf',\r\n 'application/msword', 'application/doc',\r\n 'application/vnd.ms-excel', 'application/xls', 'application/x-msexcel',\r\n 'application/vnd.ms-powerpoint', 'application/mspowerpoint',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n // OpenDocument\r\n 'application/vnd.oasis.opendocument.text',\r\n 'application/vnd.oasis.opendocument.spreadsheet',\r\n 'application/vnd.oasis.opendocument.presentation',\r\n 'application/vnd.oasis.opendocument.graphics',\r\n // Texto y código\r\n 'text/plain', 'text/rtf', 'text/html', 'text/xhtml', 'text/css',\r\n 'text/javascript', 'application/javascript', 'application/json',\r\n 'application/xml', 'text/xml', 'text/csv', 'text/markdown',\r\n // Archivos comprimidos\r\n 'application/zip', 'application/x-zip-compressed', 'application/x-zip',\r\n 'multipart/x-zip', 'application/x-rar-compressed', 'application/vnd.rar',\r\n 'application/x-rar', 'application/x-7z-compressed', 'application/x-7z',\r\n 'application/x-tar', 'application/gzip', 'application/x-gzip',\r\n 'application/x-bzip2', 'application/x-bzip', 'application/x-compress',\r\n 'application/x-compressed',\r\n // Fuentes\r\n 'font/ttf', 'font/otf', 'font/woff', 'font/woff2', 'application/font-woff',\r\n 'application/font-woff2', 'application/vnd.ms-fontobject', 'font/eot',\r\n // eBooks\r\n 'application/epub+zip', 'application/x-mobipocket-ebook',\r\n // Otros seguros\r\n 'application/rtf', 'application/x-rtf',\r\n ];\r\n }\r\n\r\n get defaultExtensions(): string[] {\r\n if (this.isImageMode) {\r\n // Solo extensiones de imagen para modo imagen\r\n return ['jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'svg', 'tiff', 'ico', 'heic', 'heif', 'avif', 'ppm', 'pgm', 'pbm'];\r\n }\r\n // Para file mode: todas las extensiones no peligrosas\r\n return [\r\n // Imágenes\r\n 'jpg', 'jpeg', 'png', 'webp', 'gif', 'bmp', 'svg', 'tiff', 'ico', 'heic', 'heif', 'ppm', 'pgm', 'pbm',\r\n // Videos\r\n 'mp4', 'm4v', 'webm', 'ogg', 'mov', 'avi', 'wmv', 'mkv', 'flv', '3gp', '3g2', 'asf',\r\n // Audio\r\n 'mp3', 'wav', 'ogg', 'aac', 'flac', 'wma', 'opus', 'm4a',\r\n // Documentos\r\n 'pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp', 'odg',\r\n // Texto y código\r\n 'txt', 'rtf', 'html', 'htm', 'css', 'js', 'json', 'xml', 'csv', 'md',\r\n // Archivos comprimidos\r\n 'zip', 'rar', '7z', 'tar', 'gz', 'bz2', 'bz', 'z', 'xz',\r\n // Fuentes\r\n 'ttf', 'otf', 'woff', 'woff2', 'eot',\r\n // eBooks\r\n 'epub', 'mobi',\r\n ];\r\n }\r\n\r\n get effectiveTypes(): string[] {\r\n return this.types.length > 0 ? this.types : this.defaultTypes;\r\n }\r\n\r\n get effectiveExtensions(): string[] {\r\n return this.extensions.length > 0 ? this.extensions : this.defaultExtensions;\r\n }\r\n\r\n get allowedTypesText(): string {\r\n return this.effectiveExtensions.join(\", \");\r\n }\r\n\r\n get maxSizeText(): string {\r\n if (!this.maxSize) return '';\r\n return this.maxSize.toFixed(2) + ' MB';\r\n }\r\n\r\n // ============================================================================\r\n // CICLO DE VIDA (Life Cycle)\r\n // ============================================================================\r\n ngAfterViewInit(): void {}\r\n\r\n ngAfterViewChecked(): void {\r\n // INIT DRAG SORTABLE\r\n if (\r\n this.sortable &&\r\n this.sortableContainer &&\r\n !this.sortableInitialized &&\r\n this.uploaded.length > 1\r\n ) {\r\n this.sortableInstance = Sortable.create(\r\n this.sortableContainer.nativeElement,\r\n {\r\n animation: 150,\r\n ghostClass: 'ActiveDragItem',\r\n filter: 'img',\r\n preventOnFilter: false,\r\n onEnd: () => this.reorderUploadedFromDOM(),\r\n }\r\n );\r\n this.sortableInitialized = true;\r\n }\r\n\r\n // REMOVE DRAG WHEN EMPTY\r\n if (!this.uploaded.length && this.sortableInitialized) {\r\n this.sortableInstance?.destroy();\r\n this.sortableInstance = undefined;\r\n this.sortableInitialized = false;\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // CONTROL VALUE ACCESSOR (Controlador de valor)\r\n // ============================================================================\r\n private onChange: (value: string[] | string | null) => void = () => {};\r\n private onTouched: () => void = () => {};\r\n\r\n writeValue(value: string[] | string | null): void {\r\n const isEmpty =\r\n value == null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0);\r\n if (isEmpty) {\r\n this.uploaded = [];\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n const urls = Array.isArray(value) ? value : [value];\r\n this.uploaded = urls.map((url) => {\r\n // url contiene el hash encriptado o una URL completa\r\n const fileName = this.extractFileName(url);\r\n const fileType = this.getMimeTypeFromFileName(fileName);\r\n\r\n const fileInfo: FileInfo = {\r\n name: fileName,\r\n size: 0,\r\n progress: 100,\r\n status: 'success' as const,\r\n type: fileType, // Determinar tipo desde la extensión\r\n url, // Hash encriptado o URL completa\r\n urlEncrypted: url,\r\n };\r\n\r\n // Obtener el tamaño del archivo de forma asíncrona\r\n this.fetchFileSize(fileInfo);\r\n\r\n return fileInfo;\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Obtiene el tamaño del archivo con HEAD. En modo imagen con hash usa CDN (Cloudflare).\r\n */\r\n private async fetchFileSize(fileInfo: FileInfo): Promise<void> {\r\n try {\r\n const fileUrl = this.getFileUrl(fileInfo);\r\n if (!fileUrl) return;\r\n\r\n if (fileUrl.startsWith('http://') || fileUrl.startsWith('https://')) return;\r\n\r\n let urlToHead: string;\r\n if (this.mode === 'image') {\r\n urlToHead = await this.mediaPreview.resolveImageUrlForMetadata(fileUrl);\r\n if (!urlToHead) return;\r\n } else {\r\n urlToHead = this.buildPreviewUrl(fileUrl);\r\n }\r\n\r\n const response = await fetch(urlToHead, { method: 'HEAD' });\r\n if (response.ok) {\r\n const contentLength = response.headers.get('Content-Length');\r\n if (contentLength) {\r\n const size = parseInt(contentLength, 10);\r\n if (!isNaN(size) && size > 0) {\r\n fileInfo.size = size;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('No se pudo obtener el tamaño del archivo:', error);\r\n }\r\n }\r\n\r\n /**\r\n * Obtiene la URL de preview para mostrar la imagen.\r\n * En modo imagen, si url es un hash encriptado, resuelve la URL desde el CDN (Cloudflare).\r\n * Si no, usa el endpoint de preview del backend.\r\n */\r\n getPreviewUrl(url: string | undefined): string | undefined {\r\n if (!url) return undefined;\r\n\r\n if (url.startsWith('http://') || url.startsWith('https://') || url.startsWith('data:')) {\r\n return url;\r\n }\r\n\r\n // Modo imagen: hash / uploads / URL absoluta (schedule llena caché y dispara CD).\r\n if (this.mode === 'image') {\r\n const resolved = this.mediaPreview.scheduleBackendImageDisplayUrl(\r\n url,\r\n this.backendPreviewImgState,\r\n () => this.cdr.markForCheck()\r\n );\r\n return resolved || undefined;\r\n }\r\n\r\n return this.buildPreviewUrl(url);\r\n }\r\n\r\n /**\r\n * Obtiene la URL a usar para preview (prioriza urlEncrypted, luego url)\r\n */\r\n private getFileUrl(fileInfo: FileInfo): string | undefined {\r\n return fileInfo.urlEncrypted || fileInfo.url;\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.isDisabled = isDisabled;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // MANEJO DE ARCHIVOS (Manejo de archivos)\r\n // ============================================================================\r\n async onFileInput(event: Event): Promise<void> {\r\n const input = event.target as HTMLInputElement;\r\n const selectedFiles = Array.from(input.files || []);\r\n input.value = '';\r\n\r\n // Límite de cantidad de archivos\r\n if (this.maxItems) {\r\n const total =\r\n this.uploaded.length + this.pending.length + selectedFiles.length;\r\n const exceso = total - this.maxItems;\r\n\r\n if (exceso > 0) {\r\n const omitidos = selectedFiles.splice(\r\n selectedFiles.length - exceso,\r\n exceso\r\n );\r\n\r\n for (const file of omitidos) {\r\n const fileInfo: FileInfo = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: 0,\r\n status: 'error',\r\n error: `Se excede el límite de ${this.maxItems} ${this.isImageMode ? 'imágenes' : 'archivos'}.`,\r\n };\r\n this.failed.push(fileInfo);\r\n }\r\n\r\n this.loading = false;\r\n this.showStatusMessage(\r\n `Se omitieron ${exceso} ${this.isImageMode ? 'imagen(es)' : 'archivo(s)'} porque superan el máximo permitido (${this.maxItems}).`\r\n );\r\n }\r\n }\r\n\r\n // Límite de tamaño total (acumulado)\r\n if (this.maxSize) {\r\n const maxTotalSize = this.maxSize * 1024 * 1024;\r\n let accumulatedSize = this.uploaded.reduce((sum, f) => sum + f.size, 0);\r\n\r\n const validFiles: File[] = [];\r\n\r\n for (const file of selectedFiles) {\r\n if (accumulatedSize + file.size <= maxTotalSize) {\r\n validFiles.push(file);\r\n accumulatedSize += file.size;\r\n } else {\r\n const fileInfo: FileInfo = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: 0,\r\n status: 'error',\r\n error: `Supera el límite de tamaño (${this.maxSize} MB).`,\r\n };\r\n this.failed.push(fileInfo);\r\n this.showStatusMessage(\r\n `El archivo \"${file.name}\" fue omitido porque excede el límite total de ${this.maxSize} MB.`\r\n );\r\n }\r\n }\r\n\r\n this.loading = false;\r\n selectedFiles.length = 0;\r\n selectedFiles.push(...validFiles);\r\n }\r\n\r\n if (!selectedFiles.length) return;\r\n\r\n this.loading = true;\r\n this.cdr.markForCheck();\r\n\r\n // Verificar duplicados\r\n const existingKeys = new Set(\r\n [...this.uploaded, ...this.pending].map((f) => `${f.name}_${f.size}`)\r\n );\r\n\r\n const uniqueFiles: File[] = [];\r\n const duplicatedFiles: File[] = [];\r\n\r\n for (const file of selectedFiles) {\r\n const key = `${file.name}_${file.size}`;\r\n if (existingKeys.has(key)) {\r\n duplicatedFiles.push(file);\r\n } else {\r\n uniqueFiles.push(file);\r\n }\r\n }\r\n\r\n // Archivos duplicados se van a \"failed\"\r\n for (const file of duplicatedFiles) {\r\n const fileInfo: FileInfo = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: 0,\r\n status: 'error',\r\n error: 'Archivo duplicado',\r\n };\r\n this.failed.push(fileInfo);\r\n }\r\n\r\n this.loading = false;\r\n\r\n if (duplicatedFiles.length > 0) {\r\n this.showStatusMessage(\r\n `${duplicatedFiles.length} archivo(s) ya estaban seleccionados.`\r\n );\r\n }\r\n\r\n if (!uniqueFiles.length) return;\r\n\r\n // Procesar archivos únicos\r\n for (const file of uniqueFiles) {\r\n const fileInfo: FileInfo = {\r\n name: file.name,\r\n size: file.size,\r\n type: file.type,\r\n progress: 0,\r\n status: 'loading',\r\n };\r\n\r\n this.pending.push(fileInfo);\r\n\r\n // Validar imagen si es modo image/card\r\n if (this.isImageMode) {\r\n const fileExtension = file.name.split('.').pop()?.toLowerCase() || '';\r\n // Verificar tipo MIME o extensión primero (algunos navegadores no detectan correctamente el MIME type de AVIF)\r\n const hasValidType = this.effectiveTypes.includes(file.type) ||\r\n this.effectiveExtensions.includes(fileExtension);\r\n\r\n if (!hasValidType) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = 'Tipo de archivo no permitido';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`\"${file.name}\" tiene un tipo no permitido.`);\r\n continue;\r\n }\r\n\r\n // Para AVIF, si tiene la extensión correcta, confiar en ella (algunos AVIF pueden no pasar la validación de magic headers)\r\n if (fileExtension === 'avif' && this.effectiveExtensions.includes('avif')) {\r\n // AVIF válido por extensión, continuar sin validar magic headers\r\n } else {\r\n // Para otros formatos, validar magic headers\r\n const isValid = await this.validateImageFile(file);\r\n if (!isValid) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = 'Archivo no válido o corrupto';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`\"${file.name}\" no es una imagen válida.`);\r\n continue;\r\n }\r\n }\r\n } else {\r\n // Para file mode, validar tipo\r\n if (!this.effectiveTypes.includes(file.type)) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = 'Tipo de archivo no permitido';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`\"${file.name}\" tiene un tipo no permitido.`);\r\n continue;\r\n }\r\n }\r\n\r\n // El componente siempre requiere endpointUpload (no hay modo local)\r\n if (!this.endpointUpload) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = 'Se requiere una URL de subida (endpointUpload)';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`\"${file.name}\": se requiere una URL de subida.`);\r\n continue;\r\n }\r\n\r\n // Guardar referencia al archivo para el proceso de chunks\r\n fileInfo.file = file;\r\n fileInfo.chunkNumber = 0;\r\n fileInfo.uploadedBytes = 0;\r\n\r\n // Iniciar subida por chunks\r\n this.uploadFileByChunks(file, fileInfo);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Sube un archivo por chunks usando binarios (multipart/form-data) con ping-pong\r\n */\r\n private async uploadFileByChunks(file: File, fileInfo: FileInfo): Promise<void> {\r\n const chunkSizeBytes = this.chunkSizeMB * 1024 * 1024; // Convertir MB a bytes\r\n const totalChunks = Math.ceil(file.size / chunkSizeBytes);\r\n let currentChunk = 0;\r\n\r\n try {\r\n while (currentChunk < totalChunks) {\r\n currentChunk++;\r\n fileInfo.chunkNumber = currentChunk;\r\n\r\n // Calcular posición del chunk\r\n const start = (currentChunk - 1) * chunkSizeBytes;\r\n const end = Math.min(start + chunkSizeBytes, file.size);\r\n const chunk = file.slice(start, end);\r\n const isLastChunk = currentChunk === totalChunks;\r\n if (isLastChunk) {\r\n fileInfo.phase = 'processing';\r\n fileInfo.progress = 100;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // Si no es el primer chunk, verificar que tenemos la URL encriptada (ping-pong)\r\n if (currentChunk > 1) {\r\n if (!fileInfo.urlEncrypted) {\r\n console.error('media-entry: ERROR - No se encontró URL encriptada para chunk subsecuente', {\r\n chunkNumber: currentChunk,\r\n totalChunks: totalChunks,\r\n urlEncrypted: fileInfo.urlEncrypted\r\n });\r\n throw new Error(`No se encontró la URL encriptada para el chunk ${currentChunk}. El primer chunk debe haberse completado correctamente y devolver la URL encriptada.`);\r\n }\r\n }\r\n\r\n // Enviar chunk binario al servidor (ping-pong: esperar respuesta antes de siguiente)\r\n const response = await this.sendChunkBinary(chunk, currentChunk, chunk.size, file.name, file.size, file.type, isLastChunk, fileInfo.urlEncrypted);\r\n\r\n if (response.status === 'error') {\r\n throw new Error(response.message || 'Error del servidor');\r\n }\r\n\r\n // Guardar/actualizar URL encriptada de la respuesta (ping-pong)\r\n // El backend devuelve 'url' en todos los chunks para mantener la consistencia\r\n if (response.url) {\r\n fileInfo.urlEncrypted = response.url;\r\n\r\n // Evitar logs por chunk (pueden degradar el rendimiento en archivos grandes)\r\n } else if (currentChunk > 1 && !fileInfo.urlEncrypted) {\r\n // Si no hay URL en la respuesta y no tenemos una guardada, es un error\r\n throw new Error(`No se recibió la URL encriptada en la respuesta del chunk ${currentChunk}`);\r\n }\r\n\r\n\r\n // Actualizar progreso en tiempo real\r\n if (response.uploadedBytes !== undefined && response.totalSize !== undefined) {\r\n fileInfo.uploadedBytes = response.uploadedBytes;\r\n fileInfo.progress = response.progress || Math.round((response.uploadedBytes / response.totalSize) * 100);\r\n } else {\r\n // Calcular progreso manualmente si el servidor no lo proporciona\r\n fileInfo.uploadedBytes = end;\r\n fileInfo.progress = Math.round((end / file.size) * 100);\r\n }\r\n\r\n this.cdr.markForCheck();\r\n\r\n // Si es el último chunk, finalizar\r\n if (isLastChunk) {\r\n // Desde aquí el backend puede responder:\r\n // - status=queued: el archivo ya está completo pero falta procesar + sync a Cloudflare\r\n // - status=success: (legacy) ya está listo\r\n if (response.status === 'queued' && response.uploadId) {\r\n fileInfo.phase = 'processing';\r\n fileInfo.status = 'loading';\r\n fileInfo.progress = 100;\r\n this.cdr.markForCheck();\r\n\r\n await this.pollUploadDone(String(response.uploadId), fileInfo);\r\n break;\r\n }\r\n\r\n fileInfo.status = 'success';\r\n if (response.url) {\r\n fileInfo.url = response.url;\r\n fileInfo.urlEncrypted = response.url;\r\n }\r\n this.moveToUploaded(fileInfo);\r\n break;\r\n }\r\n }\r\n } catch (error: any) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = error.message || 'Error al subir el archivo';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`Error al subir \"${file.name}\": ${error.message || 'Error desconocido'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Espera hasta que el backend termine procesamiento + sync a Cloudflare y devuelva el hash final.\r\n * Mientras tanto, mantiene el item en \"pending\" (phase=processing).\r\n */\r\n private async pollUploadDone(uploadId: string, fileInfo: FileInfo): Promise<void> {\r\n const maxMs = 20 * 60 * 1000; // 20 min\r\n const started = Date.now();\r\n let waitMs = 750;\r\n\r\n while (Date.now() - started < maxMs) {\r\n try {\r\n const resp = await fetch(`${this.inputsConfig.apiUrl}/upload/status/${encodeURIComponent(uploadId)}`, {\r\n headers: this.inputsConfig.getAuthToken()\r\n ? { Authorization: `Bearer ${this.inputsConfig.getAuthToken()}` }\r\n : undefined,\r\n });\r\n\r\n if (resp.ok) {\r\n const data = await resp.json();\r\n if (data.status === 'done' && data.finalHashPath) {\r\n fileInfo.status = 'success';\r\n fileInfo.url = data.finalHashPath;\r\n fileInfo.urlEncrypted = data.finalHashPath;\r\n fileInfo.phase = undefined;\r\n fileInfo.progress = 100;\r\n this.moveToUploaded(fileInfo);\r\n return;\r\n }\r\n if (data.status === 'error') {\r\n throw new Error(data.error || 'Error procesando el archivo');\r\n }\r\n }\r\n } catch (e: any) {\r\n fileInfo.status = 'error';\r\n fileInfo.error = e?.message || 'Error procesando el archivo';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`Error al procesar \"${fileInfo.name}\": ${fileInfo.error}`);\r\n return;\r\n }\r\n\r\n await new Promise((r) => setTimeout(r, waitMs));\r\n waitMs = Math.min(5000, Math.round(waitMs * 1.25));\r\n }\r\n\r\n fileInfo.status = 'error';\r\n fileInfo.error = 'Tiempo de espera agotado esperando procesamiento/sincronización';\r\n this.moveToFailed(fileInfo);\r\n this.showStatusMessage(`Timeout procesando \"${fileInfo.name}\"`);\r\n }\r\n\r\n /**\r\n * Envía un chunk binario al servidor mediante POST multipart/form-data (ping-pong).\r\n * Todas las subidas (imágenes, vídeos, documentos) usan este flujo por fragmentos binarios.\r\n */\r\n private async sendChunkBinary(\r\n chunk: Blob,\r\n chunkNumber: number,\r\n chunkSize: number,\r\n fileName: string,\r\n fileSize: number,\r\n fileType: string,\r\n isLastChunk: boolean,\r\n urlEncrypted?: string\r\n ): Promise<any> {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open('POST', this.inputsConfig.apiUrl + this.endpointUpload!, true);\r\n\r\n // Obtener token de autenticación y enviarlo en el header Authorization\r\n const token = this.inputsConfig.getAuthToken();\r\n if (token) {\r\n xhr.setRequestHeader('Authorization', `Bearer ${token}`);\r\n }\r\n\r\n // Crear FormData para enviar chunk binario\r\n const formData = new FormData();\r\n formData.append('chunk', chunk, `chunk_${chunkNumber}`);\r\n formData.append('chunkNumber', chunkNumber.toString());\r\n formData.append('chunkSize', chunkSize.toString());\r\n formData.append('fileName', fileName);\r\n formData.append('fileSize', fileSize.toString());\r\n formData.append('fileType', fileType);\r\n formData.append('end', isLastChunk.toString());\r\n\r\n // Si no es el primer chunk, agregar la URL encriptada\r\n if (chunkNumber > 1 && urlEncrypted) {\r\n formData.append('url', urlEncrypted);\r\n }\r\n\r\n // Parámetros opcionales de imagen (resolución máxima); solo aplican en modo imagen\r\n if (this.isImageMode) {\r\n if (this.imageMaxWidth != null) {\r\n formData.append('image_max_width', String(this.imageMaxWidth));\r\n }\r\n if (this.imageMaxHeight != null) {\r\n formData.append('image_max_height', String(this.imageMaxHeight));\r\n }\r\n }\r\n\r\n // Trackear progreso de subida en tiempo real\r\n xhr.upload.onprogress = (event) => {\r\n if (event.lengthComputable) {\r\n // Calcular progreso total considerando chunks anteriores\r\n const totalUploaded = (chunkNumber - 1) * this.chunkSizeMB * 1024 * 1024 + event.loaded;\r\n const totalProgress = Math.min(100, Math.round((totalUploaded / fileSize) * 100));\r\n\r\n // Actualizar progreso del archivo\r\n const fileInfo = this.pending.find(f => f.chunkNumber === chunkNumber) ||\r\n this.uploaded.find(f => f.chunkNumber === chunkNumber);\r\n if (fileInfo) {\r\n fileInfo.progress = totalProgress;\r\n fileInfo.uploadedBytes = totalUploaded;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n try {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n const response = JSON.parse(xhr.responseText);\r\n resolve(response);\r\n } else {\r\n try {\r\n const errorResponse = JSON.parse(xhr.responseText);\r\n reject(new Error(errorResponse.message || `Error HTTP ${xhr.status}`));\r\n } catch {\r\n reject(new Error(`Error HTTP ${xhr.status}: ${xhr.statusText}`));\r\n }\r\n }\r\n } catch (error: any) {\r\n reject(new Error('Respuesta inválida del servidor: ' + error.message));\r\n }\r\n };\r\n\r\n // Timeout más largo para el último chunk (puede requerir conversión)\r\n const timeoutMs = isLastChunk ? 300000 : 60000; // 5 min para último, 1 min para otros\r\n xhr.timeout = timeoutMs;\r\n xhr.ontimeout = () => {\r\n reject(new Error('Tiempo de espera agotado'));\r\n };\r\n\r\n xhr.onerror = () => {\r\n reject(new Error('Error de conexión'));\r\n };\r\n\r\n xhr.send(formData);\r\n });\r\n }\r\n\r\n\r\n private validateImageFile(file: File): Promise<boolean> {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n const buffer = new Uint8Array(reader.result as ArrayBuffer);\r\n const hex = buffer\r\n .slice(0, 4)\r\n .reduce((acc, val) => acc + val.toString(16).padStart(2, '0'), '');\r\n\r\n const isWebP =\r\n buffer.length >= 12 &&\r\n hex === '52494646' &&\r\n String.fromCharCode(...buffer.slice(8, 12)) === 'WEBP';\r\n\r\n // Validar AVIF: busca \"ftyp\" seguido de \"avif\" o \"avis\"\r\n // AVIF usa formato ISO Base Media (similar a MP4)\r\n // Los primeros 4 bytes son el tamaño del box, luego \"ftyp\", luego el brand\r\n let isAVIF = false;\r\n if (buffer.length >= 32) {\r\n // Buscar \"ftyp\" en diferentes posiciones posibles\r\n for (let i = 0; i <= buffer.length - 12; i++) {\r\n if (i + 8 <= buffer.length) {\r\n const ftyp = String.fromCharCode(...buffer.slice(i, i + 4));\r\n if (ftyp === 'ftyp' && i + 12 <= buffer.length) {\r\n const brand = String.fromCharCode(...buffer.slice(i + 4, i + 8));\r\n if (brand === 'avif' || brand === 'avis') {\r\n isAVIF = true;\r\n break;\r\n }\r\n // También verificar en la posición siguiente (algunos AVIF tienen estructura diferente)\r\n if (i + 16 <= buffer.length) {\r\n const brand2 = String.fromCharCode(...buffer.slice(i + 8, i + 12));\r\n if (brand2 === 'avif' || brand2 === 'avis') {\r\n isAVIF = true;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Si no se detectó por magic headers pero tiene extensión .avif, confiar en la extensión\r\n const fileExtension = file.name.split('.').pop()?.toLowerCase() || '';\r\n if (!isAVIF && fileExtension === 'avif') {\r\n isAVIF = true;\r\n }\r\n\r\n const valid =\r\n IMAGE_MAGIC_HEADERS.some((h) => hex.startsWith(h)) || isWebP || isAVIF;\r\n resolve(valid);\r\n };\r\n // Leer más bytes para AVIF (necesita al menos 32 bytes para detectar correctamente)\r\n reader.readAsArrayBuffer(file.slice(0, 32));\r\n });\r\n }\r\n\r\n private extractFileName(url: string): string {\r\n try {\r\n const defaultName = this.isImageMode ? 'imagen' : 'archivo';\r\n return decodeURIComponent(url.split('/').pop() || defaultName);\r\n } catch {\r\n return this.isImageMode ? 'imagen' : 'archivo';\r\n }\r\n }\r\n\r\n /**\r\n * Determina el tipo MIME basándose en la extensión del archivo\r\n */\r\n private getMimeTypeFromFileName(fileName: string): string | undefined {\r\n if (!fileName) return undefined;\r\n\r\n const extension = fileName.split('.').pop()?.toLowerCase();\r\n if (!extension) return undefined;\r\n\r\n const mimeMap: Record<string, string> = {\r\n // Imágenes\r\n 'jpg': 'image/jpeg',\r\n 'jpeg': 'image/jpeg',\r\n 'png': 'image/png',\r\n 'webp': 'image/webp',\r\n 'gif': 'image/gif',\r\n 'bmp': 'image/bmp',\r\n 'svg': 'image/svg+xml',\r\n 'tiff': 'image/tiff',\r\n 'ico': 'image/x-icon',\r\n 'heic': 'image/heic',\r\n 'heif': 'image/heif',\r\n 'avif': 'image/avif',\r\n // Videos\r\n 'mp4': 'video/mp4',\r\n 'm4v': 'video/x-m4v',\r\n 'webm': 'video/webm',\r\n 'ogg': 'video/ogg',\r\n 'mov': 'video/quicktime',\r\n 'avi': 'video/x-msvideo',\r\n 'wmv': 'video/x-ms-wmv',\r\n 'mkv': 'video/x-matroska',\r\n 'flv': 'video/x-flv',\r\n '3gp': 'video/3gpp',\r\n // Audio\r\n 'mp3': 'audio/mpeg',\r\n 'wav': 'audio/wav',\r\n 'aac': 'audio/aac',\r\n 'flac': 'audio/flac',\r\n 'wma': 'audio/x-ms-wma',\r\n 'opus': 'audio/opus',\r\n 'm4a': 'audio/mp4',\r\n // Documentos\r\n 'pdf': 'application/pdf',\r\n 'doc': 'application/msword',\r\n 'docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'xls': 'application/vnd.ms-excel',\r\n 'xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'ppt': 'application/vnd.ms-powerpoint',\r\n 'pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'odt': 'application/vnd.oasis.opendocument.text',\r\n 'ods': 'application/vnd.oasis.opendocument.spreadsheet',\r\n 'odp': 'application/vnd.oasis.opendocument.presentation',\r\n 'rtf': 'text/rtf',\r\n // Texto y código\r\n 'txt': 'text/plain',\r\n 'html': 'text/html',\r\n 'htm': 'text/html',\r\n 'css': 'text/css',\r\n 'js': 'application/javascript',\r\n 'json': 'application/json',\r\n 'xml': 'application/xml',\r\n 'csv': 'text/csv',\r\n 'md': 'text/markdown',\r\n // Archivos comprimidos\r\n 'zip': 'application/zip',\r\n 'rar': 'application/x-rar-compressed',\r\n '7z': 'application/x-7z-compressed',\r\n 'tar': 'application/x-tar',\r\n 'gz': 'application/gzip',\r\n // Fuentes\r\n 'ttf': 'font/ttf',\r\n 'otf': 'font/otf',\r\n 'woff': 'font/woff',\r\n 'woff2': 'font/woff2',\r\n };\r\n\r\n return mimeMap[extension];\r\n }\r\n\r\n\r\n /**\r\n * Construye la URL de preview completa usando el endpoint unificado\r\n * encryptedHash es el finalUrl (urlEncrypted)\r\n *\r\n * Inserta \"sdz673fuf7348_sf4\" después de los primeros 10 caracteres del hash\r\n * para que el backend pueda identificarlo y extraer el hash original\r\n */\r\n private buildPreviewUrl(finalUrl: string): string {\r\n // Insertar \"sdz673fuf7348_sf4\" después de los primeros 10 caracteres\r\n const marker = 'sdz673fuf7348_sf4';\r\n const modifiedHash = finalUrl.length > 10\r\n ? finalUrl.substring(0, 10) + marker + finalUrl.substring(10)\r\n : finalUrl;\r\n\r\n // Usar el endpoint unificado: /preview/all/{encryptedHash}\r\n return `${this.inputsConfig.apiUrl}/preview/all/${modifiedHash}`;\r\n }\r\n\r\n /**\r\n * Abre el preview del archivo mediante `MediaViewerService` (UI en `media-viewer-service`).\r\n * En modo imagen con hash resuelve la URL desde el CDN (Cloudflare) antes de abrir.\r\n */\r\n async openGeneralMediaPreview(fileInfo: FileInfo): Promise<void> {\r\n try {\r\n const fileUrl = this.getFileUrl(fileInfo);\r\n if (!fileUrl) {\r\n this.showStatusMessage('No se pudo obtener la URL del archivo para previsualizar');\r\n return;\r\n }\r\n\r\n let previewUrlResult: string | undefined;\r\n const isImageHash = !fileUrl.startsWith('http') && !fileUrl.startsWith('data:');\r\n const useCdnForImage = isImageHash && (this.mode === 'image' || fileInfo.type?.startsWith('image/'));\r\n\r\n if (useCdnForImage) {\r\n previewUrlResult = await this.mediaPreview.resolveImageUrlForMetadata(fileUrl);\r\n } else {\r\n previewUrlResult = this.getPreviewUrl(fileUrl) ?? undefined;\r\n }\r\n\r\n if (!previewUrlResult) {\r\n this.showStatusMessage('No se pudo construir la URL de preview');\r\n return;\r\n }\r\n\r\n let previewType = fileInfo.type || '';\r\n const previewName = fileInfo.name;\r\n\r\n if (!previewType && previewName) {\r\n previewType = this.getMimeTypeFromFileName(previewName) || '';\r\n }\r\n\r\n let previewUrlSafe: SafeResourceUrl | null = null;\r\n if (previewUrlResult) {\r\n if (this.shouldUseIframe(previewType, previewName)) {\r\n const isPdf =\r\n previewType?.includes('pdf') || previewName?.toLowerCase().endsWith('.pdf');\r\n if (isPdf) {\r\n previewUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n previewUrlResult + '#toolbar=0&navpanes=0&scrollbar=1&zoom=100&view=FitH'\r\n );\r\n } else {\r\n previewUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(previewUrlResult);\r\n }\r\n } else {\r\n previewUrlSafe = this.sanitizer.bypassSecurityTrustResourceUrl(previewUrlResult);\r\n }\r\n }\r\n\r\n const mode = this.viewerModeFor(previewType, previewName);\r\n this.generalMediaViewer.open({\r\n mode,\r\n url: previewUrlResult,\r\n urlSafe: previewUrlSafe,\r\n downloadUrl: mode === 'download' ? previewUrlResult : null,\r\n fileName: previewName || 'Archivo',\r\n });\r\n this.cdr.markForCheck();\r\n } catch (error: any) {\r\n this.showStatusMessage(`Error al abrir el preview: ${error.message || 'Error desconocido'}`);\r\n }\r\n }\r\n\r\n /**\r\n * Determina si el archivo se puede previsualizar en el navegador\r\n * El backend maneja todo, así que solo verificamos si tenemos tipo o nombre\r\n */\r\n canPreview(fileType?: string | null, fileName?: string | null): boolean {\r\n // Si tenemos tipo o nombre, el backend puede servir el archivo\r\n return !!(fileType || fileName);\r\n }\r\n\r\n private viewerModeFor(\r\n fileType?: string | null,\r\n fileName?: string | null\r\n ): GeneralViewerMode {\r\n if (fileType?.startsWith('image/')) return 'image';\r\n if (fileType?.startsWith('video/')) return 'video';\r\n if (fileType?.startsWith('audio/')) return 'audio';\r\n if (this.shouldUseIframe(fileType, fileName)) return 'document';\r\n return 'download';\r\n }\r\n\r\n /**\r\n * Determina si el archivo debe mostrarse en iframe (PDFs y documentos)\r\n * El backend sirve estos archivos directamente, así que usamos iframe para PDFs y documentos Office\r\n */\r\n shouldUseIframe(fileType?: string | null, fileName?: string | null): boolean {\r\n if (!fileType && !fileName) return false;\r\n\r\n const type = fileType?.toLowerCase() || '';\r\n const extension = fileName ? fileName.split('.').pop()?.toLowerCase() : '';\r\n\r\n // PDFs y documentos de Office - el backend los sirve directamente\r\n return type.includes('pdf') ||\r\n type.includes('document') ||\r\n type.includes('msword') ||\r\n type.includes('excel') ||\r\n type.includes('powerpoint') ||\r\n ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'odt', 'ods', 'odp'].includes(extension || '');\r\n }\r\n\r\n // ============================================================================\r\n // MANEJO DE ESTADO (Manejo de estado)\r\n // ============================================================================\r\n private moveToUploaded(fileInfo: FileInfo): void {\r\n this.pending = this.pending.filter((f) => f !== fileInfo);\r\n this.uploaded.push(fileInfo);\r\n // Resolver preview una sola vez (evita promesas repetidas desde el template)\r\n const url = fileInfo.urlEncrypted || fileInfo.url;\r\n if (this.mode === 'image' && url) {\r\n this.mediaPreview.scheduleBackendImageDisplayUrl(\r\n url,\r\n this.backendPreviewImgState,\r\n () => this.cdr.markForCheck()\r\n );\r\n }\r\n this.emitValues();\r\n this.uploadFormRef?.nativeElement.reset();\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private moveToFailed(fileInfo: FileInfo): void {\r\n this.pending = this.pending.filter((f) => f !== fileInfo);\r\n this.failed.push(fileInfo);\r\n this.emitValues();\r\n this.uploadFormRef?.nativeElement.reset();\r\n this.loading = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private emitValues() {\r\n const urls = this.uploaded.map((f) => f.url!).filter(Boolean);\r\n this.onChange(this.multiple ? urls : urls[0] || null);\r\n }\r\n\r\n isAllProcessed(): boolean {\r\n return this.pending.length === 0;\r\n }\r\n\r\n isPrimary(index: number): boolean {\r\n return this.primaryTag && index === 0;\r\n }\r\n\r\n // ============================================================================\r\n // LIMPIEZA Y ELIMINACIÓN (Limpieza y eliminación - SIN SERVIDOR)\r\n // ============================================================================\r\n removeUploaded(index: number): void {\r\n this.uploaded.splice(index, 1);\r\n this.emitValues();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n removeFailed(index: number): void {\r\n this.failed.splice(index, 1);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n clearAllUploaded(): void {\r\n this.uploaded = [];\r\n this.emitValues();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n clearAllFailed(): void {\r\n this.failed = [];\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // DRAG AND DROP (Drag and drop)\r\n // ============================================================================\r\n onDragOver(event: DragEvent): void {\r\n event.preventDefault();\r\n }\r\n\r\n onDragEnter(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragCounter++;\r\n this.isDragging = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDragLeave(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragCounter--;\r\n if (this.dragCounter === 0) {\r\n this.isDragging = false;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onDrop(event: DragEvent): void {\r\n event.preventDefault();\r\n this.dragCounter = 0;\r\n this.isDragging = false;\r\n\r\n const files = event.dataTransfer?.files;\r\n if (files?.length) {\r\n const fakeEvent = { target: { files } } as unknown as Event;\r\n this.onFileInput(fakeEvent);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n // ============================================================================\r\n // MENSAJES (Mensajes)\r\n // ============================================================================\r\n statusMessage: string | null = null;\r\n statusTimeout?: any;\r\n\r\n showStatusMessage(msg: string, durationMs = 4000): void {\r\n this.statusMessage = msg;\r\n this.cdr.markForCheck();\r\n\r\n clearTimeout(this.statusTimeout);\r\n this.statusTimeout = setTimeout(() => {\r\n this.statusMessage = null;\r\n this.cdr.markForCheck();\r\n }, durationMs);\r\n }\r\n\r\n // ============================================================================\r\n // ORDENAMIENTO (Ordenamiento)\r\n // ============================================================================\r\n private reorderUploadedFromDOM(): void {\r\n if (!this.sortableContainer) return;\r\n\r\n const container = this.sortableContainer.nativeElement as HTMLElement;\r\n const selector = 'li.MediaItemDraggable';\r\n const items = Array.from(container.querySelectorAll(selector)) as HTMLElement[];\r\n\r\n const newOrder: FileInfo[] = [];\r\n\r\n for (const item of items) {\r\n const indexAttr = item.getAttribute('data-index');\r\n if (indexAttr === null) continue;\r\n const oldIndex = parseInt(indexAttr, 10);\r\n if (!isNaN(oldIndex)) {\r\n newOrder.push(this.uploaded[oldIndex]);\r\n }\r\n }\r\n\r\n if (newOrder.length === this.uploaded.length) {\r\n this.uploaded = newOrder;\r\n this.emitValues();\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n // ============================================================================\r\n // RENDER DE TIPOS DE ARCHIVOS (Solo para mode 'file')\r\n // ============================================================================\r\n getFileIcon(type: string | undefined): string {\r\n if (!type) return 'file-icons/file.png';\r\n\r\n const map: Record<string, string> = {\r\n 'image/jpeg': 'file-icons/jpeg.png',\r\n 'image/pjpeg': 'file-icons/jpeg.png',\r\n 'image/png': 'file-icons/png.png',\r\n 'image/webp': 'file-icons/webp.png',\r\n 'image/bmp': 'file-icons/img.png',\r\n 'image/x-ms-bmp': 'file-icons/img.png',\r\n 'image/gif': 'file-icons/gif.png',\r\n 'image/svg+xml': 'file-icons/svg.png',\r\n 'image/tiff': 'file-icons/tiff.png',\r\n 'image/x-tiff': 'file-icons/tiff.png',\r\n 'image/heic': 'file-icons/heic.png',\r\n 'image/heif': 'file-icons/heic.png',\r\n 'video/mp4': 'file-icons/mp4.png',\r\n 'video/x-m4v': 'file-icons/mp4.png',\r\n 'video/webm': 'file-icons/webm.png',\r\n 'video/ogg': 'file-icons/ogg.png',\r\n 'application/ogg': 'file-icons/ogg.png',\r\n 'video/quicktime': 'file-icons/mov.png',\r\n 'video/x-msvideo': 'file-icons/avi.png',\r\n 'video/x-ms-wmv': 'file-icons/wmv.png',\r\n 'audio/mpeg': 'file-icons/mp3.png',\r\n 'audio/mp3': 'file-icons/mp3.png',\r\n 'audio/x-mpeg': 'file-icons/mp3.png',\r\n 'audio/x-mp3': 'file-icons/mp3.png',\r\n 'audio/wav': 'file-icons/wav.png',\r\n 'audio/x-wav': 'file-icons/wav.png',\r\n 'audio/x-ms-wma': 'file-icons/wma.png',\r\n 'application/pdf': 'file-icons/pdf.png',\r\n 'application/msword': 'file-icons/doc.png',\r\n 'application/doc': 'file-icons/doc.png',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'file-icons/docx.png',\r\n 'application/vnd.ms-excel': 'file-icons/xls.png',\r\n 'application/xls': 'file-icons/xls.png',\r\n 'application/x-msexcel': 'file-icons/xls.png',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'file-icons/xlsx.png',\r\n 'application/vnd.ms-powerpoint': 'file-icons/ppt.png',\r\n 'application/mspowerpoint': 'file-icons/ppt.png',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'file-icons/pptx.png',\r\n 'text/plain': 'file-icons/txt.png',\r\n 'text/rtf': 'file-icons/txt.png',\r\n 'text/html': 'file-icons/html.png',\r\n 'application/xhtml+xml': 'file-icons/html.png',\r\n 'text/css': 'file-icons/css.png',\r\n 'application/javascript': 'file-icons/js.png',\r\n 'text/javascript': 'file-icons/js.png',\r\n 'application/sql': 'file-icons/sql.png',\r\n 'text/x-sql': 'file-icons/sql.png',\r\n 'text/x-c': 'file-icons/code.png',\r\n 'text/x-c++': 'file-icons/code.png',\r\n 'text/x-java-source': 'file-icons/code.png',\r\n 'text/x-python': 'file-icons/py.png',\r\n 'text/x-php': 'file-icons/php.png',\r\n 'text/x-shellscript': 'file-icons/sh.png',\r\n 'text/x-typescript': 'file-icons/ts.png',\r\n 'text/x-markdown': 'file-icons/md.png',\r\n 'application/x-msdownload': 'file-icons/exe.png',\r\n 'application/x-ms-installer': 'file-icons/msi.png',\r\n 'application/x-sh': 'file-icons/sh.png',\r\n 'application/octet-stream': 'file-icons/bin.png',\r\n 'application/zip': 'file-icons/zip.png',\r\n 'application/x-zip-compressed': 'file-icons/zip.png',\r\n 'application/x-zip': 'file-icons/zip.png',\r\n 'multipart/x-zip': 'file-icons/zip.png',\r\n 'application/x-rar-compressed': 'file-icons/rar.png',\r\n 'application/vnd.rar': 'file-icons/rar.png',\r\n 'application/x-rar': 'file-icons/rar.png',\r\n };\r\n\r\n if (type.startsWith('image/') && !map[type]) {\r\n return 'file-icons/img.png';\r\n }\r\n\r\n if (type.startsWith('video/') && !map[type]) {\r\n return 'file-icons/vid.png';\r\n }\r\n\r\n return map[type] || 'file-icons/file.png';\r\n }\r\n}\r\n\r\n","<p\n *ngIf=\"label\"\n class=\"Label\"\n [class.Disabled]=\"isDisabled\"\n>\n {{ label }} <span class=\"Opcional\" *ngIf=\"opcional\">(opcional)</span>\n</p>\n\n<p\n *ngIf=\"description\"\n class=\"Description\"\n [class.Disabled]=\"isDisabled\"\n>\n {{ description }}<span *ngIf=\"allowedTypesText\"> · Tipos permitidos: {{ allowedTypesText }}</span>\n</p>\n\n<!-- ESTRUCTURA UNIFICADA -->\n<ng-container>\n <!-- Upload Box -->\n <form\n #uploadForm\n (change)=\"onFileInput($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\"\n >\n <div\n class=\"UploadBox\"\n [class.Disabled]=\"loading\"\n [class.Dragging]=\"isDragging\"\n [class.Single]=\"!multiple\"\n [class.Multiple]=\"multiple\"\n >\n <label class=\"DropLabel\">\n <input type=\"file\" [multiple]=\"multiple\" [accept]=\"effectiveTypes.join(',')\" hidden />\n <div class=\"Texts\">\n <lucide-icon class=\"UploadIcon\" name=\"cloud-upload\"></lucide-icon>\n <span class=\"Insentivo\">\n {{\n isDragging\n ? (isImageMode ? \"¡Suelta las imágenes aquí!\" : \"¡Suelta los archivos aquí!\")\n : multiple\n ? (isImageMode ? \"Arrastra varias imágenes aquí\" : \"Arrastra varios archivos aquí\")\n : (isImageMode ? \"Arrastra una imagen aquí\" : \"Arrastra un archivo aquí\")\n }}\n </span>\n <span class=\"Or\">O</span>\n <span class=\"Clicked\">haz clic para seleccionar</span>\n <span class=\"Info\">\n Máx: {{ maxItems }} item{{ maxItems > 1 ? \"s\" : \"\" }}<span *ngIf=\"maxSize\"> · {{ (maxSize * 1024 * 1024) | fileSize }}</span>\n </span>\n </div>\n </label>\n </div>\n </form>\n\n <div *ngIf=\"statusMessage\" class=\"StatusMessage\">\n {{ statusMessage }}\n </div>\n \n <!-- Lista de items en proceso -->\n <div \n class=\"MediaSection\" \n *ngIf=\"pending.length\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n >\n <h4 class=\"Title\">\n <span>Pendientes</span>\n </h4>\n <ul \n class=\"MediaList\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n [class.ItemsDisplay]=\"isItemsDisplay\"\n >\n <li \n class=\"MediaItem\" \n *ngFor=\"let item of pending\"\n [class.FileItem]=\"isFileMode\"\n [class.ImageItem]=\"isImageMode\"\n >\n <div class=\"Thumbnail\" *ngIf=\"isFileMode\">\n <img\n [src]=\"getFileIcon(item.type)\"\n [alt]=\"item.name\"\n class=\"FileIcon\"\n \n />\n </div>\n <div class=\"FileInfo\">\n <span class=\"Name\">{{ item.name }}</span>\n <span class=\"Size\">{{ item.size | fileSize }}</span>\n <div class=\"Progress\">\n <div class=\"Bar\" [style.width.%]=\"item.progress\"></div>\n </div>\n <span class=\"ProgressLabel\">{{ item.phase === 'processing' ? 'Procesando...' : (item.progress + '%') }}</span>\n </div>\n </li>\n </ul>\n </div>\n\n <!-- Lista de items subidos correctamente -->\n <div \n class=\"MediaSection\" \n *ngIf=\"uploaded.length\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n >\n <h4 class=\"Title\">\n <span>{{ isImageMode ? \"Imágenes Cargadas\" : \"Archivos Cargados\" }}</span>\n <button type=\"button\" (click)=\"clearAllUploaded()\" class=\"ClearAll\">\n <lucide-icon name=\"brush-cleaning\"></lucide-icon>\n </button>\n </h4>\n\n <ul \n class=\"MediaList\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n [class.ItemsDisplay]=\"isItemsDisplay\"\n #sortableContainer\n >\n <li\n class=\"MediaItem MediaItemDraggable\"\n [class.FileItem]=\"isFileMode\"\n [class.ImageItem]=\"isImageMode\"\n *ngFor=\"let item of uploaded; let i = index\"\n [attr.data-index]=\"i\"\n >\n\n <div class=\"Thumbnail\">\n <img\n *ngIf=\"isImageMode\"\n [src]=\"getPreviewUrl(item.urlEncrypted || item.url) || undefined\"\n alt=\"Imagen cargada\"\n draggable=\"true\"\n />\n <img\n *ngIf=\"isFileMode\"\n [src]=\"getFileIcon(item.type)\"\n [alt]=\"item.name\"\n class=\"FileIcon\"\n \n />\n </div>\n\n <div class=\"FileInfo\">\n <span class=\"Name\">{{ item.name }}</span>\n <p class=\"Tags\">\n <span class=\"Size\">{{ item.size | fileSize }}</span>\n </p>\n <span *ngIf=\"isPrimary(i)\" class=\"PrimaryTag\">\n {{ isImageMode ? \"Primaria\" : \"Primario\" }}\n </span>\n </div>\n <!-- Preview: MediaViewerService (singleton); UI global en media-viewer-service -->\n <div class=\"Actions\">\n <div\n class=\"Open\"\n type=\"button\"\n (click)=\"openGeneralMediaPreview(item)\"\n title=\"Abrir preview\"\n >\n <lucide-icon class=\"Icon--eye\" name=\"eye\"></lucide-icon>\n </div>\n <div class=\"Cancel\" type=\"button\" (click)=\"removeUploaded(i)\" title=\"Eliminar\">\n <lucide-icon class=\"Icon--trash\" name=\"trash\"></lucide-icon>\n </div>\n </div>\n </li>\n </ul>\n </div>\n\n <!-- Lista de errores -->\n <div \n class=\"MediaSection Error\" \n *ngIf=\"failed.length\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n >\n <h4 class=\"Title\">\n <span>Errores</span>\n <button type=\"button\" (click)=\"clearAllFailed()\" class=\"ClearAll\">\n <lucide-icon name=\"brush-cleaning\"></lucide-icon>\n </button>\n </h4>\n <ul \n class=\"MediaList\"\n [class.CardsDisplay]=\"isCardsDisplay\"\n [class.ItemsDisplay]=\"isItemsDisplay\"\n >\n <li \n class=\"MediaItem\"\n [class.FileItem]=\"isFileMode\"\n [class.ImageItem]=\"isImageMode\"\n *ngFor=\"let item of failed; let i = index\"\n >\n <div class=\"FileInfo\">\n <span class=\"Name\">{{ item.name }}</span>\n <span class=\"ErrorMsg\">{{ item.error }}</span>\n </div>\n <div class=\"Cancel\" type=\"button\" (click)=\"removeFailed(i)\">\n <lucide-icon class=\"Icon--trash\" name=\"trash\"></lucide-icon>\n </div>\n </li>\n </ul>\n </div>\n</ng-container>\n","/**\r\n * Barrel export para todos los componentes de inputs.\r\n *\r\n * Este archivo centraliza todas las exportaciones de los componentes de inputs,\r\n * permitiendo importaciones más limpias y organizadas.\r\n *\r\n * Uso individual:\r\n * import { TextEntryComponent, EmailEntryComponent, ... } from '@shared/components/inputs';\r\n *\r\n * Uso como array (recomendado):\r\n * import { ALL_INPUT_COMPONENTS } from '@shared/components/inputs';\r\n * imports: [ALL_INPUT_COMPONENTS]\r\n */\r\n\r\n// Texto y texto largo\r\nexport { TextEntryComponent } from './text-entry/text-entry.component';\r\nexport { TextAreaEntryComponent } from './text-area-entry/text-area-entry.component';\r\nexport { EmailEntryComponent } from './email-entry/email-entry.component';\r\nexport { UrlEntryComponent } from './url-entry/url-entry.component';\r\nexport { PasswordEntryComponent } from './password-entry/password-entry.component';\r\nexport { SearchEntryComponent } from './search-entry/search-entry.component';\r\nexport { TagsEntryComponent } from './tags-entry/tags-entry.component';\r\n\r\n// Números\r\nexport { IntegerEntryComponent } from './integer-entry/integer-entry.component';\r\nexport { DecimalEntryComponent } from './decimal-entry/decimal-entry.component';\r\nexport { CounterEntryComponent } from './counter-entry/counter-entry.component';\r\nexport { PriceEntryComponent } from './price-entry/price-entry.component';\r\nexport { RangeEntryComponent } from './range-entry/range-entry.component';\r\nexport { SliderEntryComponent } from './slider-entry/slider-entry.component';\r\nexport { RatingEntryComponent } from './rating-entry/rating-entry.component';\r\n\r\n// Fechas y tiempo\r\nexport { DatePickerComponent } from './date-picker/date-picker.component';\r\nexport { TimePickerComponent } from './time-picker/time-picker.component';\r\nexport { MonthPickerComponent } from './month-picker/month-picker.component';\r\nexport { DatetimePickerComponent } from './datetime-picker/datetime-picker.component';\r\n\r\n// Selección y opciones\r\nexport { OnlySelectComponent } from './only-select/only-select.component';\r\nexport { MultiselectComboboxComponent } from './multiselect-combobox/multiselect-combobox.component';\r\nexport { BooleanEntryComponent } from './boolean-entry/boolean-entry.component';\r\nexport { MultichoiceEntryComponent } from './multichoice-entry/multichoice-entry.component';\r\nexport { OnlychoiceEntryComponent } from './onlychoice-entry/onlychoice-entry.component';\r\nexport { SwitchEntryComponent } from './switch-entry/switch-entry.component';\r\n\r\n// Otros\r\nexport { PhoneEntryComponent } from './phone-entry/phone-entry.component';\r\nexport { ColorPickerComponent } from './color-picker/color-picker.component';\r\nexport { OtpEntryComponent } from './otp-entry/otp-entry.component';\r\nexport { RichTextEntryComponent } from './rich-text-entry/rich-text-entry.component';\r\nexport { SignatureEntryComponent } from './signature-entry/signature-entry.component';\r\n\r\n// Archivos e imágenes\r\nexport { MediaEntryComponent } from './media-entry/media-entry.component';\r\n\r\n// Array con todos los componentes para importación masiva\r\nimport { TextEntryComponent } from './text-entry/text-entry.component';\r\nimport { TextAreaEntryComponent } from './text-area-entry/text-area-entry.component';\r\nimport { EmailEntryComponent } from './email-entry/email-entry.component';\r\nimport { UrlEntryComponent } from './url-entry/url-entry.component';\r\nimport { PasswordEntryComponent } from './password-entry/password-entry.component';\r\nimport { SearchEntryComponent } from './search-entry/search-entry.component';\r\nimport { TagsEntryComponent } from './tags-entry/tags-entry.component';\r\nimport { IntegerEntryComponent } from './integer-entry/integer-entry.component';\r\nimport { DecimalEntryComponent } from './decimal-entry/decimal-entry.component';\r\nimport { CounterEntryComponent } from './counter-entry/counter-entry.component';\r\nimport { PriceEntryComponent } from './price-entry/price-entry.component';\r\nimport { RangeEntryComponent } from './range-entry/range-entry.component';\r\nimport { SliderEntryComponent } from './slider-entry/slider-entry.component';\r\nimport { RatingEntryComponent } from './rating-entry/rating-entry.component';\r\nimport { DatePickerComponent } from './date-picker/date-picker.component';\r\nimport { TimePickerComponent } from './time-picker/time-picker.component';\r\nimport { MonthPickerComponent } from './month-picker/month-picker.component';\r\nimport { DatetimePickerComponent } from './datetime-picker/datetime-picker.component';\r\nimport { OnlySelectComponent } from './only-select/only-select.component';\r\nimport { MultiselectComboboxComponent } from './multiselect-combobox/multiselect-combobox.component';\r\nimport { BooleanEntryComponent } from './boolean-entry/boolean-entry.component';\r\nimport { MultichoiceEntryComponent } from './multichoice-entry/multichoice-entry.component';\r\nimport { OnlychoiceEntryComponent } from './onlychoice-entry/onlychoice-entry.component';\r\nimport { SwitchEntryComponent } from './switch-entry/switch-entry.component';\r\nimport { PhoneEntryComponent } from './phone-entry/phone-entry.component';\r\nimport { ColorPickerComponent } from './color-picker/color-picker.component';\r\nimport { OtpEntryComponent } from './otp-entry/otp-entry.component';\r\nimport { RichTextEntryComponent } from './rich-text-entry/rich-text-entry.component';\r\nimport { SignatureEntryComponent } from './signature-entry/signature-entry.component';\r\nimport { MediaEntryComponent } from './media-entry/media-entry.component';\r\n\r\n/**\r\n * Array con todos los componentes de inputs completamente standalone.\r\n * \r\n * Uso:\r\n * import { ALL_INPUT_COMPONENTS } from '@shared/components/inputs';\r\n * \r\n * @Component({\r\n * imports: [...ALL_INPUT_COMPONENTS]\r\n * })\r\n */\r\nexport const ALL_INPUT_COMPONENTS = [\r\n TextEntryComponent,\r\n TextAreaEntryComponent,\r\n EmailEntryComponent,\r\n UrlEntryComponent,\r\n PasswordEntryComponent,\r\n SearchEntryComponent,\r\n TagsEntryComponent,\r\n IntegerEntryComponent,\r\n DecimalEntryComponent,\r\n CounterEntryComponent,\r\n PriceEntryComponent,\r\n RangeEntryComponent,\r\n SliderEntryComponent,\r\n RatingEntryComponent,\r\n DatePickerComponent,\r\n TimePickerComponent,\r\n MonthPickerComponent,\r\n DatetimePickerComponent,\r\n OnlySelectComponent,\r\n MultiselectComboboxComponent,\r\n BooleanEntryComponent,\r\n MultichoiceEntryComponent,\r\n OnlychoiceEntryComponent,\r\n SwitchEntryComponent,\r\n PhoneEntryComponent,\r\n ColorPickerComponent,\r\n OtpEntryComponent,\r\n RichTextEntryComponent,\r\n SignatureEntryComponent,\r\n MediaEntryComponent,\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","/*\r\n * Public API Surface of @xosue-utils/inputs\r\n */\r\n\r\nexport * from './config/inputs-config';\r\n\r\nexport * from './lib/index';\r\n\r\nexport { LucideIconComponent } from './vendor/lucide-icon/lucide-icon.component';\r\nexport { FieldHelpTooltipComponent } from './vendor/field-help-tooltip/field-help-tooltip.component';\r\nexport {\r\n ContextMenuService,\r\n type ContextMenuOption,\r\n type ContextMenuInfo,\r\n} from './vendor/context-menu-service/context-menu.service';\r\nexport { ContextMenuServiceComponent } from './vendor/context-menu-service/context-menu-service.component';\r\nexport { DragScrollDirective } from './vendor/drag-scroll.directive';\r\nexport { FileSizePipe } from './vendor/file-size.pipe';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i2"],"mappings":"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"}
|